Logo

Model Context Protocol: AI 애플리케이션의 통신 표준

Chat GPT와 같은 대형 언어 모델(LLM)이 급속도로 발전하면서 이를 활용한 다양한 AI 에이전트 및 확장 서비스들이 등장하고 있습니다. 하지만 LLM은 학습된 시점의 데이터에 갇혀 실시간 정보에 접근하거나 외부 시스템과 상호작용하는 데 한계가 있습니다. 뿐만 아니라, 비지니스 도메인에 맞는 문맥(Context)에서 AI 애플리케이션이 작동하도록 하는 것은 여전히 큰 도전입니다.

이러한 LLM의 한계를 극복하고 AI의 잠재력을 최대한 발휘하기 위해 등장한 것이 바로 Model Context Protocol, 줄여서 MCP입니다. 이 글에서는 MCP가 무엇인지, 왜 필요한지, 그리고 어떻게 활용할 수 있는지에 대해 자세히 알아보겠습니다.

MCP란 무엇인가?

Model Context Protocol은 말 그대로 AI 모델에게 컨텍스트, 즉 문맥을 제공해주는 표준화된 방법입니다. 많은 개발자 분들이 요즘 바이브 코딩할 때 애용하시는 LLM인 Claude 모델로 유명한 앤트로픽(Anthropic)에서 처음 제안한 이 프로토콜인데요. 제안하자 마자 AI 생태계에서 엄청난 반향을 일으키며 현재는 OpenAI, Microsoft, Cloudflare 등 국내외 유수 AI 제공 업체들이 앞다퉈 MCP를 지원하고 있습니다.

이전에도 AI 모델이 학습된 데이터를 벗어나 아닌 외부 데이터에 접근하게 할 수 있는 기술들은 있었습니다. 대표적으로 RAG(Retrieval Augmented Generation)을 들 수가 있으며, LLM을 직접 파인튜닝(fine-tuning)하기도 했었습니다. 하지만 RAG는 기본적으로 데이터를 읽을 수 밖에 없었고 백터(Vector) DB도 필요해서 기술적 문턱이 높은 편이었습니다. 파인튜닝도 새로운 근간(base) 모델이 등장하면 순식간에 활용 가치가 떨어지는 맹점이 있었습니다. 무엇보다 기존 기술들은 표준화가 되어 않아서, 각 모델 제공 업체마다 API가 달라서 통합 비용이 높았습니다.

MCP의 핵심 아이디어는 간단합니다. AI 모델이 다양한 외부 세계와 상호작용할 때, 매번 다른 방식의 통합을 구현하는 대신 표준화된 인터페이스를 사용하자는 것입니다. MCP를 사용하면 모델 제공 업체를 가라지 않고 모든 데이터 소스가 동일한 방식으로 LLM과 통신할 수 있어서 AI 애플리케이션의 확장성이 크게 향상됩니다.

MCP의 아키텍처

MCP가 등장한지 1년도 안 되서 AI 생태계에서 이렇게 짧은 시간 내에 자리를 잡은 이유는 무엇보다도 쉽기 때문입니다. 대부분의 소프트웨어 개발자들에게 익숙한 아키텍처인 클라이언트-서버 모델을 근간으로 하며, 메시지 포멧도 HTTP 통신에서 너무 흔하게 사용되는 JSON 기반으로 되어 있습니다. 기존에 널리 알려진 아키텍처와 메시지 포멧을 사용하기 때문에 새롭게 배울 기술이 사실 상 없다고 봐도 무방하죠.

MCP는 크게 다음 3개의 핵심 컴포넌트로 이루어집니다.

  • MCP 호스트: LLM과 상호작용하는 주체입니다. ChatGPT나 Claude와 같은 AI 에이전트, Cursor나 VSCode와 같은 코드 편집기, 또는 직접 구현한 AI 애플리케이션이 될 수 있습니다.
  • MCP 클라이언트: MCP 호스트 내에 위치하며, LLM과 MCP 서버 간의 통신을 돕는 중개자 역할을 합니다. MCP 서버가 노출시켜준 리소스에 접근하거나 도구(Tool)를 호출합니다.
  • MCP 서버: LLM에게 추가적인 문맥(Context)을 제공하기 위해서 외부 리소스나 도구(Tool)를 MCP 클라이언트에게 노출시켜주는 백엔드 서버입니다.

mcp sequence

MCP 클라이언트와 MCP 서버는 JSON-RPC 2.0 포멧의 메시지를 주고 받습니다. 예를 들어, MCP 서버에서 제공하는 get_weather라는 도구(tool)을 호출할 때 주고 받는 요청과 응답은 다음과 같은 모습입니다.

