서버 개념 (Server Concepts)¶
MCP 서버는 표준화된 프로토콜 인터페이스를 통해 AI 애플리케이션에 특정 기능을 노출하는 프로그램이에요. 흔한 예로는 문서 접근을 위한 파일 시스템 서버, 데이터 조회를 위한 데이터베이스 서버, 코드 관리를 위한 GitHub 서버, 팀 커뮤니케이션을 위한 Slack 서버, 일정 관리를 위한 캘린더 서버가 있어요.
핵심 서버 기능¶
서버는 세 가지 구성 요소로 기능을 제공합니다.
| 기능 | 설명 | 예시 | 제어 주체 |
|---|---|---|---|
| 도구(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 애플리케이션은 휴가를 예약하기 위해 여러 도구를 사용할 수 있어요.
항공편 검색
여러 항공사를 조회하고 구조화된 항공편 옵션을 반환해요.
캘린더 일정 확보
여행 날짜를 사용자 캘린더에 표시해요.
이메일 알림
sendEmail(to: "[email protected]", subject: "Out of Office", body: "...")
동료들에게 자동으로 부재중(out-of-office) 메시지를 보내요.
사용자 상호작용 모델¶
도구는 모델이 제어하므로, AI 모델이 자동으로 발견하고 호출할 수 있어요. 하지만 MCP는 여러 메커니즘을 통해 인간의 감독을 강조합니다. 신뢰와 안전을 위해 애플리케이션은 다양한 방식으로 사용자 제어를 구현할 수 있어요.
- UI에 사용 가능한 도구를 표시해 특정 상호작용에서 도구를 사용할 수 있게 할지 사용자가 정의하게 하기
- 개별 도구 실행에 대한 승인 대화상자
- 안전한 특정 동작을 미리 승인하는 권한 설정
- 모든 도구 실행과 그 결과를 보여주는 활동 로그
리소스(Resources)¶
리소스는 AI 애플리케이션이 검색해 모델에 문맥으로 제공할 수 있는 정보에 구조화된 접근을 제공해요.
리소스의 동작 방식¶
리소스는 파일, API, 데이터베이스 또는 AI가 문맥을 이해하기 위해 필요한 다른 어떤 소스의 데이터도 노출해요. 애플리케이션은 이 정보에 직접 접근해 어떻게 사용할지 스스로 결정합니다. 관련 부분만 선택하거나, 임베딩으로 검색하거나, 전체를 모델에 전달하는 식이죠. 각 리소스는 고유한 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)"를 제안할 수 있어요.
매개변수 자동 완성¶
동적 리소스는 매개변수 자동 완성을 지원합니다. 예를 들어:
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" } }
]
}
비구조화된 자연어 입력 대신, 프롬프트 시스템은 다음을 가능하게 해줘요.
- "휴가 계획" 템플릿 선택
- 구조화된 입력: Barcelona, 7 days, $3000, ["beaches", "architecture", "food"]
- 템플릿에 기반한 일관된 워크플로 실행
사용자 상호작용 모델¶
프롬프트는 사용자가 제어하므로 명시적으로 호출해야 해요. 프로토콜은 애플리케이션 내에서 자연스럽게 느껴지는 인터페이스를 설계할 자유를 구현자에게 부여합니다. 핵심 원칙은 다음과 같아요.
- 사용 가능한 프롬프트의 쉬운 발견
- 각 프롬프트가 무엇을 하는지에 대한 명확한 설명
- 검증이 포함된 자연스러운 인자 입력
- 프롬프트의 기본 템플릿을 투명하게 표시
애플리케이션은 일반적으로 다음과 같은 다양한 UI 패턴으로 프롬프트를 노출해요.
- 슬래시 명령(
/를 입력해 사용 가능한 프롬프트 보기, 예: /plan-vacation) - 검색 가능한 접근을 위한 명령 팔레트
- 자주 쓰는 프롬프트를 위한 전용 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(캘린더 서버)travel://preferences/europe(여행 서버)-
travel://past-trips/Spain-2023(여행 서버) -
AI가 도구를 사용해 요청 처리: AI는 먼저 선택된 모든 리소스를 읽어 문맥을 수집해요. 캘린더에서 가능한 날짜를 확인하고, 여행 선호도에서 선호하는 항공사와 호텔 종류를 배우고, 과거 여행에서 이전에 즐겼던 장소를 발견하죠. 이 문맥을 바탕으로 AI는 AI 애플리케이션이 제공한 프롬프트를 실행합니다. 이 예시에서 AI 애플리케이션은 연결된 MCP 날씨 서버의 날씨 도구를 모델에 노출해요. 날씨는 여행 계획에 영향을 줄 수 있으므로, AI는 프롬프트를 해석할 때
checkWeather()를 호출하기로 선택합니다. 그 결과 AI는 일련의 도구를 실행하고, 이 정보를 바탕으로 예약을 만들고 필요한 곳에서 사용자 승인을 요청합니다. searchFlights()- NYC에서 바르셀로나까지의 항공편 조회checkWeather()- 여행 날짜의 기후 예보 검색bookHotel()- 지정된 예산 안에서 호텔 찾기createCalendarEvent()- 여행을 사용자 캘린더에 추가sendEmail()- 여행 세부 정보가 담긴 확인 메시지 전송
결과: 여러 MCP 서버를 통해 사용자는 자신의 일정에 맞춘 바르셀로나 여행을 조사하고 예약했어요. "휴가 계획" 프롬프트는 AI가 서로 다른 서버의 리소스(캘린더 가용성과 여행 이력)와 도구(항공편 검색, 호텔 예약, 캘린더 업데이트)를 조합하도록 안내해 문맥을 모으고 예약을 실행하게 했죠. 몇 시간이 걸렸을 작업이 MCP를 통해 몇 분 만에 완료됐어요.