MCP는 server-client의 stateful한 연결을 지원하기 위해 Mcp-Session-Id http header를 제공할 수 있고, 제공되는 경우 이후 요청에서 이를 포함해야 한다.
또한, 클라이언트는 MCP-Protocol-Version 헤더를 포함해야 서버가 해당 프로토콜 버전에 맞는 응답을 할 수 있다. 유효하지 않은 버전이라면 server는 400 코드를 응답한다.
streamable-http를 통신방식으로 채택한 경우의 흐름은 다음과 같다. stateful session을 제공하기 위한 initialization 단계가 포함된다.
sequenceDiagram
participant Client
participant Server
note over Client, Server: initialization
Client->>+Server: POST InitializeRequest
Server->>-Client: InitializeResponse<br>Mcp-Session-Id: 1868a90c...
Client->>+Server: POST InitializedNotification<br>Mcp-Session-Id: 1868a90c...
Server->>-Client: 202 Accepted
note over Client, Server: client requests
Client->>+Server: POST ... request ...<br>Mcp-Session-Id: 1868a90c...
alt single HTTP response
Server->>Client: ... response ...
else server opens SSE stream
loop while connection remains open
Server-)Client: ... SSE messages from server ...
end
Server-)Client: SSE event: ... response ...
end
deactivate Server
note over Client, Server: client notifications/responses
Client->>+Server: POST ... notification/response ...<br>Mcp-Session-Id: 1868a90c...
Server->>-Client: 202 Accepted
note over Client, Server: server requests
Client->>+Server: GET<br>Mcp-Session-Id: 1868a90c...
loop while connection remains open
Server-)Client: ... SSE messages from server ...
end
deactivate Server
initialization 단계는 client와 server의 첫번째 동작으로, 이 단계에서는 mcp version, capability, 각자의 정보에 대해 교환하고 session id를 발급한다.
capability negotiation은 optional feature에 대한 지원 여부를 포함한다. 예를 들어, mcp server의 tool, prompt, resource가 변경되었을 때 notifications를 발행하는지 여부가 initialization 단계에서 공유된다.
fastmcp는 기본적으로 python asgi server로 실행되며, mcp endpoint는 기본적으로 /mcp이다. postman으로 해당 엔드포인트에 POST요청으로 initialize를 수행한다.
client는 Accept 헤더에 text/event-stream, application/json를 모두 포함하고, json-rpc 형식으로 initialize를 호출해야 한다. server는 이에 sse 형식으로 응답하고, 단일 메시지를 포함한 청크를 응답한다. 응답 헤더에는 mcp-session-id로 세션 id가 서버측에서 발급된다.
mcp spec을 보며, 직접 streamable-http 통신에서 어떻게 server와 client가 상호작용하는지를 확인해보았다. mcp를 이용하면 llm을 통합한 host가 client를 이용하여 server를 호출하여 llm의 context에 도움을 줄 것이다.
이러한 mcp client는 fastmcp와 같은 mcp toolkit으로 간단하게 작성이 가능하며, claude desktop과 같은 application들에는 mcp client가 포함되어 configuration 수준으로 간단하게 연결이 가능하다.
오늘은 server와 client가 어떻게 상호작용하여 도구들을 제공하고 실행하는지에 대해 간단하게 알아보았다. 실제 remote mcp server를 운영할 계획이라면 multi client에 따른 보안 처리 등도 적용할 수 있어야 하니, 사용하는 sdk의 기능들을 활용하도록 하자.