본 글은 mcp architecture을 읽고, 학습한 내용을 정리한 문서입니다. 👩🏻🏫
MCP이란?
AI 애플리케이션에 외부 시스템을 연결하기 위한 오픈소스 표준이다. MCP를 사용하면, AI 애플리케이션 (Claude Desktop 등)에서 데이터소스 (로컬 파일, 데이터베이스 등), 도구 (브라우저 등) 등에 접근하여 작업을 실행할 수 있다.
MCP 구성요소
MCP은 Client-Server 아키텍처를 따른다. MCP 아키텍처는 크게 MCP Host, MCP Client, MCP Server으로 구성된다. 각 요소의 역할은 다음과 같다.

Layer
MCP 아키텍처는 크게 2가지 계층으로 나뉜다. Data Layer, Transport Layer이다.
Data layer
Data Layer은 JSON-RPC 2.0 기반으로 구현된다. 메시지 구조와 의미(시맨틱)를 정의한 영역이다. 즉, 클라이언트와 서버가 “무슨 메시지를 주고받을 것인가?”, “어떤 메서드를 호출할 것인가?”, “어떤 기능을 제공하거나 요청할 것인가?” 같은 논리적인 상호작용의 규칙을 정의한 계층이다.
Data Layer에서는 크게 4가지 개념을 정의하고 있다.
| 기능 | 설명 |
| 수명 주기 관리 (Lifecycle Management) | 연결 초기화, 기능 협상(capability negotiation), 연결 종료 등을 조정 |
| 서버 기능 (Server Features) | 서버가 클라이언트에게 제공할 수 있는 기본 기능들 (예: 도구(tools), 리소스(resources), 프롬프트(prompts)) |
| 클라이언트 기능 (Client Features) | 클라이언트가 서버에게 요청할 수 있는 동작들, 예컨대 LLM 샘플링 요청, 사용자 입력 요청(elicitation), 로그 기록 등 |
| 알림 / 유틸리티 기능 (Notifications / Utility Features) | 서버가 클라이언트에게 상태 변경, 도구 목록 변화 등의 알림을 보낼 수 있는 기능 |
이 계층 덕분에, 전송 수단이나 네트워크 방식이 바뀌어도 (예: HTTP, stdio 등) 메시지 구조나 호출 방식은 바뀌지 않아도 된다. 즉, Transport Layer이 바뀌어도 Data Layer은 동일하게 유지됨을 보장한다. MCP는 AI 애플리케이션 ↔ 컨텍스트 서버 간 문맥(context)이나 도구(tool) 등의 상호작용이 핵심이다. 그러려면 클라이언트/서버가 어떤 기능을 제공할 수 있는지, 어떤 요청을 할 수 있는지 명확히 정의되어야 한다. 이 정의가 바로 데이터 계층이 하는 일이다. 데이터 계층 덕분에 MCP Server 개발자는 “어떤 메시지 포맷을 써라, 어떤 메서드가 있고, 응답은 이런 형태여야 한다”는 규약만 따르면 되고, 전송 세부 사항(HTTP, stdio 등)은 Transport layer에서 알아서 해결해줄 수 있다.
Transport layer
Transport layer은 서버와 클라이언트 간의 커뮤니케이션 채널, 인증 등을 관리한다. MCP 구성요소 간의 커넥션 설정, 메시지 프레임, 보안 통신 등을 처리한다.
MCP에서 지원하는 두가지 전송 매커니즘은 다음과 같다.
| 특징 (Feature) | STDIO Transport | Streamable HTTP Transport |
|---|---|---|
| 실행 환경 (Execution Environment) | 동일 시스템 내 로컬 프로세스 간 통신에 사용 | 원격 서버 통신을 가능하게 함 |
| 아키텍처 (Architecture) | 클라이언트가 MCP 서버를 서브프로세스로 실행 | 서버가 독립적인 프로세스로 운영되며 다중 클라이언트 연결 처리 가능 |
| 메시지 방식 (Messaging) | 표준 입력/출력 스트림(stdin, stdout) 사용 | HTTP POST (클라이언트 메시지) 및 HTTP GET (서버 메시지 스트리밍) 사용 |
| 메시지 형식 (Framing) | JSON-RPC 메시지가 줄바꿈으로 구분됨 (Newline delimited) | HTTP 요청 본문으로 JSON-RPC 메시지 전송 |
| 성능 (Performance) | 네트워크 오버헤드가 없어 최적의 성능 제공 | HTTP POST와 Server-Sent Events (SSE)를 선택적으로 사용 (스트리밍 가능) |
| 로깅 제약 (Logging Constraints) | 표준 출력(stdout)에 쓰는 것은 금지됨 (JSON-RPC 메시지 손상 방지) | 표준 출력 로깅이 허용됨 |
| 권한 부여 (Authorization) | OAuth 인증 사양을 따르지 않고 환경에서 자격 증명 검색 (SHOULD NOT) | HTTP 기반 전송이므로 OAuth 및 API 키를 포함한 표준 HTTP 인증 방식 지원 (SHOULD) |
| 종료 (Shutdown) | 클라이언트가 서버의 입력 스트림을 닫고 종료될 때까지 대기 | 관련된 HTTP 연결을 닫아 종료를 표시 |

