Axonity Flow MCP Server
OfficialSummary: Axonity Flow MCP Server lets an external agent securely author, inspect, validate, run, and manage Axonity tenant resources via the public REST API, with human-only publishing and secrets kept out of the agent.
Manage core entities: list/read/create/update/soft-delete/restore/discard drafts/request publication for workflows, agents, tools, skills, policies, reference docs, output schemas, prompt snippets, flows, data tables, measures, queries, and applications; also non-versioned data sources, table relationships, and dashboards.
Work with versions: list/read/restore/delete version history, read published snapshots, and create/ensure/name major versions.
Build workflows: apply structural mutations, replace documents, validate workflows, analyze reachable outputs, inspect trigger parameters, manage subworkflows, and place prompt snippets into flow steps.
Build tools and connections: create/update tools, connectors, and toolboxes; validate/format/execute tool code; test stored connectors; inspect tool packages, templates, and system tools.
Configure triggers: manage webhook, cron, and conditional triggers; run schedules immediately; pause/resume schedules; reconcile cron state.
Run and inspect executions: start workflow runs, upload run-input files or pass trigger JSON, list/read/trace/cost/summarize runs, cancel/delete/archive runs, inspect outlines/values/transcripts/items/session memory, handle waiting questions/messages, and view for-each progress.
Operate the semantic/data layer: data-source drivers, source tests/schema/SQL, queries, tables and rows, measures/formula specs/validation/query/explain, concepts/links, influences, dashboards, and expected ranges.
Handle approvals and governance: request publish per entity or as a release bundle, list/get approvals; read company docs, users, audit events, queues, deploy contract, secrets catalogue, labels/roles/audiences, and the knowledge graph.
Respect guardrails: no direct publish; human approval required; read-only tokens limited; secrets are read-only or placeholder-only; local file paths only work in local mode and must be approved by the MCP client.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Axonity Flow MCP Server list my Axonity workflows"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@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
Have a token. The connector sends whatever
AXONITY_TOKENholds 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.
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/mcpAXONITY_API_URLis 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.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 | What it does |
| List the tenant's entities. |
| Read one by id (incl. its version — read before you update). |
| Create a new draft. |
| Update a draft ( |
| Soft-delete. Recoverable — see |
| Undo a delete. No version check. |
| Restore candidates. |
| Reset the draft to the last published state. |
| 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 mutationoperations, thetriggerTypes, thestepTypes(including the ones you may not author, each with the reason and what to write instead), thescheduleRuleKinds(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'stype),outputKinds(a step output's or input'skind— narrower, different key) andschemaFieldKinds(inside a field'sschema, which wins where present), plusdecisionEvaluators(what a decision may branch with) andtableColumnKinds(a table column's kind). Getting the three value vocabularies wrong is silent: akindwritten 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.operationsis an index by default; passtypesfor a command's live payload schema.rulesVersionis 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 (toolwith each type's implementation,agentwith its persona,application,measure,query,data_table,output_schema,policy,skill,reference_doc,prompt_snippet,toolbox,secret,conditional_trigger,trigger_element), read live fromGET /api/v1/authoring/entity-contracts(axonity-flow#2103):{ kinds, contracts, rulesVersion }, per kind the create/update fields and thepublish.rulesthat stop it going live. Passkindsto 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 inaxonity_conventionsare marked subordinate to it.apply_workflow_mutationsfor structural workflow edits (add steps, connect edges) via mutation commands, sequenced and version-threaded for you.replace_workflow_documentfor one-shot full-document replacement in a single atomic PUT.Both end with the platform's catalog-checked verdict: the connector runs
validate_workflowon the stored workflow after the write and returns it, verbatim, asvalidation(catalogChecked,launchable, every issue). The write's ownlaunchableis 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 apinnedflag marking the values the author owns.bulk_delete_workflows— soft-delete several at once (each with its ownexpectedVersion).
Version history, rollback, and version-level delete
For the versioned entities (including flow, data_table, measure and
application):
Tool | What it does |
| List version history (checkpoints + named majors). |
| Read one, by integer checkpoint number. |
| Roll the draft back to an old version ( |
| Remove one history entry. Draft and published version are protected. |
| Restore candidates for the row above. |
| Undo the delete above. No version check. |
| The live snapshot, as opposed to the draft. |
| Cut a new named major version — "Save As" on the current draft. |
| Make sure a working draft major version exists. Idempotent. |
| 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
personafield (the character text every prompt of the agent opens with), set withcreate_agent/update_agentand published with the agent. There is no persona entity any more: no id, versions or approvals of its own.read_agent_personareads the field (with the agent'sversion) andcreate_agent_personawrites it (agentId,expectedVersion,persona);""removes it,nullon an update leaves it as it is.An agent's team: one capability of the company model (
capabilityId, a key ofdocument.capabilitiesinread_company).create_agenttakes it; on an existing agentset_agent_team(agentId,capabilityId, null for none) changes it —update_agentrefuses 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—authConfigmust be placeholders only; a human fills real secrets in Axonity. (create_tool/update_toolcarry the same guard, so a connector authored either way is covered.) A connector must declareimplementation.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. Readlist_toolboxesbeforecreate_tooland passtoolboxId— a tool made without one is ungrouped. Three things worth knowing before you write:set_toolbox_toolsdeclares the membership (anything you leave out is evicted —assign_tool_toolboxmoves a single tool and takesnullto 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_authsets 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 adetach_*_from_*for each. Detaching removes the link only — the skill or policy itself is untouched. Read the links back withlist_agent_skills,list_agent_policies,list_agent_reference_docs,list_workflow_skillsandlist_workflow_reference_docs. The three agent read-backs take an optionalworkflowIdfor the composed runtime view — what the agent's prompt actually assembles inside that workflow, with alinkSourceper 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, withdraft/publishedper 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_snippetis a library item; it only takes effect once placed into a flow step's prompt stack.read_workflow_prompt_stacks/read_flow_prompt_stacksresolve a workflow/flow to its steps and each step'ssystem/userstacks (this is how you find theflowStepIds). Thenattach_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, andlist_flow_step_prompts/list_wildcard_prompts.Company (the tenant's single company document — a singleton, no id):
read_company,update_company(whole-document save withexpectedVersion),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-documentupdate_company, the same wayapply_workflow_mutationsis preferred for a workflow), andrequest_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 asubprocessstep may call, each with itsparametersandoutcomes, and ablockedReasonfor the ones that cannot (never published, or nosubprocess-invocationtrigger). Authoring both halves is ordinaryapply_workflow_mutationswork — a callable workflow's signature goes into theadd_triggercall itself.validate_workflowdoes check a subprocess target now (missing, self-call, deleted, unpublished, not callable), butlist_callable_workflowsis 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 anownerIdcomes from),list_audit_events(passactorKind: "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, plusread_model_tier_map(whatcapabilityTierresolves to),read_concurrency_status,read_concurrent_run_capandread_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 intest/denyList.ts, the listtest/exclusions.test.tsenforces.Secrets (read-only):
list_secrets,read_secret— the catalogue a connector'sauthConfig.secretIdpoints at. Values are never returned by any Axonity route;valueKeyssays 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 isupdate_agentwith the id added tosystemToolIds),clone_flow,clone_prompt_snippet,list_tool_packages(the import allowlistvalidate_tool_codejudges 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_tablesis paged (20 by default, 200 max), likelist_measures,list_queriesandlist_applications, because a tenant's reference data has no ceiling. Page one is not the library — follownextCursorwhilehasMore, or narrow withname, which is exact and unique per workspace.rowsandcolumnsare whole-collection fields. Sendingrowsthroughupdate_data_tablereplaces the table's content; one row there deletes every other.add_data_table_row,update_data_table_rowanddelete_data_table_rowaddress a single row by amatchColumn/matchValuepair 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_toolsreportsoffered(what the draft would yield),toolId(whether a row exists) andisLive(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. Readaxonity_semantic_conventionsbefore building one — the platform serves those rules.list_data_source_driversfirst: each warehouse'sconfigFieldsare the keyscreate_data_sourcetakes inconfig, 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 bysecretId.test_data_sourceanswers{ ok, message }— a failure is an answer, not an error.read_data_source_schemareads the warehouse's catalogue for free, dataset by dataset on a source limited toallowedDatasets.query_data_sourceruns read-only SQL with capped rows (truncatedsays 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 thereturns),read_query_usage(the read tool its publication mints, and which agents hold it) andlist_query_live_versions. It carries the SQL, the source, the grain, its typedparametersand its describedreturns.There is no sync object, and no
provenance. A table says what fills it infilledBy—author,workflow,queryorsource(the rows stay in a data source;externalsays where) — and a query-filled table names its query infillingQueryIdand when it runs inrhythm({ cron, timezone, keyColumns, mode, enabled }). Whether a table is read live or as published follows from itsversioning(liveorconfig; only an author's table may choose), and a measure reads every table whose rows Flow holds.refresh_data_tablefills a query-filled table now instead of at its next turn (it does not wait for the result; read the table'sfillafterwards).Concept links: a concept's
refersTopoints at one thing;link_concept,unlink_conceptandlist_concept_linkshang the same word on every column, table, measure, value or query that means it. The links are rows of theconcept_linkstable 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, andlist_measure_live_versions. It names the concept it means inconcept, and the questions it answers inquestions.read_measure_designnow 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_specis the only list of its words — the platform's own, the one its editor shows — and withincludeWorkspace: truealso this workspace's measures, tables and columns.validate_measurechecks a formula without saving it and answers with every problem by code.read_measurereturns 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 withlegacy_field.Time over a date table:
create_data_table/update_data_tabletakedateTable: trueandcalendars(name, the column per grain, one default) — whatshift,to_date,rollingandrunningare measured in.read_measure_designshows them.Explaining a number:
query_measurestakesexplain: true(what each part of the formula gave, on the total, per period and per group) anduseDraftChain; a refusal carries itscode.read_measuresays what a measure rests on (dependsOn) and what rests on it (usedBy,dashboards).delete_measureis refused withstill_referenced, publishing withdepends_on_unpublished/unverified_relationship(the approval names what moves with it inchangesWith), and a table or relationship change that would break a published measure withbreaks_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 withrequest_publish_data_tableon thetableIdevery 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 aneffect(same or opposite),why,owner(a role as text) and an optionalbasis. A link the formula already makes, a duplicate and a loop are refused; aplannedrow marks a link that is still missing and may name a measure not built yet. The rows live in themeasure_influencestable, go live when it is published and travel with the deploy like the measures.read_measure_treereads formula parts and influences as one graph ({ root, nodes, edges, missing }), published by default;read_measureshowsinfluencedByandinfluences.Reading numbers:
query_measures(up to 40 questions, each answered on its own, measures named by their handle),list_measure_rows(a list tile). Plusduplicate_dashboard. Besides the periods that run to date,last_3_full_months,last_12_full_monthsandyear_to_last_full_monthend at the last full month.last_quarteris the previous completed calendar quarter. Both question and row tools acceptperiod: nullwithstart/enddates (end inclusive) for a chosen month or quarter.Expected ranges: choose
definition.rangeMethodexplicitly from the live formula spec'srangeMethods; no method, grain or history length is invented by the connector.query_measureswithexpected: truereturns the server's band and historical basis, or the reason none is available. Series points retainexpectedBasis,expectedReasonandpartial.power_undefinedwarnings locate the affected total, group or point. The formula spec and validation also carrypowerunchanged.Number cards: query
againstnames another measure; the answer keeps its value, gap and errors separate from the status. Report changes aschangeKindsays:deltain points for a percentage/score,changeas a percentage for a relative change. A dashboard number tile acceptsconfig.against: {measure, label?}andconfig.sparkline(none, trend, bullet); number and trend tiles acceptshowExpected. A dashboard'speriodPickerselects 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
semanticKindany 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 itslimits, what the agent may never do in it (processes, windows, keys, buttons, folders, domains, secrets by name). The generic family and the version tools, andrequest_publish_application: an executor receives only the published limits, so only a human makes them live.Executors:
set_application_executors/read_application_executorschoose the machines an application runs on (the whole set at once);list_executors,read_executor,read_executor_applicationsandlist_executor_commandsonly 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) andlist_application_knowledge_versions;forget_application_knowledge,restore_application_knowledgeandwrite_application_knowledgeto 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) andaudienceIds, whom it is meant for.list_audiences/read_audiencegive the ids to put there,list_roles/read_rolesay what each role reads and maintains, andread_member_roleswhich roles a colleague holds. Leave the label out and it gets the default (internal, for Staff);level: nullmakes 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'sclearanceis 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_topicsandlist_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_snippetscalls/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 |
| Check a workflow against the tenant's catalog. By |
| What a given step can read from upstream — bind inputs to real fields instead of guessing. Stateless and read-only-token safe. |
| Syntax and banned-pattern check for Python tool code. Stateless and read-only-token safe. |
| Format tool code with Black. Stateless and read-only-token safe. |
| Actually RUN tool code (not just validate it) and see the real output. |
| 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_TOKENset 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 anaxp_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 frombackend/scripts/dump_token_route_classes.pyin axonity-flow). A tool on a closed route keeps its name and says why it is closed.No local files.
upload_run_input_filetakescontentBase64only, andstart_workflow_runtakestriggerInputonly: the process runs on the Axonity server, so apathortriggerInputPathwould 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
/mcpare 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, andAXONITY_MCP_MAX_QUEUED_PER_TOKEN, default 4; one more is answered 429, so one token cannot fill what everybody shares), for a body overAXONITY_MCP_LARGE_BODY_BYTES(default 1 MiB) or one that does not say its size, one ofAXONITY_MCP_MAX_LARGE_BODIES(default 1), and then one ofAXONITY_MCP_MAX_IN_FLIGHTseats (default 4) withAXONITY_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 afterAXONITY_MCP_API_TIMEOUT_MS(default 300000). A body overAXONITY_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 thanAXONITY_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 throughapply_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 49500throughapply_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_PORTonly and callsAXONITY_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-flowA 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
authorscope is refused with a 403 (writeis its older name; a token with onlyoperatemay only answer, message and recover runs).The four analysis tools are the exception:
validate_workflow({ document }),analyze_workflow_reachable_outputs,validate_tool_code, andformat_tool_codecan be called by read-only tokens because they never mutate state;validate_workflow({ workflowId })needs theauthorscope.The token is tenant-bound. An agent cannot reach another tenant.
Secrets never pass through the agent. A connector's
authConfigaccepts 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_secretgive the catalogue andvalueKeys(which keys are filled, never their values) so an agent can pointauthConfig.secretIdat the right entry, and no tool can create, change or delete one — the backend refuses a service token there too. A secret'smetadatais stored unencrypted and readable tenant-wide (axonity-flow#908), so credential-shaped entries in it are withheld on read and listed undermetadataRedacted.Errors carry a machine-readable
code, not just prose. A 409 can mean a stale write (retry) or a live reference conflict (don't — seeaxonity_conventions); the connector tells them apart bycode, 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/secretsis 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.tsfails if a route or documented enum diverges (seetest/fixtures/README.md).Every backend route is decided, and the build says so.
test/completeness.test.tspartitions 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:majorThat 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 accountWhy 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_PATHIt 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 toolsanalyze_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:
launchablehere 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
Scored across 242 tools
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.
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.
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.
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
Related MCP Connectors
Supervised API-write gateway for AI agents with policy, human approval and execution receipts.
Give your AI agents trusted access to the full Postman platform.
Credential broker for AI agents: scoped, revocable API access with policy enforcement and audit.
Governed access to sensitive data, secrets and APIs for AI agents. A signed proof for each decision.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables 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
- AlicenseNot gradedqualityNot gradedmaintenanceEnables 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
- AlicenseCqualityBmaintenanceEnables AI agents and terminal clients to manage subscribers, draft campaigns, workflows, custom fields, webhooks, and private account profiles with shared read/write safeguards.3225 npmAGPL 3.0

Anima MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceEnables AI assistants to connect over streamable HTTP with bearer authentication to tools for agent lifecycle, email, phone, platform, vault, and browser extension management.2MIT