핵심 요약
MCP(Model Context Protocol)는 Anthropic이 제안하고 업계에서 확산 중인 표준이다. LLM ↔ 도구·데이터 연결을 벤더 독립적으로 만든다.
- Server: 도구·리소스를 제공
- Client: LLM 앱 (Claude Desktop, Cursor, Claude Code 등)
- 3대 프리미티브: Resources / Tools / Prompts
- 전송: stdio 또는 WebSocket(SSE)
왜 필요한가
LLM이 파일 시스템·DB·API에 접근하려면 벤더마다 다른 방식을 구현해야 했다. MCP는 이를 한 번 구현하면 모든 MCP 호환 클라이언트에서 재사용되게 만든다.
3대 프리미티브
Resources — 읽기 전용 데이터
파일 내용, DB 레코드, API 응답처럼 LLM에 "보여주는" 것.
Tools — LLM이 호출하는 함수
검색, 쓰기, 실행. 부작용이 있을 수 있는 동작.
Prompts — 사용자가 선택하는 템플릿
"코드 리뷰", "요약" 같은 재사용 프롬프트.
서버 구현 (TypeScript SDK)
import { McpServer } from '@modelcontextprotocol/sdk';
import { z } from 'zod';
const server = new McpServer({ name: 'my-tools', version: '1.0.0' });
server.tool(
'search_docs',
{
description: '회사 내부 문서 검색',
inputSchema: z.object({ query: z.string() }),
},
async ({ query }) => {
const hits = await searchApi(query);
return { content: [{ type: 'text', text: JSON.stringify(hits) }] };
},
);
server.resource(
'changelog',
'file://CHANGELOG.md',
async () => ({
contents: [{ uri: 'file://CHANGELOG.md', mimeType: 'text/markdown', text: readFile() }],
}),
);
server.connect(new StdioServerTransport());
클라이언트에 등록 (예: Claude Desktop)
// ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"my-tools": {
"command": "node",
"args": ["/path/to/server.js"]
}
}
}
실전 활용 예
- 사내 위키 검색 서버 → 모든 개발자의 Claude Desktop에서 공용
- DB 스키마 조회 서버 → 읽기 전용으로 안전 공개
- 티켓 시스템 서버 → Jira/Linear CRUD
- git 서버 → commit/PR 조회
보안 설계
- 입력 검증: Zod 등으로 스키마 강제
- 최소 권한: 서버는 필요한 API 토큰만
- 감사 로그: 모든 tool 호출 기록
- 프롬프트 인젝션: 외부 문서 내용이 지시로 해석되지 않도록 샌드박스 처리
자주 묻는 질문
OpenAI 함수 호출과 차이?
함수 호출은 벤더 내 기능. MCP는 벤더 중립 프로토콜로 서버를 한 번 만들면 Claude, Cursor, Copilot(지원 추가 중) 등에서 재사용.
MCP 서버 생태계?
공식 레퍼런스 + 커뮤니티 서버 수천 개가 GitHub에 공개돼 있다. filesystem, git, sqlite, slack 등 주요 인프라 대부분 커버.
댓글 0