LangChain-接入12306-HTTP MCP智能体

发布时间:2026-03-25 21:42:03编辑:123阅读(285)

    接入在线MCP服务流程

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


    自托管启动(Self-hosted)

    这种方式主要是应用MCP官方的Python/TypeScript MCP SDK把Server代码跑起来(FastAPI/Express集成),程序启动后会打印或返回一个本地、内网SSE URL、然后可以用这个URL建立事件流接入到OpenAI Agent SDK框架中。


    平台托管直连(Platform-hosted)

    诸如ModelScope的MCP广场、mcp.run等社区维护大量MPC服务并支持一键启动的SSE模型。使用方法非常简单,只需要在平台首页选好MCP Server-->生成一个API-KEY,一键生成SSE URL,即可直接接入使用。


    进入ModelScope的MCP广场,访问地址:https://www.modelscope.cn/mcp

    搜索12306 mcp

    image.png

    点击立即使用按钮,进入MCP服务详情页,最右侧会有一个通过SSE URL连接服务的说明:

    image.png

    复制上面的mcp配置文件,修改本地

    servers_config.json

    {
      "mcpServers": {
        "weather": {
          "command": "python",
          "args": ["weather_server.py"],
          "transport": "stdio"
        },
        "spider": {
          "command": "python",
          "args": ["spider_server.py"],
          "transport": "stdio"
        },
        "12306-mcp": {
          "url": "https://mcp.api-inference.modelscope.net/0e32603ec65c43/sse",
          "transport": "sse"
        }
      }
    }

    修改本地提示词文件

    agent_prompts.txt

    你是一个智能体,具备以下三种能力:
    
    1.查询天气:调用query_weather(city:str),返回指定城市的实时天气
    
    2.爬取网页信息:调用run_spider(url:str),将爬取到的网页内容返回
    
    3.车票查询:调用12306-mcp,查询对应的车票信息并返回
    
    当用户提出请求时,你需要理解意图并选择相应的工具。如果请求缺少必要信息,先与用户确认后再调用工具。返回结果时
    以简洁、友好的方式回复。
    如果用户提出的问题与你的功能无关,请礼貌告知无法处理。

    client代码如下:

    import asyncio
    import json
    from langchain_ollama import ChatOllama
    from typing import Any,Dict
    from langchain.agents import create_agent
    from langchain_mcp_adapters.client import MultiServerMCPClient
    from langgraph.checkpoint.memory import InMemorySaver
    
    # 设置记忆存储
    checkpointer = InMemorySaver()
    
    # 读取提示词
    with open("./agent_prompts.txt", mode='r', encoding='utf-8') as f:
        prompt = f.read()
    
    # 设置对话配置
    config = {
        "configurable":{
            "thread_id":"2"
        }
    }
    
    class Configuration:
        @staticmethod
        def load_servers(file_path: str = "servers_config.json") -> Dict[str, Any]:
            with open(file_path, mode='r', encoding='utf-8') as f:
                return json.load(f).get("mcpServers", {})
    
    async def run_chat_loop():
        """启动 MCP-Agent 聊天循环"""
        cfg = Configuration()
        servers_cfg = Configuration.load_servers()
        # 连接多台MCP服务器
        mcp_client = MultiServerMCPClient(servers_cfg)
        _tools = await mcp_client.get_tools()
        print(f"已加载{len(_tools)}个MCP工具:{[t.name for t in _tools]}")
    
        # 初始化大模型
        model = ChatOllama(
        model="qwen3:8b",
        temperature=0,
        top_p=0.95,
        )
    
        # 构造 LangGraph Agent
        agent = create_agent(
            model=model,
            tools=_tools,
            system_prompt=prompt,
            checkpointer=checkpointer
        )
        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 e:
                print(f"\n 错误:{e}")
    
    if __name__ == '__main__':
        asyncio.run(run_chat_loop())

    运行结果如下:

    已加载10个MCP工具:['query_weather', 'run_spider', 'get-current-date', 'get-stations-code-in-city', 'get-station-code-of-citys', 'get-station-code-by-names', 'get-station-by-telecode', 'get-tickets', 'get-interline-tickets', 'get-train-route-stations']


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

    你:查询12306余票信息{"date":"2026-03-29","from_station":"BJP","to_station":"SHH"}


    AI:以下是北京到上海的火车票信息整理,按车次分类并标注关键信息,方便您快速筛选:

    ---

    ### **高铁/动车(G/D/CRH)**

    #### **G27(北京南→上海虹桥)**

    - **历时**:4小时32分钟  

    - **座位类型**:  

      - 商务座:无票  

      - 一等座:有票(1060元)  

      - 二等座:有票(662元)  

      - 无座:无票  


    #### **G25(北京南→上海虹桥)**

    - **历时**:4小时18分钟  

    - **座位类型**:  

      - 一等座:有票(1060元)  

      - 二等座:有票(662元)  

      - 优选一等座:有票(1457元)  


    #### **G29(北京南→上海)**

    - **历时**:4小时43分钟  

    - **座位类型**:  

      - 一等座:有票(1070元)  

      - 二等座:有票(669元)  

      - 优选一等座:有票(1471元)  


    #### **G31(北京南→上海虹桥)**

    - **历时**:4小时54分钟  

    - **座位类型**:  

      - 一等座:有票(1060元)  

      - 二等座:有票(662元)  


    #### **G35(北京南→上海虹桥)**

    - **历时**:4小时27分钟  

    - **座位类型**:  

      - 二等座:有票(662元)  


    ---

    ### **动车(D)**

    #### **D5(北京→上海)**

    - **历时**:12小时06分钟  

    - **座位类型**:  

      - 二等卧:有票(542元)  

      - 二等座:有票(361元)  

      - 一等卧:有票(686元)  

      - 无座:有票(361元)  


    #### **D11(北京南→上海松江)**

    - **历时**:12小时23分钟  

    - **座位类型**:  

      - 二等卧:有票(479元)  

      - 二等座:有票(319元)  

      - 一等卧:无票  


    #### **D17(北京→上海松江)**

    - **历时**:12小时21分钟  

    - **座位类型**:  

      - 二等卧:有票(447元)  

      - 二等座:有票(298元)  

      - 一等卧:有票(566元)  

      - 无座:无票  


    ---

    ### **特快/普快(T/Z)**

    #### **T109(北京→上海)**

    - **历时**:14小时58分钟  

    - **座位类型**:  

      - 硬座:有票(177.5元)  

      - 硬卧:有票(304.5元)  

      - 无座:有票(177.5元)  


    #### **Z281(北京丰台→上海松江)**

    - **历时**:13小时23分钟  

    - **座位类型**:  

      - 硬座:无票  

      - 硬卧:无票  

      - 软卧:无票  


    #### **D9(北京南→上海南)**

    - **历时**:12小时24分钟  

    - **座位类型**:  

      - 二等卧:有票(510元)  

      - 二等座:有票(340元)  

      - 一等卧:有票(603元)  


    ---

    ### **关键建议**

    1. **最快车次**:G27(4小时32分钟)或 G25(4小时18分钟)。  

    2. **最便宜选项**:T109硬座(177.5元)或 D5二等座(361元)。  

    3. **舒适度优先**:G25优选一等座(1457元)或 G29优选一等座(1471元)。  

    4. **夜间出行**:D5二等卧(542元)或 D11二等卧(479元)。  


    **注意**:部分车次如 Z281、G35 等无票,建议尽早购票或选择其他车次。


关键字