Running @hasmcp/mcp-spec-test against the examples/dice-roller server (pip install -r requirements.txt && python3 dice_server.py) on MCP spec revision 2026-07-28, the server process exits without responding to any request. Root cause: requirements.txt pins only a floor (mcp[cli]>=1.2.0) with no ceiling. A fresh install grabs the newest mcp package (currently v2.1.0), which no longer exposes mcp.server.fastmcp — that import has moved/been renamed (the newer SDK now exposes MCPServer directly under mcp.server instead). Since dice_server.py does from mcp.server.fastmcp import FastMCP, it crashes with ModuleNotFoundError before ever binding stdio, so the harness sees "server exited" on every request.
(Note: a plain pip install in some containers also hits Python's PEP 668 "externally-managed-environment" guard and needs --break-system-packages or a venv — that's a separate environment wrinkle, but the ModuleNotFoundError above reproduces even after working around it, so it's the real underlying bug.)
Conformance report
MCP 2026-07-28 conformance report
Verdict: not conformant — 10 requirements violated.
|
|
| Target |
sh -c '[ -d /tmp/dice ] || git clone --depth 1 https://github.com/theNetworkChuck/docker-mcp-tutorial /tmp/dice; cd /tmp/dice/examples/dice-roller && pip install --break-system-packages -r requirements.txt && python3 dice_server.py' |
| Transport |
stdio |
| Revision tested |
2026-07-28 |
| Revisions supported |
2026-07-28, 2025-11-25 |
| Passed |
4 |
| Failed |
10 |
| Not verified |
22 |
| Cases applied |
36 |
| Duration |
18226ms |
| Generated |
2026-08-24T19:12:43.821Z |
| Tool |
@hasmcp/mcp-spec-test 0.1.1 |
Failed (10)
the server deviates from the spec here
server/discover
- server/discover is answered without a session or handshake
expected 200, got 0: {"_raw":"server exited"}
0 !== 200
- server/discover advertises the versions the server can serve
Cannot read properties of undefined (reading 'supportedVersions')
- server/discover is a CacheableResult with usable cache hints
Cannot read properties of undefined (reading 'ttlMs')
- server/discover reports server identity and capabilities
Cannot read properties of undefined (reading 'capabilities')
- server/discover is stable across calls within its own TTL
Cannot read properties of undefined (reading 'supportedVersions')
- server/discover advertises a revision this suite supports
Cannot read properties of undefined (reading 'supportedVersions')
Version negotiation
- a request with no version at all is served on the default
a version-less request must be served, got 0: {"_raw":"server exited"}
0 !== 200
Official SDK interop
- a stock official-SDK client completes the handshake
MCP error -32000: Connection closed
- the handshake settles on a revision inside the supported window
initialize must return a protocolVersion, got undefined
- a stock official-SDK client can list tools
MCP error -32000: Connection closed
Not verified (22)
skipped; a skip is not a pass
Capability methods
- tools/list returns schema-conformant tools
cannot determine what the target supports — server/discover returned no result (status 0)
- tools/call on an unknown tool is an error, not a crash
cannot determine what the target supports — server/discover returned no result (status 0)
- tools/call returns a schema-conformant CallToolResult
cannot determine what the target supports — server/discover returned no result (status 0)
- prompts/list returns schema-conformant prompts
cannot determine what the target supports — server/discover returned no result (status 0)
- prompts/get returns messages with a role and content
cannot determine what the target supports — server/discover returned no result (status 0)
- resources/list returns schema-conformant resources
cannot determine what the target supports — server/discover returned no result (status 0)
- resources/templates/list returns schema-conformant templates
cannot determine what the target supports — server/discover returned no result (status 0)
- resources/read returns contents for every sampled resource
cannot determine what the target supports — server/discover returned no result (status 0)
- resources/read on an unknown uri is an error
cannot determine what the target supports — server/discover returned no result (status 0)
- following nextCursor terminates and does not repeat a page
cannot determine what the target supports — server/discover returned no result (status 0)
- an invalid pagination cursor is rejected (SHOULD)
cannot determine what the target supports — server/discover returned no result (status 0)
Version negotiation
- a version declared in _meta is accepted
cannot determine what the target supports — server/discover returned no result (status 0)
- an unsupported version is rejected with the supported list
cannot determine what the target supports — server/discover returned no result (status 0)
- clientInfo is optional (SHOULD, not MUST)
cannot determine what the target supports — server/discover returned no result (status 0)
Result envelope
- every result carries the required resultType
cannot determine what the target supports — server/discover returned no result (status 0)
- cacheable list results carry the schema-required cache hints
cannot determine what the target supports — server/discover returned no result (status 0)
- results identify the server in _meta
cannot determine what the target supports — server/discover returned no result (status 0)
- a client on an older version receives no newer-revision fields
cannot determine what the target supports — server/discover returned no result (status 0)
subscriptions/listen
- subscriptions/listen acknowledges only the opted-in notification types
cannot determine what the target supports — server/discover returned no result (status 0)
- the acknowledgment carries the subscription id for correlation
cannot determine what the target supports — server/discover returned no result (status 0)
- a listen requesting no notification types is not a subscription to everything
cannot determine what the target supports — server/discover returned no result (status 0)
- a cancelled subscription ends with a conformant teardown result, if it sends one
cannot determine what the target supports — server/discover returned no result (status 0)
Passed (4)
checked and conformant
server/discover
- the suite is reading a schema that matches the features it selected
Result envelope
- schema sanity: the envelope fields match the features selected
Official SDK interop
- the official SDK does not yet implement the newest revision
subscriptions/listen
- schema sanity: SubscriptionsListenResult requires _meta and resultType
How to reproduce
With Docker:
docker pull hasmcp/mcp-spec-test:latest
docker run --rm hasmcp/mcp-spec-test -c "sh -c '[ -d /tmp/dice ] || git clone --depth 1 https://github.com/theNetworkChuck/docker-mcp-tutorial /tmp/dice; cd /tmp/dice/examples/dice-roller && pip install --break-system-packages -r requirements.txt && python3 dice_server.py'"
(or, if that image can't run on your platform: git clone https://github.com/hasmcp/mcp-spec-test && cd mcp-spec-test && docker build -t mcp-spec-test . && docker run --rm mcp-spec-test -c "sh -c '[ -d /tmp/dice ] || git clone --depth 1 https://github.com/theNetworkChuck/docker-mcp-tutorial /tmp/dice; cd /tmp/dice/examples/dice-roller && pip install --break-system-packages -r requirements.txt && python3 dice_server.py'")
Without Docker (npx):
npx @hasmcp/mcp-spec-test@latest -c "sh -c '[ -d /tmp/dice ] || git clone --depth 1 https://github.com/theNetworkChuck/docker-mcp-tutorial /tmp/dice; cd /tmp/dice/examples/dice-roller && pip install --break-system-packages -r requirements.txt && python3 dice_server.py'"
This was generated by an automated conformance sweep. A one-line fix — pinning requirements.txt to mcp[cli]<2.0.0 (or updating the import for the newer SDK layout) — would likely resolve this. See also the companion issue filed against the same repo for the older 2025-11-25 revision. The maintainer is welcome to close this if it's not applicable.
Running
@hasmcp/mcp-spec-testagainst theexamples/dice-rollerserver (pip install -r requirements.txt && python3 dice_server.py) on MCP spec revision 2026-07-28, the server process exits without responding to any request. Root cause:requirements.txtpins only a floor (mcp[cli]>=1.2.0) with no ceiling. A fresh install grabs the newestmcppackage (currently v2.1.0), which no longer exposesmcp.server.fastmcp— that import has moved/been renamed (the newer SDK now exposesMCPServerdirectly undermcp.serverinstead). Sincedice_server.pydoesfrom mcp.server.fastmcp import FastMCP, it crashes withModuleNotFoundErrorbefore ever binding stdio, so the harness sees "server exited" on every request.(Note: a plain
pip installin some containers also hits Python's PEP 668 "externally-managed-environment" guard and needs--break-system-packagesor a venv — that's a separate environment wrinkle, but theModuleNotFoundErrorabove reproduces even after working around it, so it's the real underlying bug.)Conformance report
MCP 2026-07-28 conformance report
Verdict: not conformant — 10 requirements violated.
sh -c '[ -d /tmp/dice ] || git clone --depth 1 https://github.com/theNetworkChuck/docker-mcp-tutorial /tmp/dice; cd /tmp/dice/examples/dice-roller && pip install --break-system-packages -r requirements.txt && python3 dice_server.py'Failed (10)
the server deviates from the spec here
server/discover
expected 200, got 0: {"_raw":"server exited"}
0 !== 200
Cannot read properties of undefined (reading 'supportedVersions')
Cannot read properties of undefined (reading 'ttlMs')
Cannot read properties of undefined (reading 'capabilities')
Cannot read properties of undefined (reading 'supportedVersions')
Cannot read properties of undefined (reading 'supportedVersions')
Version negotiation
a version-less request must be served, got 0: {"_raw":"server exited"}
0 !== 200
Official SDK interop
MCP error -32000: Connection closed
initialize must return a protocolVersion, got undefined
MCP error -32000: Connection closed
Not verified (22)
skipped; a skip is not a pass
Capability methods
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
Version negotiation
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
Result envelope
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
subscriptions/listen
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
cannot determine what the target supports — server/discover returned no result (status 0)
Passed (4)
checked and conformant
server/discover
Result envelope
Official SDK interop
subscriptions/listen
How to reproduce
With Docker:
(or, if that image can't run on your platform:
git clone https://github.com/hasmcp/mcp-spec-test && cd mcp-spec-test && docker build -t mcp-spec-test . && docker run --rm mcp-spec-test -c "sh -c '[ -d /tmp/dice ] || git clone --depth 1 https://github.com/theNetworkChuck/docker-mcp-tutorial /tmp/dice; cd /tmp/dice/examples/dice-roller && pip install --break-system-packages -r requirements.txt && python3 dice_server.py'")Without Docker (npx):
This was generated by an automated conformance sweep. A one-line fix — pinning
requirements.txttomcp[cli]<2.0.0(or updating the import for the newer SDK layout) — would likely resolve this. See also the companion issue filed against the same repo for the older 2025-11-25 revision. The maintainer is welcome to close this if it's not applicable.