mcp-schema-audit
Audit recorded MCP listings for wire shapes that make clients silently reject tools. Offline, deterministic, zero dependencies.
MCP servers publish broken tool listings in ways that are invisible server-side: the endpoint returns 200, no log fires — the failure happens entirely in the client's validation:
inputSchema: {}→ every client rejects the listing (gitlab-mcp #286)- a dropped schema is replaced with
{}and the model reverse-engineers arguments one failed call at a time (prime-agent #1073) - root without
type: "object"(z.intersection →allOf) → Claude Code silently drops the tools (langfuse #13804) - draft-07 dialect with tuple
items: [...]→ strict 2020-12 clients reject everything (strapi #27395, upstream TS SDK #2084 P1 for 3 months) - protocol version negotiation chaos: hardcoded versions (mcpkit #12), echoing a modern-era version through the legacy handshake (go-sdk #1033), hard-error instead of negotiating down (ferrum-edge #2168), hanging on initialize (stripe #290)
Quality linters (mcp-schema-lint, mcp-assert) grade descriptions and naming. This tool checks the shapes that make clients REJECT tools outright.
What it detects
| Severity | Finding |
|---|---|
| CRITICAL | inputSchema missing or {} |
| CRITICAL | root type not "object" (incl. allOf intersections) |
| CRITICAL | draft-07 dialect with tuple syntax (2020-12 incompatible) |
| CRITICAL | duplicate tool names / unnamed tools |
| CRITICAL | negotiated protocolVersion is not a known MCP revision |
| WARNING | initialize without serverInfo.name / draft-07 without tuples |
| WARNING | empty tools listing / no initialize in the recording |
| INFO | version renegotiated (legal, worth confirming intent) |
Input format
JSONL of recorded MCP messages (same format as mcp-session-audit):
{"direction":"request","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25"}}
{"direction":"response","id":1,"result":{"protocolVersion":"2025-11-25","serverInfo":{"name":"srv","version":"1.0"}}}
{"direction":"response","id":2,"result":{"tools":[{"name":"search","inputSchema":{"type":"object","properties":{}}}]}}
Usage
python3 mcp_schema_audit.py recording.jsonl
Exit codes (CI-friendly): 0 clean · 1 warnings · 2 any CRITICAL.
MIT License.
Metadata
Release files for mcp-schema-audit 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mcp_schema_audit-0.1.0.tar.gz | 5.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_schema_audit-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 12.0 kB
Release files / mcp_schema_audit-0.1.0.tar.gz
| Download URL | mcp_schema_audit-0.1.0.tar.gz |
|---|---|
| Size | 5.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
558b0cb074f3e2fa6b80782b9aa0bd6e2164d8682d2c33a6f1ad591f06e580db
|
|
BLAKE2b-256 checksum How to use checksums |
23a3e4f9411b3bc9ba9c418eb9addc67efc4ad3fdaf4b0e7526802c132cff834
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / mcp_schema_audit-0.1.0-py3-none-any.whl
| Download URL | mcp_schema_audit-0.1.0-py3-none-any.whl |
|---|---|
| Size | 6.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0be6198e79e973e4e71a788d6ac24bd029eee986dff668b163ba9bc608f96ab6
|
|
BLAKE2b-256 checksum How to use checksums |
8620d518ef3cdc72a620978107a6bcfe34fcbcca9bcdd93ddf789a05b4d33963
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|