Files
Magnus Hedemark a1c83765a3 feat: add cli-builder skill — agent-friendly CLI design patterns
10 universal patterns for building CLI tools that AI agents can use
reliably: non-interactive, --json, --dry-run, idempotent, lazy auth,
progressive help, and more. Includes a bash scaffold template, Python
API client reference, advanced edge-case patterns, MCP-vs-CLI decision
framework, and an improvement cycle for iterating on shipped tools.

Principles grounded in real failures from building 15+ agent-facing
CLIs across multiple API services.

Signed-off-by: Jasper <magnus@groktop.us>
2026-05-21 22:17:23 -04:00

3.5 KiB
Raw Permalink Blame History

MCP vs CLI — Discourse Summary & Decision Framework

The Core Argument

CLI-first design for agent tools vs MCP servers — what the debate is actually about, not the noise.

Key Sources

Source Key Claim
Eric Zakariasson — "Building CLIs for Agents" (X thread) CLIs designed for agents need --json, --dry-run, examples in help, and non-interactive mode. Most CLIs assume a human.
ScaleKit Benchmarks (scalekit.com/blog/mcp-vs-cli-use) 9-32× token savings for CLI over MCP on GitHub automation. 100% reliability (CLI) vs 72% (MCP). The gap is schema injection — 43 tool definitions per turn, agent uses 1-2.
Ronnie Rocha — "Don't Build MCPs, Build CLI Tools" (ronnierocha.dev) MCP was designed for sandboxed agents (IDE plugins, web assistants). Terminal-native agents already have access — they don't need a bridge. MCP tax: context bloat, no composability, no pipes, serialized overhead.
Garry Tan (X) "MCP sucks honestly. It eats too much context window… I vibe coded a CLI wrapper for Playwright tonight in 30 minutes… worked 100x better."
Peter Steinberger (steipete) — MCPorter (github.com/steipete/mcporter) Converts MCP tools to CLI commands. Describes MCP as "a crutch" for environments without terminal access.

Token Cost Breakdown

The ScaleKit benchmark reveals why CLI wins for agent consumption:

Metric CLI MCP
Schema overhead per turn 0 tokens (agent calls --help on demand) 500-2000 tokens (full tool definitions injected every turn)
Output shape Agent requests exactly what it needs via flags Full JSON-RPC response, unfiltered
Composition Piped through jq, grep, mlr Atomic calls only
Failure mode Exit code + stderr message ConnectTimeout to MCP endpoint (36% of MCP failures)

The gap grows with tool count. A CLI aggregate (one binary with subcommands) costs ~100 tokens in --help output. An MCP aggregate costs ~43 tool schemas × ~500 tokens each = ~21,500 tokens per turn.

Decision Framework

Situation Default Rationale
Agent already has a terminal CLI No bridge needed. Agent pipes output directly.
Single-user, personal/homelab CLI Simpler to build and debug. No server to maintain.
Multi-tenant, end-user OAuth MCP Auth delegation and credential management handled by the protocol.
Token-sensitive at scale CLI 9-32× cheaper per operation.
Need composability (pipes) CLI `cmd
Need dynamic resource discovery MCP MCP's list_resources + subscribe provides real-time schema discovery.
Enterprise audit/traceability MCP JSON-RPC has structured request/response logging at the protocol level.
Internal bespoke API Either — CLI with --json is simpler; MCP if governed access is required

Bottom line: CLI is the default for most agent-facing tools. MCP wins for governed multi-tenant deployments where credential management and audit trails are the primary value. In practice, many deployments end up hybrid: CLI for high-frequency known tools, MCP for sandboxed or governed integrations.