跳到正文
DEV Community· Prince Jain·· 2 小時前AI 評分62

canimcp 檢查哪些 MCP 客戶端會令伺服器工具失效

canimcp: which clients silently break your MCP server's tools

AI 導讀

Prince Jain 開發 canimcp,讓用戶檢查不同 MCP 客戶端及版本會如何處理伺服器工具。它可讀取已儲存的 tools/list 回應或以伺服器命令執行檢查,並為發現附上 measured、probe、historical、field-report 證據等級和來源連結。

正文

Cover image for canimcp: which clients silently break your MCP server's tools

Prince Jain

A tool on r/mcp sat invisible to Claude Code for 17 days. A root oneOf in the input schema. No error on the server, no error on the client. The tool just never appeared in the client's list.

Last week SineFrame published a run of Claude Code and Codex against the same ten MCP servers at pinned versions. Five of the ten features split the clients, and the two never failed on the same feature. A tool argument named ids[]? Claude Code drops the tool silently. A 14 KB input schema? Codex compacts it and loses your required nested fields. 2049 tools on one server? Codex keeps the first 2048.

I wanted that list as a check I could run in CI, so I built canimcp: point it at a saved tools/list response or at your server command, and it reports which client+version breaks on what, each finding carrying its evidence grade and a source link.

$ npx canimcp fixtures/quirky-tools.json --client codex

8 findings . 1 error . 5 warnings . 2 advisories . 10 tools checked

tool: create_payment
  [error] root-composition-adjacent . codex 0.162.0
    root oneOf sits next to "properties" (inputSchema)
    A root oneOf or anyOf placed next to "properties" made Codex lose
    the property names - the call reached the server mangled.
    fix: move the composition inside each property
    src: m3-probes-2026-10 . evidence: probe

Two things the evidence forced me to change in my own design:

  1. I almost shipped probe results as equal to measured ones. The published matrix grades some rows as direct binary probes not yet run under the harness, so the corpus carries evidence grades (measured, probe, historical, field-report) and output labels them. A probe is a lead, not a verdict.

  2. I thought of this as a schema linter. Then the Codex detail sunk in: in code mode the model never sees your JSON Schema at all, only a compacted TypeScript declaration generated from it. This is not a "does your schema validate" tool. It is a "what does each client actually see" corpus. The schema is just the part I can check statically.

What it is not: a live test. It sees the schema, not runtime result shapes or tonight's client build. For real client trials there is M3; canimcp is the fast pass in CI before that.

Corpus PRs need a reproduction and client versions. Cursor, Gemini CLI and friends stay unseeded until someone ships evidence.

github.com/princejain756/canimcp - npx canimcp - zero dependencies, Node 18+.

Which MCP client should get seeded into the corpus next?

來源:DEV Community · dev.to