반응형

목차

  • MCP 란 무엇인가 ?
  • MCP 로 뭘 할 수 있는가?
  • MCP 는 어떻게 동작하는가?
  • MCP 의 실체를 알아보고 직접 server 를 만들어보자

1.MCP 란 무엇인가?


  • MCP = Model Context Protocol, 대형 언어 모델 LLM 이 외부 데이터 및 기능과 상호작용할 수 있도록 돕는 공개 프로토콜
  • 부연 설명 !! 2024년 11월 calude 로 유명한 Anthropic 에서 발표한, LLM Agent 가 다른 프로그램과 연동하기 위한 프로토콜이다.
  • 사람들이 쉽게 예를 들어 설명할때 AI USB 로 표현하기도 함
  • AI 가 더 똑똑해지려면 단순한 훈련 데이터에 의존하지 않도록 해야 하는게 필수. 외부데이터를 안전하게 가져와야 하는 방법이 필요했다 그래서 탄생하게 된게 MCP

 

2.MCP로 뭘 할 수 있는가?


 

  • 주요 역할
    • LLM 이 파일, 데이터베이스, API, 시스템 정보 등에 접근 가능
    • 사용자 허가를 통해 안전한 데이터 이동
    • 다양한 LLM 에서 공통적으로 사용할 수 있는 표준 인터페이스 제공
  • 기존에는 AI 가 사전에 학습된 정보에만 의존해야 했지만, MCP 를 사용하면 실시간으로 외부와 연동하여 최신 데이터를 가져와 활용할 수 있다.

3.그래서 MCP는 어떻게 동작하는가?

A. 주요 아키텍쳐 컴포넌트

  • MCP Hosts
    • LLM 모델을 이용하는 AI Tool
    • IDE, Claude Desktop,
  • MCP Client
    • 서버와 1:1 로 연결하는 프로그램 클라이언트
    • LLM 이 실제 실행되는 주체. 다양한 도구나 서비스를 사용할 수 있또록 요청을 보내는 쪽
  • MCP Server
    • 모델의 문맥을 교환할 수 있는 프로토콜로 통신하는 경량화된 프로그램
  • Local Data Sources
    • 컴퓨터 파일, DB 등의 서비스
  • Remote Services
    • 인터넷 API 를 통해 연결 가능한 외부 서비스들

 

B. 동작흐름

  • 클라이언트는 서버에 연결 요청을 보내고, 서버는 승인하여 통신 채널을 설정한다.
  • 사용자의 요청을 MCP Client 가 MCP Server 를 통해 요구하는 사양에 맞는 내용의 데이터를 반환 받고, LLM 제공자( sonnet, grok, gemini, gpt 등) 에게 전달하여 분석과 처리를 한다.

4. MCP 서버의 실체를 알아보고, 직접 만들어보기

A.개발환경 설정

  • MCP SDK 설치
  • MCP 서버 코드 작성
  • MCP 서버 실행 & Inspector 로 테스트
  • Cursor에서 연동해보기

B.시나리오 설정

  • AI Tool (MCP Host) 가 MCP 에 연결하여 회의록 내용을 읽고 회의록의 내용을 요약하거나 질문에 답한다.
  • 빠른 시연을 위해 회의록 데이터는 로컬에 txt 형태로 저장한다.
  • 샘플 데이터
$ mkdir my-mcp
$ cd my-mcp

$ npm init -y

$ npm install @modelcontextprotocol/sdk zod 
$ npm install -D @types/node typescript


