LangGraph 集成 MCP Server

简介:

LangGraph 与 MCP(模型上下文协议)的结合使用,实现了大语言模型与外部工具、数据源的标准化交互,核心功能包括多轮对话记忆、动态工作流分支及工具调用链管理。
下面例子有两个python文件,一个用作服务器端,一个用作客户端。

服务器端:

FastMCP 也可以非常方便创建 MCP Server

from mcp.server.fastmcp import FastMCP

创建名为 “Logistics” 的MCP服务器

mcp = FastMCP("Logistics")

工具1:查询包裹状态

@mcp.tool()
def get_package_status(tracking_id: str) -> str:
    """Get the current status of a package by tracking ID."""
    statuses = {
        "LGT123456": "已发货,在途中",
        "LGT789012": "本地分拣中心,待派送",
        "LGT345678": "已签收",
        "LGT000000": "无效单号,请检查"
    }
    return statuses.get(tracking_id, "未找到该包裹信息")

工具2:计算运算费用

@mcp.tool()
def estimate_delivery_time(distance_km: float) -> str:
    """Estimate delivery time in hours based on distance."""
    avg_speed_km_per_hour = 40
    time_hours = distance_km / avg_speed_km_per_hour
    days = int(time_hours // 24)
    hours = round(time_hours % 24)
    return f"预计送达时间:{days}{hours} 小时"

工具3:预计到达时间

@mcp.tool()
def estimate_delivery_time(distance_km: float) -> str:
    """Estimate delivery time in hours based on distance."""
    avg_speed_km_per_hour = 40
    time_hours = distance_km / avg_speed_km_per_hour
    days = int(time_hours // 24)
    hours = round(time_hours % 24)
    return f"预计送达时间:{days}{hours} 小时"

完整代码:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Logistics")

@mcp.tool()
def get_package_status(tracking_id: str) -> str:
    """Get the current status of a package by tracking ID."""
    statuses = {
        "LGT123456": "已发货,在途中",
        "LGT789012": "本地分拣中心,待派送",
        "LGT345678": "已签收",
        "LGT000000": "无效单号,请检查"
    }
    return statuses.get(tracking_id, "未找到该包裹信息")

@mcp.tool()
def calculate_shipping_cost(weight_kg: float, distance_km: float) -> str:
    """Calculate shipping cost based on weight and distance."""
    base_rate = 5.0
    per_kg_rate = 2.0
    per_km_rate = 0.01
    cost = base_rate + (weight_kg * per_kg_rate) + (distance_km * per_km_rate)
    return f"运费估算:{round(cost, 2)} 元"

@mcp.tool()
def estimate_delivery_time(distance_km: float) -> str:
    """Estimate delivery time in hours based on distance."""
    avg_speed_km_per_hour = 40
    time_hours = distance_km / avg_speed_km_per_hour
    days = int(time_hours // 24)
    hours = round(time_hours % 24)
    return f"预计送达时间:{days}{hours} 小时"

if __name__ == "__main__":
    mcp.run(transport="streamable-http")

客戶端:

完整代码:

# pip install langchain-mcp-adapters
import os
from typing import List
from typing_extensions import TypedDict
from typing import Annotated
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langgraph.prebuilt import tools_condition, ToolNode
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import AnyMessage, add_messages
from langgraph.checkpoint.memory import MemorySaver
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_mcp_adapters.tools import load_mcp_tools
from langchain_mcp_adapters.prompts import load_mcp_prompt
from langchain_openai import ChatOpenAI
import asyncio

# 初始化多服务器客户端
client = MultiServerMCPClient(
    {
        # "math": {
        #     "command": "python",
        #     "args": ["math_mcp_server.py"],  # 确保这个文件存在且可运行
        #     "transport": "stdio",
        # },
        "logistics": {
            "url": "http://localhost:8000/mcp",  # 物流MCP服务地址
            "transport": "streamable_http",
        }
    }
)

async def create_graph(logistics_session):
    # 使用 OpenAI 模型
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, api_key="sk-淘宝35块apikey")

    # 加载工具
    logistics_tools = await load_mcp_tools(logistics_session)
    tools = logistics_tools

    # 绑定工具到 LLM
    llm_with_tool = llm.bind_tools(tools)

    # 可选:从 MCP 加载 system prompt - 静默处理
    system_prompt = "你是一个智能助手,可以调用工具来回答用户问题。"
    try:
        system_prompt_msg = await load_mcp_prompt(logistics_session, "system_prompt")
        if system_prompt_msg and len(system_prompt_msg) > 0:
            system_prompt = system_prompt_msg[0].content
    except Exception:
        # 静默失败,使用默认提示,不打印错误信息
        pass

    prompt_template = ChatPromptTemplate.from_messages([
        ("system", system_prompt),
        MessagesPlaceholder(variable_name="messages")
    ])

    chat_llm = prompt_template | llm_with_tool

    # 状态定义
    class State(TypedDict):
        messages: Annotated[List[AnyMessage], add_messages]

    # 节点函数
    def chat_node(state: State) -> State:
        response = chat_llm.invoke({"messages": state["messages"]})
        return {"messages": [response]}

    tool_node = ToolNode(tools=tools)

    # 构建图
    graph_builder = StateGraph(State)
    graph_builder.add_node("chat_node", chat_node)
    graph_builder.add_node("tool_node", tool_node)
    graph_builder.add_edge(START, "chat_node")
    graph_builder.add_conditional_edges(
        "chat_node",
        tools_condition,
        {"tools": "tool_node", "__end__": END}
    )
    graph_builder.add_edge("tool_node", "chat_node")
    
    graph = graph_builder.compile(checkpointer=MemorySaver())
    return graph


async def main():
    config = {"configurable": {"thread_id": "logistics_thread_001"}}
    
    async with client.session("logistics") as logistics_session:

        print("MCP 客户端已连接:Logistics 服务")
        agent = await create_graph(logistics_session)

        print("\n欢迎使用智能物流客服!你可以询问:")
        print("包裹状态、运费、送达时间等")
        print("输入 'quit' 退出\n")

        while True:
            try:
                user_input = input("User: ").strip()
                if user_input.lower() in ["quit", "exit", "退出"]:
                    print("再见!")
                    break

                # 调用代理
                response = await agent.ainvoke(
                    {"messages": [{"role": "user", "content": user_input}]},
                    config=config
                )
                ai_message = response["messages"][-1].content
                print(f"AI: {ai_message}\n")

            except KeyboardInterrupt:
                print("\n已退出。")
                break
            except Exception as e:
                print(f"出错: {e}")

if __name__ == "__main__":
    asyncio.run(main())

Graph框架

在这里插入图片描述

测试案例:

启动服务器端:

在这里插入图片描述

启动客户器端:

在这里插入图片描述

测试案例:

1.我的包裹 LGT123456 到哪了?

在这里插入图片描述

2.从北京到上海寄一个5公斤的包裹要多少钱?距离大约是1200公里。

在这里插入图片描述

3.那大概多久能到?

因为LangGraph 自带记忆功能,所以可以直接问下一个问题。
在这里插入图片描述

### LangGraphMCP集成方法 LangGraph MCP 是一种基于 LangGraph 和模型上下文协议(Model Context Protocol, MCP)的技术组合,旨在提供更高效的开发体验和更强的功能支持。以下是关于如何在 LangGraph 中使用 MCP 的详细介绍: #### 1. 基础概念 LangGraph 提供了一种灵活的方式来处理自然语言数据并生成结构化输出[^1]。而 MCP 则是一种用于定义 AI 助手行为的标准协议,能够帮助开发者更好地管理模型的状态和交互逻辑。两者的结合使得构建复杂的对话系统变得更加简单。 #### 2. 集成步骤 为了实现 LangGraphMCP 的无缝集成,通常需要完成以下几个方面的工作: - **安装依赖库** 开发者需先确保环境中已安装必要的 Python 库以及 MCP 支持工具。可以通过 pip 安装这些包: ```bash pip install langgraph mcp-inspector ``` - **编写 MCP Server** 如果你是纯 MCP Server 的开发者,则可以按照标准模板创建服务端脚本,并通过 `mcp dev` 工具对其进行调试[^2]。例如,在名为 `server_demo.py` 的文件中定义好接口之后,运行如下命令即可启动本地测试环境: ```bash mcp dev server_demo.py ``` - **配置 LangGraph 插件** 接下来,将 LangGraph 设置为调用上述 MCP Server 的客户端角色。这一步可能涉及修改配置文件或者调整初始化参数以指定目标地址和服务名称。 - **验证通信流程** 使用实际输入样本触发整个系统的运作过程,观察从请求发送到响应接收之间的各个环节是否正常工作。如果有任何异常情况发生,可以根据日志记录定位具体原因并修复相应部分。 #### 3. 示例代码片段 下面展示了一个简单的例子,说明如何利用 LangGraph 调用远程部署好的 MCP Service 来获取特定任务的结果: ```python from langgraph import Client import json def query_mcp_service(input_data): client = Client(api_key="your_api_key", service_name="example-service") result = client.call_method( method="process_text", payload=json.dumps({"text": input_data}) ) return json.loads(result) if __name__ == "__main__": sample_input = "What is the capital of France?" output = query_mcp_service(sample_input) print(f"Output: {output}") ``` 此段程序展示了如何设置一个 LangGraph 客户端实例并与预设的服务名建立连接;随后传递适当的数据格式作为负载提交给服务器端的方法执行入口 point —— 这里假设该函数命名为 process_text[]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值