Ironflow is pre-1.0: APIs can change between releases. Pin a version. What is ready →
AI & Agents
CLI vs MCP Coverage
CLI vs MCP Coverage
When building Ironflow applications with an AI assistant (Claude Code, Cursor, etc.), the AI can interact with your Ironflow server through two channels:
CLI — The AI runs ironflow commands via the terminal (like it runs gh, git, npm)
MCP — The AI calls structured MCP tools directly (requires .mcp.json configuration)
The Ironflow agent for Zed and JetBrains uses both: the CLI through its shell tool, and a fixed set of MCP tools. It starts a local ironflow mcp process, which works under ironflow serve --dev, and falls back to the server’s remote MCP endpoint. If neither works, it uses the CLI only.
Both hit the same underlying API for operations. MCP also exposes API contracts and bundled authoring guides. The difference is coverage, output format, and interaction style. In addition to the static MCP tools listed below, with --allow-writes the MCP server also surfaces dynamic agent tools registered by SDK clients at runtime — so the effective MCP tool count may be higher depending on your project. (Read-only mode never exposes them; pass --static-only to exclude them in write mode.) Desktop’s optional terminal bridge tools are outside the core counts below.
ironflow_emit_event, then ironflow_wait_for_run per run ID
Critical for test loops
Retry without duplicates
ironflow emit ... --idempotency-key <key>
idempotency_key argument
Same key, same event: a retry after a timeout never emits twice. Also on invoke / ironflow_invoke_function, and on ironflow_append_entity_event (with expected_version)
Emit from file
ironflow emit ... --data-file payload.json
—
CLI only
Invoke function
ironflow invoke process-order --data '{...}'
ironflow_invoke_function
CLI waits by default (--timeout, default 30s); MCP returns at once, so follow with ironflow_wait_for_run
Invoke without waiting
ironflow invoke ... --no-wait
ironflow_invoke_function
List runs
ironflow run list
ironflow_list_runs
Filter runs by status
ironflow run list --status failed
ironflow_list_runs with status
Filter runs by function
ironflow run list --function my-func
ironflow_list_runs with function_id
Get run details
ironflow run get <run-id>
ironflow_get_run
Wait for a run to finish
ironflow run wait <run-id>
ironflow_wait_for_run
Both poll, so giving up never cancels the run
Get run steps
ironflow run get <run-id> (includes step outputs)
ironflow_get_run_steps
Cancel run
ironflow run cancel <run-id>
ironflow_cancel_run
Delete run
ironflow run delete <run-id>
ironflow_delete_run
Terminal runs only, irreversible. The CLI prompts unless --yes; the MCP tool asks the user to confirm, or takes confirm: true when the client cannot be asked
Prune runs by filter
ironflow run prune --status completed
—
CLI only — the filter can match an environment’s whole history, so it is deliberately not an MCP tool
Retry / resume run
ironflow run resume <run-id>
ironflow_resume_run
One verb handles both paused and failed runs; --from-step / from_step targets a specific step. There is no separate retry command.
Pause run
ironflow run pause <run-id>
—
CLI only
Inject step output
ironflow run inject <run-id> <step-id> --output '{...}'
ironflow stream append order-1 --type Order --event order.placed --data '{...}'
ironflow_append_entity_event
Delete entity stream
ironflow stream delete order-1 [--purge]
ironflow_delete_stream
Appends a $stream.deleted tombstone and drops snapshots; --purge / purge: true also deletes the events below it. Irreversible. The CLI prompts unless --yes; the MCP tool asks the user to confirm, or takes confirm: true when the client cannot be asked
Redact event payload
ironflow event redact ev-1
ironflow_redact_event
Replaces the data with a placeholder; the row, its name and its entity version stay. Does not reach the runs it triggered. Irreversible
Redact run payloads
ironflow run redact run-1
ironflow_redact_run
Replaces input, output and every audit payload for the run and its steps. Terminal runs only. Irreversible
Redact step output
ironflow run redact-step <step-row-id>
ironflow_redact_step
Replaces output and original output, plus that step’s audit payloads. Takes the row id, not the step name. Irreversible
ironflow_get_docs(topic: "openapi") or ironflow://docs/openapi
Fetched from the configured engine; REST only, excludes ConnectRPC methods and push callbacks, not the complete Ironflow API contract
Retrieve push wire protocol
—
ironflow_get_docs(topic: "push-protocol") or ironflow://docs/push-protocol
Markdown bundled with the MCP binary; available offline
Retrieve SDKless handler guide
—
ironflow_get_docs(topic: "function-authoring") or ironflow://docs/function-authoring
Markdown bundled with the MCP binary; available offline
The guides may differ from the target engine’s version or the current website.
All three resources and the documentation tool work in read-only mode and with
--static-only. See the MCP guide
for retrieval examples.
ironflow circuit-breaker reset <endpoint-url> or <function-id>
ironflow_circuit_breaker_reset
Different argument on each side: the CLI takes an endpoint URL or a function ID and resolves it against the list itself; the MCP tool takes the key field verbatim from ironflow_circuit_breaker_list
Read tool. env is required and must match your API key’s scope — a mismatch is a 403, not a silent redirect
Requeue dead-letter entry
ironflow outbox dlq requeue <eventID>
ironflow_outbox_dlq_requeue
env required. Acts on every row sharing the event_id
Discard dead-letter entry
ironflow outbox dlq discard <eventID>
ironflow_outbox_dlq_discard
env required. Irreversible, and acts on every row sharing the event_id — an entity append leaves two. The CLI prompts unless --yes; the MCP tool asks the user to confirm, or takes confirm: true when the client cannot be asked
Use the CLI as your primary tool. It covers every Ironflow feature except the KV store, overview stats, worker listing, MCP documentation retrieval, and the ironflow_await_reload barrier, is self-documenting via --help, and supports --wait for synchronous feedback loops — which is critical when an AI is iterating on your application.
Supplement with MCP for API contracts and authoring guides, KV store operations, overview stats, worker monitoring, and the reload barrier — these are currently MCP-only.
The key CLI advantage: ironflow emit --wait emits an event and blocks until the triggered run completes, returning the full result. It calls a different server RPC (TriggerSync) than the fire-and-forget path. This gives the AI a tight build-test-fix loop. MCP’s ironflow_emit_event posts to the async endpoint; the AI follows it with ironflow_wait_for_run for each returned run ID.