Skip to content
Ironflow is pre-1.0: APIs can change between releases. Pin a version. What is ready →

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.

CLI (via Bash)MCP (via tools)
Tools / commandsEvery top-level command in ironflow --help27 read-only, 43 with --allow-writes, 44 with --evidence-file too
CoverageEverything except KV, overview stats, worker listing, documentation retrieval, and the reload barrierA subset, including authoring guides, run resume, projection rebuild, outbox DLQ and circuit breakers (+ dynamic agent tools)
Discoverabilityironflow --help, ironflow emit --helpAI sees all tools at startup
Output formatText (AI parses it)Structured JSON
Setup requiredNone — just binary in PATH.mcp.json config file
TransportLocal processstdio (default) or --transport streamable-http
Shell escapingJSON in bash can be trickyNative JSON parameters
Sync operations--wait blocks until the run completesironflow_wait_for_run blocks until a run finishes
RecommendationPrimary tool for developmentSupplement for documentation, KV, and overview
OperationCLIMCPNotes
Emit eventironflow emit order.placed --data '{...}'ironflow_emit_event
Emit + wait for resultironflow emit ... --waitironflow_emit_event, then ironflow_wait_for_run per run IDCritical for test loops
Retry without duplicatesironflow emit ... --idempotency-key <key>idempotency_key argumentSame 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 fileironflow emit ... --data-file payload.json—CLI only
Invoke functionironflow invoke process-order --data '{...}'ironflow_invoke_functionCLI waits by default (--timeout, default 30s); MCP returns at once, so follow with ironflow_wait_for_run
Invoke without waitingironflow invoke ... --no-waitironflow_invoke_function
List runsironflow run listironflow_list_runs
Filter runs by statusironflow run list --status failedironflow_list_runs with status
Filter runs by functionironflow run list --function my-funcironflow_list_runs with function_id
Get run detailsironflow run get <run-id>ironflow_get_run
Wait for a run to finishironflow run wait <run-id>ironflow_wait_for_runBoth poll, so giving up never cancels the run
Get run stepsironflow run get <run-id> (includes step outputs)ironflow_get_run_steps
Cancel runironflow run cancel <run-id>ironflow_cancel_run
Delete runironflow run delete <run-id>ironflow_delete_runTerminal 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 filterironflow 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 runironflow run resume <run-id>ironflow_resume_runOne verb handles both paused and failed runs; --from-step / from_step targets a specific step. There is no separate retry command.
Pause runironflow run pause <run-id>—CLI only
Inject step outputironflow run inject <run-id> <step-id> --output '{...}'—CLI only
View paused stateironflow run paused-state <run-id>—CLI only
TUI debuggerironflow inspect <run-id>—CLI only (interactive)
SQL queryironflow sql "SELECT ..."ironflow_sql_query
SQL with formatironflow sql "..." --format json—CLI only (table, json, csv, jsonl)
OperationCLIMCPNotes
List entity streamsironflow stream listironflow_list_entity_streams
Filter by typeironflow stream list --type Order—CLI only
Read stream eventsironflow stream read order-1ironflow_read_entity_stream
Stream infoironflow stream info order-1—CLI only
Append eventironflow stream append order-1 --type Order --event order.placed --data '{...}'ironflow_append_entity_event
Delete entity streamironflow stream delete order-1 [--purge]ironflow_delete_streamAppends 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 payloadironflow event redact ev-1ironflow_redact_eventReplaces the data with a placeholder; the row, its name and its entity version stay. Does not reach the runs it triggered. Irreversible
Redact run payloadsironflow run redact run-1ironflow_redact_runReplaces input, output and every audit payload for the run and its steps. Terminal runs only. Irreversible
Redact step outputironflow run redact-step <step-row-id>ironflow_redact_stepReplaces output and original output, plus that step’s audit payloads. Takes the row id, not the step name. Irreversible
Subscribe to streamironflow stream subscribe order-1—CLI only
OperationCLIMCPNotes
List projectionsironflow projection listironflow_list_projections
Get projection stateironflow projection get my-projironflow_projection_status
Projection statusironflow projection status my-projironflow_projection_status
Rebuild projectionironflow projection rebuild my-projironflow_rebuild_projectionAsynchronous — returns a job. Destructive. Both accept a dry run (--dry-run / dry_run: true) that reports the scope and changes nothing. Do it first
Rebuild progressironflow projection status my-proj (includes rebuild progress)ironflow_rebuild_projection_statusEvents processed, total, ETA. The MCP tool reports the rebuild job only; ironflow_projection_status reports the projection
Cancel rebuildironflow projection rebuild cancel my-proj—CLI only
Resume projectionironflow projection resume my-proj—CLI only
Watch projectionironflow projection watch my-proj—CLI only (live updates)
Pause projectionironflow projection pause my-proj—CLI only
Archived definitionsironflow projection history my-proj—CLI only
Delete projectionironflow projection delete my-proj—CLI only
Create SQL projectionironflow projection create ...—CLI only
Wait for catch-upironflow projection wait my-proj—CLI only — blocks until the projection is caught up
Wait for a specific eventironflow projection wait-for-event <event-id> --projection my-proj—CLI only (--projection is required)
Wait for several projectionsironflow projection wait-batch ...—CLI only
Inspect pre-#1516 JetStream durablesironflow projection durables prune—CLI only (migration) — lists candidates and stops
Prune pre-#1516 durablesironflow projection durables prune --delete—CLI only (migration) — --delete is what actually removes them
OperationCLIMCPNotes
Retrieve REST OpenAPI—ironflow_get_docs(topic: "openapi") or ironflow://docs/openapiFetched 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-protocolMarkdown bundled with the MCP binary; available offline
Retrieve SDKless handler guide—ironflow_get_docs(topic: "function-authoring") or ironflow://docs/function-authoringMarkdown 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.