요청
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_weather",
    "arguments": {
      "location": "New York"
    }
  }
}
응답
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Current weather in New York:\nTemperature: 72°F\nConditions: Partly cloudy"
      }
    ],
    "isError": false
  }
}

MCP는 특정 프로그래밍 언어에 종속되지 않는 프로토콜입니다. TypeScript, Python, Java, Go, Rust 등 사실상 모든 주류 프로그래밍 언어에 대한 SDK가 존재합니다. 등장한 지 1년이 채 되지 않은 프로토콜에 이렇게 많은 프로그래밍 언어가 벌써 대응하고 있다는 것은 정말 이례적인 것 같습니다.

mcp sdks

(이미지 출처: https://modelcontextprotocol.io/docs/sdk)

MCP 서버 구현

사실 우리가 현업에서 MCP를 개발한다고 하면 서버를 개발하는 경우가 많습니다. MCP 클라이언트는 이미 많은 AI 서비스에서 제공하는 MCP 호스트에 탑재되어 있기 때문입니다.

MCP의 프로토콜 스펙(specification)은 타입스크립트로 작성이 되어 있습니다. 따라서 프로그래밍 언어에 호불호가 없으신 분들은 타입스크립트로 시작해보시기를 추천드립니다.

예를 들어서, LLM은 수학 계산에 취약한 것으로 알려져 있으니, 정확한 계산을 돕기위한 MCP 서버를 구현해볼까요? 서버에서 제공하는 도구 목록을 알려주는 tools/list와 도구를 호출해주는 tools/call 요청에 대한 핸들러가 필요합니다.

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

class MathServer {
  constructor() {
    this.server = new Server({
      name: "math-server",
      version: "1.0.0",
    });

    this.setupTools();
  }

  setupTools() {
    // 계산 도구 정의
    this.server.setRequestHandler("tools/list", async () => ({
      tools: [
        {
          name: "calculate",
          description: "수학 계산을 수행합니다",
          inputSchema: {
            type: "object",
            properties: {
              expression: {
                type: "string",
                description: "계산할 수식 (예: 2 + 3 * 4, 150000 * 0.15)",
              },
            },
            required: ["expression"],
          },
        },
      ],
    }));

    // 도구 실행 처리
    this.server.setRequestHandler("tools/call", async (request) => {
      const { name, arguments: args } = request.params;

      if (name === "calculate") {
        return this.calculate(args.expression);
      }

      throw new Error(`알 수 없는 도구: ${name}`);
    });
  }

  calculate(expression) {
    try {
      const result = this.safeEval(expression);

      return {
        content: [
          {
            type: "text",
            text: `${expression} = ${result}`,
          },
        ],
      };
    } catch (error) {
      return {
        content: [
          {
            type: "text",
            text: `계산 오류: ${error.message}`,
          },
        ],
        isError: true,
      };
    }
  }

  // 안전한 수식 계산기
  safeEval(expression) {
    // 허용된 문자만 포함하는지 검증
    if (!/^[0-9+\-*/.() ]+$/.test(expression)) {
      throw new Error("허용되지 않는 문자가 포함되어 있습니다");
    }

    return new Function(`return (${expression})`)();
  }

  async run() {
    const transport = new StdioServerTransport();
    await this.server.connect(transport);
  }
}

// 서버 시작
new MathServer().run();

MCP 서버는 다양한 MCP 호스트에서 테스트해볼 수 있는데요. 평상 시에 쓰시는 ChatGPT나 Claude와 같은 AI 에이전트, Cursor나 VSCode와 같은 코드 편집기를 활용하시면 됩니다.

만약에 LLM을 끼지 않고 바로 서버와 메세지를 주고 받으시고 싶으시다면 MCP Inspector가 많이 사용됩니다.

마치며

마치 과거 TCP/IP가 컴퓨터 네트워킹의 기반을 닦고 HTTP가 인터넷 통신의 기반을 마련했듯이, MCP는 AI 시스템이 외부 세계와 상호작용하는 방식을 표준화함으로써 AI 통합의 새로운 시대를 열고 있습니다. 이를 통해 개발자들은 더욱 강력하고 안정적인 AI 애플리케이션을 보다 효율적으로 구축할 수 있게 될 것입니다.

물론 아직 초기 단계이기 때문에 완전하지 않은 부분들이 있지만, AI 기술의 급속한 발전과 함께 MCP의 잠재력은 무한합니다. 특히 그동안 AI 생태계에 진입이 어려웠던 전통적인 응용 애플리케이션 개발자들에게 큰 기회가 될 수 있다고 생각합니다.

AI의 진정한 가능성을 열어줄 열쇠, 소프트웨어 개발자들이 MCP의 미래를 주목해야 하는 이유입니다.