Skip to main content
Glama
Axonity Flow MCP Server

Axonity Flow MCP Server

Official
by AxonityAI

@axonity-ai/mcp — Axonity Flow MCP connector

A local Model Context Protocol server that lets an external agent (e.g. Claude Code on your laptop) read, draft, update, and recoverably delete workflows, agents (with their persona), tools, skills, policies, reference docs, output schemas, prompt snippets and flows in your Axonity tenant — the same verbs the internal Builder team has, minus direct publish.

It runs on your machine and talks to Axonity only over the public REST API, authenticated with a token for one workspace. The backend re-enforces tenant + scope on every call, so the connector is not a trust boundary for what it may do in Axonity. One thing only the connector decides: which local file leaves your machine. upload_run_input_file with path and start_workflow_run with triggerInputPath read any file the user running the connector may read, following symlinks, with no folder they are limited to, and the platform cannot tell what the file is. Use them with a connector running locally for someone who trusts it, and check the path before you approve the call — your MCP client's approval of each call is the guard.

Setup

  1. Have a token. The connector sends whatever AXONITY_TOKEN holds as a bearer, and the platform decides what it may do:

    • a personal token (axp_…) acts as you, within the limits it was made with (see Hosted by Axonity below for what that means per tool);

    • an existing service token (axs_…) keeps working until it expires or is revoked, but no new ones are made.

    Every token expires, and there is no way for the agent to check the remaining lifetime in advance: an expired token fails exactly like a revoked one, so get a fresh one when that happens. Copy a token once; you will not see it again.

  2. Add the connector to Claude Code:

    claude mcp add axonity \
      --env AXONITY_TOKEN=your_token_here \
      --env AXONITY_API_URL=https://app.axonity.ai \
      -- npx -y @axonity-ai/mcp

    AXONITY_API_URL is optional (defaults to the Axonity SaaS URL); set it if you self-host.

    Do not pass extra CLI arguments to axonity-mcp; startup only reads environment variables. If arguments are supplied, the process exits with a clear usage-style error.

  3. Ask Claude Code things like "list my Axonity workflows", "create a workflow called Onboarding", or "add a step to workflow X".

Related MCP server: genesys-mcp

Tools

474 tools total. axonity_conventions (read this first) covers the authoring rules — drafts vs live, optimistic locking, per-entity fields, delete/restore, and how to tell a retryable error from one that will never succeed. axonity_semantic_conventions is its counterpart for one job only: building a workspace's semantic layer. Both serve the platform's own rules, read live — there is no copy of them in this repository.

What the connector does not state is as deliberate as what it does: the mutation commands, the step types, the trigger types, the schedule-rule shapes and the three value vocabularies are all read live from get_workflow_authoring_spec, because every one of those lists drifted while it was kept here. A conformance test asserts their absence.

The generic entity family

Thirteen entities — workflow, agent, tool, skill, policy, reference_doc, output_schema, prompt_snippet, flow, data_table, measure, query, application — share one shape, though not every entity gets every verb (see the per-entity notes below for the exceptions):

Tool (per <entity>)

What it does

list_<plural>

List the tenant's entities.

read_<entity>

Read one by id (incl. its version — read before you update).

create_<entity>

Create a new draft.

update_<entity>

Update a draft (expectedVersion in the body; 409 on a stale write).

delete_<entity>

Soft-delete. Recoverable — see restore_<entity>.

restore_<entity>

Undo a delete. No version check.

list_deleted_<plural>

Restore candidates.

discard_<entity>_draft

Reset the draft to the last published state.

request_publish_<entity>

Ask for a draft to be published — creates a pending approval; never publishes.

Exception: list_data_tables (like list_measures, list_queries and list_applications) answers one page, not the whole library — see Tables below.

Three more entities use the same verbs without the draft ones — data_source, table_relationship, dashboard. None is versioned: a change is live when it is saved, so there is no discard_*_draft and no request_publish_*. Their lists are paged like list_data_tables. See Warehouses and dashboards below.

Some list routes narrow in the query, which is where narrowing belongs — the backend applies it before the rows come back: list_workflows({ stageId?, capabilityId? }), list_agents({ includeSystem? }), list_policies({ scope?, ownerId? }), list_reference_docs({ scope?, ownerId? }), list_prompt_snippets({ deleted? }), list_data_tables({ name?, status?, isDynamic?, filledBy? }), list_data_sources({ enabled? }), list_table_relationships({ tableId? }), list_measures({ tableId? }), list_applications({ name? }), list_queries({ dataSourceId? }).

That table is generated from the pinned schema's own query parameters (npm run generate:filters → src/generated/listFilters.ts), not hand-listed. A filter the backend adds is exposed as soon as the snapshot is refreshed, and a test fails if the two have parted. The argument names are camelCase; the wire keeps whatever spelling each route declares, which is not consistent between them and is not something a caller should have to know.

