한 줄 요약: MCP(Model Context Protocol)란, AI 모델이 외부 도구·리소스·데이터 소스에 표준화된 방식으로 접근할 수 있도록 Anthropic이 설계한 오픈 프로토콜이다.


1. MCP란 무엇인가?

스마트폰 충전기를 생각해 보세요. USB-C 표준이 생기기 전에는 제조사마다 다른 단자를 사용해 충전기가 호환되지 않았습니다. AI 에이전트도 비슷한 문제를 겪었습니다. 각 AI 서비스가 각 도구(파일 시스템, 데이터베이스, API)에 맞춤형 연결 코드를 따로 작성해야 했기 때문입니다.

MCP(Model Context Protocol)는 이 문제를 해결하는 AI 세계의 USB-C입니다. 2024년 Anthropic이 오픈소스로 공개한 이 프로토콜은 AI 모델과 외부 도구 사이에 표준 인터페이스를 제공합니다.

공식 정의 (Anthropic, 2024):

“MCP is an open protocol that standardizes how applications provide context to LLMs.”

2. 핵심 개념 이해하기

MCP는 클라이언트-서버 아키텍처를 따릅니다.

┌─────────────────────────────────────────┐
│           MCP Host (Claude 등)           │
│  ┌──────────────┐  ┌──────────────────┐ │
│  │  MCP Client  │  │   MCP Client     │ │
│  └──────┬───────┘  └────────┬─────────┘ │
└─────────┼────────────────────┼───────────┘
          │ JSON-RPC 2.0       │
    ┌─────▼──────┐      ┌──────▼──────┐
    │ MCP Server │      │ MCP Server  │
    │ (파일시스템)│      │ (GitHub API)│
    └────────────┘      └─────────────┘

MCP가 제공하는 세 가지 기본 요소

요소 설명 예시
Resources 모델이 읽을 수 있는 데이터 파일 내용, DB 레코드
Tools 모델이 실행할 수 있는 함수 파일 쓰기, API 호출
Prompts 재사용 가능한 프롬프트 템플릿 코드 리뷰 템플릿

통신 방식

MCP는 JSON-RPC 2.0 기반으로 동작하며 두 가지 전송 방식을 지원합니다:

  • stdio: 로컬 프로세스 간 통신 (CLI 도구에 적합)
  • HTTP+SSE: 원격 서버와의 통신 (웹 서비스에 적합)

3. 실무 적용 예시

Python으로 간단한 MCP 서버를 구현하는 예시입니다.

from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types

app = Server("my-file-server")

@app.list_resources()
async def list_resources() -> list[types.Resource]:
    return [
        types.Resource(
            uri="file:///workspace/notes.txt",
            name="작업 노트",
            description="현재 작업 중인 메모 파일",
            mimeType="text/plain"
        )
    ]

@app.read_resource()
async def read_resource(uri: str) -> str:
    if uri == "file:///workspace/notes.txt":
        with open("/workspace/notes.txt", "r") as f:
            return f.read()
    raise ValueError(f"Unknown resource: {uri}")

@app.list_tools()
async def list_tools() -> list[types.Tool]:
    return [
        types.Tool(
            name="write_note",
            description="노트 파일에 내용을 추가합니다",
            inputSchema={
                "type": "object",
                "properties": {
                    "content": {"type": "string", "description": "추가할 내용"}
                },
                "required": ["content"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[types.TextContent]:
    if name == "write_note":
        with open("/workspace/notes.txt", "a") as f:
            f.write(arguments["content"] + "\n")
        return [types.TextContent(type="text", text="노트에 추가했습니다.")]

async def main():
    async with stdio_server() as (read_stream, write_stream):
        await app.run(read_stream, write_stream, app.create_initialization_options())

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

Claude Desktop의 claude_desktop_config.json에 등록:

{
  "mcpServers": {
    "my-file-server": {
      "command": "python",
      "args": ["/path/to/server.py"]
    }
  }
}

4. MCP vs 유사 개념 비교

구분 MCP 일반 API 플러그인
표준화 ✅ 오픈 프로토콜 ❌ 각자 다름 ❌ 플랫폼 종속
AI 최적화 ✅ 컨텍스트 인식 ❌ 범용 설계 부분적
양방향 통신 ✅ 지원 제한적 제한적
재사용성 ✅ 어떤 MCP 호스트도 사용 가능 ❌ 서비스별 통합 필요 ❌ 특정 플랫폼만
오픈소스 혼합 혼합

5. 마치며

MCP는 AI 에이전트 생태계에서 표준 인터페이스 레이어 역할을 합니다. 한 번 MCP 서버를 만들면 Claude, Cursor, Zed 등 MCP를 지원하는 모든 AI 호스트에서 재사용할 수 있습니다. 이어서 MCP 서버(MCP Server), 툴 콜링(Tool Calling), 에이전틱 AI(Agentic AI)를 함께 학습하면 MCP 생태계 전체를 이해할 수 있습니다.

참고 자료

함께 읽으면 좋은 용어

이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.

댓글 남기기