10장 — 모델 컨텍스트 프로토콜

LLM이 에이전트로서 효과적으로 기능하려면 멀티모달 생성 능력만으로는 부족합니다. 최신 데이터에 접근하고, 외부 소프트웨어를 활용하고, 특정 운영 작업을 수행하는 등 외부 환경과 상호작용할 수 있어야 합니다. 모델 컨텍스트 프로토콜(Model Context Protocol, MCP) 은 LLM이 외부 리소스와 연결될 수 있도록 표준 인터페이스를 정의하며, 이러한 통합이 일관되고 예측 가능하게 이루어지도록 하는 핵심 메커니즘입니다.

패턴 개요

어떤 LLM이든 외부 시스템, 데이터베이스, 도구에 별도 맞춤 연동 없이 바로 연결할 수 있는 범용 어댑터가 있다고 상상해 보자. MCP는 본질적으로 그런 역할을 한다.

MCP는 제미나이, 오픈AI의 지피티, 미스트랄, 클로드 같은 LLM이 외부 애플리케이션·데이터 소스·도구와 통신하는 방식을 표준화하려고 설계된 개방형 표준입니다. 클라이언트-서버 아키텍처로 동작하며, 세 가지를 노출합니다.

구성 요소 무엇인가 예시
리소스(resource) 정적 데이터 PDF 파일, 데이터베이스 레코드
도구(tool) 실행 가능한 함수 이메일 발송, API 쿼리
프롬프트(prompt) 상호작용이 구조적·효과적으로 이루어지도록 안내하는 템플릿 대화형 템플릿

이를 소비하는 쪽이 MCP 클라이언트인데, LLM 호스트 애플리케이션이 될 수도 있고 AI 에이전트 자체가 될 수도 있습니다.

MCP의 성능은 그 아래 API가 결정한다

이 장에서 가장 중요한 대목입니다. 표준을 붙인다고 저절로 좋아지지 않습니다.

다만 MCP는 “에이전트용 인터페이스”를 위한 일종의 규약이며, 그 성능은 결국 이를 뒷받침하는 API 설계에 크게 달려 있다. 개발자가 기존 API를 수정 없이 그대로 감싸기(wrap)만 할 위험이 있는데, 이는 에이전트에게는 최적이 아닐 수 있다.

예시가 구체적입니다. 티켓 시스템 API가 티켓 상세 정보를 한 건씩만 조회할 수 있다면, 우선순위가 높은 티켓을 요약하라는 요청을 받은 에이전트는 처리량이 커질수록 느려지고 부정확해집니다. 진정으로 효과를 거두려면 필터링, 정렬 같은 결정론적 기능으로 기반 API를 보강해 비결정론적 에이전트가 효율적으로 작업할 수 있게 해야 합니다.

그리고 여기서 나오는 문장이 이 책 전체를 관통합니다.

이는 에이전트가 결정론적 워크플로를 마법처럼 대체하는 것이 아니라, 오히려 더 강력한 결정론적 지원이 있어야 제대로 성과를 낼 수 있음을 보여 준다.

데이터 형식도 마찬가지입니다. 문서 저장소용 MCP 서버가 파일을 PDF로 반환한다면, 소비하는 에이전트가 PDF 내용을 파싱할 수 없는 한 사실상 쓸모가 없습니다. 더 나은 방법은 마크다운 같은 텍스트 버전으로 반환하는 API를 먼저 만드는 것입니다. 개발자가 연결 방식뿐 아니라 교환하는 데이터의 특성까지 고려해야 진정한 호환성을 확보할 수 있습니다.

MCP vs. 도구 함수 호출

둘 다 LLM의 역량을 텍스트 생성 너머로 확장하지만 접근 방식과 추상화 수준이 다릅니다.