MCP Server
MCP 서버는 AI 애플리케이션(호스트)이 사용할 수 있는 기능을 표준화된 인터페이스로 노출하는 프로그램이다. 예를 들어, 문서 접근 서버, 데이터베이스 서버 등이 있다.
MCP Server은 3가지 핵심 기능을 제공한다.
- tools: AI 애플리케이션이 함수를 실행해야할 때 사용된다.
- resources: AI 애플리케이션이 문맥 (context) 정보를 얻어야할 때 사용된다.
- prompts: 언어 모델과 상호작용을 구조화 하는 데에 도움이 되는 재사용 가능한 템플릿이다. (ex .시스템 프롬프트, few-shot 예시)
MCP Server > Tools
tools은 LLM이 실제로 액션을 취할 수 있게 해준다. LLM이 tools 호출이 필요하다고 판단하면, tools을 실행한다.
Tool 정의 예시
{
name: "searchFlights",
description: "Search for available flights",
inputSchema: {
type: "object",
properties: {
origin: { type: "string", description: "Departure city" },
destination: { type: "string", description: "Arrival city" },
date: { type: "string", format: "date", description: "Travel date" }
},
required: ["origin", "destination", "date"]
}
}
tools을 위와 같이 정의하면, AI 애플리케이션은 항공권을 검색할 때, 아래의 함수를 호출할 수 있다.
searchFlights(origin: "NYC", destination: "Barcelona", date: "2024-06-15")
이와 매칭되는 jsonRpc request 형식은 다음과 같다.
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "searchFlights",
"arguments": {
"origin": "NYC",
"destination": "Barcelona",
"date": "2024-06-15"
}
}
}
MCP Server > Resource
AI 애플리케이션이 문맥을 이해할 수 있도록, 필요한 정보를 제공해주는 역할을 한다. 읽기 전용 기능으로 볼 수 있다.
예를 들어, AI 애플리케이션에서 "main.rs 파일에 Hello world가 포함되었는지 궁금해."라는 프롬프트를 작성한다면, AI 애플리케이션은 MCP resource를 사용하여 main.rs 파일의 값을 얻어낼 수 있다.
{
"jsonrpc": "2.0",
"id": 2,
"method": "resources/read",
"params": {
"uri": "file:///project/src/main.rs"
}
}
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"contents": [
{
"uri": "file:///project/src/main.rs",
"name": "main.rs",
"title": "Rust Software Application Main File",
"mimeType": "text/x-rust",
"text": "fn main() {\n println!(\"Hello world!\");\n}"
}
]
}
}
MCP Server > Prompts
사용자가 AI 모델에게 어떻게 질문할지 제어하기 위해, 프롬프트를 사용한다. MCP 서버에서 사용자의 프롬프트를 제어하고 싶을 때 사용한다.
프롬프트 리스트
{
"jsonrpc": "2.0",
"id": 1,
"method": "prompts/list",
"params": {
"cursor": "optional-cursor-value"
}
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"prompts": [
{
"name": "code_review",
"title": "Request Code Review",
"description": "Asks the LLM to analyze code quality and suggest improvements",
"arguments": [
{
"name": "code",
"description": "The code to review",
"required": true
}
]
}
],
"nextCursor": "next-page-cursor"
}
}
프롬프트 조회
{
"jsonrpc": "2.0",
"id": 2,
"method": "prompts/get",
"params": {
"name": "code_review",
"arguments": {
"code": "def hello():\n print('world')"
}
}
}
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"description": "Code review prompt",
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "Please review this Python code:\ndef hello():\n print('world')"
}
}
]
}
}
MCP 호출 흐름: Tools 사용 케이스
(1) MCP 설정 초기화

(2) MCP Server 호출 흐름

📒 용어사전
- RPC (Remote Procedure Call): 다른 컴퓨터(또는 다른 프로세스)에 있는 함수를 내 코드에서 ‘로컬 함수처럼’ 호출할 수 있게 해주는 기술을 말한다.
- JSON-RPC: “원격 절차 호출(Remote Procedure Call)”을 간단한 방식으로 구현하기 위한 프로토콜이다. JSON 형식을 사용하고, RPC 스타일 통신 방식을 따른다. 즉, 클라이언트가 메서드 호출 요청(request)을 보내면, 서버는 요청을 처리하고 응답(response)을 돌려주는 구조이다.
- JSON-RPC 2.0: 1.0보다 많이 쓰이며, 메시지 구조, 오류 처리, 알림(notification) 등이 더 명확하게 정의되어 있다.
✍🏻 노트
HTTP JSON VS JSON RPC
HTTP JSON
HTTP JSON은 “데이터를 주고받는” HTTP 기반의 자원(Resource) 중심 통신이다.
Request
GET /users/123 HTTP/1.1
Content-Type: application/json
Response
{
"nickname": "americanopeople",
"age": 52
}
JSON-RPC
반면 JSON-RPC는 “함수 호출” 중심이다. 여기서는 “URL”이 아니라 “메서드 이름(method)”이 중심이다. 즉, “서버의 함수를 호출한다”는 개념으로 접근한다.
Request
{
"jsonrpc": "2.0",
"method": "getUserInfo",
"params": { "userId": 123 },
"id": 1
}
Response
{
"jsonrpc": "2.0",
"result": { "nickname": "americanopeople", "age": 54 },
"id": 1
}
참고
Prompts - Model Context Protocol
Protocol Revision: 2025-06-18 The Model Context Protocol (MCP) provides a standardized way for servers to expose prompt templates to clients. Prompts allow servers to provide structured messages and instructions for interacting with language models. Client
modelcontextprotocol.io
https://modelcontextprotocol.io/specification/2025-06-18/server/resources
'소프트웨어-이야기 > 프로그래밍 언어와 프레임워크' 카테고리의 다른 글
| 웹 위젯과 Shadow DOM 이해하기 (0) | 2025.11.08 |
|---|---|
| FastMcp으로 Local MCP 개발하기 🤖 (0) | 2025.10.06 |
| 코루틴 이해하기 (0) | 2025.04.13 |
| 데이터베이스 트랜잭션과 격리수준 (0) | 2024.12.27 |
| VirtualThread 아는 체하기 (2) | 2024.09.26 |