MCP의 호스트·클라이언트·서버
호스트는 서버마다 클라이언트를 하나씩 생성하고, 서버는 도구·리소스·프롬프트를 JSON-RPC로 제공한다.
MCP의 목적
LLM 애플리케이션에 외부 데이터와 기능을 연결할 때 애플리케이션마다 연결 코드를 별도로 작성하면, 조합의 수만큼 작업량이 증가한다. MCP(Model Context Protocol)는 이 연결을 하나의 규약으로 통일한다. 이를 위해 MCP는 먼저 역할을 세 가지로 구분한다.
세 역할
- 호스트(host): LLM을 사용하는 애플리케이션이다. 클라이언트를 생성하고, 연결할 서버와 사용자 동의를 관리한다.
- 클라이언트(client): 호스트 내부에서 연결을 담당하는 구성 요소이다. 클라이언트 하나는 서버 하나와만 통신한다.
- 서버(server): 데이터와 기능을 제공하는 프로그램이다. 같은 장비의 프로세스일 수도 있고 원격 서비스일 수도 있다.
서버 세 개에 연결하면 호스트 내부에 클라이언트가 세 개 생성된다. 대화 전체는 호스트에만 유지되고, 서버는 다른 서버의 내부를 볼 수 없다.
서버의 제공 기능
| 종류 | 내용 | 사용 여부의 결정 주체 |
|---|---|---|
| 도구(tools) | 모델이 호출하는 함수 | 모델 |
| 리소스(resources) | 맥락에 포함할 읽기 전용 데이터 | 애플리케이션 |
| 프롬프트(prompts) | 사전에 정의한 프롬프트 템플릿 | 사용자 |
JSON-RPC 메시지
메시지는 JSON-RPC 2.0 형식이다. 도구 목록은 tools/list로, 도구 실행은 tools/call로 요청한다.
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "read_temperature",
"arguments": { "sensor_id": "T-101" },
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}
2026-07-28 개정부터는 요청마다 _meta에 프로토콜 버전과 클라이언트 기능을 포함하여 전송한다. 이전 개정에서 연결 시작 시점에 하던 initialize 핸드셰이크는 제거되었고, 서버의 지원 기능은 server/discover로 조회한다.