이번 포스트에서는 MCP(Model Context Protocol)의 핵심 구성요소 중 하나인 리소스(Resources)에 대해 더욱 상세히 알아보겠습니다.
리소스란 무엇인가?
리소스는 MCP 서버가 클라이언트에게 제공하고 노출하는 데이터나 콘텐츠를 의미합니다. MCP는 클라이언트가 이러한 리소스를 읽고 LLM(Large Language Model)과의 상호작용에서 컨텍스트로 사용할 수 있도록 표준화된 방식을 제공합니다.
리소스는 애플리케이션 제어가 가능하도록 설계되어 있어, 클라이언트 애플리케이션이 리소스를 언제, 어떻게 사용할지 결정할 수 있습니다. 예를 들어, Claude Desktop과 같은 일부 클라이언트는 사용자가 명시적으로 리소스를 선택하도록 요구하며, 다른 클라이언트는 자동으로 리소스를 선택할 수도 있습니다. 서버 작성자는 이러한 다양한 상호작용 패턴을 고려하여 리소스를 구현해야 합니다.
리소스의 특징과 중요성
- 표준화된 접근 방식: 각 리소스는 고유한 URI(Uniform Resource Identifier)를 통해 접근됩니다.
- 다양한 데이터 포맷 지원: 텍스트, 이미지, JSON, 바이너리 등 다양한 데이터 형식을 지원합니다.
- 보안과 효율적 관리: 접근 권한을 명확히 설정하여 데이터 관리의 효율성과 보안을 높입니다.
MCP의 리소스 유형
리소스는 다양한 유형을 지원하며, 주로 다음과 같은 형태가 포함됩니다.
1. 파일 콘텐츠
- 텍스트 파일, 문서 등 파일 형태의 데이터입니다.
2. 데이터베이스 레코드
- 데이터베이스에서 조회되는 레코드 데이터입니다.
3. API 응답
- 외부 API로부터 실시간으로 가져오는 데이터입니다.
4. 라이브 시스템 데이터
- 실시간 시스템 상태 및 모니터링 정보입니다.
5. 스크린샷 및 이미지
- 이미지나 화면 캡처 등의 시각적 데이터를 제공합니다.
6. 로그 파일
- 시스템이나 애플리케이션의 로그 데이터입니다.
7. 텍스트 리소스
- UTF-8로 인코딩된 텍스트 데이터로 소스 코드, JSON, XML, 일반 텍스트 등이 포함됩니다.
8. 바이너리 리소스
- base64로 인코딩된 바이너리 데이터로 이미지, PDF, 오디오, 비디오 등이 포함됩니다.
리소스 식별 및 접근 방식
리소스는 다음 형식의 URI를 통해 식별됩니다:
[protocol]://[host]/[path]
예시:
- 파일 시스템:
file:///home/user/documents/report.pdf
- 데이터베이스:
postgres://database/customers/schema
- API:
https://api.example.com/data
- 화면 캡처:
screen://localhost/display1
리소스 발견(Discovery)
클라이언트는 다음 두 가지 방식으로 사용 가능한 리소스를 찾을 수 있습니다.
직접 리소스 목록
서버는 resources/list
엔드포인트를 통해 명시적으로 리소스 목록을 제공합니다.
{
"uri": "string",
"name": "string",
"description": "optional",
"mimeType": "optional"
}
리소스 템플릿
동적 리소스의 경우 서버는 클라이언트가 유효한 URI를 구성할 수 있는 URI 템플릿을 제공합니다.
{
"uriTemplate": "string",
"name": "string",
"description": "optional",
"mimeType": "optional"
}
리소스 읽기
클라이언트가 리소스를 읽으려면 resources/read
요청을 보냅니다. 서버는 다음과 같은 응답을 반환합니다.
{
"contents": [
{
"uri": "string",
"mimeType": "optional",
"text": "optional",
"blob": "optional (base64 encoded)"
}
]
}
리소스 업데이트 및 구독
MCP는 리소스에 대한 실시간 업데이트를 두 가지 방식으로 지원합니다.
목록 변경 알림
서버는 notifications/resources/list_changed
알림으로 리소스 목록 변경을 클라이언트에 알립니다.
콘텐츠 변경 구독
클라이언트는 특정 리소스에 대한 변경 사항을 resources/subscribe
로 구독하고, 서버는 notifications/resources/updated
로 변경 사항을 알립니다. 클라이언트는 언제든지 resources/unsubscribe
를 통해 구독을 취소할 수 있습니다.
리소스 구현 모범 사례
- 명확하고 설명적인 이름과 URI 사용
- 설명과 MIME 유형을 명확히 제공
- 동적 콘텐츠에는 리소스 템플릿 사용
- 자주 변경되는 리소스에 구독 기능 제공
- 오류 처리 시 명확한 오류 메시지 제공
- 대규모 리소스 목록에는 페이징 고려
- 리소스 콘텐츠를 적절히 캐시
- 사용자 정의 URI 체계는 명확히 문서화
보안 고려 사항
- 모든 리소스 URI 검증
- 적절한 접근 제어 구현
- 디렉터리 탐색 방지를 위한 파일 경로 정리
- 민감 데이터 전송 시 암호화
- MIME 유형과 데이터 처리에 주의
- 속도 제한 및 감사 기능 구현
- 장기 실행 읽기에 대한 타임아웃 설정
결론
리소스는 MCP 프로토콜에서 AI 모델이 외부 데이터를 효율적이고 안전하게 활용할 수 있도록 지원하는 중요한 요소입니다. 이러한 표준화된 접근 방식은 AI 애플리케이션의 성능을 크게 향상시키는 데 기여합니다.
참고 자료
- https://modelcontextprotocol.io/introduction