Everyone frames it as a choice: CLI tools or MCP servers? We ran 8 identical multi-step tasks across 4 services both ways and measured every token. The winner isn't the mechanism — it's model familiarity with the tool.
Claude runs gh, psql, notion-cli, and slack-cli through Bash. It discovers subcommands, pipes output, and parses text. Fastest when it already knows the tool cold.
Claude calls structured tool endpoints — typed input, typed output, no shell. Tool schemas are auto-injected into context. Fastest when orchestrating operations it hasn't seen before.
Claude knows psql and gh from training data. Result: 3–5x cheaper via CLI. One compound command, one turn, done.
Claude doesn't know notion-cli or slack-cli. MCP was 1.4–2.3x cheaper because its auto-injected schemas skip the discovery tax.
When we added CLI cheatsheets to the prompt (like a good CLAUDE.md), CLI flipped from losing to winning on Slack. The mechanism doesn't matter — knowledge does.
Same prompt. Same task. Two completely different execution paths.
Each pair of bars is one task. The shorter bar won.
The pattern is clear when you aggregate. Model familiarity is the deciding factor.
Every MCP tool call loads the full tool schema into context. On every turn. This "context tax" is invisible in the API response but shows up clearly in token consumption.
MCP's advantage comes from auto-injected schemas. We re-ran every task with accurate CLI cheatsheets — equivalent to a well-written CLAUDE.md.
Every task, both variants, with context overhead.
| Task | Service | CLI | MCP | CLI Time | MCP Time | CLI Ctx | MCP Ctx | Winner |
|---|
The right question is: does the model already know this tool?
If yes — use CLI. It's cheaper, faster, and pipelines naturally. If no — either use MCP (auto-injected schemas) or teach the model via CLAUDE.md. Both work. The cost driver isn't the mechanism. It's the number of turns the model needs to figure out what to do.