LangGraph学习记录2:MCP接入LangGraph
1.MCP简介
就我的使用而言,我理解的MCP就是一个构建agent tool的标准化方法,可能理解有些片面,见仁见智啦~构建这样的连接需要一个client(agent侧)和多个server(tool侧)。这个构建方法支持三种传输类型,也就是说你搭建的client- server之间如何通信。
- stdio:这种方式是本地进程间通信,client启动server作为一个子进程,简单的工具用这个就好。
- streamable-http / sse:服务端自己先在某个端口跑起来,客户端再用 HTTP/SSE 连接过去,客户端不负责启动服务进程。两者都是基于 HTTP,区别在于是否支持流式/SSE 推送。
2.实践
这里的demo和上一篇的没有关系,单纯是学习这个mcp弄得。这里的demo也是来自于langchain官网,包含两种传输方式的工具。修改部分有:
- 模型调用改为open router
- Python 脚本文件的顶层不能直接用 await,必须放在 async def 里再用 asyncio.run。官网可能是JNB之类的,直接搬来会报错
客户端部分
注意修改math部分的路径
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
import asyncio
import os
from dotenv import load_dotenv
load_dotenv()
OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY")
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": "http", # HTTP-based remote server
# Ensure you start your weather server on port 8000
"url": "http://localhost:8000/mcp",
}
}
)
async def main():
tools = await client.get_tools()
llm = ChatOpenAI(
model="anthropic/claude-sonnet-4.5",
temperature=0,
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY")
)
agent = create_agent(
llm,
tools=tools
)
math_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what's (3 + 5) x 12?"}]}
)
math_response["messages"][-1].pretty_print()
weather_response = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what is the weather in nyc?"}]}
)
weather_response["messages"][-1].pretty_print()
if __name__ == "__main__":
asyncio.run(main())
两个server部分
math_server.py
from 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")
get_weather.py
from 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")
3.运行
这里的weather服务器是http连接,需要运行前手动跑起来这个get_weather.py程序,它在本地8000端口提供服务

math服务器是子进程方式启动,运行客户端会自行启动

两次使用工具结果如下

4.后话
像我自己要搭建的项目中,我想把仿真平台ns3作为工具供agent使用,而ns3这边的运行包含好几个进程,以及复杂的环境,使用stdio方式就很困难,弄成在某个端口提供服务就方便很多。但是具体怎么弄还没想好,再试试吧。

浙公网安备 33010602011771号