14. MCP 서버 연동
- MCP(Model Context Protocol)가 무엇이고 왜 필요한지 이해한다
- MCP 서버를 추가하고 전송 방식(stdio·HTTP 등)을 구분한다
- MCP가 컨텍스트를 많이 먹는 이유와 절약법을 안다
- MCP의 보안 위험과 안전 수칙을 안다
MCP란
MCP(Model Context Protocol) 는 Claude Code를 외부 서비스·도구와 잇는 표준 규약입니다. Claude Code는 MCP "클라이언트"로서, 별도로 작성된 MCP "서버"에 접속해 그 서버의 도구·리소스·프롬프트를 마치 네이티브 도구인 것처럼 모델에 노출합니다.
비유하자면, MCP는 다양한 가전을 꽂는 표준 콘센트입니다. GitHub·데이터베이스·브라우저·Sentry·Stripe·Linear 등 제각각인 외부 시스템을, 같은 규격의 플러그로 Claude에 연결하는 것이죠.
flowchart LR
CC[Claude Code<br/>MCP 클라이언트]:::agent
CC <-->|MCP| S1[GitHub 서버]:::tool
CC <-->|MCP| S2[데이터베이스 서버]:::tool
CC <-->|MCP| S3[브라우저 서버]:::tool
CC <-->|MCP| S4[사내 API 서버]:::tool
classDef agent fill:#80DEEA,stroke:#00ACC1,color:#000
classDef tool fill:#90CAF9,stroke:#1E88E5,color:#000
Skill과 MCP는 다른 문제를 푼다
둘 다 "Claude가 할 수 있는 일을 넓힌다"는 점에서 비슷해 보이지만 역할이 다릅니다.
| Skill | MCP 서버 | |
|---|---|---|
| 무엇 | 방법(knowledge) — 어떻게 할지 지침 | 접근(access) — 외부 시스템과의 연결 |
| 예 | "Snowflake SQL은 이렇게 써" | Snowflake에 실제 접속해 쿼리 실행 |
| 형태 | 디스크 위 파일 | 실행되는 서버 프로세스/원격 엔드포인트 |
MCP 서버 추가하기
MCP 서버 설정은 settings.json의 mcpServers나 프로젝트의 .mcp.json에 들어가며, /mcp로 상태를 봅니다. 전송 방식(transport)에 따라 설정이 다릅니다.
| 전송 방식 | 특징 | 예 |
|---|---|---|
| stdio | 로컬 프로세스로 실행, 표준입출력으로 통신 | 로컬 도구 서버 |
| HTTP / SSE | 원격 엔드포인트에 연결 | 벤더가 호스팅하는 서버 |
| WebSocket | 양방향 스트리밍 | 실시간 연동 |
CLAUDE_CODE_SESSION_ID와 CLAUDECODE=1 같은 환경변수가 전달됩니다. MCP 서버의 프롬프트는 /mcp__<서버>__<프롬프트> 형태의 명령으로도 나타날 수 있습니다.⚠️ MCP는 컨텍스트를 많이 먹는다
이건 Skill과의 결정적 차이라 꼭 알아야 합니다.
flowchart TB
subgraph Skill["Skill (점진적 공개)"]
SK[세션 시작: 이름+설명만<br/>스킬당 ~30-50 토큰]:::result
end
subgraph MCP["MCP (선행 로드)"]
MC[세션 시작: 모든 도구의<br/>이름·설명·파라미터 스키마 로드<br/>5서버 58도구 ≈ 55,000 토큰]:::danger
end
classDef result fill:#A5D6A7,stroke:#43A047,color:#000
classDef danger fill:#EF9A9A,stroke:#E53935,color:#000
Skill은 호출 전엔 이름·설명만 차지하지만(~30-50토큰), MCP는 모든 도구의 이름·설명·파라미터 스키마를 선행 로드합니다. 5개 서버에 58개 도구짜리 구성은 프롬프트를 보내기도 전에 약 55,000토큰을 먹습니다.
절약 수칙:
- 정말 쓰는 서버만 연결하세요. "혹시 몰라서" 켜둔 서버가 컨텍스트를 갉아먹습니다.
- 도구가 많은 서버는 신중히. 일부 버전은 도구 스키마를 필요 시 로드하는 deferred loading(ToolSearch)을 지원합니다(→ 22장).
⚠️ MCP 보안
MCP는 외부 시스템과 잇는 통로라 공급망·주입 공격의 표면이 됩니다. 실무 수칙:
- 1차 벤더 서버를 선호하세요. Sentry·Stripe·GitHub·Linear 등은 자기 서버에 서명해 배포합니다. 출처 불명의 커뮤니티 포크는 위험이 큽니다.
- 되돌릴 수 없는 부작용엔 사람을 끼우세요(human-in-the-loop). Slack 메시지 전송, PR 열기, 이슈 삭제 등은 자동 승인하지 말고 확인을 거치세요.
- 읽기 전용 도구만 자동 승인하세요. 쓰기·삭제는 매번 검토.
- 연결 시점뿐 아니라 런타임에도 감사하세요. 도구 응답을 로깅하고, 주입된 지시가 없는지 분류기로 점검하고, 이상을 알림으로.
⚠️ 알려진 위험 사례: 과거 일부 MCP 서버(예: 특정 git 서버, 재귀 클론을 통한 RCE 등)에서 취약점이 보고되었습니다. 새 서버를 도입하기 전 권한·스크립트·훅·외부 연결을 먼저 점검하세요. 많은 MCP 자원이 파일을 읽고, 명령을 실행하고, 데이터를 외부로 보낼 수 있습니다.
실전 예: GitHub MCP
GitHub MCP 서버를 연결하면 Claude가 이슈·PR·코드를 직접 조회·생성할 수 있습니다. 예:
> 우리 저장소의 열린 PR 중 리뷰 안 된 걸 찾아서, 변경 규모순으로 요약해줘
Claude가 GitHub MCP 도구를 호출해 데이터를 가져와 정리합니다. 다만 "PR 머지" 같은 되돌리기 어려운 작업은 위 보안 수칙대로 확인을 거치게 하세요. (Git/GitHub 워크플로우는 18장에서 더 다룹니다.)
이 장에서 배운 것
- MCP는 Claude Code를 외부 서비스와 잇는 표준 규약이다. Claude Code는 MCP 클라이언트로서 서버의 도구를 네이티브처럼 쓴다.
- Skill은 "방법", MCP는 "접근" — 웨어하우스 작업처럼 둘 다 필요한 경우가 많다.
- 전송 방식은 stdio(로컬)·HTTP/SSE(원격)·WebSocket이 있고,
mcpServers/.mcp.json에 설정한다. - MCP는 도구 스키마를 선행 로드해 컨텍스트를 크게 먹는다 → 정말 쓰는 서버만 연결.
- 보안: 1차 벤더 선호, 비가역 작업엔 사람 개입, 읽기만 자동 승인, 런타임 감사.
✍️ 확인 문제
- Skill과 MCP 서버의 역할 차이를 "방법 vs 접근"으로 설명해 보세요.
- MCP가 Skill보다 세션 시작 시 컨텍스트를 훨씬 많이 먹는 이유는 무엇인가요?
- PR 머지나 이슈 삭제 같은 작업에 대해 권장되는 안전 수칙은 무엇인가요?
다음 장: 15. Hooks(훅) — 모델의 판단에 기대지 않는 결정적 자동화.