When using HTTP transports, the connection is typically stateless. However, MCP requires a stateful session to keep track of capabilities, roots, and subscriptions.
To solve this, the server assigns a unique Session Identifier upon initialization. In the 2025 HTTP transport spec, this is often implemented as a sessionId query parameter or HTTP header.
Upon connection, the Client and Server perform a handshake:
capabilities (e.g., "I support roots and sampling").capabilities (e.g., "I support tools and prompts").