前言

1. 高德地图MCP:高德地图MCP是一个用于高德地图的API,它提供了许多用于获取地图数据的接口。

2. SSE:SSE(Server-Sent Events)

  •   SSE(Server-Send Events)是基于 HTTP协议中的持久连接
  •   是一种服务端向客户端推送信息的单向通信方法

3. langchain_mcp_adapters:langchain_mcp_adapters是一个用于使用langchain进行自然语言处理MCP的适配器。

这三个技术组件共同构成了系统的核心三角:MCP提供地理智能,SSE保障实时体验,LangChain适配器实现自然交互。这种架构既发挥了专业地图服务的可靠性,又融入了生成式AI的灵活性,最终打造出更人性化的智能出行解决方案。

一、高德地图MCP

高德地图MCP(Map Content Platform)是面向开发者的标准化地图能力中枢,提供路径规划、实时交通、POI搜索、地理编码等核心服务。在路线规划系统中,它承担着基础数据支撑角色:

  • 通过精准的路径计算API生成多种出行方案(驾车/骑行/步行)

  • 实时路况数据为动态路线优化提供决策依据

  • 地理围栏与坐标转换能力保障空间计算的准确性

  • 亿级POI数据库支持沿途兴趣点的智能推荐

高德地图MCP接入文档以及key申请地址快速接入-MCP Server | 高德地图API

具体的key配置流程以及SSE配置方法可参考上面地址

 

二、SSE:实时交互的通信管道

Server-Sent Events(SSE)技术构建了低延迟的单向信息通道,在路线规划场景中实现:

  • 渐进式结果推送:长距离路径计算的阶段性反馈

  • 动态事件通知:突发路况变化时的实时路线调整建议

  • 服务状态广播:后端计算资源的负载状态可视化

  • 断线自动重连:移动端弱网环境的容错保障
    相较于WebSocket,SSE的HTTP原生特性更易于集成到现有架构,服务端仅需维护轻量级事件流。

三、langchain_mcp_adapters

1、简介

这个库提供了一个轻量级的包装器,使人类模型上下文协议(Anthropic Model Context Protocol, MCP)工具与LangChain和LangGraph兼容。

特点:

  1. 将MCP工具转换为可与LangGraph代理一起使用的LangChain工具
  2. 一个客户端实现,允许您连接到多个MCP服务器并从中加载工具

说的直白一点,langchain-mcp-adapters 就是一个基于langchain实现的MCP客户端

2、下载库

pip install langchain-mcp-adapters

3、项目中的主要功能:

该适配器在LangChain框架与高德API间建立了语义理解层:

  • 意图识别:解析"避开高速的最近路线"等模糊需求

  • 上下文关联:将"上次去过的餐厅"映射为具体POI坐标

  • 多模态转换:把自然语言指令转化为MCP所需的参数结构

  • 对话记忆:在连续交互中保持地理位置上下文一致性
    通过预训练模型与规则引擎的结合,有效解决了地理信息查询中的歧义消除和实体链接难题。

4、简单示例:

1、Client

# 创建stdio连接的服务器参数
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent

from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o")

server_params = StdioServerParameters(
    command="python",
    args=["/path/to/math_server.py"],
)

async with stdio_client(server_params) as (read, write):
    async with ClientSession(read, write) as session:
        # 初始化连接
        await session.initialize()

        # 获取工具
        tools = await load_mcp_tools(session)

        # 创建一个agent
        agent = create_react_agent(model, tools)
        agent_response = await agent.ainvoke({"messages": "what's (3 + 5) x 12?"})

2、多MCP服务的连接

项目就是用MultiServerMCPClient实现连接SSE的客户端

from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent

from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o")

async with MultiServerMCPClient(
    {
        "math": {
            "command": "python",
            "args": ["/path/to/math_server.py"],
            "transport": "stdio",
        },
        "weather": {
            # sse服务连接方式
            "url": "http://localhost:8000/sse",
            "transport": "sse",
        }
    }
) as client:
    agent = create_react_agent(model, client.get_tools())
    math_response = await agent.ainvoke({"messages": "what's (3 + 5) x 12?"})
    weather_response = await agent.ainvoke({"messages": "what is the weather in nyc?"})

四、核心代码实现

1、所用到的库

from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import AgentExecutor
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
import os
import asyncio
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain.agents import create_openai_functions_agent

2、mcp客户端实现地图查询

load_dotenv(override=True)

llm_ds = init_chat_model(
    "gpt-4o-mini",
    api_key = os.getenv("XXXXXX_KEY"),
    base_url = os.getenv("XXXXXXX_URL"),
    model_provider="openai"
)

async def run_agent(query):
    gaode_map_key = os.getenv("GAODE_MAP_KEY")
    async with MultiServerMCPClient(
    {
        "search": {
            "url": f"https://mcp.amap.com/sse?key={gaode_map_key}",
            "transport": "sse",
        }
    }
) as client:
        prompt = ChatPromptTemplate.from_messages([
            ("system", "你是一个有帮助的智能助手。请仔细分析用户问题并使用提供的工具来回答问题。"),
            ("user", "{input}"),
            MessagesPlaceholder(variable_name="agent_scratchpad"),
        ])
        # 获取工具并修剪描述长度
        tools = client.get_tools()

        # for tool in tools:
        #     print(f"工具名称:{tool.name}\n工具描述:{tool.description}\n 工具参数:{tool.args_schema}\n ")
        
        # 创建OpenAI函数代理
        agent = create_openai_functions_agent(
            llm=llm_ds,
            tools=tools,
            prompt=prompt
        )
        # 创建代理执行器
        agent_executor = AgentExecutor(
            agent=agent,
            tools=tools,
            verbose=True,
            max_iterations=5,
            return_intermediate_steps=True,  # 返回中间步骤以便调试
            handle_parsing_errors=True
        )
        
        # 运行代理
        agent_response = await agent_executor.ainvoke({
            "input": query
        })
        # 返回格式化的响应
        return {
            "status": "success",
            "result": agent_response.get("output", ""),
            "steps": len(agent_response.get("intermediate_steps", [])),
        }

print(asyncio.run(run_agent("从北京到西安怎么走?以及帮我规划沿途著名的旅游景点")))

3、运行结果示例:

五、智能出行助手演示

1、页面展示

页面加载后首先获取高德MCP的工具列表,并在页面右边展示

 2、数据请求

3、结果展示

4、天气情况展示

上面的就是一个简单智能出行系统的展示, 可以根据用户的提问规划你的行程路线以及沿途的旅行风景,还有天气等信息。

六、写在最后

系统还在初步完善中,但是实现的核心代码就是四中展示的,如果需要完整的前后端演示代码,可以私信我。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