Plus:

  • get_workflow_authoring_spec — everything this deploy can be built from, read live from the server (GET /workflows/operations): the mutation operations, the triggerTypes, the stepTypes (including the ones you may not author, each with the reason and what to write instead), the scheduleRuleKinds (each with an example the backend round-trips through its own parser as it serves it), and three vocabularies for a value's type that are not interchangeable — parameterTypes (a trigger parameter's or workflow constant's type), outputKinds (a step output's or input's kind — narrower, different key) and schemaFieldKinds (inside a field's schema, which wins where present), plus decisionEvaluators (what a decision may branch with) and tableColumnKinds (a table column's kind). Getting the three value vocabularies wrong is silent: a kind written on a trigger parameter is not a 422, it is a key nothing reads, so the value falls back to text. Every list is generated from the registry that enforces it, so the connector states none of them and a new value is discoverable without a release here. operations is an index by default; pass types for a command's live payload schema. rulesVersion is a content hash over all of them — same hash, nothing to re-fetch.

  • get_entity_authoring_contract — the platform's create contract per entity kind (tool with each type's implementation, agent with its persona, application, measure, query, data_table, output_schema, policy, skill, reference_doc, prompt_snippet, toolbox, secret, conditional_trigger, trigger_element), read live from GET /api/v1/authoring/entity-contracts (axonity-flow#2103): { kinds, contracts, rulesVersion }, per kind the create/update fields and the publish.rules that stop it going live. Pass kinds to narrow it (sent as ?kinds=a,b; an unknown kind is the platform's 422). On a backend that does not serve it yet it says so plainly; it never falls back to a copy. The per-entity notes in axonity_conventions are marked subordinate to it.

  • apply_workflow_mutations for structural workflow edits (add steps, connect edges) via mutation commands, sequenced and version-threaded for you.

  • replace_workflow_document for one-shot full-document replacement in a single atomic PUT.

  • Both end with the platform's catalog-checked verdict: the connector runs validate_workflow on the stored workflow after the write and returns it, verbatim, as validation (catalogChecked, launchable, every issue). The write's own launchable is structural only. None of the platform's checks asks whether the editor can draw the document (#65).

  • read_workflow_trigger_parameters — how to start the workflow: { triggers, constants }, every start with its own parameters and a pinned flag marking the values the author owns.

  • bulk_delete_workflows — soft-delete several at once (each with its own expectedVersion).

Version history, rollback, and version-level delete

For the versioned entities (including flow, data_table, measure and application):

Tool

What it does

list_<entity>_versions

List version history (checkpoints + named majors).

read_<entity>_version

Read one, by integer checkpoint number.

restore_<entity>_version

Roll the draft back to an old version (expectedVersion in body).

delete_<entity>_version

Remove one history entry. Draft and published version are protected.

list_deleted_<entity>_versions

Restore candidates for the row above.

restore_deleted_<entity>_version

Undo the delete above. No version check.

read_<entity>_published

The live snapshot, as opposed to the draft.

create_<entity>_major_version

Cut a new named major version — "Save As" on the current draft.

ensure_<entity>_major_version

Make sure a working draft major version exists. Idempotent.

name_<entity>_major_version

Rename an existing major version (label a release).

{version} (an int) and {versionId} (a UUID) are two different identifiers across these routes — the tool parameter names say which.

Also

  • Personas: since axonity-flow#2176 a persona is the agent's persona field (the character text every prompt of the agent opens with), set with create_agent / update_agent and published with the agent. There is no persona entity any more: no id, versions or approvals of its own. read_agent_persona reads the field (with the agent's version) and create_agent_persona writes it (agentId, expectedVersion, persona); "" removes it, null on an update leaves it as it is.

  • An agent's team: one capability of the company model (capabilityId, a key of document.capabilities in read_company). create_agent takes it; on an existing agent set_agent_team (agentId, capabilityId, null for none) changes it — update_agent refuses it. It is on the agent's record, not in a version: it holds at once, with no publish.

  • Connectors (a tool of type connector): create_connector, update_connector — authConfig must be placeholders only; a human fills real secrets in Axonity. (create_tool/update_tool carry the same guard, so a connector authored either way is covered.) A connector must declare implementation.effect (reads | acts) before it can be published; a draft saves without it and the approval refuses it. responseMapping: { type: "file", filename? } keeps the answer as a file of the run and returns { fileId, filename, contentType, sizeBytes }, which Digitize documents and a sub-workflow's file parameter take.

  • Toolboxes (the group a tool is filed under): list_toolboxes, create_toolbox, update_toolbox, delete_toolbox, set_toolbox_tools, assign_tool_toolbox, set_toolbox_auth, list_toolbox_dependent_tools. Read list_toolboxes before create_tool and pass toolboxId — a tool made without one is ungrouped. Three things worth knowing before you write: set_toolbox_tools declares the membership (anything you leave out is evicted — assign_tool_toolbox moves a single tool and takes null to ungroup); a box never changes what an agent may call, only how a tool is advertised (agents link to individual tools, never to a box); and deleting a box leaves its tools alive, ungrouped. set_toolbox_auth sets the credential a box's tools share and carries the same placeholder guard as a connector.

  • Attach / detach memory: attach_skill_to_agent, attach_skill_to_workflow, attach_policy_to_agent, attach_reference_to_agent, attach_reference_to_workflow, and a detach_*_from_* for each. Detaching removes the link only — the skill or policy itself is untouched. Read the links back with list_agent_skills, list_agent_policies, list_agent_reference_docs, list_workflow_skills and list_workflow_reference_docs. The three agent read-backs take an optional workflowId for the composed runtime view — what the agent's prompt actually assembles inside that workflow, with a linkSource per row saying why each item is there.

  • What uses this?: list_workflows_using({ entityKind, entityId }) names the workflows that reference a tool, agent, flow, output schema or workflow, and the steps they reference it in, with draft/published per hit. list_dependent_agents({ entityKind, entityId }) is the same question for a skill, policy or reference doc. Ask before editing anything shared — the alternative is validating every workflow in the tenant.

  • Prompt elements (placement): a prompt_snippet is a library item; it only takes effect once placed into a flow step's prompt stack. read_workflow_prompt_stacks / read_flow_prompt_stacks resolve a workflow/flow to its steps and each step's system/user stacks (this is how you find the flowStepIds). Then attach_prompt_snippet_to_flow_step (target = system|user, with an order), update_flow_step_prompt, reorder_flow_step_prompts, detach_prompt_snippet_from_flow_step, and list_flow_step_prompts / list_wildcard_prompts.

  • Company (the tenant's single company document — a singleton, no id): read_company, update_company (whole-document save with expectedVersion), list_company_versions, read_company_version, restore_company_version, name_company_major_version, create_company_major_version, ensure_company_major_version, read_company_published, apply_company_mutation (one validated, version-safe command — preferred over the whole-document update_company, the same way apply_workflow_mutations is preferred for a workflow), and request_publish_company (takes no id — the server resolves your tenant's one company; direct company publish is closed to service tokens).

  • Subworkflows: list_callable_workflows — which workflows a subprocess step may call, each with its parameters and outcomes, and a blockedReason for the ones that cannot (never published, or no subprocess-invocation trigger). Authoring both halves is ordinary apply_workflow_mutations work — a callable workflow's signature goes into the add_trigger call itself. validate_workflow does check a subprocess target now (missing, self-call, deleted, unpublished, not callable), but list_callable_workflows is still what you run first: it is how you pick a target and read the interface you are binding to.

  • The deploy, the tenant and its queues (read-only): read_deploy_contract (what this backend actually mounts — read it when a call fails in a way that smells like a version mismatch), list_users (where an ownerId comes from), list_audit_events (pass actorKind: "service_token" to read back what external agents — including you — changed), read_queue_overview, list_in_flight_runs, read_task_queue_summary, list_task_queue, read_task_queue_item, export_task_queue, plus read_model_tier_map (what capabilityTier resolves to), read_concurrency_status, read_concurrent_run_cap and read_for_each_rate. Together these answer why is my run not moving without asking a human to look at a screen. Every write in these families — purging or replaying queue work, changing a cap or the tier map, importing a tenant bundle, reading someone's notifications — is deliberately absent and recorded in test/denyList.ts, the list test/exclusions.test.ts enforces.

  • Secrets (read-only): list_secrets, read_secret — the catalogue a connector's authConfig.secretId points at. Values are never returned by any Axonity route; valueKeys says which keys a human has filled in, so you can tell an unfinished secret from a finished one before wiring to it. Creating or changing a secret is a human act in Axonity (#39).

  • Catalog & cloning: list_system_tools (read-only catalog — enabling one for an agent is update_agent with the id added to systemToolIds), clone_flow, clone_prompt_snippet, list_tool_packages (the import allowlist validate_tool_code judges against), list_templates / read_template.

  • Tables (data_table): the tenant's own reference data — a table an author designs and maintains, and agents and decisions read. The whole lifecycle is the generic family above; three things are not, and each is a way to be quietly wrong:

    • list_data_tables is paged (20 by default, 200 max), like list_measures, list_queries and list_applications, because a tenant's reference data has no ceiling. Page one is not the library — follow nextCursor while hasMore, or narrow with name, which is exact and unique per workspace.

    • rows and columns are whole-collection fields. Sending rows through update_data_table replaces the table's content; one row there deletes every other. add_data_table_row, update_data_table_row and delete_data_table_row address a single row by a matchColumn / matchValue pair and cannot touch the rest.

    • A table's derived tools follow its published version. A published table mints its own CRUD tools, so granting an agent access to one is ordinary tool granting. list_data_table_tools reports offered (what the draft would yield), toolId (whether a row exists) and isLive (whether a run can reach it) separately — an author who ticked "may add rows" and has not published has granted nothing yet.

  • The semantic model (data_source, query, data_table, table_relationship, measure, concepts and their links, dashboard): a workspace connects a warehouse such as BigQuery, named queries read it, dynamic tables are filled by those queries on a schedule, measures define the numbers over those tables, concepts say what each word and number means, and dashboards show the measures. Read axonity_semantic_conventions before building one — the platform serves those rules.

    • list_data_source_drivers first: each warehouse's configFields are the keys create_data_source takes in config, so nothing about BigQuery is hard-coded here and a new warehouse works without a connector release. The warehouse key lives in a vault secret a human fills; the source points at it by secretId.

    • test_data_source answers { ok, message } — a failure is an answer, not an error. read_data_source_schema reads the warehouse's catalogue for free, dataset by dataset on a source limited to allowedDatasets. query_data_source runs read-only SQL with capped rows (truncated says when rows were left out); a 422 is the query being refused, a 502 is the warehouse.

    • A query is its own versioned entity (query): the generic family plus the version tools, request_publish_query, test_query (run it once with values; it suggests the returns), read_query_usage (the read tool its publication mints, and which agents hold it) and list_query_live_versions. It carries the SQL, the source, the grain, its typed parameters and its described returns.

    • There is no sync object, and no provenance. A table says what fills it in filledBy — author, workflow, query or source (the rows stay in a data source; external says where) — and a query-filled table names its query in fillingQueryId and when it runs in rhythm ({ cron, timezone, keyColumns, mode, enabled }). Whether a table is read live or as published follows from its versioning (live or config; only an author's table may choose), and a measure reads every table whose rows Flow holds. refresh_data_table fills a query-filled table now instead of at its next turn (it does not wait for the result; read the table's fill afterwards).

    • Concept links: a concept's refersTo points at one thing; link_concept, unlink_concept and list_concept_links hang the same word on every column, table, measure, value or query that means it. The links are rows of the concept_links table and go live when that table is published.

    • A measure is its own versioned entity: the generic family plus the version tools, request_publish_measure, and list_measure_live_versions. It names the concept it means in concept, and the questions it answers in questions. read_measure_design now returns a table's columns and time axis only; list_measures({ tableId }) says which measures read it.

    • A measure is one formula, definition.expression: sum(orders.amount), [revenue_d2c] + [revenue_retail], divide([cm1], [net_revenue]). get_measure_formula_spec is the only list of its words — the platform's own, the one its editor shows — and with includeWorkspace: true also this workspace's measures, tables and columns. validate_measure checks a formula without saving it and answers with every problem by code. read_measure returns the formula as text beside the stored tree and the aggregations it folds down to. The fields from before the formula (tableId, clearTable, aggregation, column, numerator, denominator) are refused with legacy_field.

    • Time over a date table: create_data_table / update_data_table take dateTable: true and calendars (name, the column per grain, one default) — what shift, to_date, rolling and running are measured in. read_measure_design shows them.

    • Explaining a number: query_measures takes explain: true (what each part of the formula gave, on the total, per period and per group) and useDraftChain; a refusal carries its code. read_measure says what a measure rests on (dependsOn) and what rests on it (usedBy, dashboards). delete_measure is refused with still_referenced, publishing with depends_on_unpublished / unverified_relationship (the approval names what moves with it in changesWith), and a table or relationship change that would break a published measure with breaks_measure.

    • Concepts: list_concepts, create_concept, update_concept, delete_concept — kind (concept, state, metric, rule), name, meaning, synonyms, what it refers to, owner. They are rows of one table the platform keeps per workspace, so they are published with request_publish_data_table on the tableId every write returns.

    • What moves a number (influences): list_measure_influences, link_measures, update_measure_influence, unlink_measures — one measure moves another from outside its formula, with an effect (same or opposite), why, owner (a role as text) and an optional basis. A link the formula already makes, a duplicate and a loop are refused; a planned row marks a link that is still missing and may name a measure not built yet. The rows live in the measure_influences table, go live when it is published and travel with the deploy like the measures. read_measure_tree reads formula parts and influences as one graph ({ root, nodes, edges, missing }), published by default; read_measure shows influencedBy and influences.

    • Reading numbers: query_measures (up to 40 questions, each answered on its own, measures named by their handle), list_measure_rows (a list tile). Plus duplicate_dashboard. Besides the periods that run to date, last_3_full_months, last_12_full_months and year_to_last_full_month end at the last full month. last_quarter is the previous completed calendar quarter. Both question and row tools accept period: null with start/end dates (end inclusive) for a chosen month or quarter.

    • Expected ranges: choose definition.rangeMethod explicitly from the live formula spec's rangeMethods; no method, grain or history length is invented by the connector. query_measures with expected: true returns the server's band and historical basis, or the reason none is available. Series points retain expectedBasis, expectedReason and partial. power_undefined warnings locate the affected total, group or point. The formula spec and validation also carry power unchanged.

    • Number cards: query against names another measure; the answer keeps its value, gap and errors separate from the status. Report changes as changeKind says: delta in points for a percentage/score, change as a percentage for a relative change. A dashboard number tile accepts config.against: {measure, label?} and config.sparkline (none, trend, bullet); number and trend tiles accept showExpected. A dashboard's periodPicker selects free, full_periods or hidden. These settings are forwarded and validated by the backend; read the tool descriptions before changing them, and preserve the whole layout on update.

    • A reference doc has no semanticKind any more; the platform refuses it and the other retired fields and says where each one went.

  • Applications (application): a program an agent operates through an executor — a Windows program (win32) or a website (web) — with its limits, what the agent may never do in it (processes, windows, keys, buttons, folders, domains, secrets by name). The generic family and the version tools, and request_publish_application: an executor receives only the published limits, so only a human makes them live.

    • Executors: set_application_executors / read_application_executors choose the machines an application runs on (the whole set at once); list_executors, read_executor, read_executor_applications and list_executor_commands only read. Registering or revoking an executor is a human's job — it mints a token, and no tool here ever returns one.

    • What it has learned: list_application_knowledge (elements, instructions, lessons, one page at a time) and list_application_knowledge_versions; forget_application_knowledge, restore_application_knowledge and write_application_knowledge to correct it. Linking executors and changing knowledge are reserved for a workspace administrator on the platform, and a service token always counts as a member, so today those answer with a refusal that says so.

  • Who may read what (labels, audiences, roles): every policy, skill, reference doc and table carries a label — level (public, internal, confidential) and audienceIds, whom it is meant for. list_audiences / read_audience give the ids to put there, list_roles / read_role say what each role reads and maintains, and read_member_roles which roles a colleague holds. Leave the label out and it gets the default (internal, for Staff); level: null makes a thing readable by nobody. Narrowing a label is always allowed; widening it is a colleague's act, and the refusal says so. An agent's clearance is set by an administrator; a workflow's by its author, through the publish approval. Managing audiences and roles is not here yet.

  • The knowledge graph (Cortex), read with the token's own clearance: search_knowledge_graph, list_knowledge_topics, list_topic_facts, read_fact (passages, sources, certainty, validity, which run taught it), read_source, list_knowledge_tree, list_related_topics and list_archived_facts. Maintaining one fact, as the person who made the token (only for audiences that person maintains, recorded in their name): archive_fact, restore_fact, confirm_fact, reject_fact, correct_fact, relabel_fact, give_right_version. With the module off, every call says so in plain words.

  • list_deleted_prompt_snippets calls /api/v1/prompt-snippets/deleted; the backend returns it as { items: [... ] }, and the tool forwards that response unchanged.

Validate and run before you publish

Tool

What it does

validate_workflow

Check a workflow against the tenant's catalog. By document: the document as it stands, saves nothing, read-only-token safe; skips only the checks about that workflow's own wiring (its triggers and attached knowledge). By workflowId: the saved workflow with those checks too; needs a token with the author scope. Read catalogChecked.

analyze_workflow_reachable_outputs

What a given step can read from upstream — bind inputs to real fields instead of guessing. Stateless and read-only-token safe.

validate_tool_code

Syntax and banned-pattern check for Python tool code. Stateless and read-only-token safe.

format_tool_code

Format tool code with Black. Stateless and read-only-token safe.

execute_tool

Actually RUN tool code (not just validate it) and see the real output.

execute_stored_connector

Test-run an already-saved connector. The backend decrypts its real secret server-side — the agent supplies only input parameters and never sees the secret.

Triggers — what makes a workflow run

list_/create_/delete_ for webhook triggers (plus rotate_webhook_trigger), cron schedules, and conditional triggers (plus update_conditional_trigger and list_tenant_conditional_triggers). Trigger deletes are hard deletes with no restore, and a webhook token is shown once at create or rotate.

A schedule is a claim you can now check. run_cron_schedule_now fires one immediately without moving nextFireAt — testing a schedule must not consume the run it was going to make. Before it existed, "every weekday at 07:00" could only be tested by coming back tomorrow, and what is usually wrong is not the timing but whether it starts anything at all.

To pause a schedule, disarm it — set_cron_schedule_enabled, not delete_cron_schedule. Deleting throws away the rules the author wrote and makes "stop this for a week" indistinguishable from "we do not do this any more". list_all_cron_schedules answers what runs tonight? across the tenant; reconcile_cron_schedules answers is that actually what runs? — it reports rather than tidying silently, and never arms something someone switched off.

create_cron_schedule takes either cronExpr or the richer rules, and the trigger must exist in the published document. Rule shapes come from get_workflow_authoring_spec → scheduleRuleKinds; this connector names none of its own.

A conditional start is authored in the workflow, not on its row. The trigger element (typeId: "conditional-poll", a UUID id) carries conditionText, repeatIntervalMinutes and the check (checkKind plus that kind's settings) on its config, written with apply_workflow_mutations. Publishing the workflow creates or updates the row from the document, and removes the rows whose element is gone. The platform refuses a check sent to create_/update_conditional_trigger — so those tools no longer take one, and create_conditional_trigger (rarely what you want) now sends the workflowId the platform's body schema requires. Without a check, every beat starts the workflow: a mailbox on fifteen minutes makes ninety-six empty runs a day. "automatic" decides with no model (a plan, its outputs, and a startsWhen rule); "agent" makes the beat a run whose first step asks an agent.

Runs — evaluating what you built

start_workflow_run (test a workflow you built — it runs the published workflow and really executes), upload_run_input_file, cancel_run, delete_run, list_runs, list_workflow_runs, read_run, read_run_trace, read_run_cost, read_runs_summary, archive_run / unarchive_run, bulk_archive_runs / bulk_delete_runs. There is no findings endpoint — evaluation means reading a run's validator verdicts and its trace.

Which start, and what it wants. read_workflow_trigger_parameters answers { triggers, constants } — every way the workflow can be started, each with its own parameters. Pass the one you mean to start_workflow_run as triggerId; omitting it fires the first, which on a workflow with a button and a schedule is an arbitrary choice. A parameter marked pinned is one the author owns: it is overwritten on every run, so a caller must not send it.

A start input too large to write out. Give start_workflow_run a triggerInputPath instead of triggerInput: an absolute path to a JSON file on the machine the connector runs on, holding the start input as one JSON object. The connector reads it and sends that object as triggerInput, unchanged, so its content never passes through the conversation. At most one of the two. A file that is not UTF-8 JSON holding one object is refused in words, without quoting the file.

A start that takes a file. upload_run_input_file stores a file the way the start form in Axonity does (POST /api/v1/run-input-files) and answers its reference, { fileId, filename, contentType, sizeBytes, sha256 }. Put that reference in triggerInput under a parameter the start declares as a file, or in a list under one declared as a list of file. Give the file as path (an absolute path on the machine the connector runs on; the bytes never pass through the conversation) or as contentBase64 (when the file is not on that machine). One upload serves one run, and only a start by hand (start_workflow_run or Run in Axonity) takes it. An upload no run takes within 24 hours is deleted; a file a run took is kept as long as that run exists.

read_run omits the workflow snapshot by default. It is immutable, it is never the answer to a question about the run, and it measured 81% of one real response — an oversized response turns a call that succeeded into an error. Pass includeSnapshot: true when you actually want to see what executed.

Start from the outline. read_run_outline is the run's table of contents — the run, its steps, and the items a fan-out handed out, flat with parent pointers. It carries no bodies, so its size follows the run's shape rather than its content: a launch over four thousand items costs about what one over four costs. itemCap bounds the items listed per fan-out step and the remainder is counted in counts.truncated, never dropped silently — read_run_outline_items carries on from where the outline stopped, one step at a time, walked by offset (safe here: a fan-out's items are fixed once handed out, so the ordering cannot shift under you). Then open only what you want: read_run_value for one large step value (by the digest in stepStates) and read_run_invocation_messages for one agent's transcript (by the id in agentInvocations). Reading a whole run to find one message is the habit these replace.

A run can park rather than finish. Where you see it depends on what it waits on: list_todo_steps has every step that waits on a person (a question, a plan, a manual or decision step); read_run_waiting_on has a timer and an answer or callback result on its way; a FOR EACH batch is on read_run_for_each_progress; a conversation run waits in its chat. answer_run_question answers an ask_user step and send_run_message sends a turn to a conversation run. Both record the input as a person's, so use them on runs you started. Deciding a plan approval and restarting a stuck run are deliberately absent — the first is the human review the step exists to get, the second is require_admin and a service token is always role="member". Both are recorded in test/denyList.ts, together with stopping runs in bulk (admin), the tenant's storage footprint (admin), an inbound channel reply (authenticated by the email/WhatsApp adapter, not by a service token) and the retired workflow-memory placeholder.

Testing the Dashboard Analyst. A chat about a dashboard is a run of kind conversation; list_runs asks for workflow runs only. list_conversations lists the chats (paged, newest first, only the ones opened by the person the token belongs to) in one of two ways: for one dashboard (dashboardId, with status, createdAfter/createdBefore and q, text in the opening question — the backend's GET /conversations), or across every dashboard that person can see, filtered by status, createdAfter/createdBefore and includeArchived (the backend's GET /runs?kind=conversation). What one route has and the other has not is refused instead of dropped: includeArchived with a dashboard, and q without one. The two read a bare createdBefore date differently; the tool says how. Who opened a chat cannot be filtered on at all. start_conversation opens a new one with an opening question and, optionally, the tile it is about (focus) — the same request the dashboard's chat window sends. A follow-up is send_run_message. The answer and the tools the analyst called (read_measure, show_visual, with their arguments) are in the transcript: read_run, then read_run_invocation_messages on the orchestrator row. Starting a chat needs a token with the author scope, a follow-up the operate scope. The Builder chat and its files stay out of reach.

list_todo_steps is every step in the tenant waiting on a person: an unanswered question, a plan awaiting approval, a manual step or a decision step. Each item belongs to one agent or none (agentId) — a question or plan to the agent that asked, a manual or decision step to the workflow's owner — and agentId on the call narrows the list to that agent's items. It is paged over the waiting runs, so items can be longer than pageSize — one run may park several steps — or shorter. Follow nextCursor to the end before concluding anything about how much is waiting. read_run_waiting_on is a different read: a run's pending wake-tasks (a timer; an answer or a callback's result on its way), where an open question, a FOR EACH batch and a callback still running never appear.

What an agent wrote to itself. list_run_session_memory lists the files an agent left during a run (metadata only, up to 200 per run) and read_run_session_memory_file opens one. When the trace shows a decision but not what it was reading, the reason is usually here. Workflow-bound reference material is not — that lives in reference_docs.

Inside a launch: read_run_items_summary is the roll-up ("4,415 processed · 12 failed"), list_run_items({ outcome }) the paged rows — filter in the query, because the failures are scattered and sifting page one finds none of them. list_run_tasks and read_run_for_each_progress cover the children a run set in motion.

list_workflow_runs({ workflowId, status?, archivedOnly?, limit?, cursor? }) returns one page — { items, nextCursor, pageSize, hasMore }, 20 by default and 200 at most — so follow nextCursor while hasMore is true rather than treating the first page as the answer. It also lists launches, not runs: the per-item runs a FOR EACH creates stay inside their launch, so a launch over 4,415 people is one entry carrying forEachProgress. list_runs is the tenant-wide list and is now paged the same way — { items, nextCursor, pageSize, hasMore }, walked with cursor. It stopped answering with a bare array when the backend converted the route; the offset it used to take is no longer read.

Approvals

list_publish_approvals({ status?, limit?, offset? }) and get_publish_approval({ approvalId }) — how you find out whether a request_publish_* was approved or rejected. Approving and rejecting are human-only actions in Axonity.

request_publish_release({ workflowId, changeSummary? }) proposes a release: a workflow and everything its run needs — the agents it runs (each with its persona), their tools, the flows it pins, the memory scoped to those agents — as ONE approval. Prefer it over a request per entity. Taking a tenant live entity-by-entity means a hundred-odd approvals, none of which means anything on its own, and a human asked that many times is not reviewing. list_publish_releases and get_publish_release read one back — the release's members, and its readiness recomputed as of now.

Unlike request_publish_bulk, a release is all-or-nothing and in dependency order: approving it publishes every member or none, so a workflow can never go live calling a tool that did not. The response carries the bundle's verdict — ready, changedCount of totalCount (unchanged members are already live and ride along), members with why each is there, and blockers that name the member in the way. Requesting is ours; deciding stays human, like everywhere else here.

Hosted by Axonity (HTTP mode)

The same tools also run inside Axonity, behind its own /mcp endpoint, for a person who connects with a personal token (axp_…) instead of running the connector locally. Axonity starts this package with AXONITY_MCP_TRANSPORT=http; you do not run that mode yourself. The local connector above (stdio, a service token) is unchanged and is still the default.

What differs in hosted mode:

  • One token per request. The process holds no token of its own (AXONITY_TOKEN set is refused at startup). Each request brings its caller's personal token as a bearer, and the API is called with that token only. A request without an axp_ bearer is answered 401.

  • Each tool says what a personal token needs, before the call. A personal token reads what its person reads; actions need "Run actions" on the token, drafts and publication requests need "Build drafts and request publication", and every other route is closed to it. Axonity decides that per route and enforces it on every call; the hosted tool texts are worded from the same table (src/generated/tokenRouteClasses.ts, pinned from backend/scripts/dump_token_route_classes.py in axonity-flow). A tool on a closed route keeps its name and says why it is closed.

  • No local files. upload_run_input_file takes contentBase64 only, and start_workflow_run takes triggerInput only: the process runs on the Axonity server, so a path or triggerInputPath would name a file there, and it is refused before anything is read.

  • Stateless, with a ceiling. Every message is its own POST (no sessions; GET and DELETE on /mcp are 405; a batch is answered 400). A request waits in three rooms in turn, and a caller that hangs up while it waits leaves the queue: its token's own (AXONITY_MCP_MAX_IN_FLIGHT_PER_TOKEN, default 2, and AXONITY_MCP_MAX_QUEUED_PER_TOKEN, default 4; one more is answered 429, so one token cannot fill what everybody shares), for a body over AXONITY_MCP_LARGE_BODY_BYTES (default 1 MiB) or one that does not say its size, one of AXONITY_MCP_MAX_LARGE_BODIES (default 1), and then one of AXONITY_MCP_MAX_IN_FLIGHT seats (default 4) with AXONITY_MCP_MAX_QUEUED (default 32) waiting, past which it is answered 503. A seat is kept until the work is done, also when the caller hangs up, and every API call ends after AXONITY_MCP_API_TIMEOUT_MS (default 300000). A body over AXONITY_MCP_MAX_BODY_BYTES (default 25 MB) is answered 413 before it waits for anything.

  • A message is bounded by what it holds, not only by its size. The heap hangs on what a parse builds: 10 MB of {}, is 3.3 million objects and ended the process (V8 heap limit), where a 10 MB base64 file is one string. The structure marks {, [ and , outside strings (every object, array item and member) are counted as the body arrives; a message with more than AXONITY_MCP_MAX_STRUCTURE (default 50000) is answered 400 before it is parsed, with the limit in the error. A file sent as base64 has none. That bounds one message, not the sum, so the messages in work at once also share one budget, AXONITY_MCP_MAX_STRUCTURE_IN_FLIGHT (default 100000, never less than the limit per message): a message is weighed after it is read and before it is parsed, and one that does not fit waits its turn (first come, first served) while it holds its seat, so past the seats and the queue it is the same 503. The seat and the budget go back when the answer has left the process, not when the handler returns: a failed call of a big message answers with a thousand times its size (97 KB of numbers is 10.9 MB of validation errors through apply_workflow_mutations), and those answers piled up past the heap when the seats went back early. Measured with the real process and the V8 limits Axonity starts it with (macOS RSS, 5 runs per case): twelve and twenty messages of 49 500 marks at once from different tokens, numbers 49500 through apply_workflow_mutations, died in 3 of 5 and 4 of 5 runs before; they now die in 0 of 5 (peak 219–229 MB and 224–235 MB). Without the budget, with only the rule about the answer, 20 at once also lived (0 of 5, peak 245–280 MB): the rule about the answer is the cause that was found, the budget is the bound that does not depend on what the answers weigh. One message at the limit lives at 50000 and at 100000 (slowly: 8–10 s) and ended at 200000, so the budget is kept under that. Not every tool was measured (3 of 473), and a tool with a still more expensive schema may sit closer to it. An answer that stands still for 30 seconds without being read is cut with its connection, so a caller that does not read cannot keep a seat for ever.

  • Measured (macOS RSS, Node 22, 473 tools, the V8 limits Axonity starts it with): about 85–95 MB at rest; 209–292 MB with fifty requests at once (five times over, measured before the structure limit and not repeated after it); four 24 MB bodies at once 247 MB with the big-body place and 369–407 MB without it, which is why it stays. Not measured on Linux.

  • It listens on 127.0.0.1:AXONITY_MCP_PORT only and calls AXONITY_API_URL, which has no default in this mode.

Refresh the route table after the backend changes it:

node scripts/generate-token-route-classes.mjs --flow ../axonity-flow

A test fails when a tool calls a route the pinned table does not know.

What this is for — and what it is not

Authoring. An agent composing an entity from intent: drafting a workflow, writing a tool, wiring memory onto an agent, and checking its own work. That is what these tools are built for.

Not bulk migration. Do not use the connector to move many entities verbatim from one place to another. Axonity's config export/import moves bytes with no model in the path and fails closed on secrets; content routed through an agent can be subtly altered in transit, which is precisely the risk a fidelity migration cannot take.

Guardrails

These are enforced by the backend, not merely by convention:

  • The connector never publishes. request_publish_* creates a pending approval; a human approves it in Axonity, and only then does the draft go live. A direct publish from a service token is refused with a 403, so there is no tool for it and no way around it.

  • A read-only token is genuinely read-only for mutations. Any write from a token without the author scope is refused with a 403 (write is its older name; a token with only operate may only answer, message and recover runs).

  • The four analysis tools are the exception: validate_workflow({ document }), analyze_workflow_reachable_outputs, validate_tool_code, and format_tool_code can be called by read-only tokens because they never mutate state; validate_workflow({ workflowId }) needs the author scope.

  • The token is tenant-bound. An agent cannot reach another tenant.

  • Secrets never pass through the agent. A connector's authConfig accepts placeholders only; a write carrying something that looks like a real credential is rejected before it leaves the connector. Tenant secrets (/api/v1/secrets) are readable and unwritable: list_secrets / read_secret give the catalogue and valueKeys (which keys are filled, never their values) so an agent can point authConfig.secretId at the right entry, and no tool can create, change or delete one — the backend refuses a service token there too. A secret's metadata is stored unencrypted and readable tenant-wide (axonity-flow#908), so credential-shaped entries in it are withheld on read and listed under metadataRedacted.

  • Errors carry a machine-readable code, not just prose. A 409 can mean a stale write (retry) or a live reference conflict (don't — see axonity_conventions); the connector tells them apart by code, never by matching the message text.

  • No tool crosses the authority boundary. A test drives the whole registered surface and fails the build if any tool targets a publish / approve / secret-write / service-token / deploy route (test/denyList.ts). The rules are method-aware: GET /api/v1/secrets is allowed, every write verb on it is not.

  • Guidance can't silently drift from the backend. The field/enum facts the connector states are pinned to a vendored snapshot of the backend OpenAPI schema; test/conformance.test.ts fails if a route or documented enum diverges (see test/fixtures/README.md).

  • Every backend route is decided, and the build says so. test/completeness.test.ts partitions all 444 operations in the pinned snapshot into covered by a tool or excluded by a rule that carries a written reason, and fails on anything in neither. A route nobody has decided about is indistinguishable from one somebody is still working on, which is what made "is this connector finished?" a question you could only answer with an audit. It is now a build status: a new backend route arrives as a red build asking cover it, or exclude it with a reason?

One known exception, not enforced: a framework-provided flow is meant to be read-only to a tenant, but the backend does not actually block update_flow/delete_flow against one. Prefer clone_flow over editing a framework flow in place.

Development

npm install
npm run typecheck
npm test
npm run build   # emits dist/

Releasing

One command.

npm run release:minor     # or release:patch / release:major

That is the whole procedure. It refuses to start unless you are on main with nothing uncommitted, resets main to exactly what is on GitHub, then installs, tests and builds before touching the version — so anything that can fail, fails while there is still nothing to undo. Only then does it bump, push, tag, publish, and read the version back from npm to confirm it landed.

You need to be logged in first, once per machine. Run it in a real terminal: npm login prints a URL and waits for the browser, so an editor's two-minute command timeout will kill it mid-flow.

npm login
npm whoami                # confirm the account

Why a script and not a list of steps. The list used to live here, and the ORDER was load-bearing: sync first, or the version bump lands on a stale checkout. That went wrong twice in one week, identically both times — the bump was made on a tree missing the last merge, the branch push was refused, and the tag went up anyway. Recovering meant deleting a published tag and hard-resetting, which is not something a release should ever require. The script pushes the branch before the tag for the same reason: a refused push then leaves nothing behind.

Check the contract before a release that matters. Shipping with a stale snapshot is how the connector fell nine operations behind the backend without any test noticing:

npm run check:contract          # expects ../axonity-flow; override with AXONITY_FLOW_PATH

It dumps the schema from a local axonity-flow checkout and diffs it against test/fixtures/openapi.snapshot.json, naming every operation that moved. It runs here rather than in CI because the publish runs here — a gate in CI cannot stop a local npm publish.

After releasing, optionally cut a GitHub release for the tag. That triggers Verify release, which rebuilds and packs the tagged commit without publishing — it catches a tag cut from a state CI cannot install.

Keep npm 11 locally: Node 20 bundles npm 10, whose resolver writes an incompatible lockfile tree. CI pins npm 11 for the same reason.

The package bundles its dependencies (bundleDependencies): the tarball carries the tree npm ci installed from package-lock.json, so whoever installs it — Axonity's image and Windows package included — runs the versions the tests ran on, not whatever the ranges allow that day. scripts/release.sh runs npm ci before it publishes, which is what makes the tree the lock's; test/bundledDependencies.test.ts fails if a dependency is left out or the tree on disk is not the lock's. A tarball is about ten times larger for it (3.1 MB packed, 15.5 MB unpacked, at 0.29.0). npm-shrinkwrap.json would pin the same but npm 12 does not pack it.

Staying level with the backend

The snapshot every drift guard reads is only as fresh as the last time someone regenerated it — and once it wasn't: it sat nine operations behind the backend while the whole suite stayed green, because a snapshot that has not seen a route cannot report it missing.

Before a release, check it (see §Releasing): npm run check:contract dumps the schema from a local axonity-flow checkout and names every operation that moved. It compares the contract surface — query parameters, request body, response shape — and not descriptions, so backend docstring churn does not cry wolf. This is the gate that counts, because the publish runs here too.

At startup, the connector asks the deploy what it mounts. It calls GET /api/v1/contract once before accepting its first tool call and, if this backend lacks a route this build needs, says which on stderr — instead of failing on the twentieth call, mid-task. It is a diagnostic and never a dependency: a backend too old to serve /contract, an unreachable one, or a slow one all degrade to the previous behaviour and the connector starts normally. The result is cached on the contractHash the route returns, so an unchanged deploy costs one request.

Not here: a scheduled job. Watching for drift on a timer belongs in axonity-flow, not in this repository. The schema lives there, its CI already has the backend's dependencies installed, and it can read this repository's pinned snapshot over plain HTTPS because this repository is public — where the reverse needs a credential for a private repo, with an approval policy and an expiry behind it. Tracked in axonity-mcp#48.

Available Tools

242 tools
analyze_workflow_reachable_outputsA

List the outputs a given step can read — i.e. what upstream steps make available to it. Use it to bind a step's inputs to real upstream outputs instead of guessing field names. Stateless, and safe for read-only service tokens.

Inputs: stepId (required), document (required).

apply_workflow_mutationsA

Apply structural mutation commands to a workflow draft (add/remove steps, connect edges, set conditions). Read the workflow first for its version. Commands are applied IN ORDER, one backend call each, with the version threaded automatically — pass the version you read, not one per command.

RESPONSE IS A SUMMARY, not the document: version, appliedCount, launchable, validationIssues, stepCount, edgeCount. A real workflow document can exceed the response limit, which would turn a call that SUCCEEDED into an error you must not retry. Pass returnDocument: true, or call read_workflow, when you need the document itself.

Not transactional: if command N fails, commands before it stay applied and the error reports how many landed and which index failed — resume from there, do NOT replay the list. On a 409 conflict, re-read and retry.

Each command is { "type": "add_step", "payload": { … } }; the flat form { "type": "add_step", … } is accepted too. Valid types: update_workflow, add_trigger, update_trigger, remove_trigger, update_trigger_operator, group_triggers, ungroup_triggers, move_trigger, add_step, add_loop, update_step, remove_step, move_step, add_edge, update_edge, remove_edge, add_decision_condition, convert_to_loop, setup_loop_decision, advanced_edit, attach_output_schema, detach_output_schema.

PAYLOAD CONTRACT:

  • add_step builds a COMPLETE step in ONE call: { name, position: {after|before: , …} } are required, and id, type, typeId, config, contract, inputs, outputs and edgeType are all accepted alongside them. No follow-up update_step is needed merely to fill the step in.

  • add_edge accepts the document's own from/to as well as fromStepId/toStepId, and HONOURS an id you supply rather than replacing it, so ids stay diffable against an environment you are reproducing.

  • Payloads are STRICT: an unknown or misspelled key is a 422 that names it, never a silent drop. Read the error instead of assuming a value landed.

TWO INVARIANTS RUN AFTER EVERY EDIT, and the response reports what they did in systemAdjustments (addedEdges / removedEdges / rederivedInputs):

  • Every step is guaranteed to reach the END point; the platform wires that edge itself. An edge you did not ask for is this, and it is listed.

  • A bound input's contract, its description included, is DERIVED from the output it reads and cannot be authored on its own. Set the text on the PRODUCING step's output; a downstream description changing by itself is this rule at work, and the inputs it re-derived are listed.

Inputs: id (required), mutations (required), expectedVersion (required), returnDocument.

archive_runA

Archive a run — hides it from the default run list without deleting it. Reversible with unarchive_run.

Inputs: runId (required).

attach_policy_to_agentA

Scope a policy to a agent so the agent uses it. Verify it landed with list_agent_policies before request_publish_agent — the link lives outside the entity body, so re-reading the agent will not show it.

Inputs: agentId (required), policyId (required).

attach_prompt_snippet_to_flow_stepA

Place a library prompt snippet into a flow step's prompt stack. Choose the channel (target: system/user) and its order in that channel. This is what makes a snippet actually shape the step's prompt — creating the snippet alone does nothing. Returns the created link (with its linkId) so you can reorder or detach it later.

Inputs: target (required), snippetId (required), flowStepId (required), displayOrder.

attach_reference_to_agentA

Scope a reference to a agent so the agent uses it. Verify it landed with list_agent_reference_docs before request_publish_agent — the link lives outside the entity body, so re-reading the agent will not show it.

Inputs: refId (required), agentId (required).

attach_skill_to_agentA

Scope a skill to a agent so the agent uses it. Verify it landed with list_agent_skills before request_publish_agent — the link lives outside the entity body, so re-reading the agent will not show it.

Inputs: agentId (required), skillId (required).

attach_skill_to_workflowC

Scope a skill to a workflow so the workflow uses it.

Inputs: skillId (required), workflowId (required).

axonity_conventionsA

Read the authoring conventions BEFORE creating or updating anything: the draft→publish lifecycle, optimistic locking, per-entity create contracts (required fields, valid enum values, what 'complete' means), how to WIRE tools→agents, agents/tools→workflows and delegation, and how to reproduce a setup by creating new entities and remapping ids (never copy an id across tenants).

Inputs: no named parameters.

bulk_archive_runsA

Archive up to 500 runs at once. Reversible — archived runs can be unarchived individually. Returns counts of succeeded and failed.

Inputs: runIds (required).

bulk_delete_runsA

Delete up to 500 runs at once. IRREVERSIBLE — unlike archiving, deleted runs do not come back, and their traces and cost history go with them. Prefer bulk_archive_runs unless a human has explicitly asked for deletion. Returns counts of succeeded and failed; a partial failure is possible.

Inputs: runIds (required), confirm (required).

bulk_delete_workflowsA

Soft-delete several workflows at once (each recoverable with restore_workflow, like single delete_workflow). Each target needs its own current version for optimistic locking — read each first. Returns a per-workflow success/error result; a partial failure is possible.

Inputs: confirm (required), workflows (required).

cancel_runA

Cancel an in-flight run. Stops further steps; already-completed steps and their side effects are not undone.

Inputs: runId (required).

clone_flowA

Fork a flow into a new, independent, tenant-owned copy — including a framework-provided one. Prefer this over editing a framework flow directly: it is visible and NOT actually protected from update_flow/ delete_flow (a backend gap, despite what its docstrings claim), so editing one in place risks changing something other tenants share.

Inputs: flowId (required).

clone_prompt_snippetA

Duplicate a prompt snippet into a new, independent copy.

Inputs: snippetId (required).

create_agentA

Create a new agent draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created agent with its id and version.

Inputs: fields (required).

create_agent_personaA

Create an agent's persona. Pass name, characterText and optional status.

Inputs: fields (required), agentId (required).

create_conditional_triggerA

Create a conditional trigger on a workflow: an agent checks conditionText every repeatIntervalMinutes and fires the workflow when it is met.

Inputs: agentId (required), triggerId (required), workflowId (required), conditionText (required), +2 more.

create_connectorA

Create a connector draft (a tool of type 'connector'). Do NOT put real credentials in authConfig — use placeholders; a human fills secrets in Axonity.

Inputs: fields (required).

create_cron_scheduleA

Schedule a workflow to run on a cron expression.

Inputs: cronExpr (required), triggerId (required), workflowId (required), enabled, +1 more.

create_flowA

Create a new flow draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created flow with its id and version.

Inputs: fields (required).

create_output_schemaA

Create a new output_schema draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created output_schema with its id and version.

Inputs: fields (required).

create_policyA

Create a new policy draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created policy with its id and version.

Inputs: fields (required).

create_prompt_snippetA

Create a new prompt_snippet draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created prompt_snippet with its id and version.

Inputs: fields (required).

create_reference_docA

Create a new reference_doc draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created reference_doc with its id and version.

Inputs: fields (required).

create_skillA

Create a new skill draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created skill with its id and version.

Inputs: fields (required).

create_toolA

Create a new tool draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created tool with its id and version.

Inputs: fields (required).

create_webhook_triggerA

Create a webhook trigger on a workflow. Returns the trigger AND its plaintext token — shown ONCE and never retrievable again. Hand the token to your human immediately; do not store it in an entity field.

Inputs: triggerId (required), workflowId (required), expectedInputSchema.

create_workflowA

Create a new workflow draft. Pass the entity's fields (camelCase) in fields; the backend validates them. Returns the created workflow with its id and version.

Inputs: fields (required).

delete_agentA

Delete a agent. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_agent (it will not appear in list_agents until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_agent_versionA

Permanently remove one entry from a agent's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_agent_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_conditional_triggerA

Delete a conditional trigger. HARD delete — the row is removed and cannot be restored.

Inputs: confirm (required), triggerId (required).

delete_cron_scheduleA

Delete a cron schedule. HARD delete — the row is removed and cannot be restored. The workflow stops running on this schedule immediately.

Inputs: confirm (required), scheduleId (required).

delete_flowA

Delete a flow. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_flow (it will not appear in list_flows until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_flow_versionA

Permanently remove one entry from a flow's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_flow_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_output_schemaA

Delete a output_schema. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_output_schema (it will not appear in list_output_schemas until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_output_schema_versionA

Permanently remove one entry from a output_schema's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_output_schema_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_personaA

Delete a persona. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_persona (it will not appear in list_personas until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_persona_versionA

Permanently remove one entry from a persona's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_persona_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_policyA

Delete a policy. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_policy (it will not appear in list_policies until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_policy_versionA

Permanently remove one entry from a policy's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_policy_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_prompt_snippetA

Delete a prompt_snippet. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_prompt_snippet (it will not appear in list_prompt_snippets until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_prompt_snippet_versionA

Permanently remove one entry from a prompt_snippet's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_prompt_snippet_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_reference_docA

Delete a reference_doc. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_reference_doc (it will not appear in list_reference_docs until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_reference_doc_versionA

Permanently remove one entry from a reference_doc's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_reference_doc_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_runA

Delete ONE run. IRREVERSIBLE — the run and its trace and cost history go with it. Prefer archive_run unless a human has asked for deletion. For many at once use bulk_delete_runs.

Inputs: runId (required), confirm (required).

delete_skillA

Delete a skill. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_skill (it will not appear in list_skills until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_skill_versionA

Permanently remove one entry from a skill's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_skill_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_toolA

Delete a tool. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_tool (it will not appear in list_tools until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_tool_versionA

Permanently remove one entry from a tool's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_tool_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

delete_webhook_triggerA

Delete a webhook trigger. HARD delete — the row is removed and cannot be restored, and any caller using its token starts failing immediately.

Inputs: confirm (required), webhookId (required).

delete_workflowA

Delete a workflow. Destructive, but RECOVERABLE — it is soft-deleted and can be brought back with restore_workflow (it will not appear in list_workflows until then). Read it first for its version. A 409 here may be a stale version (re-read and retry) or a reference conflict (something published still uses it — re-reading will not help; the error tells you which).

Inputs: id (required), confirm (required), expectedVersion (required).

delete_workflow_versionA

Permanently remove one entry from a workflow's version history. The working draft and the currently published version are protected and cannot be targeted this way. Recoverable with restore_deleted_workflow_version until it is purged for good.

Inputs: id (required), confirm (required), versionId (required).

detach_policy_from_agentA

Unscope a policy from a agent. This only removes the link — the policy itself is not deleted and stays available to attach elsewhere. The response is the SERVER'S answer, not a success claim by this connector: a detach that had nothing to remove reports that instead of failing, so read the body rather than assuming the link is gone. Confirm what is left with list_agent_policies.

Inputs: agentId (required), policyId (required).

detach_prompt_snippet_from_flow_stepA

Remove a prompt snippet from a flow step's stack. This only unlinks it — the snippet itself is not deleted and stays available to place elsewhere. Identify the link by its linkId (from list_flow_step_prompts). This route answers 204 with no body, so the result confirms the call was accepted and nothing more — read the stack back with list_flow_step_prompts to see what is actually attached.

Inputs: linkId (required).

detach_reference_from_agentA

Unscope a reference from a agent. This only removes the link — the reference itself is not deleted and stays available to attach elsewhere. The response is the SERVER'S answer, not a success claim by this connector: a detach that had nothing to remove reports that instead of failing, so read the body rather than assuming the link is gone. Confirm what is left with list_agent_reference_docs.

Inputs: refId (required), agentId (required).

detach_skill_from_agentA

Unscope a skill from a agent. This only removes the link — the skill itself is not deleted and stays available to attach elsewhere. The response is the SERVER'S answer, not a success claim by this connector: a detach that had nothing to remove reports that instead of failing, so read the body rather than assuming the link is gone. Confirm what is left with list_agent_skills.

Inputs: agentId (required), skillId (required).

detach_skill_from_workflowA

Unscope a skill from a workflow. This only removes the link — the skill itself is not deleted and stays available to attach elsewhere. The response is the SERVER'S answer, not a success claim by this connector: a detach that had nothing to remove reports that instead of failing, so read the body rather than assuming the link is gone.

Inputs: skillId (required), workflowId (required).

discard_agent_draftA

Discard uncommitted draft edits on a agent, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_flow_draftA

Discard uncommitted draft edits on a flow, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_output_schema_draftA

Discard uncommitted draft edits on a output_schema, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_persona_draftA

Discard uncommitted draft edits on a persona, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_policy_draftA

Discard uncommitted draft edits on a policy, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_prompt_snippet_draftA

Discard uncommitted draft edits on a prompt_snippet, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_reference_doc_draftA

Discard uncommitted draft edits on a reference_doc, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_skill_draftA

Discard uncommitted draft edits on a skill, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_tool_draftA

Discard uncommitted draft edits on a tool, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

discard_workflow_draftA

Discard uncommitted draft edits on a workflow, resetting it to its last published state. Fails if it has never been published — there is no published state to fall back to.

Inputs: id (required).

dry_run_toolA

Prove a SAVED tool by running its OWN stored code in the sandbox. This is the run that satisfies the publish gate: a clean pass stamps the tool's current version and clears the dry_run_required blocker, so request_publish_tool can succeed. Nothing about the code is supplied by you — only sample input — which is exactly why it counts and why execute_tool does not. Editing the tool afterwards bumps its version and invalidates the proof, so dry-run again after your last edit, not before it. Expect a refusal for tools that have no code to prove: 403 for a platform-shipped (locked) tool, 422 for a connector, a builtin-backed validator, or a tool with an empty implementation.

Inputs: toolId (required), inputParams.

execute_stored_connectorA

Test-run an ALREADY-SAVED connector by its tool id — the backend loads its stored authConfig and decrypts the real secret server-side; nothing credential-shaped ever passes through this tool or through you. Takes only input parameters, nothing else — there is no way to point this at a URL or auth config of your choosing (that admin-only, body-supplied form exists on the backend precisely so a client like this one can never reach it, since it would otherwise let a caller exfiltrate a decrypted secret).

Inputs: toolId (required), inputParams.

execute_toolA

Run tool code directly, WITHOUT saving it — the way to test a tool you are authoring, before create_tool/update_tool. Returns stdout/stderr, the result, and a typed errorType (timeout/memory/import/runtime/validation) on failure. Pass toolId to run against an already-saved tool's context.

This does NOT satisfy the publish gate, however cleanly it runs. It executes the functions YOU supply, which need not be the tool's stored code, so a pass here proves nothing about what would actually ship. To clear the dry_run_required blocker on a SAVED tool, use dry_run_tool — that runs the tool's own stored implementation and is the only run that counts.

Inputs: functions (required), toolId, classes, imports, +2 more.

format_tool_codeA

Format Python tool code with Black and return the formatted source. Stateless and safe for read-only service tokens — it does not save anything.

Inputs: code (required).

get_publish_approvalA

Read one publish approval by id — lets you poll a specific request rather than re-fetching the whole list. Its readiness is recomputed on this read, so it reflects the entity as it stands NOW; readinessAtRequest keeps what the requester saw and readinessChanged flags a difference. This is how you check whether a blocker (for a tool, typically dry_run_required) has since been cleared.

Inputs: approvalId (required).

list_agent_policiesA

List the policy currently scoped to an agent — the read-back for attach_policy_to_agent. Use it to confirm a link took, or to read a source agent's wiring before recreating it. Read-only.

Inputs: agentId (required).

list_agent_reference_docsA

List the reference_doc currently scoped to an agent — the read-back for attach_reference_doc_to_agent. Use it to confirm a link took, or to read a source agent's wiring before recreating it. Read-only.

Inputs: agentId (required).

list_agentsA

List all agents in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_agent_skillsA

List the skill currently scoped to an agent — the read-back for attach_skill_to_agent. Use it to confirm a link took, or to read a source agent's wiring before recreating it. Read-only.

Inputs: agentId (required).

list_agent_versionsA

List a agent's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_agent_version.

Inputs: id (required), type, limit, offset.

list_company_versionsA

List the company document's version history — checkpoints and major versions.

Inputs: type, limit, offset.

list_conditional_triggersA

List a workflow's conditional triggers — an agent evaluates a condition on an interval and starts the workflow when it holds.

Inputs: workflowId (required).

list_cron_schedulesA

List a workflow's cron schedules, with their next and last fire times.

Inputs: workflowId (required).

list_deleted_agentsB

List soft-deleted agents — the restore candidates for restore_agent.

Inputs: no named parameters.

list_deleted_agent_versionsA

List a agent's deleted version rows — restore candidates for restore_deleted_agent_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_flowsA

List soft-deleted flows (reusable workflow fragments) — the restore candidates for restore_flow.

Inputs: no named parameters.

list_deleted_flow_versionsA

List a flow's deleted version rows — restore candidates for restore_deleted_flow_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_output_schemasA

List soft-deleted output schemas (reusable step/agent output contracts) — the restore candidates for restore_output_schema.

Inputs: no named parameters.

list_deleted_output_schema_versionsA

List a output_schema's deleted version rows — restore candidates for restore_deleted_output_schema_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_personasA

List soft-deleted personas (an agent's character, 1:1 with the agent) — the restore candidates for restore_persona.

Inputs: no named parameters.

list_deleted_persona_versionsA

List a persona's deleted version rows — restore candidates for restore_deleted_persona_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_policiesA

List soft-deleted policies (rules and guardrails for agents) — the restore candidates for restore_policy.

Inputs: no named parameters.

list_deleted_policy_versionsA

List a policy's deleted version rows — restore candidates for restore_deleted_policy_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_prompt_snippetsA

List soft-deleted prompt snippets (reusable prompt fragments) — the restore candidates for restore_prompt_snippet.

Inputs: no named parameters.

list_deleted_prompt_snippet_versionsA

List a prompt_snippet's deleted version rows — restore candidates for restore_deleted_prompt_snippet_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_reference_docsA

List soft-deleted reference docs (background knowledge for agents) — the restore candidates for restore_reference_doc.

Inputs: no named parameters.

list_deleted_reference_doc_versionsA

List a reference_doc's deleted version rows — restore candidates for restore_deleted_reference_doc_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_skillsA

List soft-deleted skills (reusable know-how for agents) — the restore candidates for restore_skill.

Inputs: no named parameters.

list_deleted_skill_versionsA

List a skill's deleted version rows — restore candidates for restore_deleted_skill_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_toolsA

List soft-deleted tools (functions, connectors, validators, evaluators) — the restore candidates for restore_tool.

Inputs: no named parameters.

list_deleted_tool_versionsA

List a tool's deleted version rows — restore candidates for restore_deleted_tool_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_deleted_workflowsA

List soft-deleted workflows (business processes) — the restore candidates for restore_workflow.

Inputs: no named parameters.

list_deleted_workflow_versionsA

List a workflow's deleted version rows — restore candidates for restore_deleted_workflow_version. Deleted version numbers stay reserved (not reused), so gaps in the numbering are expected, not corruption.

Inputs: id (required).

list_flowsA

List all flows (reusable workflow fragments) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_flow_step_promptsA

List the prompt snippets attached to a flow step — its system and user prompt stacks, each entry with its link id and display order. This is how you see a step's current prompt composition before changing it. Excludes wildcard snippets (see list_wildcard_prompts). Read-only.

Inputs: flowStepId (required).

list_flow_versionsA

List a flow's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_flow_version.

Inputs: id (required), type, limit, offset.

list_output_schemasA

List all output schemas (reusable step/agent output contracts) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_output_schema_versionsA

List a output_schema's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_output_schema_version.

Inputs: id (required), type, limit, offset.

list_personasA

List all personas (an agent's character, 1:1 with the agent) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_persona_versionsA

List a persona's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_persona_version.

Inputs: id (required), type, limit, offset.

list_policiesA

List all policies (rules and guardrails for agents) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_policy_versionsA

List a policy's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_policy_version.

Inputs: id (required), type, limit, offset.

list_prompt_snippetsA

List all prompt snippets (reusable prompt fragments) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_prompt_snippet_versionsA

List a prompt_snippet's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_prompt_snippet_version.

Inputs: id (required), type, limit, offset.

list_publish_approvalsA

List this tenant's publish approvals and their status — how you find out whether a request_publish_* was approved or rejected. Optionally filter by status, and page through with limit/offset. Approving and rejecting are human-only actions in Axonity; no tool can do them.

Readiness is recomputed WHEN YOU READ, not frozen at request time: readiness is the verdict right now, readinessAtRequest is what the requester saw, and readinessChanged says whether it moved. So a blocker you saw an hour ago may already be resolved — and 'ready' means ready now.

Inputs: limit, offset, status.

list_reference_docsA

List all reference docs (background knowledge for agents) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_reference_doc_versionsA

List a reference_doc's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_reference_doc_version.

Inputs: id (required), type, limit, offset.

list_runsA

List workflow runs across the tenant, newest first. Archived runs are excluded unless includeArchived is true. To list runs of ONE workflow, use list_workflow_runs instead — this route has no workflow filter.

Inputs: limit, offset, status, createdAfter, +2 more.

list_skillsA

List all skills (reusable know-how for agents) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_skill_versionsA

List a skill's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_skill_version.

Inputs: id (required), type, limit, offset.

list_system_toolsA

List the tenant's system-tool catalog (id, label, description, category). There is no grant/revoke tool — enable one for an agent by adding its id to systemToolIds via update_agent.

Inputs: no named parameters.

list_toolsA

List all tools (functions, connectors, validators, evaluators) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_tool_versionsA

List a tool's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_tool_version.

Inputs: id (required), type, limit, offset.

list_webhook_triggersA

List a workflow's webhook triggers. Secrets are never returned — a trigger's token is shown only once, when it is created or rotated.

Inputs: workflowId (required).

list_wildcard_promptsA

List the tenant's wildcard prompt snippets — those that apply to EVERY flow step (they sit at the top of each step's prompt stack). Use this for cross-cutting instructions that should hold everywhere, rather than attaching the same snippet to every step by hand. Read-only.

Inputs: no named parameters.

list_workflow_runsA

List the runs of one workflow. Note this route takes archivedOnly (show ONLY archived runs), which is not the same as list_runs' includeArchived.

Inputs: workflowId (required), archivedOnly.

list_workflowsB

List all workflows (business processes) in your Axonity tenant (id, name, status, version).

Inputs: no named parameters.

list_workflow_versionsA

List a workflow's version history — checkpoints (every save) and major versions (named releases). Use this to find the versionId you need for restore_workflow_version.

Inputs: id (required), type, limit, offset.

name_agent_major_versionA

Give a agent's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_agent_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_company_major_versionA

Give one of the company document's major versions a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_company_versions), not a checkpoint or a versionId. Like everything else on this singleton it takes no id. This only renames; it does not create, publish, or roll anything back.

Inputs: name (required), majorVersion (required).

name_flow_major_versionA

Give a flow's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_flow_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_output_schema_major_versionA

Give a output_schema's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_output_schema_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_persona_major_versionA

Give a persona's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_persona_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_policy_major_versionA

Give a policy's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_policy_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_prompt_snippet_major_versionA

Give a prompt_snippet's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_prompt_snippet_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_reference_doc_major_versionA

Give a reference_doc's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_reference_doc_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_skill_major_versionA

Give a skill's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_skill_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_tool_major_versionA

Give a tool's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_tool_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

name_workflow_major_versionA

Give a workflow's major version a name — label a release so it is easy to find in history. Targets a MAJOR version by its integer number (from list_workflow_versions), not a checkpoint or a versionId. This only renames; it does not create, publish, or roll anything back.

Inputs: id (required), name (required), majorVersion (required).

read_agentA

Read one agent by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_agent_personaA

Read an agent's persona (voice/character). A persona is 1:1 with an agent — there is no standalone persona list.

Inputs: agentId (required).

read_agent_publishedA

Read the LIVE published version of a agent — what the runtime actually uses, as opposed to the draft that read_agent returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_agent_versionA

Read one historical version of a agent by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_agent_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_companyA

Read this tenant's company document (its current draft and version). There is one company per tenant — no id. Read it before you update, to get the version for optimistic locking.

Inputs: no named parameters.

read_company_publishedA

Read the LIVE published company document — what the runtime uses, as opposed to the draft read_company returns. Diff the two to see what a publish would change.

Inputs: no named parameters.

read_company_versionA

Read one historical company version by its CHECKPOINT NUMBER (the integer version from list_company_versions), including its document.

Inputs: version (required).

read_flowA

Read one flow by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_flow_prompt_stacksA

The flow-scoped counterpart of read_workflow_prompt_stacks: resolve a flow to its steps and their system/user prompt stacks (flowStepId, link ids, order). Read-only.

Inputs: flowId (required).

read_flow_publishedA

Read the LIVE published version of a flow — what the runtime actually uses, as opposed to the draft that read_flow returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_flow_versionA

Read one historical version of a flow by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_flow_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_output_schemaA

Read one output_schema by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_output_schema_publishedA

Read the LIVE published version of a output_schema — what the runtime actually uses, as opposed to the draft that read_output_schema returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_output_schema_versionA

Read one historical version of a output_schema by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_output_schema_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_personaA

Read one persona by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_persona_publishedA

Read the LIVE published version of a persona — what the runtime actually uses, as opposed to the draft that read_persona returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_persona_versionA

Read one historical version of a persona by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_persona_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_policyA

Read one policy by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_policy_publishedA

Read the LIVE published version of a policy — what the runtime actually uses, as opposed to the draft that read_policy returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_policy_versionA

Read one historical version of a policy by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_policy_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_prompt_snippetA

Read one prompt_snippet by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_prompt_snippet_publishedA

Read the LIVE published version of a prompt_snippet — what the runtime actually uses, as opposed to the draft that read_prompt_snippet returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_prompt_snippet_versionA

Read one historical version of a prompt_snippet by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_prompt_snippet_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_reference_docA

Read one reference_doc by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_reference_doc_publishedA

Read the LIVE published version of a reference_doc — what the runtime actually uses, as opposed to the draft that read_reference_doc returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_reference_doc_versionA

Read one historical version of a reference_doc by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_reference_doc_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_runA

Read one run in full: status, per-step state, the workflow snapshot it ran against, trigger input, agent invocations, and validator verdicts. The verdicts are the closest thing to evaluator findings — there is no separate findings endpoint.

Inputs: runId (required).

read_run_costA

Read a run's token and cost breakdown, per agent and model.

Inputs: runId (required).

read_runs_summaryA

Counts of runs by state across the tenant (running, waiting, completed, failed, expired, total).

Inputs: no named parameters.

read_run_traceA

Read a run's chronological tool-call trace — each entry has the step, the tool, its arguments, its output, and any error. This is what you read to work out WHY a run behaved as it did.

Inputs: runId (required).

read_skillA

Read one skill by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_skill_publishedA

Read the LIVE published version of a skill — what the runtime actually uses, as opposed to the draft that read_skill returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_skill_versionA

Read one historical version of a skill by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_skill_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_toolA

Read one tool by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_tool_publishedA

Read the LIVE published version of a tool — what the runtime actually uses, as opposed to the draft that read_tool returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_tool_versionA

Read one historical version of a tool by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_tool_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

read_workflowA

Read one workflow by id, including its current draft and version. Read before you update — you need the current version.

Inputs: id (required).

read_workflow_prompt_stacksA

Resolve a workflow to its flow steps and each step's prompt stack in one read: per step you get its flowStepId, name, and its system/user prompt snippets (with link ids and order). This is how you discover the flowStepIds you need before placing prompts, and how you see a workflow's whole prompt composition. Read-only.

Inputs: workflowId (required).

read_workflow_publishedA

Read the LIVE published version of a workflow — what the runtime actually uses, as opposed to the draft that read_workflow returns. Diff the two to see what a pending publish would change.

Inputs: id (required).

read_workflow_trigger_parametersA

Read the input parameters a workflow's triggers expect — what a caller must supply to start it. Use this before authoring a webhook/cron/conditional trigger, or before start_workflow_run, so the trigger input matches. Read-only.

Inputs: workflowId (required).

read_workflow_versionA

Read one historical version of a workflow by its CHECKPOINT NUMBER (an integer like 3, from the version field in list_workflow_versions) — not by its versionId. Use it to diff two versions before rolling back.

Inputs: id (required), version (required).

reorder_flow_step_promptsA

Set the full ordering of a flow step's prompt snippets in one call. Pass the snippet ids in the order you want them; the backend replaces the step's ordering with this list. Read the step first (list_flow_step_prompts) so you include every snippet — omitting one is a reorder, not a safe no-op.

Inputs: flowStepId (required), snippetIds (required).

replace_workflow_documentA

Replace the ENTIRE workflow document in one atomic call. Read the workflow first to get the current version, then call this again only after rereading on a stale 409. Unlike apply_workflow_mutations, this is a single PUT and treats the payload as the complete editable document — prefer the mutation commands, which the backend validates and normalises per edit.

The response is the same SUMMARY (version, launchable, validationIssues, stepCount, edgeCount), not the stored document; pass returnDocument: true or call read_workflow for that.

Inputs: id (required), document (required), expectedVersion (required), returnDocument.

request_publish_agentA

Request that a agent be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_bulkA

Request publication of MANY entities in one call — the same human approval queue as request_publish_*, one entry per entity, up to 200. Taking a whole tenant live means hundreds of individual requests otherwise, which turns the human review it exists for into clicking through. This does NOT publish and does NOT approve: a human still decides, in Axonity.

NOT TRANSACTIONAL: each entry carries its own outcome and one failure does not undo the entries before it. The response is { results: [{ id, success, status, error }], succeededCount, failedCount }. Read the per-entry results — retrying the whole list because failedCount is non-zero double-requests everything that worked.

Inputs: requests (required).

request_publish_companyA

Request that the company document be published. Like request_publish_* for every other entity, this does NOT publish — it creates a pending approval a human approves in Axonity. Company is a singleton, so unlike the others this takes NO id: the server resolves the one company from your tenant. (Direct company publish is closed to service tokens — this is the only path.)

Inputs: changeSummary.

request_publish_flowA

Request that a flow be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_output_schemaA

Request that a output_schema be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_personaA

Request that a persona be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_policyA

Request that a policy be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_prompt_snippetA

Request that a prompt_snippet be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_reference_docA

Request that a reference_doc be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_skillA

Request that a skill be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_toolA

Request that a tool be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

request_publish_workflowA

Request that a workflow be published. This does NOT publish it — it creates a pending approval a human approves in Axonity. Returns the pending approval (with its readiness).

Inputs: id (required), changeSummary.

restore_agentA

Undo delete_agent — bring a soft-deleted agent back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live agent now holds a name/slot this one also claims.

Inputs: id (required).

restore_agent_versionA

Roll a agent's DRAFT back to an earlier version. Takes the versionId (a UUID from list_agent_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_company_versionA

Roll the company draft back to an earlier version. Takes the versionId (a UUID from list_company_versions), not the checkpoint number. Changes only the draft; what is live stays live until a human publishes.

Inputs: versionId (required), expectedVersion (required).

restore_deleted_agent_versionA

Undo delete_agent_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_agent_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_flow_versionA

Undo delete_flow_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_flow_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_output_schema_versionA

Undo delete_output_schema_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_output_schema_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_persona_versionA

Undo delete_persona_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_persona_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_policy_versionA

Undo delete_policy_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_policy_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_prompt_snippet_versionA

Undo delete_prompt_snippet_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_prompt_snippet_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_reference_doc_versionA

Undo delete_reference_doc_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_reference_doc_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_skill_versionA

Undo delete_skill_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_skill_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_tool_versionA

Undo delete_tool_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_tool_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_deleted_workflow_versionA

Undo delete_workflow_version — bring a removed version row back into history. This does NOT change the current draft (unlike restore_workflow_version); it only makes the row visible/restorable again. Takes no version check.

Inputs: id (required), versionId (required).

restore_flowA

Undo delete_flow — bring a soft-deleted flow back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live flow now holds a name/slot this one also claims.

Inputs: id (required).

restore_flow_versionA

Roll a flow's DRAFT back to an earlier version. Takes the versionId (a UUID from list_flow_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_output_schemaA

Undo delete_output_schema — bring a soft-deleted output_schema back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live output_schema now holds a name/slot this one also claims.

Inputs: id (required).

restore_output_schema_versionA

Roll a output_schema's DRAFT back to an earlier version. Takes the versionId (a UUID from list_output_schema_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_personaA

Undo delete_persona — bring a soft-deleted persona back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live persona now holds a name/slot this one also claims.

Inputs: id (required).

restore_persona_versionA

Roll a persona's DRAFT back to an earlier version. Takes the versionId (a UUID from list_persona_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_policyA

Undo delete_policy — bring a soft-deleted policy back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live policy now holds a name/slot this one also claims.

Inputs: id (required).

restore_policy_versionA

Roll a policy's DRAFT back to an earlier version. Takes the versionId (a UUID from list_policy_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_prompt_snippetA

Undo delete_prompt_snippet — bring a soft-deleted prompt_snippet back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live prompt_snippet now holds a name/slot this one also claims.

Inputs: id (required).

restore_prompt_snippet_versionA

Roll a prompt_snippet's DRAFT back to an earlier version. Takes the versionId (a UUID from list_prompt_snippet_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_reference_docA

Undo delete_reference_doc — bring a soft-deleted reference_doc back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live reference_doc now holds a name/slot this one also claims.

Inputs: id (required).

restore_reference_doc_versionA

Roll a reference_doc's DRAFT back to an earlier version. Takes the versionId (a UUID from list_reference_doc_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_skillA

Undo delete_skill — bring a soft-deleted skill back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live skill now holds a name/slot this one also claims.

Inputs: id (required).

restore_skill_versionA

Roll a skill's DRAFT back to an earlier version. Takes the versionId (a UUID from list_skill_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_toolA

Undo delete_tool — bring a soft-deleted tool back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live tool now holds a name/slot this one also claims.

Inputs: id (required).

restore_tool_versionA

Roll a tool's DRAFT back to an earlier version. Takes the versionId (a UUID from list_tool_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

restore_workflowA

Undo delete_workflow — bring a soft-deleted workflow back. Takes no version check (a restore must never lose to a stale-version guard). Can 409 if a live workflow now holds a name/slot this one also claims.

Inputs: id (required).

restore_workflow_versionA

Roll a workflow's DRAFT back to an earlier version. Takes the versionId (a UUID from list_workflow_versions), NOT the checkpoint number. The current draft is snapshotted first, so this is itself undoable. It changes only the draft — what is live stays live until a human approves a new publish.

Inputs: id (required), versionId (required), expectedVersion (required).

rotate_webhook_triggerA

Rotate a webhook trigger's token. Returns the new plaintext token ONCE. The old token keeps working for a short grace period so callers can be migrated.

Inputs: confirm (required), webhookId (required).

start_workflow_runA

Start a real run of a workflow — the way to TEST a workflow you just authored. This EXECUTES: it runs the PUBLISHED workflow against live infrastructure (models, connectors), so it can incur cost and cause real side effects. It does not run your unpublished draft. After starting, follow it with read_run / read_run_trace / read_run_cost. Optionally pass triggerInput to feed the workflow's trigger.

Inputs: workflowId (required), manualPhases, triggerInput.

unarchive_runA

Restore an archived run to the default run list.

Inputs: runId (required).

update_agentA

Update a agent draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_companyA

Save the company draft as a WHOLE document (full-document PUT, not a field merge). Read it first for its version; on a 409 conflict re-read and retry. This writes the draft only — a human publishes it in Axonity (company is not part of the request_publish_* approval flow).

Inputs: document (required), expectedVersion (required).

update_conditional_triggerA

Change a conditional trigger's condition, interval, agent, or enabled flag. Send only what you are changing.

Inputs: triggerId (required), agentId, enabled, conditionText, +1 more.

update_connectorA

Update a connector draft (a tool of type 'connector'). Read it first for its version; keep authConfig as placeholders only.

Inputs: id (required), fields (required), expectedVersion (required).

update_flowA

Update a flow draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_flow_step_promptA

Change an existing flow-step prompt attachment: move it between the system and user channel, and/or change its display order. Identify it by its linkId (from list_flow_step_prompts or the attach response), NOT the snippet id. Send only what you are changing.

Inputs: linkId (required), target, displayOrder.

update_output_schemaA

Update a output_schema draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_personaA

Update a persona draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_policyA

Update a policy draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_prompt_snippetA

Update a prompt_snippet draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_reference_docA

Update a reference_doc draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_skillA

Update a skill draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_toolA

Update a tool draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

update_workflowA

Update a workflow draft. Read it first to get expectedVersion; on a 409 conflict, read again and retry. Pass only the fields you are changing (camelCase) in fields.

Inputs: id (required), fields (required), expectedVersion (required).

validate_tool_codeA

Check Python tool code for syntax errors and banned patterns before saving it on a tool. Returns valid plus errors (line, column, message, severity, functionName). Stateless and safe for read-only service tokens.

Inputs: functions (required), classes, imports.

validate_workflowA

Check a workflow for problems. Returns launchable, catalogChecked, and an issues list (each with code, message, severity, stepIds, edgeIds).

Pass EXACTLY ONE of workflowId or document — they answer different questions:

  • workflowId → validates the STORED workflow against this tenant's catalog. This is the real 'can this run?': it confirms the agents, tools and flows the steps reference actually exist. Answers catalogChecked: true.

  • document → validates the document you pass, STATELESSLY. No database, so read-only service tokens can call it, but with no catalog the cross-entity checks cannot run: launchable here means 'structurally sound', NOT 'this will run'. Answers catalogChecked: false. Use it for a draft you have not saved, or for fast feedback while editing.

A green verdict is what a reader remembers, so check catalogChecked before telling anyone a workflow is ready. Call this after apply_workflow_mutations and before request_publish_workflow.

Inputs: document, workflowId.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 242 tools

    Disambiguation5/5

    Every tool embeds its entity and operation in the name (list_workflows, update_agent, restore_flow_version), so selection is unambiguous even across 242 tools. Potentially confusable clusters like execute_tool vs dry_run_tool vs execute_stored_connector and restore_X vs restore_X_version vs restore_deleted_X_version are explicitly differentiated in their descriptions. No two tools appear to do the same thing.

    Naming Consistency5/5

    The set follows a rigid snake_case verb_noun pattern: list_/read_/create_/update_/delete_/restore_/request_publish_/discard_*_draft, with version operations consistently suffixed (_versions, _version, _published) and list tools pluralized. The single non-verb outlier, axonity_conventions, is a deliberate read-me-first marker rather than a genuine pattern break.

    Tool Count2/5

    At 242 tools, the surface is far beyond even the 16-25 'heavy' band and sits in the extreme-mismatch territory. The count is inflated by repeating an identical ~18-tool lifecycle template across ten-plus entity types, which could have been compressed into parameterized entity operations. The systematic repetition makes it navigable, but the selection burden on an agent is severe.

    Completeness4/5

    Coverage of the draft→publish lifecycle is exceptionally thorough: every entity has CRUD, soft-delete/restore, deleted-list, draft discard, publish approval, full version history (including deleted-version recovery and major-version naming), and published-read variants, plus run, trigger, prompt-stack, and wiring tools. Minor gaps remain: cron and webhook triggers have no update operation (only conditional triggers do), and there is no way to cancel or withdraw a pending publish approval.

    Maintenance

    ActivityActive
    ResponsivenessUsually handled

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables autonomous AI agents to securely access and execute external tools, such as GitHub REST API operations, with per-user authentication, authorization, audit logging, and observability.
      MIT
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables AI assistants to build and manage Genesys Cloud resources such as queues, skills, users, wrap-up codes, Architect flows, and outbound campaign cadences, while deliberately preventing deletes and leaving campaigns off until humans start them.
      MIT
    • A
      license
      C
      quality
      B
      maintenance
      Enables AI agents and terminal clients to manage subscribers, draft campaigns, workflows, custom fields, webhooks, and private account profiles with shared read/write safeguards.
      32
      25 npm
      AGPL 3.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI assistants to connect over streamable HTTP with bearer authentication to tools for agent lifecycle, email, phone, platform, vault, and browser extension management.
      2
      MIT