MCP 3대 핵심: 도구·리소스·프롬프트
MCP의 세 가지 핵심 요소 — 도구(Tools), 리소스(Resources), 프롬프트(Prompts)의 차이, 사용 시점, 실전 예제.
🔄 레슨 3에서 GitHub, PostgreSQL, Slack 등 필수 MCP 서버 10개를 살펴봤습니다. 이 서버들이 Claude에 기능을 제공하는 방식 — 그 뒷면에 세 가지 핵심 구조가 있습니다.
왜 세 가지로 나뉘는가?
MCP 서버가 AI에 제공하는 것은 세 종류입니다:
- 도구 (Tools) — AI가 실행할 수 있는 액션
- 리소스 (Resources) — AI에 제공되는 데이터/컨텍스트
- 프롬프트 (Prompts) — 사용자가 실행하는 워크플로우 템플릿
이 세 가지를 이해하면 “이 기능을 도구로 만들어야 할까, 리소스로 만들어야 할까?“라는 질문에 답할 수 있습니다. 레슨 5에서 직접 서버를 만들 때 이 구분이 핵심이 됩니다.
도구 (Tools): AI가 세상에 작용하는 손
도구는 model-driven입니다. AI 모델이 대화 맥락을 분석해서 “이 도구를 써야겠다"고 판단하면 자동으로 호출합니다.
실제 동작 예시:
사용자: “이번 주 열린 PR 목록 보여줘”
Claude가 생각합니다: “이건 GitHub 정보가 필요하니까 list_pull_requests 도구를 호출해야겠다.”
→ GitHub MCP 서버의 list_pull_requests 도구 자동 호출
→ 결과를 받아서 정리해서 보여줌
도구의 특징:
- AI가 언제 호출할지 결정 (model-driven)
- 부작용(side effect)이 있을 수 있음 — DB 쿼리, 파일 생성, 메시지 전송 등
- JSON Schema로 입력 파라미터 정의
- 호출할 때 사용자에게 확인을 받을 수 있음
도구의 코드 구조 (Python FastMCP):
@mcp.tool()
def search_issues(repo: str, query: str) -> str:
"""GitHub 이슈를 검색합니다."""
# GitHub API 호출
results = github_api.search(repo, query)
return format_results(results)
✅ Quick Check: Claude한테 “이 파일을 삭제해줘"라고 했을 때, MCP에서 파일 삭제는 어떤 요소에 해당할까요? (도구(Tool)입니다. 실제 액션을 수행하고, 부작용(파일이 사라짐)이 있습니다.)
리소스 (Resources): AI에 컨텍스트를 넣어주는 파이프
리소스는 app-driven입니다. 호스트 애플리케이션(Claude Desktop 등)이 필요할 때 데이터를 가져와서 AI의 컨텍스트에 넣어줍니다.
리소스 vs 도구의 핵심 차이:
| 도구 (Tool) | 리소스 (Resource) | |
|---|---|---|
| 주체 | AI 모델이 호출 | 앱이 가져옴 |
| 역할 | 액션 수행 | 데이터 제공 |
| 부작용 | 있을 수 있음 | 없음 (읽기 전용) |
| 비유 | 망치, 드릴 | 설계도, 재료 목록 |
실제 예시:
file:///project/README.md— 프로젝트 README 내용postgres://localhost/mydb/schema— DB 스키마 정보notion://workspace/프로젝트-문서— Notion 페이지 내용
리소스는 URI 형태로 식별됩니다. 앱이 사전에 리소스 목록을 가져와서 사용자가 선택하거나, 자동으로 컨텍스트에 포함시킵니다.
리소스의 코드 구조:
@mcp.resource("config://app/settings")
def get_app_settings() -> str:
"""앱 설정 정보를 반환합니다."""
return json.dumps(load_settings())
프롬프트 (Prompts): 사용자가 시작하는 워크플로우
프롬프트는 user-driven입니다. AI가 알아서 실행하는 게 아니라, 사용자가 직접 선택해서 실행합니다.
슬래시 명령어를 떠올리면 됩니다:
/code-review→ 코드 리뷰 워크플로우 시작/summarize-logs→ 로그 분석 워크플로우 시작/write-test→ 테스트 코드 작성 워크플로우 시작
프롬프트는 복잡한 지시사항을 캡슐화합니다. 매번 “이 코드를 보안 관점에서 분석하고, OWASP Top 10 기준으로 체크하고, 수정 제안을 해줘"라고 길게 타이핑하는 대신, /security-review 한 번이면 됩니다.
프롬프트의 코드 구조:
@mcp.prompt()
def code_review(code: str) -> str:
"""코드 리뷰를 수행하는 프롬프트 템플릿."""
return f"""다음 코드를 리뷰해주세요:
{code}
검토 기준:
1. 버그 및 논리 오류
2. 보안 취약점
3. 성능 최적화
4. 코드 가독성"""
✅ Quick Check: “매주 월요일에 지난주 GitHub 커밋을 요약해서 보여주는 기능"을 만들려면 어떤 요소를 조합해야 할까요? (도구: 커밋 목록을 가져오는 GitHub API 호출. 프롬프트: “주간 요약” 워크플로우를 시작하는 슬래시 명령어. 리소스: 프로젝트의 CONTRIBUTING.md를 컨텍스트로 제공.)
세 요소의 상호작용
실제 MCP 서버에서는 이 세 가지를 조합해서 사용합니다:
사용자: /weekly-report (프롬프트 실행)
↓
Claude: "주간 리포트를 만들려면 데이터가 필요하군"
↓
리소스 로드: 프로젝트 설정, 팀 멤버 목록
↓
도구 호출: GitHub 커밋 목록 조회
도구 호출: Jira 완료된 이슈 목록 조회
↓
Claude: 데이터를 종합해서 주간 리포트 생성
프롬프트가 워크플로우를 시작하고, 리소스가 배경 컨텍스트를 제공하고, 도구가 실제 데이터를 가져오는 구조입니다.
고급 요소: Sampling, Roots, Elicitation
기본 3가지 외에 MCP 스펙에는 고급 요소도 있습니다:
| 요소 | 역할 | 간단 설명 |
|---|---|---|
| Sampling | 서버가 AI한테 질문 | MCP 서버가 클라이언트를 통해 LLM에 completion 요청 |
| Roots | 파일시스템 경계 | 서버가 접근할 수 있는 디렉토리 범위 지정 |
| Elicitation | 서버가 사용자한테 질문 | 서버가 실행 중 사용자에게 추가 정보 요청 |
이번 코스에서는 기본 3가지에 집중합니다. 고급 요소는 커스텀 서버를 만들면서 필요할 때 배우면 됩니다.
핵심 정리
- 도구(Tools) = model-driven 액션. AI가 필요하다고 판단하면 자동 호출. 부작용 있음.
- 리소스(Resources) = app-driven 데이터. 읽기 전용 컨텍스트 제공. 부작용 없음.
- 프롬프트(Prompts) = user-driven 워크플로우. 사용자가 직접 선택/실행. 반복 작업을 캡슐화.
- 실제 서버에서는 세 요소를 조합해서 사용
- 핵심 판단: “이건 액션인가(도구), 데이터인가(리소스), 워크플로우 시작인가(프롬프트)?”
다음 레슨
세 가지 핵심 요소를 이해했으니, 이제 직접 만들어볼 차례입니다. 레슨 5에서 Python FastMCP SDK로 나만의 MCP 서버를 처음부터 만듭니다 — 도구와 리소스를 직접 정의하고, Claude Desktop에 연결하는 것까지.
이해도 체크
먼저 위의 퀴즈를 완료하세요
레슨 완료!