说明

  • 本文学习赋范社区公开课程,仅供学习和交流使用,最终著作权属于九天老师及其团队!

LangGraph与MCP技术概述

LangGraph接入外部工具技术实现方法

LangChain自定义外部工具函数

  • 接入外部函数工具在智能体开发中是至关重要的一环,在LangChain&LangGraph技术生态中,可以通过@tool装饰符来定义外部函数。
from langchain_core.tools import tool
from pydantic import BaseModel, Field
import os
import requests
import json

class WeatherQuery(BaseModel):
    loc: str = Field(description="The location name of the city")

@tool(args_schema=WeatherQuery)
def get_weather(loc):
    """
    查询即时天气函数
    
    :param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名,
                注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则loc参数需要输入'Beijing';
    :return: OpenWeather API查询即时天气的结果,具体URL请求地址为:https://api.openweathermap.org/data/2.5/weather
             返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息
    """
    # Step 1.构建请求
    url = "https://api.openweathermap.org/data/2.5/weather"
    
    # Step 2.设置查询参数
    params = {
        "q": loc,
        "appid": os.getenv("OPENWEATHER_API_KEY"),  # 输入API key
        "units": "metric",                         # 使用摄氏度而不是华氏度
        "lang": "zh_cn"                            # 输出语言为简体中文
    }
    
    # Step 3.发送GET请求
    response = requests.get(url, params=params)
    
    # Step 4.解析响应
    data = response.json()
    return json.dumps(data)

Langchain内置工具实现

  • LangChain具有丰富的、数以百计的内置工具,使用极少代码即可实现工具调用。
  • LangChain工具集
功能类别 工具名称 简要说明
🔍 搜索工具 TavilySearchResults 快速搜索实时网络信息
SerpAPISearchWrapper 基于 SerpAPI 的搜索结果工具
GoogleSearchAPIWrapper 调用 Google 可编程搜索引擎
🧮 计算工具 PythonREPLTool 执行 Python 表达式并返回结果
LLMMathTool 结合 LLM 和数学推理能力
wolframAlphaQueryRun 基于 Wolfram Alpha 的计算引擎
📊 数据工具 SQLDatabaseToolkit 构建 SQL 数据库查询工具集
PandasDataFrameTool 用于在 Agent 中操作表格数据
🌐 网络/API RequestsGetTool / RequestsPostTool 执行 HTTP 请求
BrowserTool / PlaywrightBrowserToolkit 自动化网页浏览与抓取
📄 文件处理 ReadFileTool 读取本地文件内容
WriteFileTool 写入文本到指定文件中
🔍 检索工具 FAISSRetriever 基于向量的文档检索工具
ChromaRetriever 使用 ChromaDB 的检索器
ContextualCompressionRetriever 上下文压缩检索器,适合长文档
🧠 LLM 工具 ChatOpenAI / OpenAIFunctionsTool 使用 OpenAI 模型作为工具调用
ChatAnthropic Anthropic Claude 模型封装工具
🔧 自定义工具 @tool 装饰器 任意函数可封装为 Agent 可调用工具
Tool 类继承 自定义更复杂逻辑的工具实现

遵循MCP协议接入外部工具

  • MCP的全称是Model Context Protocol,模型上下文协议,由Claude母公司Anthropic于2024年11月正式提出。

  • MCP的技术核心目标是创建一种统一的大模型调用外部工具的通信规范,特定功能的外部函数只需一次开发,就可以被到处使用。

  • 下面有一组图能够清晰的解释MCP工具在智能体开发过程中实际带来的提效作用。
    在这里插入图片描述

  • MCP的技术生态可以划分为三层,最底层是协议层,也就是“文字版”的规定、规范,而为了普及这一规范,让更多的人更加快速的完成自己的MCP工具开发,Anthropic进一步的提供MCP开发工具,SDK,快速完成MCP工具开发。
    在这里插入图片描述

  • MCP项目官网

  • 在MCP技术架构中,MCP的SDK和MCP技术生态需要重点关注。MCP SDK已支持Python、TypeScript、Java、Kotlin和C#等编程语言进行客户端和服务器创建。借助这些库,仅需几行代码,即可快速构建一个MCP工具。

    # server.py
    from mcp.server.fastmcp import FastMCP
    
    # Create an MCP server
    mcp = FastMCP("Demo")
    
    # Add an addition tool
    @mcp.tool()
    def add(a: int, b: int) -> int:
        """Add two numbers"""
        return a + b
    
    # Add a dynamic greeting resource
    @mcp.resource("greeting://{name}")
    def get_greeting(name: str) -> str:
        """Get a personalized greeting"""
        return f"Hello, {name}!"
    
  • 如果我们并不需要开发MCP工具,而只想要借助现成的MCP工具快速完成智能体开发,那么就需要重点关注现在的MCP集成平台。

