Skip to content

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)

Both hit the same underlying API. The difference is coverage, output format, and interaction style. In addition to the static MCP tools listed below, 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. (Pass --static-only to exclude them.)

CLI (via Bash)MCP (via tools)
Tools / commands37 top-level commands (ironflow --help)23 read-only, 34 with --allow-writes, 35 with --evidence-file too
CoverageEverything except KV, overview stats, and worker listingA subset, including 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 completesFire-and-forget only
RecommendationPrimary tool for developmentSupplement for KV/overview
OperationCLIMCPNotes
Emit eventironflow emit order.placed --data '{...}'ironflow_emit_event
Emit + wait for resultironflow emit ... --waitCLI only — critical for test loops
Emit from fileironflow emit ... --data-file payload.jsonCLI only
Invoke functionironflow invoke process-order --data '{...}'ironflow_invoke_functionCLI waits by default (--timeout, default 30s); MCP is fire-and-forget
Invoke without waitingironflow invoke ... --no-waitironflow_invoke_function
List runsironflow run listironflow_list_runs
Filter runs by statusironflow run list --status failedCLI only
Filter runs by functionironflow run list --function my-funcCLI only
Get run detailsironflow run get <run-id>ironflow_get_run
Get run stepsironflow run get <run-id> (includes step outputs)ironflow_get_run_steps
Cancel runironflow run cancel <run-id>ironflow_cancel_run
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 jsonCLI only (table, json, csv, jsonl)
OperationCLIMCPNotes
List entity streamsironflow stream listironflow_list_entity_streams
Filter by typeironflow stream list --type OrderCLI only
Read stream eventsironflow stream read order-1ironflow_read_entity_stream
Stream infoironflow stream info order-1CLI only
Append eventironflow stream append order-1 --type Order --event order.placed --data '{...}'ironflow_append_entity_event
Subscribe to streamironflow stream subscribe order-1CLI 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; the MCP tool exposes no dry_run because the server does not honor it
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-projCLI only
Resume projectionironflow projection resume my-projCLI only
Watch projectionironflow projection watch my-projCLI only (live updates)
Pause projectionironflow projection pause my-projCLI only
Delete projectionironflow projection delete my-projCLI only
Create SQL projectionironflow projection create ...CLI only
Wait for catch-upironflow projection wait my-projCLI only — blocks until the projection is caught up
Wait for a specific eventironflow projection wait-for-event <event-id> --projection my-projCLI only (--projection is required)
Wait for several projectionsironflow projection wait-batch ...CLI only
Inspect pre-#1516 JetStream durablesironflow projection durables pruneCLI only (migration) — lists candidates and stops
Prune pre-#1516 durablesironflow projection durables prune --deleteCLI only (migration) — --delete is what actually removes them
OperationCLIMCPNotes
List functionsironflow function listironflow_list_functions
Get function detailsironflow function get my-funcironflow_get_function
OperationCLIMCPNotes
List events(via sql or subscribe)ironflow_list_events
List event schemasironflow event schema listCLI only
Get schemaironflow event schema get order.createdCLI only
Register schemaironflow event schema register ...CLI only
Delete schemaironflow event schema delete <name>CLI only
Test upcastironflow event upcast ...CLI only
OperationCLIMCPNotes
List bucketsironflow_kv_list_bucketsMCP only
List keysironflow_kv_list_keysMCP only
Get valueironflow_kv_getMCP only
Put valueironflow_kv_putMCP only (write)
OperationCLIMCPNotes
List secretsironflow secret listironflow_list_secrets
Get secret metadataironflow secret get API_KEYCLI only
Set secretironflow secret set API_KEY valueironflow_secret_set
Delete secretironflow secret delete API_KEYCLI only
OperationCLIMCPNotes
Subscribe to eventsironflow subscribe "system.run.>"CLI only
List topicsironflow topic listCLI only
Topic statsironflow topic stats order.processedCLI only
Publish to topicironflow topic publish ... --data '{...}'CLI only
OperationCLIMCPNotes
Server healthironflow server infoironflow_server_info
Overview statsironflow_overviewMCP only
List projectsironflow project listironflow_list_projects
Create projectironflow project create my-projCLI only
Delete projectironflow project delete proj_xxxCLI only
List environmentsironflow env listironflow_list_environments
Create environmentironflow env create stagingCLI only
Delete environmentironflow env delete env_xxxCLI only
List workersironflow_list_workersMCP only
OperationCLIMCPNotes
List API keysironflow apikey listCLI only
Create API keyironflow apikey create my-key --role role_xxxCLI only
Delete API keyironflow apikey delete ak_xxxCLI only
Rotate API keyironflow apikey rotate ak_xxxCLI only
Audit trailironflow audit trail <run-id>CLI only
Auth auditironflow audit auth-trail --org org_defaultCLI 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
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 for confirmation; the MCP tool cannot
OperationCLIMCPNotes
List rolesironflow role listCLI only
Get roleironflow role get <role-id>CLI only
Create/delete roleironflow role create ... / ironflow role delete <role-id>CLI only
Attach/detach policy on a roleironflow role assign-policy ... / ironflow role remove-policy ...CLI only
List policiesironflow policy listCLI only
Get policyironflow policy get <policy-id>CLI only
Create/update policyironflow policy create ... / ironflow policy update ...CLI only
Delete policyironflow policy delete <policy-id>CLI only
Test/dry-run policyironflow policy test ...CLI only
Policy versions / rollbackironflow policy versions list ... / ironflow policy rollback ...CLI only
Policy templatesironflow policy template list / ironflow policy template install ...CLI only
OperationCLIMCPNotes
List organizationsironflow org listCLI only
Get organizationironflow org get <org-id>CLI only
Create/delete organizationironflow org create ... / ironflow org delete <org-id>CLI only
List tenantsironflow tenant listCLI only
Provision tenantironflow tenant provision ...CLI only
OperationCLIMCPNotes
Initialize projectironflow initCLI only
Generate ironflow.yamlironflow config initCLI only
Validate configironflow validateCLI only
Show versionironflow versionCLI only
List debouncesironflow debounce listCLI only
Cancel a debounceironflow debounce cancel <function-id> <key>CLI only
Inspect dispatch capacityironflow capacityCLI only — lanes, queue, leases, buckets, sessions, credits, stats
Write AI skills to diskironflow skills syncCLI only
Detect coding agentsironflow skills doctorCLI only
Ops / infraironflow deploy, provision, platform, cloudCLI only — cluster and tenant operations, not app development
OperationCLIMCPNotes
List webhooksironflow webhook listCLI only
Webhook deliveriesironflow webhook deliveries --provider stripeCLI 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, and worker listing, 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 KV store operations, overview stats, and worker monitoring — 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 would need to poll ironflow_list_runs to check if the run completed.

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