Protocol
Connection lifecycle
Every connection starts with a handshake. Both sides agree on a protocol version and declare what they support, so nothing gets called that the other side can't handle.
initialize → result (excerpt)json
{ "protocolVersion": "2025-11-25", "capabilities": { "tools": { "listChanged": true }, "resources": { "subscribe": true }, "prompts": {} }, "serverInfo": { "name": "calculator", "version": "1.0.0" }}Capability negotiation
A server that doesn't declare
resources will never receive resources/read. A client that doesn't declare sampling will never be asked to run the model.