MCP核心技术概念

MCP CS架构模式

  • MCP是一种围绕大模型外部函数工具创建的统一范式,因此MCP工具从诞生之初就是客户端(client)与服务器(server)分离的架构。服务器与客户端的技术概念可以借助MySQL这个通用的数据库软件进行理解,在MySQL中,服务器指的是数据库实际运行环境,例如公司内部的某个统一用于数据存储的物理机,而客户端,则指的是SQL编写和运行的环境,可以是比如数据分析师用的笔记本。每次要进行查数时,数据分析师就可以在自己的笔记本上运行MySQL WorkBench(一个SQL编程的IDE),然后借助MySQL客户端,给公司的MySQL服务器发送查数的请求。
  • MCP Server(服务器),指的是MCP工具运行的环境,而MCP Client(客户端),则指的是能够调用MCP工具、或者说给MCP工具发送请求并接受结果的环境。
    在这里插入图片描述
    在这里插入图片描述

MCP离线、在线运行模式

  • 因为MCP采用服务器和客户端分离的架构,所以MCP支持两种调用方法(本地运行和在线运行)。本地运行(离线运行),MCP服务器和MCP客户端在同一台电脑上进行运行;其在线运行(异地部署运行),MCP服务器在远程服务器或者云端运行,借助HTTP网络通信来进行响应。对应着MCP工具调用的两种核心模式,分别是stdio(本地)模式调用和SSE&streamable HTTP(在线)模式调用。
特性 Stdio SSE Streamable HTTP
通信方向 双向(但仅限本地) 单向(服务器到客户端) 双向(适用于复杂交互)
使用场景 本地进程间通信 实时数据推送,浏览器支持 跨服务、分布式系统、大规模并发支持
支持并发连接数 中等 高(适合大规模并发)
适应性 局限于本地环境 支持浏览器,但单向通信 高灵活性,支持流式数据与请求批处理
实现难度 简单,适合本地调试 简单,但浏览器兼容性和长连接限制 复杂,需处理长连接和流管理
适合的业务类型 本地命令行工具,调试环境 实时推送,新闻、股票等实时更新 高并发、分布式系统,实时交互系统

  • 三种传输方式
  • stdio传输:适合本地进程之间的简单通信,适合命令行工具或调试阶段,但不支持分布式。
  • SSE传输:适合实时推送和客户端/浏览器的单向通知,但无法满足双向复杂交互需求。
  • Streamable HTTP传输:最灵活、最强大的选项,适用于大规模并发、高度交互的分布式应用系统,虽然实现较复杂,但能够处理更复杂的场景。

离线MCP工具托管平台

  • 是调用在线MCP服务,只能了解其功能,离线的MCP服务,MCP工具是完全开源的,在调用之前,开发者都需要将其源码先下载到本地,然后再运行。
  • npx安装的mcp工具托管在npmjs.com,uvx安装的mcp工具托管在pypi.org,,每次运行uvx命令,其本质就是将工具源码从pypi平台上下载到本地再来进行运行。