# 모듈에 빌드스크립트 내용 추가
$ vi package.json
-> 아래 추가 
"type": "module",
iimport { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { z } from "zod";

// MCP 서버를 생성합니다.
const server = new McpServer({
    name: "jssvs-server",
    version: "1.0.0"
    }
);

// registerTool 메서드: 서버에 새로운 툴(기능)을 등록합니다.
// 첫 번째 인자는 툴의 이름, 두 번째는 툴의 메타데이터(설명, 입력값 스키마 등),
// 세 번째는 실제로 동작하는 함수(입력값을 받아 결과를 반환)입니다.
// 아래는 두 숫자를 더하는 add 툴을 등록하는 예시입니다.
server.registerTool("add",
  {
    title: "Addition Tool",
    description: "Add two numbers",
    inputSchema: { a: z.number(), b: z.number() }
  },
  async ({ a, b }) => ({
    content: [{ type: "text", text: String(a + b) }]
  })
);

// registerTool 메서드: 회의록 읽기 툴을 등록합니다.
// 사용자가 날짜(date)를 입력하면, 해당 날짜의 회의록 파일을 읽어 반환합니다.
server.registerTool("readMeeting",
  {
    title: "Meeting Notes Reader",
    description: "Read meeting notes from a specific date",
    inputSchema: { date: z.string() }
  },
  async ({ date }) => {
    try {
      // 파일 시스템과 경로 모듈을 동적으로 import
      const fs = await import('fs/promises');
      const path = await import('path');
      // 회의록 파일 경로를 생성합니다.
      const filePath = path.join('/Users/jssvs/workspace/mcp-demo/mydata', `${date}-meeting.txt`);
      // 파일을 읽어서 내용을 반환합니다.
      const content = await fs.readFile(filePath, 'utf8');
      return {
        content: [{ type: "text", text: content }]
      };
    } catch (error) {
      // 파일 읽기 실패 시 에러 메시지를 반환합니다.
      return {
        content: [{ type: "text", text: `Error reading meeting notes: ${error.message}` }]
      };
    }
  }
);

// registerResource 메서드: 서버에 동적 리소스를 등록합니다.
// 첫 번째 인자는 리소스 이름, 두 번째는 리소스 URI 템플릿,
// 세 번째는 리소스의 메타데이터(설명 등), 네 번째는 실제 동작 함수입니다.
// 아래는 이름에 따라 인사말을 생성하는 greeting 리소스를 등록하는 예시입니다.
server.registerResource(
  "greeting",
  new ResourceTemplate("greeting://{name}", { list: undefined }),
  { 
    title: "Greeting Resource",      // Display name for UI
    description: "Dynamic greeting generator"
  },
  async (uri, { name }) => ({
    contents: [{
      uri: uri.href,
      text: `Hello, ${name}!`
    }]
  })
);

// connect 메서드: 서버와 트랜스포트(통신 채널)를 연결합니다.
// 여기서는 StdioServerTransport를 사용하여 표준 입출력(터미널) 기반으로 외부와 통신할 수 있게 합니다.
const transport = new StdioServerTransport();
await server.connect(transport);

D. MCP Client 와 연결 ( Cursor IDE )

# mcp.json
{
"my-demo-mcp-server": {
"type": "studio",
"command": "npx",
    "args": [
    "-y",
    "tsx",
    "/Users/jssvs/workspace/mcp-demo/main.ts"
    ],
"env": {}
}

** MCP 서버는 오픈 소스 커뮤니티에서 공유가 활발히 일어나고 있음

https://smithery.ai/

 

Smithery - Model Context Protocol Registry

Your Agent's Gateway to the World Integrate your AI with 7983 skills and extensions built by the community.

smithery.ai

느낀점

  • MCP 를 개인의 수준에서 활용하는 것은 바로 가능할 것 같다. 하지만 서비스 수준에서 활용하는 것은 아래의 부분들과 사이드 이펙트를 고려해야 하고, 경험이 필요 해보인다.
    • 연동 시스템에 대한 보안 ( DB 접속 정보가 Host의 학습 데이터로 넘어간다거나, 매출, 사내 보안 데이터가 유출 되는 것 )
    • 권한에 대한 문제 ( Drop, Delete, Rm등 권한을 갖게된 MCP Client 는 잘못된 명령으로 시스템을 망가뜨릴 수 있는 힘을 갖게 됨 )
    • 네트워크 구성에 대한 문제 ( 서비스 수준에서의 MCP 서버는 원격 서버 구성을 해야 하는데, 현재는 레퍼런스가 많아 보이지 않음 )
    • 어떤 LLM 모델을 연결할 것이고, 어떤 서비스를 사용할 것인가 ? ( AI 서비스는 다양하고, 서비스의 장단점을 아직 알지 못함. Bedrock? Azure OpenAIService? )

6. 참고

https://zdnet.co.kr/view/?no=20250630161811

https://techblog.woowahan.com/22342/

https://www.claudemcp.com/ko/blog/mcp-vs-api

https://medium.com/snowflake/using-mcp-with-snowflake-cortex-ai-f04e0b840958

https://aws.amazon.com/ko/blogs/tech/amazon-bedrock-agents-mcp-model-context-protocol/

반응형

+ Recent posts