레슨 4 15분

MCP 3대 핵심: 도구·리소스·프롬프트

MCP의 세 가지 핵심 요소 — 도구(Tools), 리소스(Resources), 프롬프트(Prompts)의 차이, 사용 시점, 실전 예제.

🔄 레슨 3에서 GitHub, PostgreSQL, Slack 등 필수 MCP 서버 10개를 살펴봤습니다. 이 서버들이 Claude에 기능을 제공하는 방식 — 그 뒷면에 세 가지 핵심 구조가 있습니다.

왜 세 가지로 나뉘는가?

MCP 서버가 AI에 제공하는 것은 세 종류입니다:

  1. 도구 (Tools) — AI가 실행할 수 있는 액션
  2. 리소스 (Resources) — AI에 제공되는 데이터/컨텍스트
  3. 프롬프트 (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에 연결하는 것까지.

이해도 체크

1. MCP에서 '도구(Tool)'를 호출하는 주체는?

2. 다음 중 '리소스(Resource)'에 해당하는 것은?

3. MCP 프롬프트(Prompt)의 핵심 특징은?

모든 문제에 답해야 확인할 수 있어요

먼저 위의 퀴즈를 완료하세요

관련 스킬