CPN 한국어 자습서 · 외부 문서 한국어 미러
MCP 문서 · Learn
Understanding MCP clients · 원문: modelcontextprotocol.io/docs/learn/client-concepts
아래는 원문을 한국어로 옮긴 미러입니다. 코드·명령은 원문 그대로이며, 가장 최신 정보는 하단 원문 링크에서 확인하세요.
MCP 클라이언트는 특정 MCP 서버와 통신하기 위해 호스트 애플리케이션이 생성합니다. Claude.ai나 IDE 같은 호스트 애플리케이션은 전체 사용자 경험을 관리하고 여러 클라이언트를 조율합니다. 각 클라이언트는 하나의 서버와 직접 통신을 담당합니다.
구분을 이해하는 것이 중요합니다. 호스트는 사용자가 상호작용하는 애플리케이션이고, 클라이언트는 서버 연결을 가능하게 하는 프로토콜 수준의 컴포넌트입니다.
클라이언트는 서버가 제공하는 컨텍스트를 활용하는 것 외에도, 서버에 여러 기능을 제공할 수 있습니다. 이러한 클라이언트 기능을 통해 서버 개발자는 더 풍부한 상호작용을 구축할 수 있습니다.
| 기능 | 설명 | 예시 |
|---|---|---|
| 엘리시테이션(Elicitation) | 서버가 상호작용 중 사용자에게 특정 정보를 요청할 수 있게 합니다. 서버가 필요에 따라 정보를 수집하는 구조화된 방법을 제공합니다. | 여행 예약 서버가 사용자의 좌석 선호도, 객실 유형, 예약 완료를 위한 연락처를 요청할 수 있습니다. |
| 루트(Roots) | 클라이언트가 서버가 집중해야 할 디렉터리를 지정할 수 있게 합니다. 조율 메커니즘을 통해 의도된 범위를 전달합니다. | 여행 예약 서버가 특정 디렉터리에 접근 권한을 받아 사용자의 캘린더를 읽을 수 있습니다. |
| 샘플링(Sampling) | 서버가 클라이언트를 통해 LLM 완성을 요청할 수 있게 하여 에이전틱 워크플로우를 지원합니다. 사용자 권한과 보안 조치에 대한 완전한 제어권을 클라이언트에 부여합니다. | 여행 예약 서버가 항공편 목록을 LLM에 전달해 최적 항공편을 선택하도록 요청할 수 있습니다. |
엘리시테이션은 서버가 상호작용 중 사용자에게 특정 정보를 요청할 수 있게 하여, 더 동적이고 반응적인 워크플로우를 만들어 줍니다.
엘리시테이션은 서버가 필요한 정보를 요청 시 수집하는 구조화된 방법을 제공합니다. 모든 정보를 사전에 요구하거나 데이터가 없을 때 실패하는 대신, 서버는 작업을 일시 중단하고 사용자에게 특정 입력을 요청할 수 있습니다. 이를 통해 서버가 정해진 패턴을 따르는 대신 사용자 필요에 적응하는 더 유연한 상호작용이 가능합니다.
엘리시테이션 흐름:
sequenceDiagram
participant User
participant Client
participant Server
Note over Server,Client: Server initiates elicitation
Server->>Client: elicitation/create
Note over Client,User: Human interaction
Client->>User: Present elicitation UI
User-->>Client: Provide requested information
Note over Server,Client: Complete request
Client-->>Server: Return user response
Note over Server: Continue processing with new information
엘리시테이션 컴포넌트 예시:
{
method: "elicitation/create",
params: {
message: "Please confirm your Barcelona vacation booking details:",
schema: {
type: "object",
properties: {
confirmBooking: {
type: "boolean",
description: "Confirm the booking (Flights + Hotel = $3,000)"
},
seatPreference: {
type: "string",
enum: ["window", "aisle", "no preference"],
description: "Preferred seat type for flights"
},
roomType: {
type: "string",
enum: ["sea view", "city view", "garden view"],
description: "Preferred room type at hotel"
},
travelInsurance: {
type: "boolean",
default: false,
description: "Add travel insurance ($150)"
}
},
required: ["confirmBooking"]
}
}
}
여행 예약 서버는 최종 예약 확인 과정을 통해 엘리시테이션의 강점을 보여 줍니다. 사용자가 바르셀로나 여행 패키지를 선택한 후, 서버는 최종 승인과 누락된 세부 사항을 수집해야 합니다.
서버는 여행 요약(6월 15-22일 바르셀로나 항공편, 해변 호텔, 총 $3,000)과 좌석 선택, 객실 유형, 여행자 보험 등 추가 선호도 항목을 포함한 구조화된 예약 확인 요청을 엘리시테이션으로 전송합니다.
엘리시테이션 상호작용은 명확하고, 맥락적이며, 사용자의 자율성을 존중하도록 설계되어 있습니다.
요청 표시: 클라이언트는 어떤 서버가 요청하는지, 왜 정보가 필요한지, 어떻게 사용될지에 대한 명확한 맥락과 함께 엘리시테이션 요청을 표시합니다.
응답 옵션: 사용자는 요청된 정보를 제공하거나, 거부하거나, 전체 작업을 취소할 수 있습니다. 클라이언트는 서버에 반환하기 전에 제공된 스키마(schema)에 따라 응답을 검증합니다.
개인 정보 고려사항: 엘리시테이션은 비밀번호나 API 키를 요청하지 않습니다. 클라이언트는 의심스러운 요청을 경고하고 사용자가 데이터를 전송 전에 검토할 수 있게 합니다.
루트(roots)는 서버 작업의 파일시스템 경계를 정의하여, 클라이언트가 서버가 집중해야 할 디렉터리를 지정할 수 있게 합니다.
루트는 클라이언트가 서버에 파일시스템 접근 경계를 전달하는 메커니즘입니다. 서버가 작업할 수 있는 디렉터리를 나타내는 파일 URI로 구성됩니다. 루트는 의도된 경계를 전달하지만, 보안 제한을 강제하지는 않습니다. 실제 보안은 운영 체제 수준에서 강제해야 합니다.
루트 구조:
{
"uri": "file:///Users/agent/travel-planning",
"name": "Travel Planning Workspace"
}
루트는 파일시스템 경로에만 사용하며 항상 file:// URI 스키마를 사용합니다. 루트 목록은 동적으로 업데이트될 수 있으며, 경계가 변경되면 서버는 roots/list_changed를 통해 알림을 받습니다.
여러 고객 여행을 다루는 여행사는 파일시스템 접근을 정리하기 위해 루트를 활용합니다. 클라이언트는 여행 계획 서버에 다음 파일시스템 루트를 제공합니다:
file:///Users/agent/travel-planning — 모든 여행 파일을 포함하는 메인 워크스페이스file:///Users/agent/travel-templates — 재사용 가능한 여행 일정 템플릿 및 리소스file:///Users/agent/client-documents — 고객 여권 및 여행 서류루트는 클라이언트와 서버 간의 조율 메커니즘이지, 보안 경계가 아닙니다. 사양은 서버가 루트 경계를 "SHOULD respect(존중해야 함)"로 규정하지, "MUST enforce(강제해야 함)"로 규정하지 않습니다.
루트는 서버가 신뢰할 수 있거나 검증된 경우, 사용자가 그 권고적 특성을 이해하는 경우, 악의적 행동을 차단하는 것보다 실수를 방지하는 것이 목표인 경우에 가장 효과적입니다.
자동 루트 감지: 사용자가 폴더를 열면 클라이언트가 자동으로 루트로 노출합니다.
수동 루트 설정: 고급 사용자는 설정을 통해 루트를 직접 지정할 수 있습니다.
샘플링은 서버가 클라이언트를 통해 언어 모델 완성을 요청할 수 있게 하여, 보안과 사용자 제어를 유지하면서 에이전틱 동작을 가능하게 합니다.
샘플링은 서버가 AI 모델과 직접 통합하거나 비용을 지불하지 않고도 AI 의존적 작업을 수행할 수 있게 합니다. 서버는 이미 AI 모델에 접근하고 있는 클라이언트에게 이러한 작업을 대신 처리하도록 요청할 수 있습니다. 이 접근 방식은 사용자 권한과 보안 조치에 대한 완전한 제어권을 클라이언트에 부여합니다.
샘플링 흐름:
sequenceDiagram
participant LLM
participant User
participant Client
participant Server
Note over Server,Client: Server initiates sampling
Server->>Client: sampling/createMessage
Note over Client,User: Human-in-the-loop review
Client->>User: Present request for approval
User-->>Client: Review and approve/modify
Note over Client,LLM: Model interaction
Client->>LLM: Forward approved request
LLM-->>Client: Return generation
Note over Client,User: Response review
Client->>User: Present response for approval
User-->>Client: Review and approve/modify
Note over Server,Client: Complete request
Client-->>Server: Return approved response
요청 파라미터 예시:
{
messages: [
{
role: "user",
content: "Analyze these flight options and recommend the best choice:\n" +
"[47 flights with prices, times, airlines, and layovers]\n" +
"User preferences: morning departure, max 1 layover"
}
],
modelPreferences: {
hints: [{
name: "claude-sonnet-4-20250514"
}],
costPriority: 0.3,
speedPriority: 0.2,
intelligencePriority: 0.9
},
systemPrompt: "You are a travel expert helping users find the best flights based on their preferences",
maxTokens: 1500
}
샘플링을 사용해 사용 가능한 항공편을 분석하고 최적 항공편을 추천하는 findBestFlight 도구를 가진 여행 예약 서버를 생각해 봅니다.
도구는 항공사 API를 조회해 47개 항공편 옵션을 수집합니다. 그런 다음 이 옵션을 분석하기 위한 AI 지원을 요청합니다. 클라이언트가 샘플링 요청을 시작하면 AI가 절충점을 평가할 수 있습니다.
승인 제어: 샘플링 요청은 명시적인 사용자 동의가 필요할 수 있습니다. 클라이언트는 서버가 분석하려는 내용을 표시합니다. 사용자는 요청을 승인, 거부 또는 수정할 수 있습니다.
투명성 기능: 클라이언트는 정확한 프롬프트, 모델 선택, 토큰 제한을 표시할 수 있습니다.
구성 옵션: 사용자는 모델 선호도를 설정하거나, 신뢰할 수 있는 작업에 대해 자동 승인을 설정하거나, 모든 것에 승인을 요구할 수 있습니다.
보안 고려사항: 클라이언트와 서버 모두 샘플링 중 민감한 데이터를 적절히 처리해야 합니다. 클라이언트는 속도 제한을 구현하고 모든 메시지 내용을 검증해야 합니다.
원문(영어): https://modelcontextprotocol.io/docs/learn/client-concepts · 본 문서는 학습용 한국어 번역이며 원본의 권리는 원저작자(Model Context Protocol)에게 있습니다.
원문(영어): https://modelcontextprotocol.io/docs/learn/client-concepts