MCP在线托管服务

  • 开发者可以直接使用SSE或者流式HTTP方式请求调用在线的MCP工具,从而快速完成开发工作。
    国内主流MCP在线托管服务平台
  1. 蓝耘MCP广场:由蓝耘科技推出的集成化MCP服务平台,提供千余款热门MCP服务,覆盖知识管理、天气查询、安全审计等场景,支持云托管和本地部署,开发者可通过自然语言搜索快速匹配服务并生成SSE连接地址。

  2. AIbase MCP集合平台:收录全球超12万项MCP服务,提供一站式资源整合,包含热门推荐、最近更新服务及开发效率工具,支持浏览器自动化、动态指纹伪装等高级功能,并配套详细教程和安全管理指南。

  3. 阿里云百炼MCP服务:业内首个全生命周期托管平台,支持预置服务(如高德地图、无影云电脑)和自定义服务部署,基于函数计算实现弹性资源调度,5分钟即可完成智能体搭建,兼容工作流调用。

  4. 魔搭MCP广场:中文社区最大MCP资源库,独家首发支付宝支付、MiniMax多模态生成等服务,提供MCPBench评估工具和实验场调试环境,支持云托管与第三方集成,已上线1500余种服务。

  5. Smithery:标准化MCP托管枢纽,支持开发者快速集成外部数据源和工具,提供统一接口和灵活配置选项,加速Agent型AI开发,适用于智能客服、个性化推荐等场景。

  6. MCPmarket.cn:专注云托管部署的"智能体App Store",提供高德地图、Playwright网页抓取等即用型服务,支持SSE协议一键连接,即将推出Playground对话测试功能。

  7. 腾讯云AI开发套件:内置MCP插件协议和托管环境,提供天气查询、网页搜索等模板服务,开发者可自定义插件并免运维部署,支持小程序/H5多端接入。

  8. 七牛云Agent托管服务:新推出的MCP兼容平台,支持企业级服务托管和动态资源分配,具体功能尚在扩展中。[26]

LangGraph技术概述

LangGraph

  • LangGraph和LangChain同宗同源,底层架构完全相同、接口完全相通。从开发者角度来说,LangGraph也是使用LangChain底层API来接入各类大模型、LangGraph也完全兼容LangChain内置的一系列工具。换而言之,LangGraph的核心功能都是依托LangChain来完成。但是和LangChain的链式工作流哲学完全不同的是,LangGraph的基础哲学是构建图结构的工作流,并引入“状态”这一核心概念来描绘任务执行情况,从而拓展了LangChain LCEL链式语法的功能灵活程度。
    在这里插入图片描述
  • LangGraph是基于LangChain进行的构建,无论图结构多复杂,单独每个任务执行链路仍然是现行的,其背后仍然是靠着LangChain的Chain来实现的。因此我们可以这么来描述LangChain和LangGraph之间的关系,LangGraph是LangChain工作流的高级编排工具,其中“高级”之处就是LangGraph能按照图结构来编排工作流。

LangGraph三层API架构

  • 尽管图结构看起来比链式结构灵活很多,但在实际开发过程中,要创建一个图结构却绝非易事。要在代码环境中描述清楚一个图,至少需要清晰的说明图中有哪些节点,不同节点之间是什么关系(边如何连接),同时还需要设置各节点功能,然后才能测试上线,这个流程其实是非常复杂的。
# 1. 定义结构化状态模型 
class CalcState(BaseModel): 
    x: int 
 
# 2. 定义节点函数,接收并返回 CalcState 
def addition(state: CalcState) -> CalcState: 
    print(f"[addition] 初始状态: {state}") 
    return CalcState(x=state.x + 1) 
 
def subtraction(state: CalcState) -> CalcState: 
    print(f"[subtraction] 接收到状态: {state}") 
    return CalcState(x=state.x - 2) 
 
# 3. 构建图 
builder = StateGraph(CalcState) 
 
builder.add_node("addition",  addition) 
builder.add_node("subtraction",  subtraction) 
 
builder.add_edge(START,  "addition") 
builder.add_edge("addition",  "subtraction") 
builder.add_edge("subtraction",  END) 
 
graph = builder.compile()  
 
# 4. 执行图:传入结构化状态对象 
initial_state = CalcState(x=10) 
final_state = graph.invoke(initial_state)  
  • 不过这对于LangChain来说并不难解决。LangChain生态各框架的核心思路都是“既要有底层API来定义基础功能,同时也要有高层API来加快开发效率”,就好比LangChain中既有LCEL语法、同时也有Agent API一样,LangGraph也提供了基于图结构基础语法的高层API。LangGraph的高层API主要分为两层,其一是Agent API,用于将大模型、提示词模板、外部工具等关键元素快速封装为图中的一些节点,而更高一层的封装,则是进一步创建一些预构建的Agent、也就是预构建好的图,开发者只需要带入设置好要带入的工具和模型,三行代码就能借助这些预构建好的图,创建一个完整的Agent。
