에이전트가 도구를 호출하고 데이터를 읽는 표준 — Host·Client·Server 3계층
🔌
Host · Client · Server
JSON-RPC 2.0 위에서 3계층 구조가 도구·데이터·템플릿을 표준 인터페이스로 연결합니다.
3계층 아키텍처 — Host · Client · Server
3가지 Primitive — Tools · Resources · Prompts
전송 2종 — stdio(로컬) · Streamable HTTP(원격)
FastMCP — 데코레이터로 서버 구현
takeaway
아키텍처 → Primitive → 전송 → 코드 순으로 내려갑니다 — 서버 하나를 만들면 모든 MCP 클라이언트가 같은 도구를 씁니다.
개정 예고 — 2026-07-28 대규모 스펙 개정 최종화 예정(RC 공개): 프로토콜 stateless화 · Tasks 정식 확장 · Roots/Sampling/Logging 단계적 폐기(12개월 유예). 본문 서술은 현행 스펙(2025-11-25) 기준이며 확정 시 반영 예정입니다.
PART 2 · MCP
MCP 아키텍처
Host → Client → Server 3계층 구조 — JSON-RPC 2.0 위에서 동작
1
Host
AI 애플리케이션 (Kiro, Claude Code, Cursor 등)
사용자의 요청을 받아 Client에 전달
모델 추론과 UI를 담당
2
Client
Host 안에서 MCP 서버와 1:1 연결 유지
JSON-RPC 요청을 서버에 전송
도구 목록 조회 (tools/list) + 도구 실행 (tools/call)
3
Server
3가지 Primitive를 노출하는 프로세스
Tools: 모델이 호출할 수 있는 함수
Resources: 모델이 읽을 수 있는 데이터
Prompts: 재사용 가능한 템플릿
4
외부 시스템
API, DB, 파일시스템, SaaS 등
Server가 래핑하여 표준 인터페이스 제공
에이전트는 외부 시스템 구현을 모름
takeaway
에이전트는 외부 시스템 구현을 모른 채 Server가 노출한 표준 인터페이스만 호출합니다 — 이 계층 분리가 N×M 문제를 끊는 지점입니다.
PART 2 · MCP
3가지 Primitive
MCP 서버가 노출하는 3종류의 능력 — 도구·데이터·템플릿
Tools (도구)
모델이 호출할 수 있는 함수 — 부작용(side-effect) 가능 예: 이메일 전송, DB 쿼리, 파일 생성
Resources (데이터)
모델이 읽을 수 있는 정적/동적 데이터 예: 파일 내용, DB 레코드, API 응답
Prompts (템플릿)
사전 정의된 프롬프트 템플릿 예: 코드 리뷰 프롬프트, 번역 프롬프트
takeaway
Tools만 부작용이 가능하고 Resources는 읽기 전용, Prompts는 사용자가 선택합니다 — 제어 주체(model·application·user)가 세 Primitive를 가르는 기준입니다.
PART 2 · MCP
전송 방식
로컬(stdio)과 원격(Streamable HTTP) — 환경에 맞게 선택
stdio
로컬 프로세스
CLI 프로세스를 stdin/stdout으로 통신
인증 불필요 — 로컬 프로세스 권한 상속
개발 환경에 최적 (설치 즉시 사용)
uvx, npx로 MCP 서버 바로 실행
로컬 개발 환경에서 MCP 서버를 가장 빠르게 시작하는 방법입니다. IDE(Kiro, Cursor)가 서버 프로세스를 직접 실행합니다.
Streamable HTTP
원격 서버
HTTP 엔드포인트로 연결 — 팀 공유 가능
OAuth 2.1 인증 지원
AgentCore Gateway로 관리형 배포
SSE(deprecated) → Streamable HTTP로 전환
프로덕션 환경에서 여러 클라이언트가 동일 MCP 서버에 접속합니다. 인증·관측·스케일링을 Gateway가 관리합니다.
takeaway
개발은 stdio로 즉시 시작하고, 팀 공유·프로덕션은 OAuth 2.1 인증이 가능한 Streamable HTTP로 전환합니다.
PART 2 · MCP
MCP 서버 코드
FastMCP로 3줄이면 완성되는 MCP 서버
python
from mcp.server.fastmcp import FastMCP
# 서버 생성 — 이름이 클라이언트에 노출됩니다
mcp = FastMCP("weather-server")
# 도구 등록 — 데코레이터만 붙이면 함수가 Tool이 됩니다
@mcp.tool()
def get_weather(city: str) -> str:
"""도시의 현재 날씨를 조회합니다."""
# 외부 API 호출
return f"{city}: 맑음, 24°C"
@mcp.resource("config://settings")
def get_settings() -> str:
"""서버 설정을 반환합니다."""
return '{"unit": "celsius", "lang": "ko"}'
# 실행 — streamable-http로 원격 클라이언트 접속 허용
if __name__ == "__main__":
mcp.run(transport="streamable-http")