- MCP는 LLM/Agent가 외부 도구와 데이터 소스를 표준 방식으로 다루게 하려는 JSON-RPC 기반 프로토콜이지만, HTTP 전송 설계와 문서 품질이 구현 부담을 키운다는 비판을 받음
- 가장 큰 쟁점은 단순한 양방향 통신을 HTTP에서 구현하면서 HTTP+SSE와 Streamable HTTP로 WebSocket에 가까운 동작을 우회적으로 재구성했다는 점임
- Streamable HTTP는 세션 생성, SSE 연결, 응답 전달 경로가 여러 갈래로 나뉘어 상태 관리와 디버깅, 상호운용성, 확장성, 보안 부담을 늘림
- HTTP 전송에는 OAuth2 중심 권한 부여 요구가 붙지만 stdio는 환경 변수에서 자격 증명을 가져오도록 되어 있어 인증 모델이 전송 방식마다 달라짐
- HTTP 전송은 stdio의 입력·출력 스트림에 가장 가까운 WebSocket으로 단순화하고, 예외 사례보다 일반적인 사용 사례에 맞춰 설계를 최적화해야 함
MCP가 빠르게 확산되는 상황
- MCP(Model Context Protocol)는 애플리케이션이 LLM에 컨텍스트를 제공하는 방식을 표준화하는 공개 프로토콜임
- Anthropic은 MCP를 AI 애플리케이션의 USB-C 포트에 비유하며, AI 모델을 다양한 데이터 소스와 도구에 연결하는 표준 방식으로 설명함
- 최근 한 달 동안 MCP가 빠르게 확산됐고, MCP Server와 Client가 매일 만들어져 mcp.so와 pulsemcp.com 같은 사이트에서 확인 가능함
- IBM은 MCP와 “직교하는 표준”으로 Agent Communication Protocol(ACP)을 공개했고, Google도 Agent2Agent(A2A)를 발표함
- 대형 업체들이 모델 학습과 튜닝에는 막대한 비용을 쓰면서도 문서, SDK, 구현 가이드의 성숙도는 낮다는 점이 핵심 비판으로 남음
프로토콜 자체와 전송 계층
- MCP는 LLM과 함께 쓰도록 미리 정의된 메서드와 엔드포인트를 가진 JSON-RPC 프로토콜임
- 주요 전송 방식은 로컬 실행에 가까운 stdio와 HTTP 기반 전송으로 나뉨
-
stdio
- 로컬 MCP Server를 시작하고
stdout,stdin파이프를 Client와 연결해 JSON을 주고받으며,stderr를 로깅에 사용함 - Unix/Linux 파이프 패러다임을 양방향 통신에 쓰는 점은 비판 여지가 있지만, 모든 운영체제에서 쉽게 동작하고 소켓 처리가 필요 없어 이해하기 쉬움
- 로컬 MCP Server를 시작하고
-
HTTP 기반 전송
- HTTP 위에서 동작하는 방식으로 HTTP+SSE와 이를 대체하려는 Streamable HTTP가 있음
- 두 방식 모두 단순한 양방향 메시지 교환을 HTTP 요청과 SSE 연결 조합으로 구현하려 하면서 복잡도가 커짐
-
HTTP+SSE와 Streamable HTTP 비판
- 기존 HTTP 전송은 HTTP+SSE(Server-Sent Events) 방식이고, 새 사양에서는 이를 Streamable HTTP로 대체하려 함
- HTTP+SSE는 full duplex를 만들기 위해 Client가
GET /sse같은 요청으로 읽기용 SSE 세션을 열고, 첫 응답에서 쓰기용 URL을 받은 뒤POST /a-endpoint?session-id=1234같은 요청을 보냄- 서버는
202 Accepted와 빈 본문을 반환함 - 실제 응답은 이미 열려 있는
/sse연결에서 읽어야 함
- 서버는
- Streamable HTTP는 세션 ID를 별도 엔드포인트 대신 HTTP 헤더로 다루고,
GET또는POST /mcp로 SSE 세션을 열 수 있음- 응답은 새 SSE 스트림으로 올 수 있음
POST응답 본문에200으로 올 수 있음- 기존 SSE 스트림 중 하나로 나중에 전달될 수 있음
- 이 설계는 SSE 위에서 WebSocket처럼 동작하려는 구조에 가깝고, 실제 WebSocket을 쓰지 않기 위한 논리가 modelcontextprotocol/pull/206에서 논의됨
- HTTP 전송은 stdio를 모방하려 하지만 실제 소켓이 아니기 때문에, 서버 구현이 여러 HTTP 호출과 연결을 결합(join) 해야 하는 부담을 떠안음
구현 경험에서 드러난 문서와 SDK 문제
- Go로 MCP Server를 구현하려는 시도에서 공식 Go SDK가 없었고, 프로토콜을 이해하려면 사실상 역공학이 필요했음
- modelcontextprotocol.io의 문서는 중요한 프로토콜 세부 사항을 넘기거나 빠뜨리고, 대화 흐름 예시도 제공하지 않음
- 웹사이트는 표준 자체를 읽기보다 SDK 구현 튜토리얼로 이동하도록 유도하는 성격이 강함
- 예제 서버는 Python 또는 JavaScript로 구현되어 있고, 로컬에서 stdio로 실행하는 것을 전제로 함
- Python과 JavaScript는 다른 사람의 컴퓨터에서 안정적으로 동작해야 하는 로컬 도구에는 좋지 않은 선택으로 비판됨
- 예제가 Docker 컨테이너로도 제공되는 점은 이 문제를 어느 정도 인식한 결과로 보임
- 로컬 MCP 실행에는 Rust, Go, Java, C#처럼 더 이식성 있는 언어나 VM 기반 선택지가 더 적합하다는 판단이 제시됨
Streamable HTTP가 만드는 복잡도
- Streamable HTTP에서는 새 세션을 세 가지 방식으로 만들 수 있음
- 빈
GET요청 - 빈
POST요청 - RPC 호출을 담은
POST요청
- 빈
- SSE도 네 가지 경로로 열릴 수 있음
- 초기화를 위한
GET - 이전 세션에 합류하기 위한
GET - 세션 초기화를 위한
POST - 요청을 담고 SSE로 응답하는
POST
- 초기화를 위한
- 요청 응답은 다시 세 가지 방식으로 전달될 수 있음
- RPC 호출을 담은
POST의 HTTP 응답 - 해당
POST에 대한 응답으로 열린 SSE 이벤트 - 이전에 열린 임의의 SSE 이벤트
- RPC 호출을 담은
- 같은 결과를 얻는 경로가 많아지면서 인지 부하, 디버깅 난이도, 유지보수 부담이 커짐
- Client와 Server가 각자 필요하다고 판단한 일부만 구현하면 상호운용성 문제가 생기고, 예상치 못한 동작으로 이어질 수 있음
- 여러 머신에 걸친 서버 구성에서는 연결 상태와 응답 메커니즘 관리가 확장성 병목을 만들 수 있음
보안과 권한 부여의 문제
- Streamable HTTP의 유연성은 여러 보안 우려를 낳음
- HTTP와 SSE에 걸친 세션 상태 관리는 복잡하며, 세션 탈취, 재생 공격, DoS 가능성을 만들 수 있음
- 세션 생성과 SSE 연결 진입점이 많아져 공격 표면이 넓어짐
- 세션 시작과 응답 전달 방식이 다양해 악성 활동을 숨기는 데 쓰일 수 있음
- 최신 프로토콜의 authorization 사양은 HTTP 기반 전송 구현이 해당 사양을 따르도록 권고함
- 같은 사양에서 STDIO 전송 구현은 해당 사양을 따르지 말고, 환경에서 자격 증명을 가져오도록 권고함
- 이 구조에서는 HTTP 전송을 사용하면 OAuth2 절차를 구현해야 하는 반면, stdio에서는 API key 수준 접근이 가능해 보인다는 불만이 나옴
제안: HTTP 전송은 WebSocket으로 단순화
- MCP에는 하나의 JSON-RPC 프로토콜이 있고, stdio가 명확히 선호되는 전송 방식처럼 보임
- HTTP 전송은 stdio와 최대한 비슷하게 만들고, 꼭 필요할 때만 차이를 둬야 함
- stdio의 환경 변수는 HTTP의 HTTP 헤더에 대응할 수 있음
- stdio의 소켓 같은 입력·출력 스트림은 HTTP에서 WebSocket에 대응할 수 있음
- WebSocket을 쓰면 세션을 위한 복잡한 서버 간 상태 관리와 많은 코너 케이스를 줄일 수 있음
- 다만 권한 부여가 경우에 따라 더 복잡해질 수 있고, 일부 방화벽이 WebSocket을 차단할 수 있으며, 짧은 세션에서는 오버헤드가 생기고 끊긴 세션 재개가 더 어려울 수 있음
- MCP 사양 자체도 양방향 메시지 교환을 지원하는 어떤 통신 채널에서도 구현 가능한 transport-agnostic 프로토콜이라고 밝힘
- 업계는 코너 케이스가 아니라 가장 일반적인 사용 사례에 맞춰 최적화해야 함
ACP와 A2A에 대한 부가 평가
- MCP는 API를 LLM에 노출하는 프로토콜이고, ACP와 A2A는 Agent를 LLM에 노출하는 프로토콜에 가까움
- A2A 사양을 보면 필요성이 제한적으로 보이며, A2A의 많은 기능은 MCP 그대로 또는 작은 추가만으로 처리 가능해 보임
- ACP와 A2A는 별도 프로토콜이라기보다 MCP Server의 도구로 구현될 수도 있음
- IBM도 ACP Agent를 MCP 리소스로 보고 MCP 도구로 호출할 수 있다는 관점을 MCP adapter 문서에서 제시함
- ACP는 IBM의 agent-building-tool인 BeeAI 홍보 성격이 있어 보인다는 평가를 받음
- ACP와 A2A가 가져오는 장점은 더 온전한 전송 계층과 Agent 발견 방식임