반응형
목차
- 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 서버는 오픈 소스 커뮤니티에서 공유가 활발히 일어나고 있음
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/
반응형
'Data Engineer' 카테고리의 다른 글
아파치 스파크(apache spark) - 기본과 동작 원리 (0) | 2025.04.29 |
---|---|
쿠버네티스 - pv, pvc, storageclass 사용하기 (0) | 2025.04.24 |
카프카(apache kafka) 구성 및 기본 사용법 (1) (0) | 2025.04.15 |
쿠버네티스 Yunikorn 스케쥴러 (0) | 2025.02.20 |
airflow - Dag Factory (0) | 2025.02.18 |