The MCP client now works on the SDK you actually have installed, speaks the protocol you think it does, and stops losing tools mid-list.
Three separate defects, three different layers of the client. The thing they had in common: not one of them produced a warning, an error, or a log line that pointed at the real problem.
The real cause was buried two exception-group levels deep, or didn't error at all.
The client silently ran a year-old negotiation path with nothing to say so.
Tools past page one simply weren't there. No exception, no log.
pyproject.toml declared mcp>=1.0.0 — unbounded. SDK 2.0.0 renamed its model fields camelCase → snake_case (Tool.inputSchema → Tool.input_schema). A fresh install pulled 2.0.0. Every MCP server: dead on connect.
resource.mimeType if hasattr(resource, "mimeType") else None — hasattr evaluated False on the renamed 2.x field and silently returned None. Real data, dropped, zero error.
Bridges both field names. Floor corrected to mcp>=1.24 (1.23 and earlier fail at import for an unrelated symbol rename). Truly unknown SDK shapes now raise a self-describing error.
session.initialize() drives the SDK down its legacy pathFound by tapping the stdio pipe and reading raw JSON-RPC — not by reading documentation.
initialize()Handshake-era negotiation. Protocol 2025-11-25. No _meta field on any request — a concept that protocol doesn't have.
negotiate_auto()Stateless negotiation via server/discover. No handshake. Full _meta on every request. Protocol 2026-07-28.
Falls back to the legacy path automatically when the installed SDK is 1.x — and logs it at WARNING, not silently.
nextCursor was ignored. Multi-page tool lists were silently cut short.A live bug in the protocol the module was already running — independent of the 2026-07-28 rewrite. Any MCP server returning more than one page of tools lost everything past page one. No error, no warning, no signal at all.
The fix follows the full cursor chain, including that empty-string case, before treating discovery as complete.
Before peer review, the PR went through independent cold review — two reviewers with zero prior context, plus a six-lens review council. They converged on two real blockers, both in the newly-added code.
default=Nonepagination.py read the cursor with a default. An unrecognized page shape was treated as terminal — silently returning a partial list. Twelve lines below the docstring that forbade exactly this pattern.
except Exceptiondiscovery.py swallowed the deliberate RuntimeError safety nets the pagination fix had just added. A misbehaving server returned [] with zero signal.
| Check | How |
|---|---|
| Both wire formats | Raw stdio JSON-RPC capture on mcp 1.29.0 and 2.0.0 |
| Pagination | Real multi-page stdio server, full cursor chain confirmed |
| HTTP headers | Streamable HTTP capture behind a logging proxy — all required headers present on every request |
| As a real module | Mounted via normal bundle + mcp.json in a Digital Twin — not just unit tests. Tools appeared in the live tool list; an agent called one end-to-end, negotiating 2026-07-28 against SDK 2.0.0 |
| Regression | Tests: 57 → 99, zero skips, green on both mcp 1.29.0 and 2.0.0 |
Pull the latest amplifier-module-tool-mcp and connect any MCP server as usual.
A WARNING about legacy negotiation means your installed mcp SDK is still 1.x. The module still works — automatic fallback — but you're not on the current protocol.
No warning printed → you're negotiating 2026-07-28.
x-mcp-header mirroring (a client MUST)
subscriptions/listen — listChanged is never observed
MRTR / elicitation
Cache hints (ttlMs / cacheScope)
Roots — deprecated in 2026-07-28
Sampling — deprecated in 2026-07-28
HTTP+SSE transport — deprecated, Streamable HTTP only
main, 2026-07-29)docs/GAP_ANALYSIS.md
Data as of 2026-07-29. Sourced from the original evidence-based gap analysis (2026-07-28 spec vs. module HEAD b32b7ce), the current per-obligation conformance table in docs/GAP_ANALYSIS.md, real stdio and Streamable HTTP wire captures, and a Digital Twin Universe run mounting the module as a live Amplifier tool.