항목 도구 함수 호출 모델 컨텍스트 프로토콜(MCP)
표준화 형식과 구현이 LLM 공급자마다 다르며, 그렇기에 독점적이고 공급자에 종속 개방형 표준 프로토콜로, 서로 다른 LLM과 도구 간의 상호운용성을 촉진
범위 LLM이 사전 정의된 특정 함수의 실행을 직접 요청하는 메커니즘 LLM과 외부 도구가 서로를 탐색하고 통신하는 방식을 아우르는 더 넓은 프레임워크
아키텍처 LLM과 애플리케이션의 도구 처리 로직 간의 일대일 상호작용 LLM 기반 애플리케이션(클라이언트)이 다양한 MCP 서버(도구)에 연결해 활용하는 클라이언트-서버 아키텍처
탐색 특정 대화 컨텍스트 안에서 사용 가능한 도구가 LLM에게 명시적으로 전달됨 동적 탐색이 가능하며, MCP 클라이언트가 서버에 쿼리해 어떤 기능을 제공하는지 확인할 수 있음
재사용성 도구 통합이 특정 애플리케이션과 사용 중인 LLM에 긴밀하게 결합되는 경우가 많음 호환되는 모든 애플리케이션이 접근할 수 있는 재사용 가능한 독립형 “MCP 서버” 의 개발을 촉진

비유가 명쾌합니다.

도구 함수 호출은 AI에 맞춤 제작된 특정 공구 세트, 예컨대 특정 렌치와 드라이버를 쥐어 주는 것과 같다. 작업이 고정된 작업장에서는 이 방식이 효율적이다. 반면 MCP는 범용 표준 전원 콘센트 시스템을 만드는 것과 같다. MCP 자체가 도구를 제공하지는 않지만, 규격만 맞으면 어떤 제조사의 도구라도 꽂아서 바로 작동할 수 있어 역동적이고 끊임없이 확장되는 작업장을 만들 수 있다.

연합 모델(federated model) 을 도입하면 상호운용성이 크게 향상되고 기존 자산의 가치를 끌어낼 수 있습니다. 오래되었고 서로 따로 노는 서비스들도 MCP 호환 인터페이스로 감싸는 것만으로 현대적 생태계에 편입할 수 있고, 이들은 계속 독립적으로 운영되면서도 새로운 워크플로의 구성 요소가 됩니다. 기반 시스템을 큰 비용으로 전면 개편하지 않고도 민첩성과 재사용성을 높이는 길입니다.

옮긴이 주: 연합 모델은 각기 독립적으로 운영되는 여러 시스템을 물리적으로 통합하지 않고, 각자의 자율성을 보존하면서도 공통의 표준 인터페이스를 통해 협업하도록 하는 구조를 의미한다.

도입할 때 추가로 고려할 점

고려 사항 내용
도구·리소스·프롬프트의 구분 각 구성 요소의 역할을 정확히 이해해야 한다
탐색 가능성 MCP 클라이언트가 서버에 동적으로 쿼리해 어떤 도구와 리소스를 제공하는지 파악할 수 있다. 이 just-in-time 방식은 재배포 없이 새로운 기능에 적응해야 하는 에이전트에게 특히 유용하다
보안 인증(authentication)과 인가(authorization)가 반드시 포함되어야 하며, 어떤 클라이언트가 어떤 서버에 접근하고 어떤 작업을 수행할 수 있는지를 제어해야 한다
구현 복잡성 개방형 표준이지만 구현은 복잡할 수 있다. 앤스로픽이나 FastMCP 같은 제공자가 상당 부분을 추상화하는 SDK를 제공한다
오류 처리 도구 실행 실패, 서버 미응답, 잘못된 요청 등의 오류가 LLM에게 어떻게 전달되는지를 프로토콜이 정의해야 LLM이 실패 원인을 파악하고 다른 방식으로 접근을 시도할 수 있다
로컬 vs. 원격 서버 민감한 데이터를 다루면서 속도와 보안이 중요하면 로컬, 조직 전체에서 공통 도구를 공유하고 확장 가능하게 접근해야 하면 원격
온디맨드 vs. 배치 실시간 대화형 에이전트의 즉각적 도구 접근부터, 레코드를 배치 단위로 처리하는 데이터 분석 파이프라인까지
전송 메커니즘 로컬 상호작용에는 STDIO 기반 JSON-RPC, 원격 연결에는 Streamable HTTP와 SSE 같은 웹 친화적 프로토콜

