AI 에이전트 표준 규격 MCP(Model Context Protocol): 아키텍처 원리와 실무 서버 구축 가이드

AI 에이전트 표준 규격 MCP(Model Context Protocol): 아키텍처 원리와 실무 서버 구축 가이드
AI 에이전트 표준 규격 MCP(Model Context Protocol): 아키텍처 원리와 실무 서버 구축 가이드

LLM 기반 자율 에이전트(Autonomous Agents)가 데이터베이스 조회, 사내 문서 검색, GitHub 이슈 생성 등 실제 업무 시스템과 연동되는 범위가 급격히 확장되면서, 백엔드 엔지니어링 현장은 “도구 통합 파편화(Integration Fragmentation)”라는 심각한 유지보수 장벽에 직면했습니다.

모델 제공자(OpenAI, Anthropic, Google)나 에이전트 프레임워크(LangChain, LlamaIndex, AutoGen)마다 Function Calling 스키마, 컨텍스트 주입 방식, 인증 프로토콜이 제각각 달라, 새로운 시스템을 연동할 때마다 수많은 커스텀 어댑터를 별도로 개발해야 했습니다. 이러한 문제를 근본적으로 해결하기 위해 Anthropic이 오픈소스로 발표하고 글로벌 생태계 표준으로 빠르게 자리 잡은 규격이 바로 MCP(Model Context Protocol)입니다.

이번 글에서는 Anthropic의 공식 MCP 사양과 아키텍처 문서를 바탕으로, MCP의 3대 핵심 구성 요소(Host, Client, Server)와 3대 프리미티브(Tools, Resources, Prompts), 그리고 실무에서 안전하게 프로덕션 환경에 MCP 서버를 구축하는 파이썬 구현법을 체계적으로 정리합니다.

1. MCP 아키텍처: AI 어시스턴트를 위한 USB-C 표준

MCP는 하드웨어 분야의 USB-C 포트처럼, AI 모델(클라이언트)과 사내 데이터/도구(서버) 사이의 통신 규격을 JSON-RPC 2.0 기반으로 단일화한 개방형 프로토콜입니다. 전체 아키텍처는 다음 3대 계층으로 분리됩니다:

  • MCP Host: 사용자가 직접 상호작용하는 최상위 AI 애플리케이션 환경입니다 (예: Claude Desktop, Cursor IDE, 커스텀 엔터프라이즈 에이전트 포털).
  • MCP Client: Host 내부에서 동작하며, 프로토콜 핸드셰이크를 수행하고 여러 MCP Server와의 연결 수명 주기를 1:N으로 중계 관리합니다.
  • MCP Server: 로컬 파일시스템, 내부 데이터베이스, SaaS API(Slack, Jira, Salesforce) 등 실제 외부 데이터를 안전하게 노출하는 경량 마이크로서비스입니다.

2. MCP 3대 프리미티브(Primitive)와 전송 계층(Transport)

MCP는 모델이 외부 환경과 상호작용할 수 있도록 세 가지 핵심 원자적 단위(Primitive)를 규정합니다:

  1. Tools (도구 실행): 모델이 호출하여 실제 비즈니스 로직을 실행하거나 데이터 상태를 변경(Mutation)할 수 있는 실행 가능한 함수입니다. 엄격한 JSON Schema로 입출력이 검증됩니다.
  2. Resources (자원 읽기): 모델이 참조할 수 있는 읽기 전용 데이터(파일 본문, DB 스키마, API 조회 결과)를 custom-scheme://path 형태의 고유 URI로 제공합니다. 비가역적 부작용(Side-effect)이 없어 안전하게 자동 컨텍스트 주입이 가능합니다.
  3. Prompts (프롬프트 템플릿): 서버 측에서 사전에 정의한 재사용 가능한 프롬프트 워크플로를 클라이언트에 제공하여, 사용자 경험을 일관되게 표준화합니다.

전송 계층(Transport Layer)은 로컬 환경에서 부모-자식 프로세스 간 표준 입출력으로 초고속 통신하는 stdio 방식과, 분산 클라우드 환경에서 원격 통신을 지원하는 SSE (Server-Sent Events over HTTP) 방식을 표준으로 채택하고 있습니다.

3. 실무 FastMCP 기반 파이썬 서버 구현

공식 mcp 파이썬 SDK의 FastMCP 모듈을 활용하면, 복잡한 저수준 JSON-RPC 핸들링 없이 데코레이터 패턴으로 안전한 엔터프라이즈 MCP 서버를 구축할 수 있습니다.

from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, Field
import sqlite3

# 1. MCP 서버 인스턴스 초기화 (FastMCP 프로토콜 래퍼)
mcp = FastMCP("enterprise-knowledge-mcp")

class SearchCustomerFilter(BaseModel):
    name_query: str = Field(..., description="검색할 고객명 또는 회사명 키워드")
    limit: int = Field(5, description="최대 반환 레코드 수 (1~20)")

# 2. Tools 프리미티브: 모델이 호출 가능한 원자적 실행 도구
@mcp.tool()
def search_customer_records(name_query: str, limit: int = 5) -> str:
    """내부 CRM 데이터베이스에서 고객 기본 정보를 안전하게 검색합니다."""
    with sqlite3.connect("enterprise_crm.db") as conn:
        cursor = conn.cursor()
        cursor.execute(
            "SELECT customer_id, company_name, tier, status FROM customers WHERE company_name LIKE ? LIMIT ?",
            (f"%{name_query}%", min(limit, 20))
        )
        rows = cursor.fetchall()
        if not rows:
            return "검색 조건과 일치하는 고객 레코드가 없습니다."
        
        result_lines = [f"ID: {r[0]} | 사명: {r[1]} | 등급: {r[2]} | 상태: {r[3]}" for r in rows]
        return "\n".join(result_lines)

# 3. Resources 프리미티브: 읽기 전용 컨텍스트 자원 (URI 기반 로드)
@mcp.resource("crm://policies/data-access")
def get_data_access_policy() -> str:
    """사내 CRM 데이터 보안 및 접근 통제 규정 문서"""
    return """[보안 규정]
1. VIP 등급 고객의 개인 연락처는 명시적 권한 승인 없이 노출 불가.
2. 모든 검색 쿼리는 감사 로그에 자동 기록됩니다."""

if __name__ == "__main__":
    # stdio 전송 계층으로 실행 (Claude Desktop, Cursor, AI 샌드박스와 프로세스 파이프 통신)
    mcp.run(transport="stdio")

4. 엔터프라이즈 MCP 운영 및 보안 체크리스트

  • 최소 권한 원칙(Least Privilege)과 범위 제한: MCP Server는 전용 서비스 계정(Service Account)을 사용하여 읽기/쓰기 범위를 격리해야 하며, 불필요한 시스템 셸(Shell)이나 루트 권한 도구를 노출해서는 안 됩니다.
  • Human-in-the-Loop(HITL) 승인 가드레일: 파일 삭제, 금융 송금, 권한 변경 등 비가역적 부작용을 일으키는 Tool 실행은 MCP Host 레벨에서 사용자 명시적 승인 팝업을 거치도록 강제하십시오.
  • 도구 호출 감사 로깅: 모델이 호출한 도구명, 입력 파라미터, 반환 결과 요약, 실행 소요 시간을 SIEM 감사 로그에 구조화된 JSON으로 기록하여 이상 탐지 파이프라인과 연동하십시오.

출처 및 공식 기술 문서

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다