Model Context Protocol이 무엇이고, 왜 AI 생태계의 표준으로 자리 잡았는지, 그리고 이 시리즈에서 다룰 내용의 전체 지도를 살펴봅니다.
대규모 언어 모델(Large Language Model, LLM)은 텍스트 생성과 추론에 뛰어난 능력을 보여주고 있습니다. 하지만 LLM만으로는 해결할 수 없는 근본적인 한계가 있습니다. 모델은 학습 데이터에 포함되지 않은 최신 정보를 모르고, 외부 시스템에 접근할 수 없으며, 실제 세계에서 행동을 취할 수 없습니다.
이 문제를 해결하기 위해 각 AI 애플리케이션은 독자적인 방식으로 외부 도구와의 연동을 구현해 왔습니다. 데이터베이스에 접근하려면 해당 데이터베이스 전용 코드를 작성하고, API를 호출하려면 API별 어댑터를 만들어야 했습니다. 이런 방식의 문제는 명확합니다.
이것은 USB 이전의 컴퓨터 주변기기 시장과 동일한 상황입니다. 프린터, 스캐너, 키보드가 각각 다른 포트와 드라이버를 필요로 했던 시대를 USB가 하나의 표준으로 통합한 것처럼, AI 생태계에도 범용 연결 표준이 필요했습니다.
MCP(Model Context Protocol)는 Anthropic이 2024년 11월에 발표한 개방형 프로토콜로, AI 모델과 외부 데이터 소스 및 도구 사이의 연결을 표준화합니다. MCP를 사용하면 AI 애플리케이션이 데이터베이스, API, 파일 시스템, 클라우드 서비스 등 다양한 외부 시스템과 일관된 방식으로 상호작용할 수 있습니다.
MCP 이전에는 각 AI 애플리케이션이 각 서비스에 대한 개별 통합을 구현해야 했습니다. MCP 이후에는 클라이언트 측과 서버 측이 표준 프로토콜을 구현하기만 하면 어떤 조합이든 즉시 연결됩니다. M x N 문제가 M + N으로 줄어듭니다.
MCP는 클라이언트-서버 아키텍처를 따릅니다. 세 가지 핵심 역할이 있습니다.
사용자가 직접 상호작용하는 AI 애플리케이션입니다. Claude Desktop, VS Code, IDE 플러그인 등이 호스트에 해당합니다. 호스트는 하나 이상의 MCP 클라이언트를 생성하고 관리합니다.
호스트 내부에 존재하며, 특정 MCP 서버와 1:1로 연결되는 프로토콜 세션입니다. 클라이언트는 사용자의 요청을 MCP 프로토콜 형식으로 변환하여 서버에 전달하고, 서버의 응답을 호스트에 다시 전달합니다.
특정 외부 서비스(GitHub, PostgreSQL, Slack 등)와의 통신을 담당하는 프로세스입니다. 서버는 도구(Tools), 리소스(Resources), 프롬프트(Prompts)를 클라이언트에 노출합니다.
각 클라이언트와 서버 사이의 통신은 JSON-RPC 2.0 프로토콜을 기반으로 합니다. 이는 웹 개발자에게 이미 친숙한 요청-응답 패턴을 따르므로, 기존 지식을 활용하여 빠르게 이해할 수 있습니다.
MCP 서버는 세 가지 핵심 프리미티브(Primitive)를 통해 기능을 노출합니다.
서버가 제공하는 실행 가능한 함수입니다. AI 모델이 판단하여 호출하며, 외부 시스템에 대한 작업을 수행합니다. 예를 들어 GitHub MCP 서버는 create_issue, list_pull_requests, merge_pr 같은 도구를 제공합니다.
도구는 모델 제어(Model-controlled) 방식으로 동작합니다. 사용자가 "이 버그를 이슈로 등록해 줘"라고 요청하면, LLM이 적절한 도구를 선택하고 필요한 매개변수를 구성하여 호출합니다.
서버가 제공하는 읽기 전용 데이터입니다. 파일 내용, 데이터베이스 레코드, API 응답 등이 리소스에 해당합니다. 리소스는 URI로 식별되며, 부작용(side effect) 없이 안전하게 읽을 수 있습니다.
리소스는 애플리케이션 제어(Application-controlled) 방식으로 동작합니다. 호스트 애플리케이션이 어떤 리소스를 LLM의 컨텍스트에 포함할지 결정합니다.
서버가 제공하는 재사용 가능한 템플릿입니다. 특정 작업을 수행하기 위한 구조화된 지시사항을 포함하며, 동적으로 매개변수를 받아 컨텍스트에 맞게 조정됩니다.
프롬프트는 사용자 제어(User-controlled) 방식으로 동작합니다. 사용자가 명시적으로 프롬프트를 선택하여 실행합니다.
MCP는 발표 이후 빠르게 발전해 왔습니다. 주요 이정표를 살펴보겠습니다.
2024년 11월: Anthropic이 MCP를 오픈 소스로 공개합니다. 초기 버전은 stdio 전송과 HTTP+SSE 전송을 지원했습니다.
2025년 3월: Streamable HTTP 전송이 도입됩니다. 기존 SSE 전송의 한계(지속적 연결 필요, 로드 밸런싱 어려움)를 해결한 현대적인 원격 전송 방식입니다.
2025년 6월: Elicitation(유도) 프리미티브가 추가됩니다. 서버가 클라이언트를 통해 사용자에게 추가 정보를 요청할 수 있는 기능입니다.
2025년 11월: 1주년 기념 사양이 발표됩니다. 비동기 Tasks, Sampling with Tools, MCP Bundles(.mcpb) 등 프로덕션 환경을 위한 핵심 기능이 대거 추가됩니다.
2025년 12월: MCP가 Linux Foundation으로 이관되어 중립적 거버넌스 체제를 갖추게 됩니다. 이 시점에서 OpenAI, Google, Microsoft를 포함한 주요 AI 플랫폼이 모두 MCP를 채택합니다.
MCP가 Linux Foundation으로 이관된 것은 특정 기업의 프로토콜이 아닌 산업 표준으로 자리 잡았음을 의미합니다. OpenAI의 Agents SDK, Google의 Gemini, Microsoft의 Copilot 등이 모두 MCP를 지원하며, 이는 도구 통합을 한 번만 구현하면 모든 AI 플랫폼에서 활용할 수 있다는 것을 뜻합니다.
MCP 이전에도 LLM에 도구를 연결하는 방법은 존재했습니다. OpenAI의 Function Calling, LangChain의 Tool 추상화 등이 대표적입니다. MCP는 이들과 근본적으로 다른 관점을 제시합니다.
| 비교 항목 | Function Calling | LangChain Tools | MCP |
|---|---|---|---|
| 범위 | 단일 API 호출 | 프레임워크 내부 | 범용 프로토콜 |
| 표준화 | 벤더 종속 | 라이브러리 종속 | 개방형 표준 |
| 전송 | HTTP만 | 프로세스 내 | stdio, HTTP, SSE |
| 생태계 | 플랫폼별 분리 | Python 중심 | 언어 독립적 |
| 프리미티브 | 도구만 | 도구 중심 | 도구 + 리소스 + 프롬프트 |
Function Calling은 "이 LLM에서 이 함수를 호출하는 방법"을 정의합니다. MCP는 "어떤 LLM이든 어떤 외부 서비스든 연결할 수 있는 표준"을 정의합니다. 이 차이가 MCP가 생태계 전체의 표준이 된 이유입니다.
이 시리즈에서는 MCP를 개념부터 실전 구현까지 체계적으로 다룹니다.
| 장 | 주제 | 핵심 내용 |
|---|---|---|
| 1장 | 소개와 핵심 개념 | MCP의 정의, 아키텍처, 프리미티브 |
| 2장 | 프로토콜 아키텍처 심층 분석 | JSON-RPC, 메시지 흐름, 생명주기 |
| 3장 | 전송 계층 | stdio, Streamable HTTP, 전송 선택 기준 |
| 4장 | 서버 프리미티브 | 도구, 리소스, 프롬프트 상세 구현 |
| 5장 | TypeScript MCP 서버 | TypeScript SDK로 서버 구축 |
| 6장 | Python FastMCP 서버 | FastMCP 프레임워크로 서버 구축 |
| 7장 | MCP 클라이언트 구현 | 클라이언트 측 프로토콜 구현 |
| 8장 | 기존 시스템 연동 | 데이터베이스, API, 레거시 시스템 통합 |
| 9장 | 보안과 인증 | OAuth 2.1, 권한 관리, 보안 모범 사례 |
| 10장 | 실전 프로젝트 | 풀스택 MCP 시스템 구축 |
이 시리즈를 따라가기 위해 필요한 사전 지식과 환경을 안내합니다.
# Node.js 18 이상
node --version
# 프로젝트 초기화
mkdir mcp-tutorial && cd mcp-tutorial
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node tsx# Python 3.11 이상
python --version
# 가상 환경 생성 및 활성화
python -m venv mcp-env
source mcp-env/bin/activate
# FastMCP 설치
pip install fastmcp이 시리즈에서는 TypeScript와 Python 두 언어로 예제를 제공합니다. 5장은 TypeScript 중심, 6장은 Python 중심으로 구성되어 있으며, 나머지 장에서는 두 언어의 예제를 병행합니다. 자신에게 익숙한 언어를 선택하여 따라가면 됩니다.
MCP 서버가 실제로 어떤 모습인지 간단한 예제를 통해 살펴보겠습니다. 아래는 현재 시간을 반환하는 가장 단순한 MCP 서버입니다.
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({
name: "time-server",
version: "1.0.0",
});
server.tool("get_current_time", "현재 시간을 반환합니다", {}, async () => {
return {
content: [
{
type: "text",
text: new Date().toISOString(),
},
],
};
});
const transport = new StdioServerTransport();
await server.connect(transport);이 서버를 Claude Desktop이나 다른 MCP 호스트에 연결하면, AI 모델이 "지금 몇 시야?"라는 질문에 get_current_time 도구를 호출하여 실시간 정보를 제공할 수 있습니다. 단 20줄의 코드로 AI 모델에 새로운 능력을 부여한 것입니다.
2장에서는 MCP의 프로토콜 아키텍처를 심층적으로 분석합니다. JSON-RPC 2.0 기반의 메시지 형식, 클라이언트와 서버 간의 연결 생명주기, 능력 협상(Capability Negotiation) 메커니즘을 상세히 다루겠습니다. 프로토콜 수준의 이해는 안정적인 MCP 서버를 구축하는 데 필수적인 기반입니다.
이 글이 도움이 되셨나요?
관련 주제 더 보기
MCP의 JSON-RPC 2.0 기반 메시지 형식, 연결 생명주기, 능력 협상 메커니즘을 상세히 분석합니다.
MCP의 두 가지 핵심 전송 방식인 stdio와 Streamable HTTP의 동작 원리, 장단점, 선택 기준을 상세히 다룹니다.
MCP 서버가 제공하는 세 가지 핵심 프리미티브의 스키마 정의, 구현 패턴, 실전 활용 사례를 상세히 다룹니다.