tools =[search_tool,python_inter,fig_inter]
model=ChatDeepSeek(model="deepseek-chat")
graph=create_react_agent(model=model,tools=tools)
  • 依托LangChain完善的生态、拥有丰富稳定的API架构、以及便捷上手等特性,使得LangGraph成为目前超越LangChain的新一代Agent开发框架。
    在这里插入图片描述

LangGraph搭建MCP服务端

  1. 创建项目
    uv init mcp-get-weather
    cd mcp-get-weather
    
  2. 创建、激活虚拟环境
    uv venv
    .venv\Scripts\activate
    
  3. 添加依赖
    uv add mcp httpx dotenv langgraph langchain-deepseek langchain-mcp-adapters
    
  4. 编写MCP服务器
  • weather_server.py

    import os
    import json
    import httpx
    from typing import Any
    from dotenv import load_dotenv
    from fastmcp import FastMCP
    
    # 加载环境变量
    load_dotenv(override=True)
    API_KEY = os.getenv('OPENWEATHER_API_KEY')
    
    # 初始化mcp服务器
    mcp=FastMCP("Weather Server")
    
    #OpenWeather API 配置
    OPENWEATHER_API_BASE = "https://api.openweathermap.org/data/2.5/weather"
    
    USER_AGENT = "weather-app/1.0"
    
    async def fetch_weather(city: str) -> dict[str, Any]|None:
        """
        获取天气信息
        :param city: 城市名称(需使用英文,如 Beijing)
        :return: 天气数据字典;若出错返回包含 error 信息的字典
        """
        params={
            "q": city,
            "appid": API_KEY,
            "units": "metric",
            "lang": "zh_cn"
        }
        headers={
            "User-Agent": USER_AGENT
        }
        
        async with httpx.AsyncClient() as client:
            response = await client.get(OPENWEATHER_API_BASE, params=params, headers=headers,timeout=1000)
            if response.status_code == 200:
                return response.json()
            else:
                print(f"Error fetching weather data: {response.status_code}, {response.text}")  # 增加日志输
                return None
    
    def format_weather(data: dict[str,Any] | str)->str:
        """
        解析天气数据字典,提取关键信息并格式化输出。
        功能:对可能缺失的嵌套数据字段进行容错处理,确保返回内容完整。
        参数:
            data: 天气API返回的原始数据字典
        返回:
            格式化后的天气信息字符串
        """
        # 基础位置信息(城市、国家)- 缺失时显示"未知"
        city = data.get("name", "未知")  # 城市名称(顶层字段)
        country = data.get("sys", {}).get("country", "未知")  # 国家代码(嵌套在sys字段中)
    
        # 天气核心指标 - 缺失时显示"N/A"(Not Available)
        main_data = data.get("main", {})  # 提取main字段(包含温度、湿度等)
        temperature = main_data.get("temp", "N/A")  # 温度
        humidity = main_data.get("humidity", "N/A")  # 湿度
    
        wind_data = data.get("wind", {})  # 提取wind字段(包含风速等)
        wind_speed = wind_data.get("speed", "N/A")  # 风速
    
        # 天气描述 - weather字段可能为空列表,默认返回第一个元素的描述
        weather_list = data.get("weather", [{}])  # 提取weather数组(默认空字典避免索引错误)
        weather_description = weather_list[0].get("description", "未知")  # 天气状况描述
    
        # 格式化输出字符串(使用f-string拼接,添加emoji直观展示)
        weather_info = (
            f"🌍 {city}, {country}\n"
            f"🌡️ 温度:{temperature}℃\n"
            f"💧 湿度:{humidity}%\n"
            f"💨 风速:{wind_speed} m/s\n"
            f"☁️ 天气:{weather_description}\n"
        )
    
        return weather_info
    
    @mcp.tool()
    async def query_weather(city: str) -> str:
        """
        查询天气信息并返回结果
    
        注意:当大模型调用此工具时,必须使用参数名 'city' 来传递城市名称。
        city 参数只支持英文城市名或中文城市的拼音形式,不支持中文城市名直接输入。
    
        Args:
            city (str): 要查询天气的城市名称,仅支持英文或中文拼音
                        例如:Beijing, Shanghai, london, tokyo
    
        Returns:
            str: 格式化的天气信息字符串,包含温度、湿度、风速和天气描述等信息
    
        Example:
            query_weather(city="Beijing")
            query_weather(city="Shanghai")
            query_weather(city="london")
        """
        weather_data = await fetch_weather(city)
        if weather_data:
            return format_weather(weather_data)
        else:
            return "无法获取天气信息。请检查城市名称是否正确,确保使用英文或拼音格式。"
    
    
    if __name__=="__main__":
        mcp.run(transport="streamable-http", host="0.0.0.0", port=8000, path="/mcp/get_weather")
    
  • write_server.py

    import os
    from datetime import datetime
    from fastmcp  import FastMCP
    
     
    # 初始化 MCP 服务器
    mcp = FastMCP("WriteServer")
    
    # 文件保存目录
    OUTPUT_DIR = "./output"
    
    # 确保目录存在
    os.makedirs(OUTPUT_DIR, exist_ok=True)
    
    @mcp.tool() 
    async def write_file(content: str) -> str:
        """
        将指定内容写入本地文件。
        :param content: 必要参数,字符串类型,用于表示需要写入文档的具体内容
        :return:字符串,表示是否成功写入
        """
        # 创建带时间戳的文件名
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        file_name = f"note_{timestamp}.md"
        file_path = os.path.join(OUTPUT_DIR, file_name)
    
        try:
            with open(file_path, "w", encoding="utf-8") as file:
                file.write(content)
            return f"已成功写入本地文件{file_name},内容长度:{len(content)} 字符"
        except Exception as e:
            return f"写入文件失败: {str(e)}"
     
    if __name__ == "__main__":
        # 以标准 I/O 方式运行 MCP 服务器
        mcp.run(transport="streamable-http", host="0.0.0.0", port=8001, path="/mcp/write_file")
    
  1. 运行和测试
    uv run weather_server.py
    uv run write_server.py
    npx -y @modelcontextprotocol/inspector
    

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

