Six states, both gates, measured
Rows shaded amber are the ones where the old gate reports success on a broken tree. Old-gate results assume .mcp.json is present, which is the friendliest case for it: it never opens the file at all.
| State of the tree | Old | New | What the new gate says |
|---|
Why the manifest records provenance, not just names
context7 exposes exactly two tools: resolve-library-id and query-docs. Spellings that have appeared in this repo's history and grant nothing: resolve, get_library_docs, getLibraryDocs, query_docs, resolve_library_id. Packages 3.0.0 and 4.0.2 expose the identical two names, so a version bump changes no grant.
- tools/list returns HTTP 200 for any auth state: no header, garbage bearer, unexpanded literal, real key. So "it connected" never proves the key is in use. Only tools/call discriminates, and a bad key answers with text starting "Invalid API key".
- If CONTEXT7_API_KEY is unset, the unexpanded literal is sent as the token and every tools/call fails. It does not degrade to anonymous.
- That is why a roster in the manifest carries toolsVerifiedOn and toolsVerifiedBy. A roster of null means nobody verified that server against a live tools/list, so name checking is skipped for it rather than run against an invented roster.
- The hosted endpoint is https://mcp.context7.com/mcp. The legacy transport is npx stdio, which costs one child process per Claude Code session. That transport move is exactly what the old literal kept asserting away.