MCP를 사용해보고 어언 7개월이 지났는데 그동안 난 발전한게 1도 없다
7개월전의 나는 내 AI활용능력이 폭발적으로 증가할줄 알았지만 전혀 발전하지 않았고 (공부를 안했으니까요..)
대신 성능이 더 뛰어난 제미나이3와 클로드 4.5 Opus, 그리고 GPT 5.2가 나와서 점점 멍청해지는중
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
매우 늦었지만 지금이라도 따라잡기 위해 MCP를 만드는 법을 배워보자
이번엔 앤트로픽 공식문서를 보고 공부했다.
MCP 기본 구조

위 그림 예시에서 VSCode가 호스트의 역할을 할 수 있다.
VSCode가 MCP 서버와 연결을 생성하면, 런타임에서 MCP서버와 연결을 유지하는 MCP 클라이언트 오브젝트를 인스턴스화 한다.
또한 그림을 보면 MCP Server 종류가 두가지가 있다.
Local : STDIO 전송을 사용하는 동일한 컴퓨터에서만 사용
Remote : 그림에서 공식 센트리 Remote MCP는 센트리 플랫폼에서 돌고, Streamable HTTP 전송을 사용한다.
MCP Host (호스트)
여러 MCP 클라이언트를 조정하고 관리하는 AI 어플리케이션
Claude Desktop, IDE copilot 등
MCP Client
MCP 서버와 연결을 1:1로 유지
호스트가 사용할 수 있도록 MCP 서버로부터 컨텍스트를 가져온다
메시지 직렬화/역직렬화 처라
MCP Server
MCP 클라이언트에게 기능이나 리소스 제공
여기서 더 딥한 개념이 있지만 일단 넘어가고 서버에 대해 좀 더 알아보도록 하자.
MCP Server의 3가지 핵심기능
서버는 표준화된 프로토콜 인터페이스를 통해 AI 애플리케이션에 기능을 제공한다.
근데 도대체 표준화된 프로토콜 인터페이스가 뭔데??
일반적인 예시로 문서 접근을 위한 파일시스템 서버, 데이터 쿼리를 위한 데이터베이스 서버, 슬랙 기능을 제공하는 Slack 서버, 일정 관리를 위한 구글 캘린더 서버 등이 있을 수 있다.
Resources
AI가 컨텍스트를 이해하는데 필요한 파일, API, 데이터베이스 같은 데이터를 노출한다.
각 리소스는 고유한 URI를 갖고 적절한 처리를 위해 MIME타입을 선언해야 한다.
(MIME 타입이 뭔지 몰라서 찾아봤는데 파일의 종류와 형식을 알려주는 표준 식별자
예를들면 application/json 이나 text/html, image/jpeg 등)
{
"uriTemplate": "weather://forecast/{city}/{date}",
"name": "weather-forecast",
"title": "Weather Forecast",
"description": "Get weather forecast for any city and date",
"mimeType": "application/json"
}
뭐 이런식으로 정의를 한다고 한다.
UI 패턴이 필수가 아니라서 텍스트 기반으로도 사용이 가능하고 주로 검색이나 대량선택, 기존 파일 브라우저와 데이터 탐색기 등에 적합하다고 한다.
Tools
AI 모델이 작업을 수행할 수 있도록 한다.
tool을 정의한다는건 유형이 지정된 입력과 출력 작업을 정의하는 것이다.
AI 모델은 컨텍스트에 기반해 어떤 tool 실행을 할지 선택한 뒤, 사용자한테 내가 이걸 쓸테니 승인해달라는 요청을 한다.
아래와 같은 구조를 갖고 있다.
{
"name": "tool 이름",
"description": "tool에 대한 설명",
"inputSchema": {
"type": "object",
"properties": {
"매개변수1": {
"type": "string",
"description": "매개변수 설명"
}
},
"required": ["필수 매개변수 목록"]
}
}
홈페이지 상 예시는 비행기 예약이었는데, 예를 들어 사용자가
"12월 25일에 인천에서 삿포로로 가는 비행기 찾아줘" 라고 명령을 하면
이 tool을 갖고 있는 AI는 이것을 활용한다는..? 그런 개념이다.
근데 이제 이것만 정의해선 제대로 수행을 못할 것이고 실제로 검색할 수 있도록 뭔가 해야겠지
{
name: "searchFlights",
description: "Search for available flights",
inputSchema: {
type: "object",
properties: {
origin: { type: "string", description: "Departure city" },
destination: { type: "string", description: "Arrival city" },
date: { type: "string", format: "date", description: "Travel date" }
},
required: ["origin", "destination", "date"]
}
}
Prompt
내가 생각하는 그 프롬프트가 맞는 것 같은데, 시스템에 미리 입력해두는 프롬프트인듯 하다.
MCP 서버를 잘 활용할 수 있도록 방법을 정의해두는 듯..?
- 예상되는 입력값과 상호작용 패턴을 정의한다.
- 명시적 호출이 필요함 : 보통 '/'를 입력했을때 뜨는 명령어들이 프롬프트에 해당한다..
{
"name": "프롬프트 이름",
"title": "프롬프트 제목",
"description": "프롬프트 설명",
"arguments": [
{ "name": "매개변수 이름", "type": "string", "required": 필수여부(true/false) },
]
}
날씨 어플리케이션 MCP서버 만들기
https://modelcontextprotocol.io/docs/develop/build-server
Build an MCP server - Model Context Protocol
Get started building your own server to use in Claude for Desktop and other clients.
modelcontextprotocol.io
너무 생략을 많이해놔서 한글버전도 참고했다..
클로드에 연결할 수 있는 서버를 안내해주고 있고, 위의 세가지 요소 중 tool의 구현에만 집중한다.
'LLM' 카테고리의 다른 글
| Context7 MCP 사용해보기 (LLM 할루시네이션 방지) (2) | 2025.05.17 |
|---|---|
| MCP 개념 및 실습 (0) | 2025.05.17 |