LangGraph搭建MCP客户端

  • 使用LangGraph接入MCP工具,核心需要使用langchain_mcp_adapters库,该库可以将MCP工具信息进行解析,并让LangGraph顺利识别。识别后即可像任意其他工具一样接入LangGraph中并搭建智能体。
    在这里插入图片描述
  • LangGraph接入MCP 的核心原理为:weather_server.py → 启动为子进程 → 流式http通信 → MCP 协议→转化为langchain工具→LangGraph Agent执行读写,核心转换过程为::
  1. @mcp.tool() → 标准LangChain Tool
  2. stdio_client() → 自动处理read/write 流,其中read表示从MCP服务器读取响应的流,write表示向MCP服务器发送请求的流,对于
    stdio weather_server.py,他们就是子进程的stdoutstdin
  3. MultiServerMCPClient → 一键转换所有工具。

创建MCP配置文件

  • 为实现一个标准的MCP调用流程、即通过配置文件灵活说明MCP工具信息然后再进行调用,这里同样先创建一个servers_config.json 文件,用于记录MCP工具信息。
{
    "mcpServers": {
        "weather": {
            "transport": "streamable_http",
            "url": "http://127.0.0.1:8000/mcp/get_weather"
        },
        "write": {
            "transport": "streamable_http",
            "url": "http://127.0.0.1:8001/mcp/write_file"
        }
    }
}