네 가지 구성 요소와 상호작용 흐름

  1. 대규모 언어 모델: 핵심 지능. 사용자 요청을 처리하고, 계획을 수립하며, 외부 정보에 접근하거나 작업을 수행해야 할 시점을 판단한다.
  2. MCP 클라이언트: LLM을 감싸는 애플리케이션 또는 그 래퍼(wrapper). 중개자 역할을 맡아 LLM의 의도를 MCP 표준에 부합하는 정식 요청으로 변환한다. MCP 서버를 탐색하고, 연결하고, 통신하는 책임을 진다.
  3. MCP 서버: 외부 세계로의 관문. 인가된 모든 MCP 클라이언트에 도구·리소스·프롬프트 세트를 노출한다. 각 서버는 보통 특정 도메인(사내 데이터베이스 연결, 이메일 서비스, 공개 API 등)을 담당한다.
  4. 선택적 제3자 서비스: 요청된 작업을 실제로 수행하는 최종 엔드포인트.

흐름은 다섯 단계입니다.

① 탐색   MCP 클라이언트가 LLM을 대신해 서버에 어떤 기능을 제공하는지 질의
         → 서버가 도구(send_email)·리소스(customer_database)·프롬프트 명세 목록으로 응답
② 요청 작성  LLM이 도구 하나를 쓰기로 판단하고, 도구명과 매개변수(수신자·제목·본문)를 명시
③ 클라이언트 통신  클라이언트가 그 요청을 표준화된 호출로 서버에 전송
④ 서버 실행  서버가 클라이언트를 인증하고 요청을 검증한 뒤, 기반 소프트웨어와 연동해 작업 수행
⑤ 응답과 컨텍스트 갱신  표준화된 응답(성공 여부·출력)을 클라이언트에 반환
         → 클라이언트가 컨텍스트를 갱신하고 LLM이 다음 단계로 진행

실제 적용 및 활용 사례

사례 내용
데이터베이스 통합 MCP Toolbox for Databases로 에이전트가 구글 BigQuery 데이터셋에 질의해 실시간 정보를 조회하고, 보고서를 생성하고, 레코드를 갱신한다. 이 모든 과정이 자연어 명령으로 이루어진다
생성형 미디어 오케스트레이션 MCP Tools for Genmedia ServicesImagen(이미지), Veo(동영상), Chirp 3 HD(음성), Lyria(음악)를 포함하는 워크플로를 오케스트레이션한다
외부 API 연동 실시간 날씨, 주가 조회, 이메일 발송, CRM 상호작용
추론 기반 정보 추출 전통적 검색 도구는 문서 전체를 반환하는 데 그치지만, 에이전트는 텍스트를 분석해 복잡한 질문에 직접 답하는 정확한 조항·수치·진술을 추출한다
맞춤형 도구 개발 개발자가 도구를 만들어 MCP 서버(예: FastMCP)로 노출한다. LLM 자체를 수정할 필요가 없다
표준화된 LLM-애플리케이션 간 통신 서로 다른 LLM 제공자와 호스트 애플리케이션 간 상호운용성
복잡한 워크플로 오케스트레이션 DB에서 고객 데이터 조회 → 개인화된 마케팅 이미지 생성 → 맞춤형 이메일 작성 후 발송을 서로 다른 MCP 서비스와 상호작용하며 수행
IoT 기기 제어 스마트 홈 가전, 산업용 센서, 로봇에 명령을 보내 물리적 시스템의 자연어 제어
금융 서비스 자동화 시장 데이터 분석, 거래 실행, 개인화된 금융 자문, 규제 보고 자동화

ADK 실습 ① — 기존 MCP 서버에 연결하기

로컬 파일 시스템 작업을 제공하는 MCP 서버에 ADK 에이전트를 연결합니다.

import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters

# 이 에이전트 스크립트와 같은 디렉터리에 'mcp_managed_files' 폴더의
# 신뢰할 수 있는 절대 경로를 생성한다.
# 프로덕션 환경에서는 더 영속적이고 안전한 위치를 지정해야 한다.
TARGET_FOLDER_PATH = os.path.join(
    os.path.dirname(os.path.abspath(__file__)), "mcp_managed_files")
os.makedirs(TARGET_FOLDER_PATH, exist_ok=True)

