MCP(Model Context Protocol)가 AI 개발 생태계에서 자주 보이기 시작했다. Anthropic이 오픈소스로 공개한 프로토콜인데, AI 모델에 외부 도구나 데이터를 연결하는 방식을 표준화한다. 직접 써보면서 정리했다.
MCP가 왜 필요한가
기존에 AI 모델에 tool을 연결하는 방법은 제공사마다 달랐다. OpenAI는 function calling, Anthropic은 tool use 포맷이 각각 다르다. 모델 바꾸면 연동 코드도 다 고쳐야 하는 상황이었다.
MCP는 "AI 모델이 외부 리소스에 접근하는 방식"을 표준화한다. MCP 서버를 한 번 만들면 Claude, GPT 등 어느 모델이든 같은 인터페이스로 쓸 수 있다.
크게 세 가지를 제공한다:
- Tools — 함수 호출 (파일 읽기, API 요청, DB 쿼리 등)
- Resources — 데이터 소스를 컨텍스트로 제공 (파일, URL 등)
- Prompts — 재사용 가능한 프롬프트 템플릿
간단한 MCP 서버 만들기
Node.js로 MCP 서버를 만드는 방법이다. 공식 SDK를 쓴다.
npm install @modelcontextprotocol/sdk zod
// server.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from 'zod';
const server = new McpServer({ name: 'my-tools', version: '1.0.0' });
server.tool(
'get_weather',
'도시 이름을 받아 현재 날씨를 반환한다',
{ city: z.string().describe('도시 이름') },
async ({ city }) => {
const res = await fetch(`https://api.example.com/weather/${city}`);
const data = await res.json();
return {
content: [{ type: 'text', text: JSON.stringify(data) }],
};
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
stdio 트랜스포트는 로컬 클라이언트(Claude Desktop 등)와 통신할 때 쓴다. 원격 배포가 필요하면 HTTP/SSE 트랜스포트를 쓰면 된다.
Claude Desktop에 연결하기
macOS 기준으로 ~/Library/Application Support/Claude/claude_desktop_config.json에 서버 정보를 추가한다.
{
"mcpServers": {
"my-tools": {
"command": "npx",
"args": ["tsx", "/path/to/server.ts"],
"env": {
"WEATHER_API_KEY": "your-key-here"
}
}
}
}
Claude Desktop을 재시작하면 채팅창에서 도구가 바로 보인다. 도구 목록 아이콘을 누르면 어떤 도구가 연결돼 있는지 확인할 수 있다.
실제로 써보면 어떤가
프롬프트에 데이터를 직접 복붙하던 방식이 얼마나 비효율적이었는지 체감된다. 사내 DB를 조회하거나, GitHub 이슈를 읽거나, Notion 문서에 접근하는 도구를 연결하면 Claude가 직접 데이터를 가져온다.
커뮤니티에 이미 수백 개의 MCP 서버가 공개돼 있다. GitHub, Notion, Slack, Postgres, Figma 등 자주 쓰는 서비스들은 찾아보면 대부분 있다. mcp.so 같은 디렉토리 사이트에서 검색하면 편하다.
Resources를 쓰면 파일이나 URL을 컨텍스트로 등록해둘 수 있다. 자주 참조하는 문서나 API 스펙을 리소스로 연결해두면 매번 내용을 복사하지 않아도 된다.
server.resource(
'api-docs',
'docs://api-spec',
async (uri) => ({
contents: [{ uri: uri.href, text: await readApiSpec() }],
})
);
처음 세팅이 살짝 번거롭지만, 한 번 연결해두면 프롬프트에 데이터를 일일이 복사하는 시간을 많이 아낄 수 있다. AI 워크플로우를 자동화하고 싶다면 MCP부터 보는 게 맞다고 생각한다. Claude Code도 내부적으로 MCP를 쓰고 있어서, 같은 서버를 여러 클라이언트에서 재사용할 수 있다는 것도 장점이다.