Model Context Protocol (MCP) 은 애플리케이션이 LLM에 도구와 컨텍스트를 제공하는 방식을 표준화하는 개방형 프로토콜입니다. LangChain 에이전트는 langchain-mcp-adapters 라이브러리를 사용하여 MCP 서버에 정의된 도구를 사용할 수 있습니다.
LangGraph에서 MCP 도구를 사용하려면 langchain-mcp-adapters 라이브러리를 설치하세요:
pip install langchain-mcp-adapters
전송 유형
MCP는 클라이언트-서버 통신을 위한 다양한 전송 메커니즘을 지원합니다:
stdio: 클라이언트가 서버를 서브프로세스로 실행하고 표준 입력/출력을 통해 통신합니다. 로컬 도구와 간단한 설정에 가장 적합합니다.
Streamable HTTP: 서버가 독립적인 프로세스로 실행되어 HTTP 요청을 처리합니다. 원격 연결과 여러 클라이언트를 지원합니다.
Server-Sent Events (SSE): 실시간 스트리밍 통신에 최적화된 streamable HTTP의 변형입니다.
MCP 도구 사용
langchain-mcp-adapters는 에이전트가 하나 이상의 MCP 서버에 정의된 도구를 사용할 수 있도록 합니다.
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
client = MultiServerMCPClient(
{
"math" : {
"transport" : "stdio" , # Local subprocess communication
"command" : "python" ,
# Absolute path to your math_server.py file
"args" : [ "/path/to/math_server.py" ],
},
"weather" : {
"transport" : "streamable_http" , # HTTP-based remote server
# Ensure you start your weather server on port 8000
"url" : "http://localhost:8000/mcp" ,
}
}
)
tools = await client.get_tools()
agent = create_agent(
"anthropic:claude-sonnet-4-5" ,
tools
)
math_response = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "what's (3 + 5) x 12?" }]}
)
weather_response = await agent.ainvoke(
{ "messages" : [{ "role" : "user" , "content" : "what is the weather in nyc?" }]}
)
MultiServerMCPClient is stateless by default . Each tool invocation creates a fresh MCP ClientSession, executes the tool, and then cleans up.
Custom MCP servers
To create your own MCP servers, you can use the mcp library. This library provides a simple way to define tools and run them as servers.
Use the following reference implementations to test your agent with MCP tool servers.
Math server (stdio transport)
from mcp.server.fastmcp import FastMCP
mcp = FastMCP( "Math" )
@mcp.tool ()
def add ( a : int , b : int ) -> int :
"""Add two numbers"""
return a + b
@mcp.tool ()
def multiply ( a : int , b : int ) -> int :
"""Multiply two numbers"""
return a * b
if __name__ == "__main__" :
mcp.run( transport = "stdio" )
Weather server (streamable HTTP transport)
from mcp.server.fastmcp import FastMCP
mcp = FastMCP( "Weather" )
@mcp.tool ()
async def get_weather ( location : str ) -> str :
"""Get weather for location."""
return "It's always sunny in New York"
if __name__ == "__main__" :
mcp.run( transport = "streamable-http" )
For stateful servers that maintain context between tool calls, use client.session() to create a persistent ClientSession.
Using MCP ClientSession for stateful tool usage
from langchain_mcp_adapters.tools import load_mcp_tools
client = MultiServerMCPClient({ ... })
async with client.session( "math" ) as session:
tools = await load_mcp_tools(session)
Additional resources