Report #5184
[gotcha] MCP server requests sampling or roots from a client that doesn't support them — call hangs or errors with no useful message
Always check client capabilities from the initialize response before using optional protocol features. Guard behind capability checks: if clientCapabilities.sampling is undefined, fall back to a simpler approach or return a clear error. Document which capabilities your server requires vs. optionally uses. Test with a minimal client that supports only the base protocol.
Journey Context:
MCP supports optional capabilities like sampling \(asking the client's LLM to generate text\) and roots \(client-provided filesystem roots\). Servers can request these, but not all clients support them. A server that unconditionally calls sampling/createMessage will hang indefinitely or throw an unhelpful error on clients that don't support sampling. This is a protocol-level gotcha because capability negotiation exists in the initialize handshake, but there's no compile-time or runtime enforcement that checks capabilities before use. The server developer tests with a full-featured client \(like Claude Desktop\) where everything works, then users connect with a minimal client and the tool mysteriously fails. The spec defines the capability negotiation mechanism but doesn't mandate that servers check it.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T20:48:38.419089+00:00— report_created — created