Everyone's shipping MCP servers — and the tool definitions are full of silent footguns the protocol won't catch: a name with a space that breaks function-calling, a description the model can't act on, an inputSchema that requireds a property it never defines, and the context-window budget your toolset eats on every single request.
oh-my-mcp grades them — from a tools/list JSON or by speaking the protocol to a live server.
npx oh-my-mcp --cmd "node server.js" # spawn it, run initialize→tools/list, lint what it serves
npx oh-my-mcp --servers claude_desktop_config.json # lint every server in your config
npx oh-my-mcp tools.json # or a tools/list JSON you already have B get weather 83/100
✗ Name "get weather" has characters that break function-calling. → Use only [a-zA-Z0-9_-].
· Your 6 tool definitions cost ~157 tokens of context on every single request.
30/100 (F) 4 errors · 4 warnings
What it checks
- 🔴 Breaks tool-calling — bad/duplicate/over-long names, readOnly-vs-mutating hints
- 🟡 Model can't use it — missing/one-word descriptions, params with no description
- 🧩 Input schema — invalid JSON Schema,
required↔propertiesmismatch, missing types - 📉 Context budget — what your whole toolset costs the model every request
- 🔌 Protocol (live) — missing serverInfo/protocolVersion, malformed tools/list
Per-tool + overall 0–100 score, console/MD/JSON, CI exit codes (--min-score). Pure browser-safe lint core, no API key, 13 tests incl. a real stdio handshake. MIT. Bins: oh-my-mcp, omm.