MCP 서버를 여러 개 연결할 경우 지연되는 문제 — 도구 수와 컨텍스트 소비 실측
요약
MCP 서버를 다수 연결하면 도구 정의(tool definition)가 시스템 프롬프트에 포함되어 컨텍스트 소비와 초기 응답 지연을 유발합니다. 본 글은 이를 실측하는 스크립트와 프로파일링 절차를 제시하며, 과도한 도구 정의가 모델의 오작동 원인이 될 수 있음을 경고합니다.
핵심 포인트
- MCP 서버는 연결된 모든 도구를 시스템 프롬프트에 포함시킵니다.
- 도구 1개당 수백~2,000 토큰이 소모되며, 호출 여부와 관계없이 비용 발생합니다.
- 총 도구 정의만으로 컨텍스트의 상당 부분(예: 33,000 토큰)을 차지할 수 있습니다.
- 자주 사용하는 서버는 글로벌 설치하여 npx 의존성을 제거하는 것이 성능에 유리합니다.
제 환경(Claude Code + 1인 회사 자동화 기반, launchd 작업 17개)에서 MCP 서버를 추가하자 시작 직후의 컨텍스트가 도구 정의로 2할 가까이 채워졌고, 첫 응답 속도가 명확하게 느려졌습니다. 원인은 간단합니다. MCP 서버의 도구 정의는 '사용 여부'와 관계없이 전부 시스템 프롬프트에 포함되기 때문입니다.
본 글은 그 소비량을 실측하는 스크립트와 프로파일 분할로 줄이는 절차를 다룹니다. 경영 이야기는 마지막에 조금만 작성하겠습니다.
MCP 서버를 연결하면, Claude Code는 각 서버에 tools/list를 보내고, 돌아온 **모든 도구의 name / description / inputSchema(JSON Schema)**를 요청의 도구 정의에 포함시킵니다. 즉,
- 도구 1개당 수백~2,000 토큰 (스키마가 깊은 경우 쉽게 초과)
- 서버 1개로 40개의 도구를 반환하는 경우가 있습니다 (Gmail, Playwright, GitHub 등이 큰 편).
- 한 번도 호출하지 않아도 비용이 매 요청마다 발생합니다 (프롬프트 캐시가 적용되어도 컨텍스트 공간의 소비는 사라지지 않습니다).
제 환경에서는 Gmail / Google Drive / Slack / GitHub / Playwright / note-api / Figma / Docs / codegraph를 연결한 상태에서, 도구 총수가 190개를 넘었습니다. 이것이 '모델이 똑똑함에도 불구하고 지시를 오해하는' 현상의 온상이 되기도 합니다. 예전에 CLAUDE.md를 1,000줄까지 부풀려 AI가 지시와 반대되는 동작을 시작했던 실패 사례가 있었는데, 구조는 같습니다. 선택지가 너무 많으면 선택을 잘못합니다.
먼저 측정해 보겠습니다. MCP 서버에 직접 tools/list를 보내고, 돌아온 JSON을 그대로 토큰으로 환산하는 것이 가장 정확합니다. stdio 서버라면 JSON-RPC를 표준 입력으로 흘려보내는 것만으로 충분합니다.
.company/scripts/lib/measure-mcp-tools.mjs
(회사에서 실제로 돌리는 스크립트입니다. 의존성 제로, Node 20+)
#!/usr/bin/env node
// MCP 서버의 tools/list를 호출하여 도구 수와 정의 토큰량을 실측합니다
// 사용법: node measure-mcp-tools.mjs '<서버 이름>' '<명령어>' [인수...]
...
실행은 다음과 같습니다:
cd /path/to/repo
node .company/scripts/lib/measure-mcp-tools.mjs \
playwright npx -y @playwright/mcp@latest
...
제 환경에서의 실측값 (2026-09 기준, totalTokens는 위 스크립트 출력):
| 서버 | 도구 수 | 정의 토큰 | handshake |
|---|---|---|---|
| playwright | 30 | 약 9,800 | 1.4s |
| ... | |||
| 총합으로 도구 정의만으로 약 33,000 토큰가량이 사라집니다. 200k 컨텍스트라면 16%에 해당하며, 이는 CLAUDE.md나 파일 읽기 전에 확정적으로 포함됩니다. 체감되는 지연 시간은 이것과 연결 시의 handshake 직렬 대기를 합산한 것입니다. |
위 표의 handshake 열이 은근히 영향을 줍니다. npx -y로 지정된 서버는 캐시 미스 시 패키지 가져오기부터 시작하므로, 첫 실행만 10초급이 될 수 있습니다. 자주 사용하는 서버는 글로벌 설치하여 npx를 제거하는 것만으로도 구동이 안정됩니다.
# 매번 npx로 가져오게 하지 않기
npm i -g @playwright/mcp
# .mcp.json의 command는
확인할 수 있습니다. `✗ failed to connect`
이 섞여 있으면, Claude Code는 시작할 때마다 해당 서버의 연결 재시도를 기다립니다. **죽은 서버를 제거하지 않고 방치하는 것이 지연의 가장 흔한 원인**이었습니다. 저는 실제로 이것 때문에 몇 주 동안 손해를 봤습니다.
'모두 연결하기'를 멈추고, **용도별로 .mcp.json을 분리하여 필요할 때만 전환**합니다. 저희 회사에서는 이 형태로 정착했습니다.
`.mcp.profiles/publishing.json`
(기사/서적 공개 시. 브라우저 조작과 note만)
{
"mcpServers": {
"note-api": {
...
`.mcp.profiles/dev.json`
(개발 시. 코드 탐색과 GitHub만)
{
"mcpServers": {
"codegraph": {
...
전환 스크립트 `.company/scripts/mcp-profile.sh`
:
#!/usr/bin/env bash
MCP 프로파일을 전환합니다 (.mcp.json만 교체)
사용법: ./mcp-profile.sh dev | publishing | none | show
...
chmod +x .company/scripts/mcp-profile.sh
./.company/scripts/mcp-profile.sh dev
./.company/scripts/mcp-profile.sh show
**주의할 점 2가지.**
-
`.mcp.json`
을 심볼릭 링크로 사용하고 있으므로, 이를 잊으면 프로파일 전환 시마다 diff에 나타납니다. `.gitignore`
에 `.mcp.json`
을 넣어두세요 - 프로젝트
`.mcp.json`
의 서버는 처음 실행할 때 승인 대화 상자가 나옵니다. CI나 launchd를 통한 비대화형 실행에서는 승인이 불가능하므로, 자동 실행되는 작업에는 `.claude/settings.json`
에서 명시적으로 허용해 둡니다.
{
"enableAllProjectMcpServers": false
저는 혼자 AI-CEO Framework를 운영하고 있으며, AI 운영 비용은 매월 약 ¥20,000(Claude Code Max)입니다. MCP를 너무 많이 연결했을 때 발생한 문제는 비용 증가가 아니라 **출력 정확도 저하**였습니다. 190개의 도구 중에서 AI가 잘못 선택하는 것이죠. 이는 이전에 CLAUDE.md를 1,000줄까지 늘렸다가 AI가 지시와 반대되는 동작을 시작했던 실패와 완전히 같은 구조입니다.
**연결할 수 있는 것과 연결해야 하는 것은 다릅니다.** MCP는 '필요할 때 필요한 것만'이 정답입니다. 우선 `/context`를 열어 지금 얼마나 비용을 쓰고 있는지 확인해 보세요.
MCP 서버의 설계, 직접 제작, 운영에 대해 좀 더 체계적으로 알고 싶은 분들을 위해 저희가 책을 출간했습니다.
-
**『Claude Code × MCP 서버 개발 입문』** — MCP 프로토콜 기초부터 자체 서버 구현, 도구 설계의 세분화 정도(granularity), 인증, 운영까지 다룹니다. 본 기사의 '도구를 줄이는' 판단 기준도 책에서 자세히 다루고 있습니다 - 도서 목록: https://zenn.dev/joinclass?tab=books
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기