MCP 서버는 표준화된 프로토콜 인터페이스를 통해 AI 애플리케이션에 특정 기능을 제공하는 프로그램입니다.
예로는 문서 접근을 위한 파일 시스템 서버, 데이터 쿼리를 위한 데이터베이스 서버, 코드 관리를 위한 GitHub 서버, 팀 커뮤니케이션을 위한 Slack 서버, 일정 관리를 위한 캘린더 서버 등이 있습니다.
서버는 다음 3가지 빌딩 블록으로 기능을 제공합니다.
| 기능 | 설명 | 예시 | 제어 주체 |
|---|---|---|---|
| 도구(Tools) | LLM이 사용자 요청에 따라 능동적으로 호출하는 함수. DB 쓰기, 외부 API 호출, 파일 변경, 다른 로직 트리거 등 가능. | 항공편 검색 메시지 전송 캘린더 일정 생성 |
모델 |
| 리소스(Resources) | 읽기 전용 컨텍스트 데이터 소스. 파일 내용, DB 스키마, API 문서 등. | 문서 가져오기 지식베이스 접근 캘린더 읽기 |
애플리케이션 |
| 프롬프트(Prompts) | 모델이 특정 도구/리소스를 사용하도록 안내하는 미리 작성된 템플릿. | 휴가 계획하기 회의 요약하기 이메일 작성 |
사용자 |
아래에서는 가상의 시나리오를 통해 각 기능의 역할과 상호작용 방식을 설명합니다.
도구는 AI 모델이 행동을 수행할 수 있게 합니다. 각 도구는 명확한 입력/출력을 갖는 단일 작업을 정의하며, 모델은 컨텍스트에 따라 도구 실행을 요청합니다.
도구는 스키마로 정의된 인터페이스이며, 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 애플리케이션은 여러 도구를 사용합니다.
항공편 검색
searchFlights(origin: "NYC", destination: "Barcelona", date: "2024-06-15")
여러 항공사를 조회해 구조화된 항공편 옵션을 반환합니다.
캘린더 일정 차단
createCalendarEvent(title: "Barcelona Trip", startDate: "2024-06-15", endDate: "2024-06-22")
사용자 캘린더에 여행 일정을 표시합니다.
이메일 알림
sendEmail(to: "team@work.com", subject: "Out of Office", body: "...")
동료에게 자동 부재중 이메일을 보냅니다.
도구는 모델이 제어하지만, MCP는 사람의 통제를 중요하게 여깁니다. 애플리케이션은 다음 방식으로 사용자 제어를 제공할 수 있습니다.
리소스는 AI 애플리케이션이 컨텍스트로 사용할 정보를 구조적으로 제공하는 데이터 소스입니다.
리소스는 파일, API, 데이터베이스 등에서 데이터를 노출합니다. 애플리케이션은 정보를 어떻게 처리할지(부분 선택, 임베딩 검색, 전체 전달 등) 결정할 수 있습니다.
각 리소스는 고유 URI(예: file:///path/to/document.md)를 가지며,
적절한 콘텐츠 처리를 위해 MIME 타입을 선언합니다.
리소스는 두 가지 탐색 패턴을 지원합니다.
calendar://events/2024)예시:
travel://activities/{city}/{category} – 도시/카테고리별 활동travel://activities/barcelona/museums – 바르셀로나 박물관 목록리소스 템플릿은 title, description, MIME 타입 등의 메타데이터를 포함해 발견 가능하고 문서화됩니다.
프로토콜 동작:
| 메서드 | 목적 | 반환 |
|---|---|---|
resources/list | 직접 리소스 목록 | 리소스 설명자 배열 |
resources/templates/list | 리소스 템플릿 탐색 | 템플릿 정의 배열 |
resources/read | 리소스 내용 조회 | 메타데이터 포함 리소스 데이터 |
resources/subscribe | 리소스 변경 모니터링 | 구독 확인 |
여행 계획 시나리오에서 리소스는 다음 정보를 제공합니다.
calendar://events/2024) – 사용자 일정 확인file:///Documents/Travel/passport.pdf) – 중요 문서 접근trips://history/barcelona-2023) – 과거 일정/선호도 참고애플리케이션은 이 리소스들을 가져와 필요한 부분만 선택하거나 그대로 모델에 전달합니다. 이 예시에서는 캘린더, 날씨, 여행 선호도를 제공하여 일정·날씨·선호도 기반의 계획을 가능하게 합니다.
리소스 템플릿 예시:
{
"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)" 같은 값을 제안할 수 있습니다.
동적 리소스는 파라미터 자동 완성을 지원합니다.
weather://forecast/{city}에 "Par" 입력 시 "Paris" 또는 "Park City" 제안flights://search/{airport}에 "JFK" 입력 시 "JFK - John F. Kennedy International" 제안정확한 형식을 몰라도 유효한 값을 쉽게 찾도록 돕습니다.
리소스는 애플리케이션 주도적으로 동작하며, 다양한 UI 패턴을 자유롭게 구현할 수 있습니다. 예: 폴더 트리/리스트 뷰, 검색/필터, 자동 컨텍스트 포함, 수동/일괄 선택 UI 등.
프롬프트는 재사용 가능한 템플릿을 제공합니다.
프롬프트는 예상 입력과 상호작용 패턴을 정의하는 구조화된 템플릿입니다. 자동 트리거가 아니라 사용자가 명시적으로 호출하는 것이 특징입니다. 리소스와 마찬가지로 파라미터 자동 완성을 지원합니다.
프로토콜 동작:
| 메서드 | 목적 | 반환 |
|---|---|---|
prompts/list | 사용 가능한 프롬프트 탐색 | 프롬프트 설명자 배열 |
prompts/get | 프롬프트 상세 조회 | 인자 포함 프롬프트 정의 |
여행 계획 시나리오에서 프롬프트는 공통 작업을 템플릿화합니다.
"Plan a vacation" 프롬프트:
{
"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" } }
]
}
자유로운 자연어 입력 대신 프롬프트 시스템은 다음을 가능하게 합니다.
프롬프트는 사용자 제어 방식이며, 명시적 호출이 필요합니다. 프로토콜은 구현자가 자연스러운 UI를 설계할 자유를 줍니다. 핵심 원칙은 다음과 같습니다.
애플리케이션은 다음과 같은 UI 패턴으로 프롬프트를 노출합니다.
MCP의 진가는 여러 서버가 통합 인터페이스를 통해 전문 기능을 결합할 때 나타납니다.
개인화된 여행 계획 AI 애플리케이션이 다음과 같은 서버를 연결한다고 가정해 보겠습니다.
{
"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 (Calendar 서버)travel://preferences/europe (Travel 서버)travel://past-trips/Spain-2023 (Travel 서버)AI는 먼저 모든 선택된 리소스를 읽어 컨텍스트를 수집합니다. 캘린더에서 가능한 날짜를 확인하고, 여행 선호도에서 선호 항공사/호텔 유형을 파악하며, 과거 여행 기록을 통해 선호 지역을 확인합니다.
이 컨텍스트를 바탕으로 다음 도구를 실행합니다.
searchFlights() – NYC→Barcelona 항공편 조회checkWeather() – 여행 기간 기후 예보 확인그리고 사용자 승인 하에 다음 작업을 수행합니다.
bookHotel() – 예산 내 호텔 예약createCalendarEvent() – 캘린더에 일정 추가sendEmail() – 여행 상세가 포함된 확인 이메일 전송결과: 여러 MCP 서버를 통해 사용자는 일정에 맞춘 바르셀로나 여행을 조사하고 예약했습니다. "Plan a Vacation" 프롬프트는 리소스(캘린더 가용성, 여행 이력)와 도구(항공편 검색, 호텔 예약, 캘린더 업데이트)를 서로 다른 서버에서 결합하도록 AI를 안내했습니다. 수 시간이 걸렸을 작업이 MCP로 몇 분 만에 끝났습니다.