OperationCLIMCPNotes
List functionsironflow function listironflow_list_functions
Get function detailsironflow function get my-funcironflow_get_function
OperationCLIMCPNotes
Explain event routingironflow events explainironflow_explain_event_matchRead-only current eligibility
List events(via sql or subscribe)ironflow_list_events
List event schemasironflow event schema list—CLI only
Get schemaironflow event schema get order.created—CLI only
Register schemaironflow event schema register ...—CLI only
Delete schemaironflow event schema delete <name>—CLI only
Archived schema definitionsironflow event schema history <name> --version <n>—CLI only
Check schema enforcementironflow event schema check [event-name]—CLI only — reports per schema whether it is actually constraining traffic (enforcing, partial, unvalidated, unused, no-traffic, permissive, broken)
Test upcastironflow event upcast ...—CLI only
OperationCLIMCPNotes
List buckets—ironflow_kv_list_bucketsMCP only
List keys—ironflow_kv_list_keysMCP only
Get value—ironflow_kv_getMCP only
Put value—ironflow_kv_putMCP only (write)
OperationCLIMCPNotes
List secretsironflow secret listironflow_list_secrets
Get secret metadataironflow secret get API_KEY—CLI only
Set secretironflow secret set API_KEY valueironflow_secret_set
Delete secretironflow secret delete API_KEY—CLI only
OperationCLIMCPNotes
Subscribe to eventsironflow subscribe "system.run.>"—CLI only
List topicsironflow topic list—CLI only
Topic statsironflow topic stats order.processed—CLI only
Publish to topicironflow topic publish ... --data '{...}'—CLI only
OperationCLIMCPNotes
Server healthironflow server infoironflow_server_info
Overview stats—ironflow_overviewMCP only
List projectsironflow project listironflow_list_projects
Create projectironflow project create my-proj—CLI only
Delete projectironflow project delete proj_xxx—CLI only
List environmentsironflow env listironflow_list_environments
Create environmentironflow env create staging—CLI only
Delete environmentironflow env delete env_xxx—CLI only
List workers—ironflow_list_workersMCP only (ironflow capacity sessions lists pull-worker sessions, but needs platform credentials)
OperationCLIMCPNotes
List API keysironflow apikey list—CLI only
Create API keyironflow apikey create my-key --role role_xxx—CLI only
Delete API keyironflow apikey delete ak_xxx—CLI only
Rotate API keyironflow apikey rotate ak_xxx—CLI only
Audit trailironflow audit trail <run-id>—CLI only
Auth auditironflow audit auth-trail --org org_default—CLI only
OperationCLIMCPNotes
List circuit breakersironflow circuit-breaker listironflow_circuit_breaker_listRead tool — no --allow-writes needed
Reset circuit breakerironflow circuit-breaker reset <endpoint-url> or <function-id>ironflow_circuit_breaker_resetDifferent 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
ActionCLIMCP toolNotes
List stored dead-letter rowsironflow dead-letters listironflow_dead_letter_listRead tool. Explicit environment required. Optional exact source filter and bounded pagination. Structured output preserves stored payload bytes as base64.
OperationCLIMCPNotes
List dead-letter entriesironflow outbox dlq listironflow_outbox_dlq_listRead tool. env is required and must match your API key’s scope — a mismatch is a 403, not a silent redirect
Requeue dead-letter entryironflow outbox dlq requeue <eventID>ironflow_outbox_dlq_requeueenv required. Acts on every row sharing the event_id
Discard dead-letter entryironflow outbox dlq discard <eventID>ironflow_outbox_dlq_discardenv 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
OperationCLIMCPNotes
List rolesironflow role list—CLI only
Get roleironflow role get <role-id>—CLI only
Create/delete roleironflow role create ... / ironflow role delete <role-id>—CLI only
Pull the policy setironflow policy pull <dir>—CLI only
Validate a policy setironflow policy validate <dir>—CLI only
Dry-run a policy setironflow policy dry-run [dir] --input <file>—CLI only
Push a policy setironflow policy push <dir>—CLI only
Policy-set versions / rollbackironflow policy versions / ironflow policy rollback <version>—CLI only
Force a tenant set to monitor mode (platform break-glass)ironflow policy force-monitor <org> --reason ...—CLI only
OperationCLIMCPNotes
List organizationsironflow org list—CLI only
Get organizationironflow org get <org-id>—CLI only
Create/delete organizationironflow org create ... / ironflow org delete <org-id>—CLI only
List tenantsironflow tenant list—CLI only
Provision tenantironflow tenant provision ...—CLI only
OperationCLIMCPNotes
Initialize projectironflow init—CLI only
Generate ironflow.yamlironflow config init—CLI only
Validate configironflow validate—CLI only
Show versionironflow version—CLI only
List debouncesironflow debounce list—CLI only
Cancel a debounceironflow debounce cancel <function-id> <key>—CLI only
Inspect dispatch capacityironflow capacity—CLI only — lanes, queue, leases, buckets, sessions, credits, stats
Write AI skills to diskironflow skills sync—CLI only
Detect coding agentsironflow skills doctor—CLI only
Run the server and toolsironflow serve, a2a, conformance, update, completion—CLI only
Ops / infraplatform, tenant, cloud—CLI only — platform, tenant and Cloud operations, not app development
OperationCLIMCPNotes
List webhooksironflow webhook list—CLI only
Webhook deliveriesironflow webhook deliveries --provider stripe—CLI only
Test webhookironflow webhook test --provider stripe --payload '{...}'—CLI only

Recommendation for AI-Assisted Development

Section titled “Recommendation for AI-Assisted Development”

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.

Terminal window
# AI writes worker code, then tests it:
ironflow emit order.placed --data '{"orderId":"ord-1","total":49.99}' --wait --json
# If something fails, AI inspects:
ironflow run list --status failed --json
ironflow run get <run-id> --json
# AI waits for the projection to catch up, then checks its state:
ironflow projection wait order-stats
ironflow projection get order-stats --json
# AI queries the database directly:
ironflow sql "SELECT * FROM runs WHERE status = 'failed' ORDER BY created_at DESC LIMIT 5" --format json
# --format supports: table (default), json, csv, jsonl