root_agent = LlmAgent(
    model='gemini-2.0-flash',
    name='filesystem_assistant_agent',
    instruction=(
        'Help the user manage their files. You can list files, read files, and write files. '
        f'You are operating in the following directory: {TARGET_FOLDER_PATH}'
    ),
    tools=[
        MCPToolset(
            connection_params=StdioServerParameters(
                command='npx',
                args=[
                    "-y",    # npx가 설치를 자동 승인하도록 하는 인수
                    "@modelcontextprotocol/server-filesystem",
                    TARGET_FOLDER_PATH,   # 반드시 폴더의 절대 경로여야 한다.
                ],
            ),
            # 선택 사항: 읽기만 허용하려면 다음과 같이 설정한다.
            # tool_filter=['list_directory', 'read_file']
        )
    ],
)
  • "/path/to/your/folder"를 반드시 절대 경로로 바꿔야 하며, 이 디렉터리가 에이전트가 수행하는 파일 시스템 작업의 루트가 됩니다.
  • npx(Node Package Execute) 는 npm 5.2.0 이상에 포함된 유틸리티로, npm 레지스트리의 Node.js 패키지를 전역 설치 없이 바로 실행하게 해줍니다. Node.js 패키지로 배포되는 많은 커뮤니티 MCP 서버를 실행하는 데 흔히 사용됩니다.
  • __init__.py 파일을 만들어야 agent.py가 ADK에서 탐색 가능한 파이썬 패키지의 일부로 인식됩니다.

다른 명령도 씁니다. python3로 직접 연결하거나, uvx(uv를 활용해 임시로 격리된 파이썬 환경에서 명령을 실행하는 도구)로 연결할 수 있습니다.

connection_params = StdioConnectionParams(
    server_params={
        "command": "uvx",
        "args": ["mcp-google-sheets@latest"],
        "env": {
            "SERVICE_ACCOUNT_PATH": SERVICE_ACCOUNT_PATH,
            "DRIVE_FOLDER_ID": DRIVE_FOLDER_ID
        }
    }
)

실행은 adk web으로 하고, 에이전트 메뉴에서 filesystem_assistant_agent를 고른 뒤 “이 폴더의 내용을 보여줘”, “‘sample.txt’ 파일을 읽어줘” 같은 프롬프트를 넣어 봅니다.

ADK 실습 ② — FastMCP로 직접 서버 만들기

FastMCP는 MCP 서버 개발을 간소화하는 고수준 파이썬 프레임워크입니다. 간단한 데코레이터로 도구·리소스·프롬프트를 정의할 수 있고, 특히 자동 스키마 생성 기능이 큰 장점입니다.

파이썬 함수 시그니처, 타입 힌트, 독스트링(docstring)을 지능적으로 해석해 AI 모델 인터페이스에 필요한 명세를 만든다. 이 자동화 덕분에 수동 구성이 최소화되고 인적 오류가 줄어든다.

기본 기능 외에 서버 조합(server composition)과 프락시(proxying) 같은 고급 아키텍처 패턴도 지원해, 복잡한 다중 컴포넌트 시스템을 모듈 방식으로 개발하고 기존 서비스를 AI가 접근할 수 있는 프레임워크에 통합할 수 있습니다.

# fastmcp_server.py
# pip install fastmcp
from fastmcp import FastMCP, Client

mcp_server = FastMCP()

# `@mcp_server.tool` 데코레이터가 이 파이썬 함수를 MCP 도구로 등록한다.
# 독스트링은 LLM에 전달되는 도구 설명이 된다.
@mcp_server.tool
def greet(name: str) -> str:
    """Generates a personalized greeting.

    Args:
        name: The name of the person to greet.

    Returns:
        A greeting string.
    """
    return f"Hello, {name}! Nice to meet you."

if __name__ == "__main__":
    mcp_server.run(transport="http", host="127.0.0.1", port=8000)

FastMCP는 함수의 독스트링과 타입 힌트를 활용해 도구의 작동 방식, 필요한 입력, 반환값을 에이전트에게 전달합니다. 스크립트를 실행하면 서버가 localhost:8000에서 요청을 수신하고, greet 함수가 네트워크 서비스로 이용 가능해집니다.

클라이언트 쪽은 HttpServerParameters로 연결합니다.

# ./adk_agent_samples/fastmcp_client_agent/agent.py
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, HttpServerParameters

# 앞서 작성한 fastmcp_server.py가 이 포트에서 실행 중이어야 한다.
FASTMCP_SERVER_URL = "http://localhost:8000"

