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 27 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.

CLI (via Bash)MCP (via tools)
Total operations~80+27+ (static)
Coverage100% of Ironflow features~42% static (+ 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
Shell escapingJSON in bash can be trickyNative JSON parameters
Sync operations--wait flag blocks until completeFire-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_function
Invoke + waitironflow invoke ... --timeout 60sCLI only
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 failed runironflow run resume <run-id>ironflow_retry_runResumes from last successful step
Pause runironflow run pause <run-id>CLI only
Resume paused runironflow run resume <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
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-projCLI only
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
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 listCLI only
Reset circuit breakerironflow circuit-breaker reset <key>CLI only
OperationCLIMCPNotes
List dead-letter entriesironflow outbox dlq listCLI only
Requeue dead-letter entryironflow outbox dlq requeue <eventID>CLI only
Discard dead-letter entryironflow outbox dlq discard <eventID>CLI only
OperationCLIMCPNotes
List rolesironflow role listCLI only
Get roleironflow role get <role-id>CLI only
List policiesironflow policy listCLI only
Get policyironflow policy get <policy-id>CLI only
Create/update policyironflow policy put ...CLI only
Delete policyironflow policy delete <policy-id>CLI only
Lint policyironflow policy lint ...CLI only
OperationCLIMCPNotes
List organizationsironflow org listCLI only
Get organizationironflow org get <org-id>CLI only
List tenantsironflow tenant listCLI only
Get tenantironflow tenant get <tenant-id>CLI only
OperationCLIMCPNotes
Initialize projectironflow initCLI only
Validate configironflow validateCLI only
Show versionironflow versionCLI only
List debouncesironflow debounce listCLI only
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 100% of Ironflow’s features, 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. This gives the AI a tight build-test-fix loop. MCP’s ironflow_emit_event is fire-and-forget; 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 checks projection state:
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