MCP를 실무 흐름으로 이해하기
MCP(Model Context Protocol)로 AI Agent가 표준화된 방식으로 외부 도구와 데이터 소스에 연결하도록 구성합니다. 매번 커스텀 통합을 짜는 대신, 재사용 가능한 MCP 서버·클라이언트 구조를 익힙니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
MCP(Model Context Protocol)로 AI Agent가 표준화된 방식으로 외부 도구와 데이터 소스에 연결하도록 구성합니다. 매번 커스텀 통합을 짜는 대신, 재사용 가능한 MCP 서버·클라이언트 구조를 익힙니다.
MCP(Model Context Protocol)로 AI Agent가 표준화된 방식으로 외부 도구와 데이터 소스에 연결하도록 구성합니다. 매번 커스텀 통합을 짜는 대신, 재사용 가능한 MCP 서버·클라이언트 구조를 익힙니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
모델과 프롬프트만 보지 않고, 데이터 흐름, 평가, 배포 이후의 운영 지표까지 한 번에 연결해서 봅니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 MCP를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
MCP를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
| 방식 | 통합 방법 | 재사용성 |
|---|---|---|
| 커스텀 Tool Calling | Agent 프레임워크마다 도구 스키마를 직접 정의 | 프레임워크·프로젝트마다 다시 작성해야 함 |
| MCP | 표준 프로토콜로 서버 하나만 구현 | MCP를 지원하는 모든 Agent/클라이언트에서 재사용 |
아키텍처은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 구성요소 | 역할 |
|---|---|
| Host | Claude Desktop, IDE 등 사용자가 실제로 쓰는 애플리케이션 |
| Client | Host 내부에서 하나의 MCP 서버와 1:1로 연결을 관리 |
| Server | 실제 도구·데이터·프롬프트를 제공하는 경량 프로그램 (로컬 또는 원격) |
여기서는 MCP 서버 만들기을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather-server")
@mcp.tool()
def get_weather(city: str) -> str:
"""도시 이름으로 현재 날씨를 조회합니다."""
# 실제로는 날씨 API 호출
return f"{city}: 맑음, 22°C"
if __name__ == "__main__":
mcp.run(transport="stdio") # 로컬 프로세스 간 통신Resources / Tools / Prompts은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 종류 | 성격 | 예시 |
|---|---|---|
| Resources | 읽기 전용 데이터 (GET과 유사) | 파일 내용, DB 레코드, API 응답 |
| Tools | 부작용이 있는 실행 가능한 액션 (POST와 유사) | 이메일 발송, 티켓 생성, 계산 실행 |
| Prompts | 재사용 가능한 프롬프트 템플릿 | "이 코드를 리뷰해줘" 같은 정형화된 요청 |
여기서는 Agent에서 연결하기을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
server_params = StdioServerParameters(command="python", args=["mcp_server.py"])
async def use_mcp_tool():
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools() # 서버가 노출한 도구 목록 조회
result = await session.call_tool("get_weather", {"city": "서울"})
return result이 섹션은 보안 고려사항을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.