修改.env配置文件和提示词模板

  1. 根项目下创建.env文件
    OPENAI_API_BASE=https://dashscope.aliyuncs.com/compatible-mode/v1
    OPENAI_API_KEY=sk-xx
    MODEL=deepseek-r1-0528
    OPENWEATHER_API_KEY ="xxx"
    
  2. 创建提示词模板agent_prompts.txt
    你是一个智能体,具备以下两种能力:
    1.查询天气:调用query_weather(city: str),返回指定城市的实时天气。
    2.写入文件:调用write_file(content: str),将文本内容写入本地文件并返回结果。
    当用户提出请求时,你需要理解意图并选择相应的工具。如果请求缺少必要信息,先与用户确认后再调用工具。
    返回结果时以简洁、友好的方式回复。
    如果用户提出的问题与你的功能无关,请礼貌告知无法处理。
    

创建client.py主函数文件

"""
多服务器 MCP + LangChain Agent 示例
1. 读取 .env 中的 DS_BASE_URL / DS_API_KEY / DS_MODEL
 2. 读取 servers_config.json 中的 MCP 服务器信息
3. 启动 MCP 服务器(支持多个)
4. 将所有工具注入 LangGraph Agent,由大模型自动选择并调用
"""

import asyncio
import json
import logging
import os
from typing import Any, Dict, List
from dotenv import load_dotenv
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.checkpoint.memory import InMemorySaver

# 设置记忆存储
checkpointer = InMemorySaver()

# 读取提示词
with open("agent_prompts.txt", "r", encoding="utf-8") as f:
    prompt = f.read()

# 设置对话配置
config = {
    "configurable": {
        "thread_id": "1"  
    }
 }

# ────────────────────────────
# 环境配置
# ────────────────────────────
class Configuration:
    """读取 .env 与 servers_config.json"""
    def __init__(self) -> None:
        load_dotenv()
        self.api_key: str = os.getenv("OPENAI_API_KEY") or ""
        self.base_url: str | None = os.getenv("OPENAI_API_BASE") 
        self.model: str = os.getenv("MODEL")
        if not self.api_key:
            raise ValueError("❌未找到 DS_API_KEY,请在 .env 中配置")

    @staticmethod
    def load_servers(file_path: str = "servers_config.json") -> Dict[str, Any]:
        with open(file_path, "r", encoding="utf-8") as f:
            return json.load(f).get("mcpServers", {})

# ────────────────────────────
# 主逻辑
# ────────────────────────────
async def run_chat_loop() -> None:
    """启动 MCP-Agent 聊天循环"""
    cfg = Configuration()
    
    servers_cfg = Configuration.load_servers()

    # 1 连接多台 MCP 服务器
    mcp_client = MultiServerMCPClient(servers_cfg)
    tools = await mcp_client.get_tools()         # LangChain Tool 对象列表

    logging.info(f"✅已加载 {len(tools)} 个 MCP 工具: {[t.name for t in tools]}")
    
    # 2  初始化大模型(DeepSeek / OpenAI / 任意兼容 OpenAI 协议的模型)
    
    model = ChatOpenAI(model=cfg.model)

    # 3 构造 LangGraph Agent
    
    agent = create_react_agent(model=model, 
                               tools=tools,
                               prompt=prompt,
                               checkpointer=checkpointer)

     # 4 CLI 聊天
    print("\n🤖MCP Agent 已启动,输入 'quit' 退出")
    while True:
        user_input = input("\n你: ").strip()
        if user_input.lower() == "quit":
            break
        try:
            result = await agent.ainvoke(
                {"messages": [{"role": "user", "content": user_input}]},
                config
            )
            print(f"\nAI: {result['messages'][-1].content}")
        except Exception as exc:
            print(f"\n⚠出错: {exc}")

    # 5 清理资源 
    print("\n🧹开始清理 MCP 客户端资源...")
    await mcp_client.cleanup()
    print("✅资源已清理,Bye!")

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
    asyncio.run(run_chat_loop())

代码解释如下:
✅ 从 .env 文件读取模型配置
✅ 从 servers_config.json 读取 MCP 服务器配置(支持多个服务器)
✅ 启动 MCP 客户端加载所有工具
✅ 用 LangGraph 创建 Agent,把所有工具挂载
✅ 在命令行与用户进行对话,模型自动选择工具
✅ 清理资源


运行和测试

  • 运行天气查询mcp服务器和写文件服务器。
    uv run weather_server.py
    uv run write_server.py
    
  • 运行客户端
    uv run client.py
    
