MCP 서버 이해하기
MCP 서버 이해하기 (Understanding MCP servers)
MCP 서버는 표준화된 프로토콜 인터페이스를 통해 AI 애플리케이션에 특정 기능을 노출하는 프로그램이에요. 문서 접근을 위한 파일시스템 서버, 데이터 조회를 위한 데이터베이스 서버, 코드 관리를 위한 GitHub 서버, 팀 커뮤니케이션을 위한 Slack 서버, 일정 관리를 위한 달력 서버 같은 것들이 흔한 예시입니다.
출처: 문서
본문
MCP 서버는 표준화된 프로토콜 인터페이스를 통해 AI 애플리케이션에 특정 기능을 노출하는 프로그램이에요. 흔한 예로는 문서 접근을 위한 파일시스템 서버, 데이터 조회를 위한 데이터베이스 서버, 코드 관리를 위한 GitHub 서버, 팀 커뮤니케이션을 위한 Slack 서버, 일정 관리를 위한 달력 서버가 있어요.
핵심 서버 기능 (Core Server Features)
서버는 세 가지 구성 요소를 통해 기능을 제공합니다.
| 기능 | 설명 | 예시 | 통제 주체 |
|---|---|---|---|
| 도구(Tools) | LLM이 능동적으로 호출하는 함수로, 사용자 요청에 따라 언제 사용할지 결정해요. 도구는 데이터베이스에 쓰고, 외부 API를 호출하고, 파일을 수정하고, 다른 로직을 트리거할 수 있어요. | 항공편 검색 메시지 보내기 달력 일정 만들기 |
모델 |
| 리소스(Resources) | 컨텍스트를 위한 정보에 읽기 전용 접근을 제공하는 수동적 데이터 소스예요. 파일 내용, 데이터베이스 스키마, API 문서 등이 포함됩니다. | 문서 검색 지식 베이스 접근 달력 읽기 |
애플리케이션 |
| 프롬프트(Prompts) | 모델이 특정 도구와 리소스로 작업하도록 지시하는 사전 구축된 명령 템플릿이에요. | 휴가 계획하기 회의 요약하기 이메일 초안 작성 |
사용자 |
가상의 시나리오로 각 기능의 역할을 보여 드리고, 이들이 어떻게 함께 동작하는지 살펴볼게요.
도구 (Tools)
도구는 AI 모델이 동작을 수행할 수 있게 해 줍니다. 각 도구는 타입이 있는 입력과 출력으로 특정 연산을 정의해요. 모델은 컨텍스트를 바탕으로 도구 실행을 요청합니다.
도구가 동작하는 방식
도구는 LLM이 호출할 수 있는 스키마 정의 인터페이스예요. MCP는 검증에 JSON Schema를 사용합니다. 각 도구는 명확히 정의된 입력과 출력으로 단일 연산을 수행해요. 도구는 실행 전에 사용자 동의를 요구할 수 있어서, 모델이 취하는 동작에 대해 사용자가 통제권을 유지하도록 돕습니다.
프로토콜 연산:
| 메서드 | 용도 | 반환 |
|---|---|---|
tools/list |
사용 가능한 도구 발견 | 스키마가 있는 도구 정의 배열 |
tools/call |
특정 도구 실행 | 도구 실행 결과 |
도구 정의 예시:
{
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"]
}
}
예시: 여행 예약
도구는 AI 애플리케이션이 사용자를 대신해 동작을 수행할 수 있게 해 줘요. 여행 계획 시나리오에서 AI 애플리케이션은 휴가 예약을 돕기 위해 여러 도구를 사용할 수 있어요.
항공편 검색
searchFlights(origin: "NYC", destination: "Barcelona", date: "2024-06-15")
여러 항공사를 조회하고 구조화된 항공편 옵션을 반환해요.
달력 차단
createCalendarEvent(title: "Barcelona Trip", startDate: "2024-06-15", endDate: "2024-06-22")
사용자 달력에 여행 날짜를 표시해요.
이메일 알림
sendEmail(to: "[email protected]", subject: "Out of Office", body: "...")
동료들에게 자동 부재 중(out-of-office) 메시지를 보내요.
사용자 상호작용 모델
도구는 모델 통제형이라서, AI 모델이 자동으로 발견하고 호출할 수 있어요. 그러나 MCP는 여러 메커니즘을 통해 인간의 감독을 강조합니다.
신뢰와 안전을 위해 애플리케이션은 다양한 메커니즘으로 사용자 통제를 구현할 수 있어요.
- UI에 사용 가능한 도구를 표시해서, 사용자가 특정 상호작용에서 도구를 사용 가능하게 할지 정의하게 하기
- 개별 도구 실행에 대한 승인 다이얼로그
- 특정 안전한 연산을 미리 승인하는 권한 설정
- 모든 도구 실행과 그 결과를 보여 주는 활동 로그
리소스 (Resources)
리소스는 AI 애플리케이션이 검색해 모델에 컨텍스트로 제공할 수 있는 정보에 대한 구조화된 접근을 제공합니다.
리소스가 동작하는 방식
리소스는 AI가 컨텍스트를 이해하는 데 필요한 파일, API, 데이터베이스 또는 다른 소스의 데이터를 노출해요. 애플리케이션은 이 정보에 직접 접근하고, 어떻게 사용할지 결정할 수 있어요. 관련 부분을 선택하거나, 임베딩으로 검색하거나, 전부 모델에 전달하는 식으로요.
각 리소스는 고유 URI(예: file:///path/to/document.md)를 가지며, 적절한 콘텐츠 처리를 위해 MIME 타입을 선언합니다.
리소스는 두 가지 발견 패턴을 지원해요.
- 직접 리소스(Direct Resources) — 특정 데이터를 가리키는 고정 URI예요. 예:
calendar://events/2024— 2024년 달력 가용성을 반환해요. - 리소스 템플릿(Resource Templates) — 유연한 쿼리를 위한 매개변수가 있는 동적 URI예요. 예:
travel://activities/{city}/{category}— 도시와 카테고리에 따라 활동을 반환해요.travel://activities/barcelona/museums— 바르셀로나의 모든 박물관을 반환해요.
리소스 템플릿은 제목, 설명, 예상 MIME 타입 같은 메타데이터를 포함해서, 발견 가능하고 자체 문서화가 되게 해 줍니다.
프로토콜 연산:
| 메서드 | 용도 | 반환 |
|---|---|---|
resources/list |
사용 가능한 직접 리소스 나열 | 리소스 설명자 배열 |
resources/templates/list |
리소스 템플릿 발견 | 리소스 템플릿 정의 배열 |
resources/read |
리소스 내용 검색 | 메타데이터가 있는 리소스 데이터 |
subscriptions/listen |
리소스 변경 모니터링 | 업데이트 알림 스트림 |
특정 리소스의 변경을 지켜보려면 클라이언트는 resourceSubscriptions 필터에 리소스 URI를 나열한 subscriptions/listen 요청을 보내요. 서버는 지켜보는 리소스가 변경될 때마다 결과 스트림에 notifications/resources/updated를 전달합니다.
예시: 여행 계획 컨텍스트 얻기
여행 계획 예시를 이어서, 리소스는 AI 애플리케이션에 관련 정보 접근을 제공해요.
- 달력 데이터 (
calendar://events/2024) — 사용자 가용성 확인 - 여행 문서 (
file:///Documents/Travel/passport.pdf) — 중요 문서 접근 - 이전 일정 (
trips://history/barcelona-2023) — 과거 여행과 선호 참조
AI 애플리케이션은 이 리소스들을 검색하고, 임베딩이나 키워드 검색으로 데이터의 부분집합을 선택하거나 원시 데이터를 모델에 직접 전달할지 결정합니다.
이 경우 달력 데이터, 날씨 정보, 여행 선호를 모델에 제공해서, 가용성을 확인하고 날씨 패턴을 조회하고 과거 여행 선호를 참조할 수 있게 해 줘요.
리소스 템플릿 예시:
{
"uriTemplate": "weather://forecast/{city}/{date}",
"name": "weather-forecast",
"title": "Weather Forecast",
"description": "Get weather forecast for any city and date",
"mimeType": "application/json"
}
{
"uriTemplate": "travel://flights/{origin}/{destination}",
"name": "flight-search",
"title": "Flight Search",
"description": "Search available flights between cities",
"mimeType": "application/json"
}
이 템플릿들은 유연한 쿼리를 가능하게 해 줘요. 날씨 데이터는 어떤 도시/날짜 조합의 예보도 접근할 수 있어요. 항공편은 두 공항 사이의 노선을 검색할 수 있죠. 사용자가 origin 공항으로 "NYC"를 입력하고 destination 공항으로 "Bar"을 입력하기 시작하면, 시스템이 "Barcelona (BCN)"이나 "Barbados (BGI)"를 제안할 수 있어요.
매개변수 완성 (Parameter Completion)
동적 리소스는 매개변수 완성을 지원해요. 예를 들어:
weather://forecast/{city}의 입력으로 "Par"을 치면 "Paris"나 "Park City"를 제안할 수 있고flights://search/{airport}에 "JFK"를 치면 "JFK - John F. Kennedy International"을 제안할 수 있어요.
시스템은 정확한 형식을 몰라도 유효한 값을 발견하도록 도와줍니다.
사용자 상호작용 모델
리소스는 애플리케이션 주도형이라서, 사용 가능한 컨텍스트를 검색·처리·표시하는 방식에 유연성을 줍니다. 흔한 상호작용 패턴은 다음과 같아요.
- 친숙한 폴더 같은 구조로 리소스를 탐색하는 트리나 목록 보기
- 특정 리소스를 찾는 검색·필터 인터페이스
- 휴리스틱이나 AI 선택에 기반한 자동 컨텍스트 포함 또는 스마트 제안
- 단일 또는 여러 리소스를 포함하는 수동·일괄 선택 인터페이스
애플리케이션은 필요에 맞는 어떤 인터페이스 패턴으로든 리소스 발견을 자유롭게 구현할 수 있어요. 프로토콜은 특정 UI 패턴을 강제하지 않아서, 미리보기 기능이 있는 리소스 피커, 현재 대화 컨텍스트에 기반한 스마트 제안, 여러 리소스 포함을 위한 일괄 선택, 기존 파일 브라우저·데이터 탐색기와의 통합 등을 할 수 있습니다.
프롬프트 (Prompts)
프롬프트는 재사용 가능한 템플릿을 제공합니다. MCP 서버 작성자가 도메인에 대한 매개변수화된 프롬프트를 제공하거나, MCP 서버를 가장 잘 사용하는 방법을 보여 줄 수 있게 해 줘요.
프롬프트가 동작하는 방식
프롬프트는 기대 입력과 상호작용 패턴을 정의하는 구조화된 템플릿이에요. 사용자 통제형이라서 자동 트리거가 아닌 명시적 호출이 필요해요. 프롬프트는 컨텍스트를 인지할 수 있어, 사용 가능한 리소스와 도구를 참조해 포괄적인 워크플로를 만들 수 있어요. 리소스와 유사하게, 프롬프트는 사용자가 유효한 인수 값을 발견하도록 돕는 매개변수 완성을 지원합니다.
프로토콜 연산:
| 메서드 | 용도 | 반환 |
|---|---|---|
prompts/list |
사용 가능한 프롬프트 발견 | 프롬프트 설명자 배열 |
prompts/get |
프롬프트 세부 정보 검색 | 인수가 있는 전체 프롬프트 정의 |
예시: 간소화된 워크플로
프롬프트는 흔한 작업에 구조화된 템플릿을 제공해요. 여행 계획 맥락에서:
"휴가 계획" 프롬프트:
{
"name": "plan-vacation",
"title": "Plan a vacation",
"description": "Guide through vacation planning process",
"arguments": [
{ "name": "destination", "type": "string", "required": true },
{ "name": "duration", "type": "number", "description": "days" },
{ "name": "budget", "type": "number", "required": false },
{ "name": "interests", "type": "array", "items": { "type": "string" } }
]
}
비구조화된 자연어 입력 대신, 프롬프트 시스템은 다음을 가능하게 해요.
- "휴가 계획" 템플릿 선택
- 구조화된 입력: 바르셀로나, 7일, $3000, ["beaches", "architecture", "food"]
- 템플릿 기반의 일관된 워크플로 실행
사용자 상호작용 모델
프롬프트는 사용자 통제형이라서 명시적 호출이 필요해요. 프로토콜은 구현자가 애플리케이션 안에서 자연스럽게 느껴지는 인터페이스를 설계할 자유를 줍니다. 핵심 원칙은 다음과 같아요.
- 사용 가능한 프롬프트의 쉬운 발견
- 각 프롬프트가 무엇을 하는지에 대한 명확한 설명
- 검증이 있는 자연스러운 인수 입력
- 프롬프트의 기본 템플릿을 투명하게 표시
애플리케이션은 보통 다음과 같은 다양한 UI 패턴으로 프롬프트를 노출해요.
- 슬래시 명령(예: 사용 가능한 프롬프트를 보기 위해 "/" 입력 — /plan-vacation)
- 검색 가능한 접근을 위한 명령 팔레트
- 자주 쓰는 프롬프트를 위한 전용 UI 버튼
- 관련 프롬프트를 제안하는 컨텍스트 메뉴
서버들을 하나로 모으기 (Bringing Servers Together)
MCP의 진짜 힘은 여러 서버가 함께 작업할 때, 통합 인터페이스를 통해 각자의 특화된 기능을 결합할 때 드러납니다.
예시: 다중 서버 여행 계획
세 개의 서버가 연결된 개인화된 AI 여행 플래너 애플리케이션을 생각해 보세요.
- 여행 서버(Travel Server) — 항공편, 호텔, 일정 처리
- 날씨 서버(Weather Server) — 기후 데이터와 예보 제공
- 달력/이메일 서버(Calendar/Email Server) — 일정과 커뮤니케이션 관리
전체 흐름
-
사용자가 매개변수와 함께 프롬프트 호출:
{ "prompt": "plan-vacation", "arguments": { "destination": "Barcelona", "departure_date": "2024-06-15", "return_date": "2024-06-22", "budget": 3000, "travelers": 2 } } -
사용자가 포함할 리소스 선택:
calendar://my-calendar/June-2024(달력 서버에서)travel://preferences/europe(여행 서버에서)travel://past-trips/Spain-2023(여행 서버에서)
-
AI가 도구를 사용해 요청 처리:
AI는 먼저 선택된 모든 리소스를 읽어 컨텍스트를 모아요. 달력에서 사용 가능한 날짜를 확인하고, 여행 선호에서 선호 항공사와 호텔 유형을 배우고, 과거 여행에서 이전에 즐겼던 장소를 파악하죠.
이 컨텍스트를 바탕으로 AI는 AI 애플리케이션이 제공한 프롬프트를 실행해요. 예시에서 AI 애플리케이션은 연결된 MCP 날씨 서버의 날씨 도구를 모델에 노출해요. 날씨가 여행 계획에 영향을 줄 수 있으므로, AI는 프롬프트를 해석할 때
checkWeather()를 호출하기로 선택합니다.결과적으로 AI는 일련의 도구를 실행해요.
searchFlights()— NYC에서 바르셀로나 항공편을 조회checkWeather()— 여행 날짜의 기후 예보 검색
AI는 이 정보를 사용해 예약과 다음 단계를 만들고, 필요할 때 사용자 승인을 요청해요.
bookHotel()— 지정된 예산 내 호텔 찾기createCalendarEvent()— 사용자 달력에 여행 추가sendEmail()— 여행 세부 정보와 함께 확인 메시지 보내기
결과: 여러 MCP 서버를 통해 사용자는 자신의 일정에 맞춰진 바르셀로나 여행을 조사하고 예약했어요. "Plan a Vacation" 프롬프트는 AI가 서로 다른 서버들에 걸쳐 리소스(달력 가용성, 여행 이력)와 도구(항공편 검색, 호텔 예약, 달력 업데이트)를 결합하도록 이끌어, 컨텍스트를 모으고 예약을 실행했죠. 몇 시간이 걸렸을 작업이 MCP 덕분에 몇 분 만에 완료됐어요.