에이전트 검색을 위한 MCP와 CLI 성능 측정: MCP가 호출당 17배 더 많은 토큰을 사용함
요약
MCP와 CLI 방식의 에이전트 검색 성능을 비교한 결과, MCP가 CLI보다 호출당 약 17배 더 많은 토큰을 사용하는 것으로 나타났습니다. MCP는 매 턴마다 도구 스키마를 컨텍스트에 주입하는 고정 비용이 발생하는 반면, CLI는 필요한 시점에만 토큰을 사용하여 효율적입니다.
핵심 포인트
- MCP는 매 턴 약 771개의 도구 스키마 고정 비용 발생
- CLI는 호출 시에만 메타데이터를 사용하여 토큰 절약 가능
- MCP 기본 응답(6,047 토큰)이 CLI(351 토큰)보다 17배 무거움
- 에이전트 설계 시 호출 방식에 따른 전송 방식 선택이 중요
저는 SerpApi의 공식 serpapi-mcp 서버와, 동일한 작업을 위해 제가 직접 만든 작은 오픈 소스 (MIT) CLI인 serp를 통해 동일한 Google 검색을 실행했습니다. 검색을 수행하기도 전에 MCP는 이미 모델의 컨텍스트 (Context)에 771개의 토큰을 할당했습니다. 반면 CLI는 0개를 할당했습니다. 실제 검색을 수행했을 때, MCP는 6,047개의 토큰을 반환했고 CLI는 351개를 반환했습니다. 동일한 쿼리, 동일한 하단의 serpapi 라이브러리, 동일한 머신에서 수행한 결과입니다.
검색 여부와 상관없이 매 턴마다 지불해야 하는 이 고정 비용 (Standing cost)은 아무도 데모에서 언급하지 않는 수치입니다. 그래서 저는 이 모든 것을 기록했습니다.
요약 (TL;DR): 에이전트 루프 (Agent loop) 내의 상태 비저장 (Stateless) 검색의 경우, CLI는 턴당 약 0개의 고정 토큰이 드는 반면 MCP 도구는 턴당 약 771개가 들며, 호출당 약 351개 대 약 6,047개가 소요됩니다. 양측의 압축 로직 (Compaction logic)은 동일합니다. CLI는 단지 사용자가 요청한 필드로만 다듬고, 유휴 상태일 때는 컨텍스트 (Context)에 머물지 않을 뿐입니다. 호출 방식에 적합한 전송 방식 (Transport)을 선택하세요.
매 턴마다 지불하는 고정 비용 (Standing cost)
| SerpApi MCP | serp CLI | |
|---|---|---|
| 컨텍스트 내 도구 스키마 (Tool schema), 턴당 | 771 tokens | ~0 (PATH 상의 바이너리) |
| 스킬 메타데이터 (Skill metadata) | 해당 없음 | ~110 tokens, 트리거될 때만 |
MCP는 매 요청마다 771 토큰에 달하는 자신의 search 도구 스키마 (Tool schema)를 주입합니다. CLI는 아무것도 주입하지 않습니다. 이는 PATH 상의 바이너리입니다. 에이전트는 한 번 존재를 학습하면 호출하기 전까지는 잊어버립니다.
한 번 지불하는 발견 비용 (Discovery cost)
| SerpApi MCP | serp CLI | |
|---|---|---|
| 인터페이스 학습 | 엔진 리소스 (google.json) = 5,816 tokens | --help = ~290 tokens |
둘 다 온디맨드 (On demand) 방식입니다. MCP를 통해 하나의 엔진 파라미터를 학습하려면 리소스를 읽어야 하며, google.json은 5,816 토큰입니다. CLI를 학습하려면 --help를 읽어야 하며, 약 290 토큰이 소요됩니다.
호출당, 동일한 Google 쿼리, 바이트 단위까지 동일함
| 응답 (Response) | 토큰 (Tokens) |
|---|---|
MCP complete (기본값) | 6,047 |
| ... |
MCP의 기본 모드는 complete이므로, 별도의 설정 없이 검색을 수행하면 컨텍스트(Context)에 약 6,000 토큰이 할당됩니다. 반면 CLI는 기본적으로 compact 모드를 사용하며 사용자가 원하는 필드만 요청할 수 있게 하여, 동일한 10개의 결과가 351 토큰으로 반환됩니다. 이는 MCP 기본값보다 약 17배 작으며, MCP 자체의 compact 모드보다도 13배 더 작습니다.
CLI가 13배 더 적은 토큰을 사용하는 이유
솔직하게 먼저 말씀드리자면, 양측의 압축(Compaction) 로직은 동일합니다. 양쪽 모두 동일한 5개의 메타데이터 블록(search_metadata, search_parameters, search_information, pagination, serpapi_pagination)을 제거합니다. SerpApi의 MCP는 훌륭한 소프트웨어이며, 모든 엔진을 아우르는 하나의 범용 도구로서 771 토큰을 사용하는 것은 낭비가 아닌 합리적인 스키마(Schema)입니다. 저는 이를 비난하려는 것이 아닙니다.
차이는 CLI가 의도적으로 수행하는 세 가지 작업에서 발생합니다. 첫째, 필드 투영(Projects fields)입니다. --fields title,link를 사용하면 모든 결과가 지정된 키로 축소되지만, MCP의 compact 모드는 메타데이터만 제거할 뿐 모든 결과의 모든 필드를 여전히 반환합니다. 이 기능 하나가 13배 차이의 대부분을 차지합니다. 둘째, CLI는 미니파이(Minify)를 수행하는 반면, MCP는 indent=2를 사용하여 프리티 프린트(Pretty-print)를 수행하며, 이 자체만으로도 약 15% 더 많은 문자를 사용합니다. 셋째, CLI는 유휴 상태(Idle)일 때 비용이 들지 않습니다. MCP 서버 하나를 유지하는 비용 자체는 저렴합니다. 문제는 이것이 복리로 작용한다는 점입니다. 10개의 MCP 서버를 연결하면, 에이전트가 작업을 시작하기도 전에 항상 로드되어 있는 스키마로 인해 수천 토큰을 소모하게 됩니다.
다른 이들도 동일한 효과를 더 가혹하게 측정했습니다
이 원칙은 제가 만든 것이 아닙니다. Anthropic의 프레임링(framing)은 컨텍스트 윈도우(context window)가 공공재라는 것이며, 발표된 두 개의 벤치마크(benchmark)도 같은 방향을 가리키고 있습니다. 그들의 MCP를 활용한 코드 실행(code-execution-with-MCP) 보고서에 따르면, 도구 정의를 로드하는 대신 코드로 도구를 호출함으로써 Drive-to-Salesforce 워크플로우를 약 150,000개 토큰에서 약 2,000개 토큰으로 줄였으며, 이는 98.7%의 절감 효과를 가져왔습니다. OnlyCLI 벤치마크에서는 GitHub 작업을 수행할 때 MCP를 통하면 44,026개 토큰이 소모된 반면, CLI를 통하면 1,365개 토큰이 소모되어 약 32배 차이가 났습니다. 이것들은 수많은 도구와 중간 결과물이 포함된 거대한 엔드 투 엔드(end-to-end) 시나리오들입니다. 단일 검색에서 나타난 저의 13~17배 차이는 동일한 메커니즘이 작동하는 더 작고 보수적인 버전입니다.
실제로 MCP가 필요한 경우
이것은 "CLI가 MCP를 이긴다"는 뜻이 아닙니다. 호출에 적합한 전송 방식(transport)을 선택하라는 것입니다.
연결 자체가 어려운 부분일 때는 MCP를 선택하세요: OAuth 또는 다중 사용자 인증(multi-user auth), 서버 측 할당량(quota) 및 속도 제한(rate-limit) 거버넌스, 여러 클라이언트가 공유하는 하나의 호스팅된 엔드포인트(endpoint), 또는 단계 전반에 걸쳐 상태를 유지하는 세션(session) 등이 해당됩니다. SerpApi는 serpapi-mcp를 실행하며 mcp.serpapi.com에서 호스팅 버전을 제공하는데, 바로 이런 상황에서 그 가치를 발휘합니다.
호출이 상태가 없는(stateless) 방식이라면 CLI를 선택하세요: 쿼리를 입력하고 결과를 출력하며, 단일 단계로 이루어지고, 환경 변수에 하나의 키만 존재하며, 모델에 도달하기 전에 다듬고 싶은 방대한 페이로드(payload)가 있는 경우입니다. 검색이 이에 대한 교과서적인 사례입니다. --help를 한 번 읽고 나면, 그 이후의 모든 호출은 요청한 내용만을 반환합니다.
serp란 무엇인가
이것은 SerpApi의 REST 엔드포인트를 래핑(wrap)하며, bun build --compile을 통해 런타임 의존성 없이 단일 바이너리로 컴파일됩니다. compact는 메타데이터 블록을 제거하고, --fields는 각 결과를 지정한 키로 투영(project)하며, 지리적 플래그(--location, --gl, --hl)는 설정했을 때만 네트워크로 전송됩니다. 출력은 stdout(표준 출력)에 최소화된(minified) JSON 형태로 제공되는데, 이는 이를 읽는 주체가 기계이기 때문입니다. 키는 SERPAPI_API_KEY에서 읽으며, 없을 경우 SERP_API_KEY를 사용합니다.
테스트에서 중요한 부분은 순수 함수(pure functions)들입니다: URL 빌더(URL builder), 인자 파서(arg parser), 결과 셰이핑(result shaping)입니다. 네트워크 호출과 run() 엔트리는 주입된 fetch와 주입된 스트림(streams)을 사용하므로, 37개의 테스트로 구성된 전체 스위트(suite)는 키나 요청 없이 오프라인으로 실행됩니다. 이 부분이 제가 실제로 만족하는 지점입니다.
그 옆에는 절차를 담고 있는 searching-with-serpapi라는 Claude Code 스킬이 있습니다: 어떤 엔진이 어떤 의도에 적합한지, 요약형(compact) 대 전체형(complete), 연산자(operators), 중복 제거(dedup) 및 인용(cite) 시점, 그리고 아예 검색을 하지 말아야 할 시점 등을 다룹니다. 이 스킬은 트리거되기 전까지 약 110개의 토큰을 소모합니다. 능력(Capability)은 CLI(또는 MCP)에서 나오고, 방법론(how-to)은 스킬에서 나옵니다.
제가 이 글을 읽는 입장이라면 주의 깊게 볼 두 가지 사항
프롬프트 캐싱(Prompt caching)은 도구 세트(toolset)가 변하지 않는 웜 세션(warm sessions)에서 정적 스키마(static schema) 블록이 분할 상환(amortized)되므로 기존의 격차를 좁혀줍니다. 턴당 771개라는 수치는 콜드 스타트(cold starts) 시점과 도구를 추가하거나 교체할 때 가장 뼈아프게 다가옵니다. 호출당 격차는 캐싱과 무관합니다. 검색할 때마다 매번 새로 비용을 지불해야 합니다.
그리고 코드 실행(code execution)은 이 모든 것보다 더 큰 레버(lever)입니다. 98.7%라는 수치가 바로 여기서 나옵니다. 하지만 코드 실행에는 리소스 제한(resource limits)과 모니터링이 포함된 실제 샌드박스(sandbox)가 필요하며, 일반적인 CLI 호출은 이를 건너뜁니다. 이는 다른 트레이드오프(tradeoff)이며, 명시할 가치가 있습니다.
결론
전송 방식(transport)을 호출 방식에 맞추십시오. 코딩 루프 내의 상태 비저장(stateless) 검색의 경우, 작은 CLI와 스킬을 조합하는 것이 컨텍스트(context) 비용 면에서 더 저렴합니다(턴당 771개 대비 약 0개, 결과당 6,000개 대비 약 350개). 또한 도구를 추가할수록 고정 비용 절감 효과가 누적됩니다. 호스팅되고 관리되며 멀티 클라이언트 연결이 필요한 경우에는 MCP가 올바른 선택입니다.
만약 여러 개의 MCP 서버 스택으로 에이전트를 실행하고 있다면, 고정 비용을 본인의 환경에서 직접 측정해 볼 가치가 있습니다. 방법론은 부록에 있으므로 쉽게 재현할 수 있습니다. 여러분은 어떤 수치를 얻게 될지 진심으로 궁금합니다.
리포지토리는 오픈 소스이며 MIT 라이선스입니다: github.com/aryrabelo/serpapi-agent-toolkit. CLI와 스킬은 함께 제공되며, 둘 다 SerpApi의 serpapi-mcp를 보완하는 역할을 합니다.
부록: 측정 방법
토큰은 문자 수 / 4로 계산되었으며, 양측 모두 동일한 대리 지표(proxy)를 사용했으므로 절대적인 수치보다는 비율을 더 신뢰해도 좋습니다.
MCP 스탠딩(standing)은 FastMCP에서 실행되는 serpapi-mcp의 실제 tools/list 페이로드이며, 클라이언트가 실제로 수신하는 필드(name, description, inputSchema)를 기준으로 계산했습니다: 단일 search 도구에 대해 771 토큰이 소요됩니다. 또한 서버는 107개의 엔진 리소스(engine resources)를 노출합니다. 이들을 모두 나열하면 약 4,300 토큰이 소요되며, google.json을 읽는 데는 5,816 토큰이 소요됩니다.
호출당(Per call) 측정은 동일한 쿼리에 대해 동일한 serpapi Python 라이브러리를 통해 수행된 실제 Google 검색을 의미하며, 이후 두 가지 방식으로 직렬화(serialization)되었습니다: MCP와 일치하도록 json.dumps(indent=2)를 사용한 방식과, CLI와 일치하도록 필드 투영(field projection)을 적용하여 최소화(minified)한 방식입니다. 정확한 토큰 수: MCP 전체(complete) 6,047, MCP 압축(compact) 4,577, CLI 전체(complete) 5,321, CLI 압축(compact) 3,940, CLI --fields title,link 351. CLI 스탠딩(standing) 및 --help는 배포된 v0.1.0 텍스트에서 가져왔으며, 각각 약 110 및 290 토큰입니다.
출처: Anthropic의 "Code execution with MCP", "Writing tools for agents", "Effective context engineering"; OnlyCLI 토큰 비용 벤치마크; SerpApi의 serpapi-mcp 및 serpapi-javascript 리포지토리.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기