day4_practice/mcp_server.py · mcp_verify.py · mcp_agent.py 외

MCP 흐름 플레이어: 메시지가 프로세스 경계를 넘는 길

도구를 별도 프로세스의 MCP 서버로 떼어 내면, 도구 목록을 묻고 도구를 실행하는 일이 모두 표준 입출력(stdio)을 오가는 JSON-RPC 메시지가 됩니다. 서버를 만들고(mcp_server.py), 모델 없이 클라이언트로 확인하고(mcp_verify.py), LangGraph Agent 에 붙이는(mcp_agent.py) 과정을 시퀀스로 따라갑니다. JSON-RPC 메시지는 모양만 보인 (예시) 이고, 도구 목록과 호출 결과는 mcp_verify.py 와 같은 방식으로 서버를 실제로 띄워 얻은 값입니다.

한눈에 보는 시퀀스

Agent 프로세스 (부모: mcp_agent.py 또는 mcp_verify.py) 서버 프로세스 (자식: python mcp_server.py) stdio 모델Claude (Bedrock) AgentLangGraph + ToolNode MCP 클라이언트ClientSession MCP 서버FastMCP 데이터JSON 3개 ① 서버 프로세스 실행 (command + args) ② JSON 3개 읽기 (import 시) ③ initialize ④ 결과: protocolVersion · serverInfo ⑤ notifications/initialized ⑥ tools/list ⑦ 도구 4개 (이름 · 설명 · inputSchema) ⑧ LangChain 도구로 변환 ⑨ 질문 + toolSpec 5개 ⑩ tool_calls ⑪ 도구 실행 (await) ⑫ tools/call {name, arguments} ⑬ 도구 함수 실행 ⑭ 결과: content [text] ⑮ ToolMessage ⑯ 결과 전달 → 답

파랑은 클라이언트가 보내는 요청(stdin), 초록은 서버의 응답(stdout), 보라는 Agent 프로세스 안의 일입니다. mcp_verify.py 는 모델과 Agent 없이 ①~⑦과 ⑫~⑭만 씁니다. mcp_agent.py 에서는 도구 목록을 받을 때(⑥ 앞)와 도구를 부를 때(⑫ 앞)마다 ①③④⑤가 새로 일어납니다. 호출마다 새 세션을 열기 때문입니다.

이 단계에서 일어나는 일

세 가지 클라이언트 사용법 비교

mcp_verify.pymcp_agent.pymcp_agent_external.py
클라이언트stdio_client + ClientSessionMultiServerMCPClient (서버 1개)MultiServerMCPClient (서버 2개)
세션한 번 열어 끝까지 사용목록 조회와 도구 호출마다 새로 엶같음. 서버마다 따로
서버 프로세스1개가 끝까지 떠 있음호출마다 떴다가 내려감같음
모델없음claude-sonnet-4-6claude-haiku-4-5
결과를 받는 모양CallToolResult.content[0].textToolMessage (content 는 text 블록 리스트)

함정과 주의

관련 파일