(mcp-get-weather) D:\Code\mcp-get-weather>uv run client.py
2025-09-03 21:33:17,951 - INFO - HTTP Request: POST http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:33:17,951 - INFO - Received session ID: ae8f8dc5178643049d862dfe525023b8
2025-09-03 21:33:17,952 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:33:17,953 - INFO - Received session ID: 4a9b7b411cbb43dfa37cea46cfaf27ba
2025-09-03 21:33:17,954 - INFO - Negotiated protocol version: 2025-06-18
2025-09-03 21:33:17,955 - INFO - Negotiated protocol version: 2025-06-18
2025-09-03 21:33:17,965 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 202 Accepted"
2025-09-03 21:33:17,966 - INFO - HTTP Request: POST http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 202 Accepted"
2025-09-03 21:33:17,967 - INFO - HTTP Request: GET http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:33:17,968 - INFO - HTTP Request: GET http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:33:17,972 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:33:17,973 - INFO - HTTP Request: POST http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:33:17,981 - INFO - HTTP Request: DELETE http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:33:17,983 - INFO - HTTP Request: DELETE http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:33:17,984 - INFO - ✅已加载 2 个 MCP 工具: ['query_weather', 'write_file']

🤖MCP Agent 已启动,输入 'quit' 退出

你: 请查询北京今天的天气,并保存到本地文件中。
2025-09-03 21:33:54,586 - INFO - HTTP Request: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions "HTTP/1.1 200 OK"
2025-09-03 21:33:55,202 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:33:55,203 - INFO - Received session ID: 62e16bbc6a5c4c84b8c2f71de459b7e8
2025-09-03 21:33:55,203 - INFO - Negotiated protocol version: 2025-06-18
2025-09-03 21:33:55,210 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 202 Accepted"
2025-09-03 21:33:55,211 - INFO - HTTP Request: GET http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:33:55,214 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:35:18,146 - INFO - HTTP Request: DELETE http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:35:38,390 - INFO - HTTP Request: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions "HTTP/1.1 200 OK"
2025-09-03 21:35:38,988 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:35:38,988 - INFO - Received session ID: 0b94ec07ea22493dbd87e617e05e9464
2025-09-03 21:35:38,989 - INFO - Negotiated protocol version: 2025-06-18
2025-09-03 21:35:38,996 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 202 Accepted"
2025-09-03 21:35:38,998 - INFO - HTTP Request: GET http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:35:39,000 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:35:51,629 - INFO - HTTP Request: POST http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:35:51,637 - INFO - HTTP Request: DELETE http://127.0.0.1:8000/mcp/get_weather "HTTP/1.1 200 OK"
2025-09-03 21:35:58,674 - INFO - HTTP Request: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions "HTTP/1.1 200 OK"
2025-09-03 21:35:59,308 - INFO - HTTP Request: POST http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:35:59,309 - INFO - Received session ID: 334483d5a4044d61886a9a0b1f068d56
2025-09-03 21:35:59,309 - INFO - Negotiated protocol version: 2025-06-18
2025-09-03 21:35:59,315 - INFO - HTTP Request: POST http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 202 Accepted"
2025-09-03 21:35:59,317 - INFO - HTTP Request: GET http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:35:59,320 - INFO - HTTP Request: POST http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:35:59,329 - INFO - HTTP Request: POST http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:35:59,335 - INFO - HTTP Request: DELETE http://127.0.0.1:8001/mcp/write_file "HTTP/1.1 200 OK"
2025-09-03 21:36:08,265 - INFO - HTTP Request: POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions "HTTP/1.1 200 OK"

AI: 北京的天气信息已成功保存到本地文件!以下是文件详情:
📄 文件名:`note_20250903_213559.md`
📝 内容长度:58 字符

需要查看文件内容或进一步操作请随时告诉我! 😊
  • 文件内容:
🌍 Beijing, CN
🌡️ 温度:25.81℃
💧 湿度:84%
💨 风速:1.98 m/s
☁️ 天气:小雨

