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端口提供服务
image

math服务器是子进程方式启动,运行客户端会自行启动
image
两次使用工具结果如下
image

4.后话

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

posted @ 2025-12-22 11:15  陈金鱼  阅读(1)  评论(0)    收藏  举报