MCP tools
Fiveonefour's MCP tool catalog with current tool families and report workflows.
The MCP server mirrors the CLI nouns: same ids, same vocabulary. The available
catalog can vary with organization features and access; call tools/list for
the complete current catalog and input schemas. Org-scoped tools use the
current MCP org (see mcp_org tools) unless you
pass an org_id override. Arguments marked required must be supplied;
everything else is optional.
Experiment tools
| Tool | What it does | CLI equivalent |
|---|---|---|
experiment_list | List experiments the org can access. | ax experiment list |
experiment_view | One experiment's metadata, axes, run counts, and resources. | ax experiment view |
experiment_resource_add | Attach titled links to an experiment. | ax experiment resource add |
experiment_resource_edit | Change a resource's title or URL. | ax experiment resource edit |
experiment_resource_delete | Remove a resource. | ax experiment resource delete |
experiment_versions | List stored version fingerprints. | ax experiment versions |
experiment_pull | Return stored YAML (latest or a version). | ax experiment pull |
experiment_push | Validate and push a YAML version without running. | ax experiment push |
experiment_fork | Copy an experiment onto the current data pipeline as a new experiment. | ax experiment fork |
experiment_run | Submit runs for a registered experiment. | ax experiment run <id> |
experiment_query | Query results in experiment scope. | ax experiment query |
experiment_list filters with search, owner, agents, models,
products, environments, updated_since (RFC 3339), and limit. Same-axis
values OR; different axes AND.
experiment_view includes a resources array (id, title, url,
createdAt, updatedAt). Empty is []. Resources hang off the experiment,
not a version, and are not in YAML. Tool arguments are snake_case
(experiment_id, resource_id); structured results use the same
lowerCamelCase JSON as the HTTP API.
experiment_resource_add takes required experiment_id plus either one
title and url, or a resources array of {title, url}. Do not send both
shapes. Title and URL are both required on each item. http:// or https://
only; same title or URL twice is allowed.
experiment_resource_edit takes required experiment_id and
resource_id (UUID from experiment_view) plus at least one of title or
url. experiment_resource_delete takes required experiment_id and
resource_id. A missing resource is an error, not a silent success.
experiment_push takes required experiment_yaml. An experiment that
declares required dependencies (files:, setup.files, setup.skills, or
tests[*].files entries with a source) needs its complete package to become
a runnable version — ax experiment push resolves and uploads those files for
you. A YAML-only call is only accepted when it matches the YAML of an existing
stored version (an idempotent re-push); otherwise it fails rather than
registering an incomplete version. A caller that has already staged each
dependency's content-addressed blob for this org can supply the package
directly with replace_version_files: true and version_files (dest,
tar_sha256, size_bytes, source, and optionally variant_id,
test_names, name) — the same fields the API's JSON push
body accepts.
experiment_fork takes required experiment_id plus optional
new_experiment_id (kebab-case; derived as <experiment_id>-v2 when omitted,
with a counter appended when that id is taken) and new_name (derived as the
source name followed by (V2)). It registers the source's latest stored
definition and dependencies as a new experiment on the current results
pipeline (session_data_v1) and creates no runs. The source experiment is only
read. Use it when an experiment's results are held in the retired data
pipeline and you want to run the same definition again, then pass the returned
experimentId to experiment_run.
experiment_run accepts version, repeat, exact variant_ids, the axis
selectors (prompt_ids, agents, models, product_ids,
environment_ids), registered flags, mock, and setup_only. A
setup_only submit runs one sandbox per distinct setup unless all_variants
is set, the same as
ax experiment run --setup-only. Setup-only
runs have no model spend, but each run incurs the per-run platform fee
(sandbox charge).
Selectors are a union; no selector runs every variant. The response pins the version and returns its
fingerprint, ordinal, selected variant ids, and the run request id.
experiment_query takes required experiment_id plus either raw sql
(scoped to the experiment) or the experimental modeled fields (metrics,
ordered group_by, stat (only mean today), dimension filters, version,
and dimensions discovery; the surface may change). Both modes support
limit (default 100, cap 10,000), dry_run, and save
({heading, slug?, description?, labels?, force?}); dry_run, save, and
dimension discovery are mutually exclusive. Metrics are testPassRate,
testsPassed, testsFailed, cost, wallClockTime, tokens,
toolCalls, toolFailures. Both modes leave out runs classified as
"test aware" (the agent noticed it was being tested) unless
include_test_aware is set; those runs may not mimic real-world agent
behavior. Both modes report how many were held back as
excludedTestAwareRuns, and the result text repeats it when any were.
Run tools
| Tool | What it does | CLI equivalent |
|---|---|---|
run_list | List runs with experiment, version, dimension, and status filters. | ax run list |
run_view | View a run request or one run, optionally with a transcript, tests, or setup log. | ax run view |
run_cancel | Cancel queued or running work for a request. | ax run cancel |
run_cleanup | Run a skipped or failed declared teardown for one platform run. | ax run cleanup |
run_query | Read-only SQL scoped to one run. | ax run query |
run_list accepts experiment_id, version_scope, the dimension filters,
exact variant_ids, statuses, created_by_ids, status_updated_since
(when the run entered its current status, not creation), test_aware (only
runs classified as "test aware", where the agent noticed it was being tested
or changed its behavior because of it), run_request_id (only the runs of one
submission), and limit.
run_view takes a request id or composite run id. Set tests: true for every
captured test, or test_name for one test's exit code, duration, and output
tails (composite run ids only; not both). For a transcript, select one composite
run with transcript: true. Pass include: ["reasoning"] to add reasoning and
limit to change the 500-turn default (minimum 1, maximum 10,000). Transcript
and test payloads cannot be combined.
Set setup_log: true with one composite run id for the run's setup.log (the
tail when it exceeds the size cap) and its setup-check results, the same as
ax run view --setup-log. The structured result carries found, content,
truncated, totalSizeBytes, maxBytes, and setupChecks. setup_log cannot
be combined with tests, test_name, or transcript.
The transcript object matches CLI JSON. Its ordered turns contain seq,
nullable ts, role, nullable origin (human or harness on user turns),
kind, and text; include_reasoning, limit, truncated, shown,
total, and skipped_malformed describe completeness.
A composite run's run_view result also lists its failed tool calls, with or
without a transcript. The run's failedToolCalls array (up to 50 calls, with
failedToolCallsTruncated set when there were more) gives each call's seq,
position, tool_name, error_text (the joined error content with likely secrets redacted,
shown as [redacted], cut to at most 2,000 Unicode code points; error_truncated
says when the redacted text was cut, and error_chars is the length in Unicode code
points of the redacted error text, before the cut), and the summary text lists them. With
a transcript, each listed failed call also appears as a tool_error turn carrying the
same tool_call object. When failedToolCallsTruncated is set, query every failed
call with run_query (pass limit: 10000, since the default is 100): SELECT seq, tool_name, payload FROM tool_interactions WHERE is_error ORDER BY seq.
When more than half of a run's MCP calls failed (returned an error, or returned
a result naming an HTTP 4xx or 5xx status), or otherwise more than half of all
its tool calls, the run also carries toolFailureFlag (failedCalls,
totalCalls, mcp, errorStatuses, and summary, for example
4/4 MCP calls failed: 404), and the summary text opens its failed-call section
with Most tool calls failed: <summary>. A flagged run can pass its tests
without its agent ever reading real data.
run_query takes required composite run_id plus sql or tables, and
limit, dry_run, and save with the same semantics as experiment_query.
Pass tables to run_query or experiment_query to discover what raw sql
can read, the same as ax run query <RUN_ID> sql --tables and
ax experiment query <EXPERIMENT_ID> --table on the CLI: "" lists the
tables, and a table name returns its columns, types, join keys, and allowed
values. run_query also reports each table's row count. The structured result
carries the same fields as the CLI's JSON output, in the tools'
lowerCamelCase JSON. tables cannot be combined with sql, limit,
dry_run, save, or the modeled fields.
Insight tools
| Tool | What it does | CLI equivalent |
|---|---|---|
insight_list | List saved SQL and experiment chart insight metadata. | ax insight list |
insight_create | Create a saved SQL insight. | ax insight create |
insight_view | Execute an insight, or inspect its query and schemas. | ax insight view |
insight_edit | Update heading, SQL, description, or labels. | ax insight edit |
insight_delete | Delete by slug or id (idempotent). | ax insight delete |
insight_share | Create or reuse an immutable public publication and return its URL. | ax insight share |
insight_create takes required heading and sql, plus slug,
description, labels, and force (overwrite mutable content on slug
collision; slugs are immutable). insight_view executes live unless
sql_only: true. insight_edit is presence-aware: an empty description or
labels array clears the field (clear_labels also works).
Set experiment on insight_list to discover its three built-in Results charts.
Report tools
| Tool | What it does | CLI equivalent |
|---|---|---|
report_list | List the org's active reports, most recently changed first, without bodies; include_archived lists archived reports too. | ax report list |
report_get_metadata | Read saved metadata without the body. | ax report get (combined read) |
report_get_content | Read saved content, block handles and the revision for a guarded write. | ax report get (combined read) |
report_create | Create a report from a title, an optional description and an optional body. | ax report create |
report_update_metadata | Update a report's title or description, guarded by its latest revision. | ax report edit |
report_add_block | Insert one typed block at a specified position, guarded by expected_updated_at. | ax report append (end insertion) |
report_archive | Archive a report: it keeps its body and links and leaves report_list unless asked for. Nothing is deleted. | ax report archive |
report_move_block | Move an existing block to a specified position, guarded by expected_updated_at. | ax report edit |
report_remove_block | Remove an editable block, guarded by expected_updated_at. | ax report edit |
report_follow_state | Read the current member's follow state for a report. | None yet |
report_follow | Follow or unfollow a report. | None yet |
block_get | Read a block's saved text, data, appearance, or source. | None yet |
block_update | Apply a typed partial patch to a block, guarded by expected_updated_at. | None yet |
block_list_data_sources | Discover compatible source references by block type and typed filters for an identified report, including Trace quote candidates and registered test results for an A/B Comparison side or its measuredBy. | None yet |
report_trace_quote_source | One message's exact text and recorded agent, harness and model, with the trace-quote block to insert. | None yet |
report_frontmatter_group_sources | A report's front-matter groups with each id's current name and status, and an experiment's versions and test keys. | None yet |
report_get_metadata and report_get_content each take exactly one of
report_id or report_name. Clarify ambiguous names before reading. When
combining their results, use the same report ID and matching updatedAt
values; reread if the report changed between calls. report_archive takes
exactly one of report_id or report_name. If a name matches multiple
reports, it returns candidates and does not archive anything. Name selectors
match active reports only; an archived report is reached by report_id.
report_create takes required title plus
description and body_markdown. report_add_block takes
exactly one of report_id or report_name, plus required block, position
and expected_updated_at. To append several blocks, insert each at
position: { at: "end" } in order, using the completed write’s updatedAt
for the next insertion. Clarify ambiguous report names before writing.
report_update_metadata, report_move_block, report_remove_block, and
block_update also require the report's latest expected_updated_at value.
block_get can return all saved properties or a selected subset with fields.
block_update is typed by block kind, preserves omitted fields, and replaces an
array when that array is included in the patch.
The catalog exposes separate metadata and content reads, plus focused edit
tools. report_update_metadata changes the title or description.
report_move_block and report_remove_block manipulate existing blocks;
report_add_block accepts a typed block payload to insert one without
replacing the full body. The former report_edit tool is retired.
For product-version Comparison references, call block_list_data_sources with
required report_id or report_name (exactly one), block_kind set to
version-selection-rate-evidence, and filters containing category: "product-version"
and experimentId. You can also pass experimentFingerprint to pin a registered
version or productId to narrow the returned products. Omitting the fingerprint
reads all experiment versions. If the report name is ambiguous, choose a returned
report before requesting sources. An unknown experiment or fingerprint is an error,
not an empty list.
The result contains report identity, experiment-version identities, product IDs
and versions, and exact selection-test names. Copy those references without
choosing a version pair from labels alone. Preserve a nonempty
experimentFingerprint as the block's scope.experimentFingerprint; omit that
scope field when the returned value is empty. Discovery returns no report revision,
measurements, or selection counts. Read the report through the appropriate content
or block read before a later write and use that read's concurrency token.
block_list_data_sources takes required block_kind and filters, plus
exactly one of report_id or report_name. For block_kind: "selection-rate",
filters requires experimentId and accepts experimentFingerprint (default:
the current version) and exact testName. Resolve ambiguous report names
before reading sources. Make a separate call for each baseline experiment/version.
Read candidate identities from tests and versions, and scope values from
availableFilters. availableFiltersScope: "experiment" means dimension options
span the experiment; registered tests follow the returned experimentFingerprint.
A test-name filter can return zero or multiple candidates. Select a returned
identity explicitly; duplicate names do not establish identity. The response
contains references, not rates, run counts or a revision for writing the report.
Keep the revision from your report read when using the guarded report writer.
Selection sources return an empty nextPageToken. For paginated source kinds,
pass a nonempty token unchanged as page_token with the same report, kind and
filters, even after an empty page. For CLI selection discovery, use
ax report selection-rate-sources. CLI and REST source discovery keep their
existing experiment-only inputs and result shape.
block_list_data_sources requires exactly one authorized report_id or
report_name; an ambiguous name returns candidates for clarification. For
A/B Comparison test results, set block_kind: "version-selection-rate-evidence"
and filters: {"category": "test-result"}. Add filters.search for a literal,
case-insensitive test-name match, or filters.experimentId and
filters.experimentFingerprint for an exact version (a fingerprint requires
its experiment). Copy each row's kind, experimentId, experimentFingerprint
and testId unchanged. Results contain references only, never pass counts or rates.
Read-only credentials cannot discover comparison test results.
When nextPageToken is not empty, pass it unchanged as page_token with the
same report, block kind and filters, even after an empty page. Start without a
page token when changing tools; tokens from earlier discovery tools are not
interchangeable. Discovery does not return a report revision. Use the
updatedAt from your saved report read as expected_updated_at for the next
write, and read again if that revision is stale.
report_frontmatter_group_sources takes report_id, experiment_id (with an
optional experiment_fingerprint) or both. Each product reads as available,
archived or missing, each experiment as available or missing, and the
metric as available, missing_experiment, missing_version or
missing_test.
Read report_get_content before adding or changing a front-matter group.
Use report_add_block to insert a block with kind: "frontmatter-group" at
an explicit position. Use block_update to change an existing group, with
its full block_id from that read and a patch with
kind: "frontmatter-group". Both writers take exactly one of report_id or
report_name and require that read's updatedAt as expected_updated_at.
Clarify ambiguous report names or destination headings before writing.
Follow the tool's input schema for the group's fields. Omitted patch fields
stay unchanged; metric: null clears the metric. If you replace a rows
collection, include the rows you want to keep. A newly selected source must
resolve in the org; an unavailable source already in an untouched row stays.
Changing the metric's experiment or version while carrying over its old test
or pinned version clears the metric to null. Select the new source's version
and test together to configure it again.
Retry an insertion with its original request and expected_updated_at.
A new insertion at a fresh revision creates another group even when the
values match. A stale revision refuses the write; read the current content
before planning a new change.
Use block_update for individual row or text choices so omitted
fields retain the member's edits.
The report_add_block tool’s block parameter states the
document format and carries the JSON Schema
for every ax-block kind, so an agent can build a valid fence without another
lookup. Results use the same lowerCamelCase JSON as the
HTTP API.
Use block_list_data_sources with exactly one of report_id or report_name,
block_kind: "trace-quote", and filters: { experimentId, runId, limit? }
to discover candidate messages. limit defaults to 50 and is at most 100. If a report name is ambiguous, choose the intended report before
continuing. Copy each candidate's canonical source unchanged.
report_trace_quote_source takes required experiment_id, run_id and
message_entity_id to read one candidate's exact text and recorded identity.
The quote's authored text is separate from that recorded evidence.
To modify a saved quote, use block_update with its saved block_id, a typed
trace-quote patch and the last-read expected_updated_at. Omitted fields
stay unchanged.
Recorded identity comes from the chosen source and cannot be authored in the
block.
Pass nextPageToken unchanged as page_token, keeping the report, block type
and filters unchanged, even after an empty page. An empty token ends paging. Message previews are
exact prefixes, not full verified quotes. Read a candidate with
report_trace_quote_source before quoting it. A message that is missing,
unavailable or empty comes back without text or a block.
For chart insights, insight_view with sql_only: true returns the parameter
schema, response schema, and available filter values as parameterSchema,
responseSchema, and availableValues inside insight.
Execute with a parameters object, for example
{"ref":"<INSIGHT_REF>","parameters":{"group_by":"model","metric":"wallSeconds"}}.
Chart results are in chartData; saved SQL results remain in rows. To retrieve
points or underlying runs, set result_view to points or runs, then pass
chartData.nextCursor as cursor until it is null. Keep the same parameters and
view for every page. Use group_value and test_name for an exact heatmap cell.
Omit limit for chart insights; summaries always cover all matching runs.
See CLI insight usage for filter and pagination examples.
Secret tools
| Tool | What it does | CLI equivalent |
|---|---|---|
secret_set | Create or overwrite one secret; returns metadata, never the value. | ax secret set |
secret_list | List slugs and audit metadata; never values. | ax secret list |
secret_delete | Delete one secret by slug. | ax secret delete |
Org context and CLI auth
| Tool | What it does | CLI equivalent |
|---|---|---|
mcp_org_list | List orgs available to the MCP user. | ax org list |
mcp_org_get_current | The org context org-scoped tools use. | ax org view |
mcp_org_set_current | Change that org context. | ax org switch |
auth_whoami | Read the authenticated user ID and email, and selected organization ID, name, and slug. | ax auth whoami |
cli_auth_start | Mint a one-time code that signs in the local CLI. | ax auth connect --code |
auth_whoami takes no arguments and returns user_id, email, org_id,
org_name, and org_slug. It uses your MCP connection's identity and organization
selection. Organization fields are null when no organization is selected;
email is null for service identities or users without an email address.
It never returns credentials.
Context tools
| Tool | What it does | CLI equivalent |
|---|---|---|
context_list_types | Discover Context object types, their filters, and the related objects each embeds, for a scope. | ax context objects |
context_list | List Context objects of one type as flat rows in organization or global scope. | ax context list |
context_get | Read selected saved fields, the stored revision, and bounded relationships in organization or global scope. | ax context get |
context_match | Find the organization's existing company, product, persona, market, or use case before researching or creating one. | ax context match |
context_list_documents | List document attachments for a supported host and scope. | ax context documents |
context_options | Find eligible existing organization objects by kind, search, and filters; follow opaque cursors for further candidates. | ax context edit with action options |
context_edit | Edit organization-owned Context with an action/input envelope. | `ax context edit --file <PATH |
context_create | Create an organization Context object, reusing an existing identity match. | `ax context edit --file <PATH |
context_update | Patch an object's fields or reorder its existing flow steps at the current revision. | `ax context edit --file <PATH |
context_remove | Check dependencies and apply the object's existing archive or delete behavior. | `ax context edit --file <PATH |
context_batch_mutate | Apply requested creates and updates together, or none of them. | `ax context edit --file <PATH |
context_owners | Read or change descriptive owners from eligible organization members. | `ax context edit --file <PATH |
context_copy | Copy an eligible global root into the selected organization. | ax context copy |
context_tags | Create, assign, and look up reusable tags on Context objects. | ax context tags |
context_claim | Read and manage ownership claims. | ax context claim |
context_follow_state | Read whether you follow a shared Context object or, with scope: org, one your organization owns. | ax context follow-state |
context_follow | Follow or unfollow a shared Context object or, with scope: org, one your organization owns (followed by every member until they unfollow it). | ax context follow, ax context unfollow |
context_suggestions | Read a shared Context snapshot, submit a reviewed edit or tag change, list your suggestions, or withdraw one. | `ax context suggest --file <PATH |
context_list_types, context_list, context_get, and context_list_documents
accept scope: "org" (default) or "global". Object discovery is the source
of truth for object types, allowed filters, ordering, and the relationships
context_get embeds one level deep. Relationship tables are not object types
and cannot be listed; their rows appear only as embedded arrays. Document hosts
are companies, products, use-cases, personas, agents,
persona-agents, interfaces, capabilities, user-flows,
markets, product-packages, product-versions,
product-competitors, agent-versions, and models. The companies
type holds Company Context objects (companies, customers, vendors, and
competitors), shown as Companies in the platform.
context_get and context_list_documents accept exactly one target selector:
id, name, or url. Supply kind with IDs, names, or company/product website
URLs. AX page URLs identify their kind and scope. Ambiguous names or websites
return candidates to choose from; an incomplete search requires an ID or AX
page URL. A URL does not grant access to another organization's data.
Persona-agent attachment targets require an association ID.
context_get accepts optional fields, such as ["description", "website_url"],
and relationships, such as [{"key": "personas", "limit": 20}]. Selecting fields
loads no unrelated relationships. Each selected field contains value,
source: "saved", and its stored revision when available. Null values remain
null; unselected fields are omitted. The response also includes canonical
kind, id, scope, and revision. Live editor values are unavailable.
Each relationship returns key, kind, items, and complete. A known total
counts all items only when the underlying read is complete. These bounded
reads provide no continuation cursor: after is rejected. Use context_list
filters or context_list_documents pagination to continue discovery.
truncatedRelationships names incomplete relationships, and the top-level
complete applies only to selected values. Do not use an incomplete relationship
as a replacement value. Narrow oversized reads with fields or use a paginated list.
context_list_documents returns attachment metadata, not complete file content.
Continue with page_token until next_page_token is empty to list every attachment.
context_options separates candidate discovery from type discovery. It accepts
kind, optional search, supported filters, and page_token. Its opaque
continuation token belongs to the same organization, kind, search, and filters.
Discovery does not create an object or attach a candidate.
The five mutation tools above are organization-only. context_create takes
kind and typed values; an optional id makes a create retry use the same
object ID. Companies, products, personas, markets, and use cases
are checked for existing identity matches before creation. A conflicting or
pending identity stops creation.
For context_update, context_remove, and context_owners, identify the
object with exactly one of id, name, or url. IDs and names also require
kind. An AX page URL carries its kind; company and product websites require
kind. Ambiguous or incomplete matches make no changes. Shared catalog
objects cannot be mutated through these tools.
context_update also takes expected_updated_at and values.
Omitted fields stay unchanged; null clears only nullable fields. A stale
revision conflicts. For a user flow, send flow_steps instead of values,
listing every current Step ID once in the desired order. Step content and
links remain unchanged.
context_remove also takes the expected effect (archive or delete). It checks dependencies itself and reports blockers without removing
anything. Live roots archive; permanently deleting an archived root requires
an organization admin. Other object kinds require effect: "delete".
An unexpected effect stops removal.
context_batch_mutate takes up to 100 operations, each a create or update
with the corresponding fields above (flow ordering is a single-object update).
Every operation must validate before any changes commit. A stale revision or
duplicate create rejects the whole batch.
context_owners also takes an operation: list, members,
assign, or unassign. Use members with optional search to find eligible
members, then pass a user_id to assign or unassign one owner. Other owners
stay assigned. Ownership grants no access or role. Use after with the
returned nextPageToken to continue a list or member search.
context_edit is organization-only. Its actions are read, options,
preview-delete, mutate, mutate-many, flow-steps, and document upload
actions. models and agent-versions are read-only through this editor.
Use mutate with kind user-flow-steps to create a Step or update its action
and expected_result. Use attach and detach on
user-flow-step-memberships, user-flow-step-interfaces, and
user-flow-step-capabilities to manage its links. flow-steps takes
{id,expectedUpdatedAt,steps:[{id}]}, with the Flow ID and existing Step IDs
in the desired order. Omitting a Step detaches its membership and preserves
the Step and its content.
On an archived
root (context_list with archived: "only" finds them), an org admin's
preview-delete and delete remove it permanently with its owned records;
records that restrict it are deleted or detached first. context_copy
accepts global companies, products, user flows, user flow steps, use cases, personas, and agents, and
carries their published tags into the organization library (reusing tags
matched by origin or name, creating the rest, and keeping local edits); a
name collision with a different organization tag fails the whole copy with a
message naming both tags. context_claim
can check companies, products, agents, personas, use cases, or documents;
ownership writes are limited to companies, products, and agents for
organization admins.
context_tags takes one action: targets, list, get, create,
update, delete, assign, unassign, usage, or assigned (the tags one
object carries, by kind and target_id), with snake_case fields
(tag_id, target_id, kind, name, color, patch,
expected_updated_at, expected_usage_count, search, after, limit,
include_usage, scope). Organization tags and their assignments are
editable; scope: "global" reads the shared library and refuses writes, and
shared objects take tag changes through the tags action of
context_suggestions instead of assign.
create returns the existing tag with created: false when the name is taken,
and assign and unassign are idempotent, so retries are safe. update
requires the tag's current updatedAt as expected_updated_at, and delete
requires the count from usage as expected_usage_count once a tag is in use;
when the count moved, the error message names the current count to confirm
with. usage items carry parentKind and parentId for nested objects such
as an interface under its product. context_list narrows taggable types to objects carrying any of the tags in
filters.tags (comma-separated tag ids), alongside its column filters.
context_match takes candidates, up to 50 objects each with a type
(companies, products, personas, markets, or use-cases)
and a name, website, or aliases. It answers each candidate in order
with the same result as POST /context/match:
matches starts with the existing object its exact identity belongs to (the
one research reuses), duplicates lists other objects with the same
identity, and lookAlikes are different objects whose names only look
similar, which are never matched. The optional different list contains live
rows previously marked Different; ordinary reruns do not ask about those pairs
again. To reconsider an answer, ask AX in web chat. MCP, CLI, and REST can read
these results but cannot record identity answers.
context_follow and context_follow_state act on global companies,
products, use cases, personas, and agents. They change or read only the
authenticated person's own follow state and never list other followers; org_id
only selects the organization whose feature rollout applies.
context_suggestions takes input, the same JSON action used by ax context suggest, and optional org_id. Actions are snapshot, submit, tags,
list, and withdraw. tags proposes shared-tag changes for any taggable
shared object: {"action":"tags","op":"snapshot","kind","targetId"} returns the
published tags plus the shared library, and {"action":"tags","op":"submit","kind","targetId","add","remove","reason","idempotencyKey"}
files the proposal. It never edits shared Context directly and cannot approve or
deny a suggestion. list and withdraw only access the authenticated user's
own suggestions; list takes requestKind (suggestion or tag_assignment)
to return one kind. Reuse a submission's idempotencyKey only when retrying
that same submission.
Notification tools
| Tool | What it does | CLI equivalent |
|---|---|---|
notification_feed | Read your notification feed, newest first. | None yet |
notification_feed_mark_read | Mark feed entries read by event_id. | None yet |
Both act only on the authenticated person's feed in the current MCP org.
notification_feed takes page_size (at most 100), cursor (the previous
result's next_cursor), and unread_only. Each entry is one changed object
with a stable event_id. notification_feed_mark_read takes 1 to 100
event_ids and returns marked_count; already-read or unknown ids are
ignored, so repeating it is safe. The same routes are
/api/v1/notifications.
Workflow guidance
| Tool | What it does | CLI equivalent |
|---|---|---|
learn | List task workflows, or one workflow's steps in order. | ax learn |
learn with no arguments lists the workflows you can follow with MCP tools;
pass a workflow's slug for its steps, in order. A tool step names the tool to
call and how to call it; other steps describe what to do between calls. The label-behaviors workflow appears only when behaviors
are enabled for one of your organizations.
Errors
Errors come back in one of two forms, following the MCP specification:
| Situation | What the client receives |
|---|---|
| The tool ran and failed, or its arguments did not match the tool's input schema | A tool result with isError: true. The text names the tool and the invalid field, for example Input validation error: Invalid arguments for tool run_view: .... |
| The tool name is not in the catalog | A JSON-RPC error with code -32602 and the message Tool <name> not found, not a tool result. |
| A renamed or retired tool from an older catalog | A tool result with isError: true that names the replacement tool. Reconnect to refresh the catalog. |
tools/list advertises each tool's input schema as JSON Schema draft 2020-12
($schema is https://json-schema.org/draft/2020-12/schema, shared
definitions sit under $defs).
Legacy tools
Kept for compatibility; prefer experiment_query, run_query, and
insight_* for new agent workflows.
| Tool | What it does | Use instead |
|---|---|---|
results_query | Org-wide read-only SQL. | experiment_query / run_query |
results_scatter | Deterministic per-run point sample (capped at 2,000; totalPoints / truncated disclose sampling). | experiment_query |
results_share | Mint a filtered public share URL (anyone with the URL can view). | No v0.6 equivalent yet |
The former analyze_* and persisted-findings tools are not in the current
catalog. The only current findings-related tool is findings_resolve, which
resolves run, tool-call, timeline, span, or prompt anchors into live trace
evidence; it is listed under Other tools.
Not in MCP
Some CLI commands have no direct MCP equivalent:
| CLI command | MCP equivalent | Notes |
|---|---|---|
ax experiment create | None | Creates a starter YAML file on the local filesystem. |
ax experiment validate | Partial: experiment_push | experiment_push validates while publishing a version. There is no read-only preflight validator for draft YAML. agent_version_validate validates agent-version coordinates, not the experiment YAML. |
ax experiment schema | None | Prints the experiment YAML schema. MCP tool input schemas do not provide this full schema document. |
ax experiment variants | None | Resolves draft YAML into variant coordinates and a fingerprint without running it. experiment_run submits a registered experiment instead. |
ax run rerun / ax run retest | None | Reruns failed or canceled variants, or reruns tests against existing run evidence. |
ax run watch | Poll run_view | There is no blocking watch tool. Call run_view again with the run request id to check progress. |
ax learn | learn | Lists MCP workflows and returns their tool steps. The MCP workflow guide is scoped to tasks agents can perform with MCP tools. |
ax experiment create writes a local file. Resolving local files into a
package also stays CLI-side: experiment_push accepts a staged package by
reference but never reads from or uploads a caller's local disk.
experiment_run can run registered experiments with files: after
ax experiment push has stored their dependencies. Insight export is a
client-side CLI operation; agents can consume the structured rows returned by
the query and insight tools.
Evals and datasets
See eval and dataset tools for definitions, results, immutable snapshot reads, explicit held-out reveals and dataset publication.
Agent version and model tools
| Tool | What it does | CLI equivalent |
|---|---|---|
agent_version_list | List registered agent versions, optionally filtered by model or latest supported version. | ax agent list |
agent_version_get | Read one exact agent version, artifact digests, and model compatibility. | ax agent version |
agent_version_validate | Validate agent-version coordinates for an experiment. | ax experiment validate |
agent_version_test | Start a compatibility check for one agent version and model. | None yet |
agent_version_test_get | Read the status and result of a compatibility check. | None yet |
model_list | List canonical models and registered agent versions that support them. | ax model list |
Behavior tools
Behavior tools are experimental and may change.
| Tool | What it does |
|---|---|
behavior_list | List behaviors. |
behavior_get | Read a behavior and its versions. |
behavior_children | List child behaviors and their current versions. |
behavior_create | Save a new behavior version and make it current. |
behavior_set_current | Select an existing unretired current version. |
behavior_retire_version | Retire one behavior version. |
behavior_retire | Retire a behavior. |
behavior_restore | Restore a retired behavior. |
behavior_mode | Set a behavior to logic or manual mode. |
behavior_tags | Read a behavior's tags. |
behavior_assignable_tags | List the tags the organization can assign: the standard 514 tags and its tag library. |
behavior_set_tags | Replace a behavior's tags. |
behavior_activity | Read observations and run activity for behaviors. |
behavior_feed | Read a behavior's activity feed: reviews, tag, description and related-behavior changes, and observations created. |
behavior_observations | Read behavior observations. |
behavior_related | Read the behaviors classified on the same observations as a behavior. |
behavior_metric | Read behavior rates grouped by agent, model, or variant. |
behavior_funnel | Read consideration, selection, installation, and usage outcomes. |
behavior_views | List saved behavior views. |
behavior_view_create | Save a behavior view. |
behavior_view_update | Update a saved behavior view. |
behavior_view_delete | Delete a saved behavior view. |
Other tools
| Tool | What it does | CLI equivalent |
|---|---|---|
feedback_send | Send product feedback with optional run or experiment references. Show the draft to the user and send only after they agree. | ax feedback send |
findings_resolve | Resolve run, tool-call, timeline, span, or prompt anchors into live trace evidence. | No direct equivalent |
get_slack_channel | Read the org's shared Slack channel and its latest invitation result. | None yet |
join_slack_channel | Request to join the org's shared Slack channel using the verified primary email. | None yet |
org_invite_members | Invite one or more email addresses to the current org. | ax org invite |