LangGraph接入HTTP MCP智能体

  • 在 SSE (Server-Sent Events) 模式 下,我们可以把 「工具 API」,用 URL 建立事件流、再用 MCP 服务器当成一个已经在网络上跑着的POST /messages 发指令。当前主流的使用形式可以归纳为两大类:自托管启动与平台托管直连。

  • 自托管启动(Self-hosted):主要应用 MCP 官方的 Python / TypeScript MCP SDK 把 Server 代码跑起来(FastAPI / Express 集成),程序启动后会打印或返回一个本地或内网 SSE URL,然后便可以用这个 URL 建立事件流接入到 openAI Agents SDK 框架中。如果需要使用 MCP 官方的 Python SDK 构建 SSE 模式的 MCP 服务器。

  • 平台托管直连(Platform-hosted):诸如 ModelScope 的 MCP 广场、mcp.run 等社区维护大量 MPC 服务并支持一键启动 MCP 的 SSE 模式。使用的方法非常简单,只需在平台首页选好 MCP Server → 生成一个 API-Key,一键生成 SSE URL,即可直接接入使用。
    对于国内开发者,通过“一键复制 URL + API-Key”就能拿到 SSE 端点的热门网站大致可以分为四类:

  1. 专门的 MCP 服务市场/目录(如 MCP Market、Albase、MCP Server Hub);
  2. 云厂商推出的官方托管平台(阿里云“百炼”与 Higress Marketplace);
  3. 行业 API 已内置 MCP & SSE(百度地图、腾讯位置服务等);
  4. IDE / 客户端集市 把第三方 SSE URL 聚合到本地(Cherry Studio、Cursor)。

MCP 热门导航网站

平台 规模与特点 访问链接
ModelScope MCP 广场 超过 3000+ 个中文托管 MCP;详情页右侧直接复制 SSE URL,部分服务需在“API Key”栏目填 Token 点击进入
MCP Market 标榜“国内首个 MCP 服务市场”,已收录 1W+ SSE Server,并提供云托管与 Playground,一键生成专属 URL 点击进入
Albase MCP 资源站 整理 GitHub 上的热门 MCP Server 并直接给出 SSE 地址与使用教程 点击进入
MCP Server Hub 国际化,标签筛选 + “Copy URL”操作流畅,站内统计数千条 SSE Server 点击进入
阿里云“百炼” 官方托管“全周期 MCP 服务”,控制台能生成已鉴权的 SSE URL 点击进入

在这里插入图片描述

{
    "mcpServers": {
        "weather": {
            "transport": "streamable_http",
            "url": "http://127.0.0.1:8000/mcp/get_weather"
        },
        "write": {
            "transport": "streamable_http",
            "url": "http://127.0.0.1:8001/mcp/write_file"
        },
        "12306-mcp": {
        "type": "streamable_http",
        "url": "https://mcp.api-inference.modelscope.net/76e13034af0942/mcp"
        }
    }
}
你: 查询明天从北京到郑州的车票
AI: 我为您查询了明天(2025年9月4日)从北京到郑州的车票信息,以下是部分主要车次:

🚄 **高铁/动车推荐**:
1. **G559次** 北京西→郑州东
   - 06:15发车 → 09:05到达(2小时50分)
   - 二等座:309元(有票)
   - 商务座:1072元(剩余6张)

2. **G51次** 北京西→郑州东
   - 06:55发车 → 09:16到达(2小时21分)
   - 二等座:371元(有票)
   - 商务座:1165元(剩余13张)

3. **G89次** 北京西→郑州东
   - 15:00发车 → 17:20到达(2小时20分)
   - 二等座:371元(有票)
   - 商务座:1165元(剩余12张)

🛏️ **普速列车推荐**:
1. **Z149次** 北京西→郑州
   - 07:56发车 → 13:52到达(5小时56分)
   - 硬卧:163元(有票)
   - 软卧:251元(有票)

2. **K599次** 北京丰台→郑州
   - 05:19发车 → 14:12到达(8小时53分)
   - 硬卧:163元(剩余2张)

💡 **温馨提示**:
- 共查询到100+趟车次,高铁/动车最快约2小时,普速列车约5-9小时
- 如需特定时间或席别(如早班车/商务座),可进一步告知我为您筛选
- 以上票价和余票实时变动,请尽快购票

需要我帮您预订或查询具体车次经停信息吗?
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