MCP旅行规划作业教程.md 5.4 KB

MCP 旅行规划作业教程

这份教程对应课件最后的作业:使用 LangGraph 构建一个多角色协作旅行规划 Agent,并通过 MCP 动态调用工具,生成包含行程、住宿和景点推荐的个性化旅行方案。

你最终要交什么

建议交三部分:

  1. 一段说明:解释你的 Agent 架构、MCP 工具来源、每个角色负责什么。
  2. 一份运行截图:展示 MCP 工具被发现、Agent 输出最终旅行方案。
  3. 代码文件:travel_mcp_server.pytravel_agent_langgraph.py.env.examplerequirements.txt

先把 MCP 和 Function Calling 分清

一句话:

  • Function Calling 解决的是:模型怎么表达“我想调用哪个工具、参数是什么”。
  • MCP 解决的是:工具怎么被发现、怎么被调用、结果怎么通过标准协议返回。

可以把它们放到一条链路里看:

用户提问
→ 大模型判断需要工具
→ Function Calling 生成工具调用意图
→ MCP Client 把这个意图发给 MCP Server
→ MCP Server 真正执行工具
→ 工具结果返回给模型
→ 模型组织自然语言答案

所以 MCP 不是 Function Calling 的替代品。它们是上下游协作关系:Function Calling 更靠近模型,MCP 更靠近工具基础设施。

本作业的推荐实现路线

因为你还没有注册高德 API Key,第一版不要卡在高德那里。我们先做一个本地模拟旅行 MCP Server:

  • travel_mcp_server.py:提供交通、酒店、景点、预算 4 个 MCP Tool。
  • travel_agent_langgraph.py:用 LangGraph 编排 4 个角色:
    • 交通规划师
    • 住宿规划师
    • 景点体验规划师
    • 预算规划师
    • 最后由总规划师汇总

这样能完整体现:

  • MCP Server 暴露工具
  • MCP Client 动态发现工具
  • LangGraph 组织多角色协作
  • 大模型根据角色目标调用 MCP 工具

第 1 步:安装依赖

在当前目录执行:

python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

如果你使用 uv:

uv pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

第 2 步:配置大模型 Key

复制 .env.example.env

Copy-Item .env.example .env

然后打开 .env,填写:

DEEPSEEK_API_KEY=你的 DeepSeek API Key

注意,这里需要的是 DeepSeek 的大模型 Key,不是高德地图 Key。

第 3 步:理解本地 MCP Server

打开 travel_mcp_server.py。核心是:

mcp = FastMCP(name="travel-tools")

然后用:

@mcp.tool()
def search_transport(...):
    ...

把普通 Python 函数注册成 MCP Tool。

这个 Server 最后用 stdio 启动:

mcp.run(transport="stdio")

stdio 的好处是:不需要你单独打开一个服务窗口,Client 会自动启动它。

第 4 步:运行作业主程序

执行:

python travel_agent_langgraph.py

正常情况下你会先看到:

已从 MCP Server 动态发现工具: ['search_transport', 'search_hotels', ...]

这就说明 MCP Client 已经从 Server 拉到了工具列表。

然后程序会输出最终旅行方案。

第 5 步:换成你自己的题目

travel_agent_langgraph.py 里找到:

user_request = (
    "我想从成都出发去重庆玩 3 天 2 晚..."
)

你可以改成:

user_request = (
    "我想从上海出发去杭州玩 2 天 1 晚,2 个人,预算 1800 元以内。"
    "喜欢自然风景、拍照和慢节奏城市漫步。"
)

如果你换了代码里没有收录的城市,工具会给出通用策略;这不是错误,而是模拟数据不完整。

第 6 步:作业说明怎么写

你可以这样写:

本项目实现了一个基于 LangGraph 的多角色旅行规划 Agent。
系统包含交通规划师、住宿规划师、景点体验规划师、预算规划师四个角色,
每个角色都通过 MCP Client 动态获取 travel-tools MCP Server 暴露的工具。

MCP Server 提供 search_transport、search_hotels、recommend_attractions、
estimate_trip_budget 等工具。Agent 不需要在代码里手写工具 schema,
而是在运行时通过 MCP 动态发现工具,再由大模型通过 Function Calling 判断何时调用。

最终,总规划师节点汇总各角色结果,生成包含行程、住宿、景点和预算的个性化旅行方案。

后续升级:接入高德或 ModelScope MCP

等你注册高德 API Key 后,可以把本地模拟工具替换为高德官方 MCP。

常见的高德 MCP Streamable HTTP 地址格式是:

https://mcp.amap.com/mcp?key=你的高德key

如果高德或 ModelScope 服务页面给了不同 endpoint,以服务页面为准。对应配置参考 travel_agent_amap_example.py

老师给的 ModelScope MCP 广场地址是:

https://modelscope.cn/mcp

你可以在里面搜索地图、搜索、酒店、火车票等 MCP 服务。如果服务页面提供 SSE 或 HTTP Endpoint,就能放进 MultiServerMCPClient

你交作业时可以强调的亮点

  • 我没有直接在 Agent 里写死工具,而是通过 MCP 动态发现工具。
  • 工具运行在独立 MCP Server 中,Agent 只负责调用。
  • LangGraph 把任务拆成多个角色节点,最后统一汇总。
  • Function Calling 负责模型的调用决策,MCP 负责工具发现和执行链路。