Key Takeaways
- MCP proxy logging reveals silent client-side failures.
- Claude Code's 45/45 success rate vs Gemini's 42/45 shows reliability differences.
- Check tool-call gaps and serverInfo metadata to avoid misattributing failures.
What Changed — MCP Proxy Testing Exposes Hidden Failures
A developer ran 90 trials through a proxy on the MCP stdio pipe, testing three servers (filesystem, playwright, github) with two clients (Claude Code 2.1.235 on claude-sonnet-5, Gemini CLI 0.55.1 on gemini-2.5-flash). The headline result: Claude Code finished 45 of 45 trials, Gemini CLI 42 of 45. But the real finding wasn't in the token table — it was in the shakedown that preceded the run.
What It Means For You — Silent Failures Look Like Model Incompetence
Here's the kicker: one client (Gemini CLI 0.18.4) was failing calls inside itself before a byte reached the server. The cause? Its bundled validator had no JSON Schema draft 2020-12 meta-schema registered. @playwright/mcp@0.0.79 declares 2020-12 on all 24 tools, so most calls died with no schema with key or ref "https://json-schema.org/draft/2020-12/schema" — never hitting the wire.
On the wire, this looked exactly like a model that tried very little and answered wrong. The proxy's tool-call gap field caught it: it subtracts wire frames from client-attributed calls. Zero is normal; gaps of 3-4 meant calls were formed but never sent.
Try It Now — How to Apply This in Claude Code
- Check your Claude Code version: Ensure you're on a recent build that supports JSON Schema draft 2020-12. The fix landed upstream in Gemini CLI 0.28.0 (issue #14970, PR #15060), but Claude Code's validator should be verified too.

Instrument your MCP pipe: Run a proxy on the stdio pipe to log
tools/callrequests and responses. Compare the tool names in your client's usage output (e.g.,mcp_<server>_<tool>) against wire frames. A positive gap means silent failures.Watch for
_metablocks: Claude Code sessions carryio.modelcontextprotocol/serverInfowith server name, version, and base64 PNG icons — 2,215 characters on a 472-character answer. That's token overhead you can strip if you control the server.Beware of your own CLAUDE.md: One trial failed because Claude Code's global CLAUDE.md said "never send outbound communications." The runner now passes
--setting-sources ""to isolate tests. For your own work, remember: your memory files can change behavior in ways you don't expect.Count line endings: One Gemini failure wrote 138 lines for a file that had 137 — the server concatenated files with a blank line separator, and the model counted it. If you're parsing MCP responses, account for separators.
Why It Works — Token Costs Are Client-Dependent
The same get_file_contents call returned 1,561 tokens to Claude Code and 161 to Gemini CLI. Why? Claude Code negotiated protocol revision 2026-07-28 vs Gemini's 2025-06-18, and every response carried that _meta serverInfo block. A per-call cost isn't a property of the server alone — it's a function of the client's protocol version.
The Takeaway
MCP failures aren't always what they seem. Before blaming the model, check whether the client actually sent the calls. Use a proxy, track tool-call gaps, and verify your client's schema support. Your debugging time will drop dramatically.
Source: dev.to
[Updated 21 Aug via devto_mcp]
A separate project tackles the operational side of MCP proxies: Smart MCP Proxy hot-swaps servers at runtime, watching proxy-config.yaml and diffing the server list to add or remove pools without restarting agents. It shares one subprocess pool per server across all connected clients — three agents plus seven servers means seven pools, not 21 — and spawns/kills subprocesses on demand with three-retry crash recovery. An optional 'AI concierge' layer routes plain-English requests to the right tool via MCP Sampling, returning only the final answer to keep context clean. The MIT-licensed v1.0.0 runs as a single Python process with no database or Docker, though auth/HTTPS aren't shipped yet [per Smart MCP Proxy].