root_agent = LlmAgent(
    model='gemini-2.0-flash',
    name='fastmcp_greeter_agent',
    instruction='You are a friendly assistant that can greet people by their name. Use the "greet" tool.',
    tools=[
        MCPToolset(
            connection_params=HttpServerParameters(url=FASTMCP_SERVER_URL),
            # 선택 사항: MCP 서버에서 노출할 도구를 필터링할 수 있다.
            tool_filter=['greet']
        )
    ],
)

“Greet John Doe” 같은 요청이 들어오면 에이전트에 내장된 LLM이 MCP를 통해 사용 가능한 greet 도구를 식별하고, “John Doe”를 인자로 전달해 호출한 후 서버의 응답을 반환합니다.

정리

모델 컨텍스트 프로토콜이란 무엇인가?

LLM이 효과적인 에이전트로 기능하려면 단순한 텍스트 생성을 넘어서야 합니다. 표준화된 통신 방법이 없으면 LLM과 외부 도구 또는 데이터 소스 간의 모든 통합이 맞춤형이고 복잡하며 재사용할 수 없는 작업이 됩니다. 이런 임시방편적 접근은 확장성을 저해하며, 복잡하고 상호 연결된 AI 시스템을 구축하기 어렵고 비효율적으로 만듭니다.

왜 사용하는가?

MCP는 LLM과 외부 시스템 사이에서 범용 인터페이스 역할을 하는 표준화된 솔루션을 제공합니다. 클라이언트-서버 모델로 동작하며, 서버가 도구·데이터 리소스·대화형 프롬프트를 호환되는 모든 클라이언트에 노출할 수 있게 합니다. 사용 가능한 리소스를 동적으로 찾아 예측 가능한 방식으로 활용하므로, 상호운용 가능하고 재사용 가능한 구성 요소로 이루어진 생태계를 조성해 복잡한 에이전틱 워크플로 개발을 크게 단순화합니다.

언제 사용해야 하는가?

다양하고 계속 변화하는 외부 도구, 데이터 소스, API 세트와 상호작용해야 하는 복잡하고 확장 가능한 기업용 에이전틱 시스템을 구축할 때 MCP를 사용한다. 서로 다른 LLM과 도구 간 상호운용성이 우선시될 때, 그리고 에이전트가 재배포 없이 새로운 기능을 동적으로 탐색해야 할 때 적합하다. 사전 정의된 함수가 고정되어 있고 제한적인 단순한 애플리케이션에는 도구 함수 호출을 직접 사용하면 충분할 수 있다.

핵심 정리

  • MCP는 LLM과 외부 애플리케이션·데이터 소스·도구 간의 표준화된 통신을 지원하는 개방형 표준이다.
  • 클라이언트-서버 아키텍처를 사용해 리소스·프롬프트·도구를 노출하고 소비하는 방법을 정의한다.
  • ADK는 기존 MCP 서버를 활용하는 것과 ADK 도구를 MCP 서버를 통해 노출하는 것 모두를 지원한다.
  • FastMCP는 MCP 서버의 개발과 관리를 단순화하며, 특히 파이썬으로 구현된 도구를 노출하는 데 유용하다.
  • MCP Tools for Genmedia Services를 통해 에이전트가 구글 클라우드의 생성형 미디어 기능과 통합할 수 있다.
  • MCP는 LLM과 에이전트가 실세계 시스템과 상호작용하고, 동적 정보에 접근하며, 텍스트 생성을 넘어서는 작업을 수행할 수 있게 한다.

마치며

모델 컨텍스트 프로토콜은 대규모 언어 모델과 외부 시스템 간 통신을 지원하는 개방형 표준입니다. MCP를 활용하면 LLM이 데이터베이스와 상호작용하고, 생성형 미디어 워크플로를 관리하고, IoT 기기를 제어하고, 금융 서비스를 자동화할 수 있습니다. MCP는 기본적인 언어 역량을 넘어서는 대화형 AI 에이전트 개발에 핵심적인 구성 요소입니다.

다만 이 장이 거듭 강조하듯, 표준을 붙이는 것만으로는 부족합니다. 그 아래 API가 에이전트가 쓰기 좋은 형태로 설계되어 있어야 하고, 주고받는 데이터도 에이전트가 읽을 수 있는 형식이어야 합니다.

참고 문헌