— LangChain·LangGraph 연동부터 서버 구축까지
“LLM이 외부 세상과 안전하게 대화할 수 있는 표준 인터페이스가 필요하다.”
그 해답이 바로 MCP입니다
MCP(Model Context Protocol)는 Anthropic이 제안한 “LLM 친화적 Web API” 표준입니다.
기존 LangChain Tool 체계는 코드(파이썬 등) 안에서만 정의돼 재사용이 어려웠습니다.
MCP는 “툴을 네트워크 서비스로 분리”해 언어·플랫폼 독립성을 확보합니다.
덕분에
- Tool: 하나의 MCP 서버만 배포 → 어디서든 호환
- Agent: REST 주소만 알면 수백 개의 외부 툴을 즉시 연결
아래 예제에서는 FastMCP로 만든 Math 서버입니다.
# math_server.py
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Math") # 도구 집합 이름
@mcp.tool()
def add(a: int, b: int) -> int:
"""두 수를 더합니다"""
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""두 수를 곱합니다"""
return a * b
if __name__ == "__main__":
mcp.run(transport="stdio") # 표준 입·출력으로 통신
| 핵심 포인트 | 설명 |
|---|---|
FastMCP("Math") | “Math”라는 툴 묶음을 정의합니다. |
@mcp.tool() 데코레이터 | 해당 함수를 원격 호출 가능한 MCP 툴로 노출합니다. |
mcp.run(transport="stdio") | STDIO 전송 방식을 사용하여, 다른 프로세스가 파이프로 이 함수를 호출할 수 있게 만듭니다. |
클라이언트가 서버 툴을 호출하는 예시입니다.
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o") # LLM 선택
server_params = StdioServerParameters(
command="python",
args=["/절대/경로/math_server.py"], # 서버 스크립트 경로
)
async def main():
# ① 서버 프로세스 실행 & 스트림 확보
async with stdio_client(server_params) as (read, write):
# ② MCP 세션 래핑
async with ClientSession(read, write) as session:
await session.initialize() # 핸드셰이크
# ③ 서버가 노출한 툴 정보 가져오기
tools = await load_mcp_tools(session)
# ④ ReAct 에이전트 구성
agent = create_react_agent(model, tools)
# ⑤ 질문 → 에이전트에게 전달
response = await agent.ainvoke(
{"messages": "what's (3 + 5) x 12?"}
)
print(response)
if __name__ == "__main__":
asyncio.run(main())
흐름 요약
- 서버 기동 : StdioServerParameters로 math_server.py를 서브프로세스로 실행
- 세션 초기화 : ClientSession.initialize()로 프로토콜 버전 확인 등 기본 정보 교환
- 툴 메타데이터 수신 : load_mcp_tools()가 서버에서 add, multiply 시그니처를 수집 → LangChain Tool 객체로 변환
- ReAct 에이전트 구성 : LLM(GPT‑4o)이 추론(Reason)·도구 호출(Act)을 번갈아 수행
