공식 참고 자료: MCP · MCP Specification · Overview
커리큘럼 흐름
- CLAUDE.md Mastery — 저장소 메모리와 규칙
- Effective Prompting — 작업 framing과 제약 설정
- MCP Power Tools — 도구와 라이브 컨텍스트 연결 ← 현재 문서
- Multi-Agent Workflows — 위임과 병렬 실행
- Hooks Automation — 로컬 가드레일 자동화
- GitHub Actions Workflows — 반복 작업을 팀 자동화로 옮기기
이 문서에서 참고한 공식 문서
- Claude Code가 MCP 서버와 연결되는 방식 — MCP
- project-scope / user-scope 설정 차이 — MCP
- 왜 MCP가 Claude Code에 잘 맞는지 — Overview
MCP란?
Model Context Protocol (MCP)은 Claude Code에 외부 도구와 데이터 소스에 대한 접근 권한을 부여합니다. AI 어시스턴트의 플러그인이라고 생각하세요.
MCP 없이 Claude는 파일을 읽고 셸 명령을 실행할 수 있습니다. MCP가 있으면:
- 데이터베이스를 직접 쿼리
- 회사 내부 문서 검색
- API와 상호작용 (Jira, Slack, GitHub)
- 전문 도구 사용 (브라우저, 디자인 도구)
MCP 서버 설정하기
설정 위치
MCP 서버는 프로젝트 루트의 .mcp.json에서 설정합니다:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "postgresql://user:pass@localhost:5432/mydb"
}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "your-token"
}
}
}
}필수 MCP 서버
| 서버 | 기능 | 사용 시점 |
|---|---|---|
server-postgres |
데이터베이스 직접 쿼리 | 스키마나 데이터를 이해해야 할 때 |
server-github |
GitHub API 접근 | PR 리뷰, 이슈 관리 |
server-filesystem |
확장된 파일 접근 | 여러 레포에서 작업 시 |
server-memory |
영속적 메모리 | 세션 간 컨텍스트가 필요한 장기 프로젝트 |
context7 |
라이브러리 문서 조회 | 모든 라이브러리의 최신 API 문서 필요 시 |
context7 패턴
가장 유용한 MCP 서버 중 하나입니다. Claude가 학습 데이터에서 API 시그니처를 추측하는 대신:
사용자: "이 Next.js 페이지에 페이지네이션 추가해줘"
Claude: *context7로 최신 Next.js 문서 조회*
Claude: *최신 API로 구현, 오래된 패턴이 아님*
MCP vs. Codex 샌드박스
GPT Codex는 다른 접근 방식을 취합니다 — 도구를 미리 설치하는 샌드박스 컨테이너에서 실행됩니다. MCP는 더 유연하지만 로컬 설정이 필요합니다.
| 측면 | MCP (Claude Code) | 샌드박스 (Codex) |
|---|---|---|
| 설정 | 프로젝트별 설정 파일 | Dockerfile/설정 스크립트 |
| 접근 | 도구별 권한 | 전체 컨테이너 접근 |
| 보안 | 세밀한 프로토콜 수준 | 컨테이너 격리 |
| 확장성 | 모든 MCP 서버 | 모든 CLI 도구 |
프로젝트 vs 사용자 스코프 MCP 설정
MCP 설정에는 두 가지 스코프가 있어요. 어느 것을 쓸지 결정하는 방법:
프로젝트 스코프 — .mcp.json
팀 전체가 동일한 MCP 서버를 써야 한다면 프로젝트 스코프를 사용해요. 이 파일은 git에 커밋할 수 있어서 팀원 모두가 같은 설정을 공유할 수 있어요.
// 프로젝트 루트/.mcp.json (팀 공유, git 커밋 가능)
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "${DATABASE_URL}"
}
}
}
}단, API 키나 비밀번호는 .mcp.json에 직접 넣지 마세요. 환경 변수를 참조하도록 하고, 실제 값은 각자의 .env 파일에 보관하세요.
사용자 스코프 — ~/.claude/settings.json
본인만 쓰는 도구, 예를 들어 개인 API 키가 필요한 서버는 사용자 스코프에 넣어요. 모든 프로젝트에서 자동으로 사용할 수 있어요.
// ~/.claude/settings.json (개인용, 모든 프로젝트에서 사용 가능)
{
"mcpServers": {
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"]
},
"brave-search": {
"command": "npx",
"args": ["-y", "@anthropic/server-brave-search"],
"env": {
"BRAVE_API_KEY": "your-personal-key"
}
}
}
}| 스코프 | 파일 위치 | 공유 여부 | 언제 사용 |
|---|---|---|---|
| 프로젝트 | .mcp.json |
팀 전체 공유, git 커밋 | DB, 프로젝트 전용 도구 |
| 사용자 | ~/.claude/settings.json |
개인 전용 | 개인 API 키, 범용 도구 |
더 많은 유용한 MCP 서버
기본 서버 외에도 실제 업무에 도움이 되는 서버들이 많아요:
| 서버 | 기능 | 설치 명령 |
|---|---|---|
server-brave-search |
웹 검색 (최신 정보 조회) | npx @anthropic/server-brave-search |
server-puppeteer |
브라우저 자동화, 스크린샷 | npx @anthropic/server-puppeteer |
server-slack |
Slack 메시지 및 채널 접근 | npx @anthropic/server-slack |
server-sqlite |
SQLite DB 쿼리 | npx @anthropic/server-sqlite |
server-filesystem |
확장된 파일 접근 | npx @modelcontextprotocol/server-filesystem |
예를 들어 Brave Search를 추가하면 Claude가 최신 라이브러리 이슈나 보안 패치를 직접 찾아볼 수 있어요. Puppeteer를 연결하면 웹 UI 테스트 자동화도 가능해지고요.
MCP 서버 직접 만들기
반드시 남이 만든 MCP 서버만 써야 하는 건 아니에요. 회사 내부 도구를 Claude와 연결하고 싶다면 직접 만들 수 있어요.
TypeScript SDK(@modelcontextprotocol/sdk)를 사용하면 생각보다 빠르게 만들 수 있어요:
// 예시: 내부 위키를 검색하는 MCP 서버 개념
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
const server = new Server({ name: "internal-wiki", version: "1.0.0" });
// 도구 등록: Claude가 이 함수를 호출할 수 있게 됩니다
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "search_wiki") {
const query = request.params.arguments.query;
// 내부 위키 API 호출
const results = await internalWikiApi.search(query);
return { content: [{ type: "text", text: JSON.stringify(results) }] };
}
});이렇게 만들면 "내부 위키에서 배포 절차 찾아줘"라고 하면 Claude가 실제로 검색해서 가져올 수 있어요. 내부 API, 사내 문서 시스템, 사내 모니터링 대시보드 등 뭐든 연결할 수 있어요.
MCP 디버깅과 문제 해결
연결이 잘 안 될 때 확인할 것들이에요.
연결된 서버 확인
claude mcp list이 명령으로 현재 활성화된 MCP 서버 목록과 상태를 확인할 수 있어요.
자주 발생하는 문제
서버가 시작되지 않을 때:
npx경로가 올바른지 확인하세요 (which npx)- Node.js 버전이 맞는지 확인하세요 (대부분 v18+ 필요)
- 필요한 환경 변수가 설정되어 있는지 확인하세요
서버가 느리거나 타임아웃이 날 때:
{
"mcpServers": {
"slow-server": {
"command": "npx",
"args": ["-y", "some-mcp-server"],
"timeout": 30000
}
}
}로그 확인 방법:
Claude Code를 실행할 때 --mcp-debug 플래그를 사용하면 MCP 통신 로그를 볼 수 있어요:
claude --mcp-debugMCP 3요소 심화: Tools, Resources, Prompts
MCP를 "Claude가 호출하는 함수"로만 생각하고 계신다면, 아직 1/3만 쓰고 있는 거예요. MCP에는 세 가지 핵심 요소가 있어요:
- Tools — Claude가 호출할 수 있는 함수 (예: 데이터베이스 쿼리, 이슈 생성)
- Resources — Claude가 읽을 수 있는 데이터 소스 (예: DB 스키마, 설정 파일, 문서)
- Prompts — 서버가 제공하는 사전 정의 프롬프트 템플릿 (예: "analyze-schema", "review-code")
대부분 Tools만 사용하지만, Resources와 Prompts를 활용하면 훨씬 깊은 통합이 가능해요.
Resources 예시: Postgres MCP 서버가 테이블 스키마를 리소스로 노출하면, Claude가 매번 쿼리하지 않아도 항상 최신 스키마 정보를 갖고 있을 수 있어요.
Prompts 예시: 코드 리뷰 MCP 서버가 "security-review" 프롬프트 템플릿을 제공하면, 보안 점검에 필요한 모든 체크 항목이 자동으로 포함돼요.
인기 커뮤니티 MCP 서버
앞서 소개한 서버 외에도 실무에서 자주 쓰이는 커뮤니티 서버들이 있어요:
| 서버 | 기능 | 설치 명령 |
|---|---|---|
@anthropic/mcp-server-linear |
Linear 이슈 트래킹 | npx @anthropic/mcp-server-linear |
@anthropic/mcp-server-notion |
Notion 워크스페이스 접근 | npx @anthropic/mcp-server-notion |
@anthropic/mcp-server-sentry |
에러 모니터링 | npx @anthropic/mcp-server-sentry |
@anthropic/mcp-server-everart |
이미지 생성 | npx @anthropic/mcp-server-everart |
mcp-server-docker |
Docker 컨테이너 관리 | npx mcp-server-docker |
전체 커뮤니티 카탈로그는 https://github.com/modelcontextprotocol/servers 에서 확인할 수 있어요.
서버를 선택할 때는 보안을 위해 공식 서버(@modelcontextprotocol 또는 @anthropic)를 우선적으로 사용하는 게 좋아요.
Python으로 MCP 서버 만들기
TypeScript 외에 Python SDK도 있어요. 데이터 중심 워크플로우에서는 TypeScript보다 더 간단하게 만들 수 있어요.
pip install mcp내부 API를 래핑하는 예시:
from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.stdio
app = Server("internal-api")
@app.list_tools()
async def list_tools():
return [
Tool(
name="search_docs",
description="Search internal documentation",
inputSchema={
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"}
},
"required": ["query"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "search_docs":
results = await internal_api.search(arguments["query"])
return [TextContent(type="text", text=str(results))]
async def main():
async with mcp.server.stdio.stdio_server() as (read, write):
await app.run(read, write, app.create_initialization_options()).mcp.json에 등록할 때는 이렇게 하면 돼요:
{
"mcpServers": {
"internal-api": {
"command": "python",
"args": ["-m", "my_mcp_server"]
}
}
}Python이 익숙하다면 내부 API 래핑 서버를 만드는 데 30분이면 충분해요.
MCP 서버 조합 전략
MCP 서버를 무작정 다 추가하면 안 돼요. 각 서버마다 컨텍스트 오버헤드가 생기거든요. 워크플로우에 맞는 조합을 선택하는 게 중요해요.
풀스택 개발:
{
"mcpServers": {
"postgres": { "...": "DB 쿼리와 스키마" },
"github": { "...": "PR과 이슈 관리" },
"context7": { "...": "라이브러리 최신 문서" }
}
}데이터 엔지니어링:
{
"mcpServers": {
"postgres": { "...": "데이터 웨어하우스 쿼리" },
"filesystem": { "...": "여러 레포 접근" },
"memory": { "...": "세션 간 컨텍스트" }
}
}DevOps/SRE:
{
"mcpServers": {
"sentry": { "...": "에러 모니터링" },
"docker": { "...": "컨테이너 관리" },
"github": { "...": "배포 워크플로우" }
}
}경험적으로 2-4개가 이상적이에요. 5개 이상은 시작 속도가 느려지고 컨텍스트를 많이 소비할 수 있어요.
프로 팁
과도하게 연결하지 마세요
각 MCP 서버는 컨텍스트 오버헤드를 추가합니다. 필수적인 2-3개로 시작하고 필요에 따라 추가하세요.
CLAUDE.md와 적극적으로 결합하세요
MCP 서버를 설정만 해두면 Claude가 언제 어떤 도구를 써야 할지 판단이 애매할 수 있어요. CLAUDE.md에 명확한 규칙을 적어두면 훨씬 일관성 있게 동작해요:
## MCP 도구 사용 규칙
- DB 스키마 질문 → postgres MCP 먼저, 추측 금지
- 외부 라이브러리 → context7로 최신 문서 확인 후 구현
- 이슈 생성/업데이트 → GitHub MCP 사용, 수동 API 호출 금지
- 웹 검색이 필요하면 → brave-search MCP 사용
- 내부 문서 참조 → internal-wiki MCP로 검색이렇게 해두면 Claude가 "DB 테이블 구조가 어때?"라는 질문을 받았을 때 추측하지 않고 실제로 쿼리해서 확인해요.