MCP应用开发实战:把大模型接到现实世界
🚀大模型落地开发实战指南!请关注微信公众号:「AGI启程号」 深入浅出,助你轻松入门!
📚 数据分析、深度学习、大模型与算法的综合进阶,尽在CSDN博客主页
目录
让大模型真正“触达现实世界”,关键不在提示词,而在标准化连接外部数据与服务。本文带你用 MCP(Model Context Protocol) 跑通一条“地图检索 → 行程生成 → 一键发布网页”的端到端链路,并给出与 Function Calling 的工程差异、场景清单、最小代码模板与踩坑建议。
看完本篇文章你将收获:
- **一眼看懂:**MCP 是什么、为何像 AI 的 USB-C
- **工程视角对比:**MCP vs Function Calling(可转内部评审)
- **实操模板:**Cursor 配置 + Qwen Agent 代码
- **落地案例:**旅游攻略智能体(可生成可转发网页)
- **风险与治理:**Key 管理、SSE 稳定性、审计与权限
本期代码运行实例详见 GitHub:
https://github.com/SWUSTcyt/qwen-agent
01 什么是 MCP(速读)
MCP(Model Context Protocol)是一个让大模型与外部系统通用对接的开放协议。
- **目标:**提供统一接口,标准化调用多种工具/数据源/服务
- **类比:**像 USB-C 统一物理接口,MCP 统一“智能体接外部世界”的方式
- **收益:**一次接入,多场景复用;降低扩展与维护成本
没有 MCP:为每个任务各写一套函数,难以复用;
有了 MCP:不同服务按统一协议“排队接入”,跨模型、跨平台可互操作。
02 核心概念与组件
- **MCP Server:**提供具体能力的“工具端”(地图、搜索、数据库、网页发布…)
- **MCP Client:**使用能力的“应用端/智能体”(Cursor、Claude Desktop、自研 Agent)
- **Tool / Resource:**Server 暴露的可调用能力与可读资源
- **连接形态:**SSE / WebSocket / HTTP 等;常见需配置 API Key + URL
- **审计与权限:**标准化请求/响应,便于日志与最小权限治理
03 MCP vs Function Calling(工程对比表)
| 维度 | MCP(协议化) | Function Calling(函数化) |
|---|---|---|
| 定位 | 统一接入协议(跨模型、跨平台) | 在某模型内定义并调用函数 |
| 扩展性 | 高:动态增删工具,跨项目复用 | 中:新增函数常改提示/推理流 |
| 维护成本 | 低:一次对接,多端可复用 | 高:多场景多套函数易分叉 |
| 互操作 | 强:标准化消息格式、可移植 | 弱:常绑定某模型生态 |
| 适用范围 | 企业级、多数据源、多工具编排 | 单点任务(天气、日历、查询…) |
| 上手速度 | 首接略多,长远更稳 | 起步快,但扩展成本上升 |
**结论:**小而快 → Function Calling 即可;
要走企业级/多工具链路 → 优先考虑 MCP。
04 CASE:旅游攻略 MCP(cursor)
在 Cursor 中配置高德 MCP:
1)申请 Key(免费):高德开放平台
注册成为开发者 => 创建应用 => 应用服务平台 选择 Web服务 => 获取 API KEY
https://lbs.amap.com/
2)在 Cursor → Settings → MCP 新增 mcp.json:
{
"mcpServers": {
"amap-maps-streamableHTTP": {
"url": "https://mcp.amap.com/mcp?key=您在高德官网上申请的key"
}
}
}
3)切到 Agent 模式 提问示例:
“用高德 mcp,帮我做一份北京一日游攻略
**效果展示:**可见 Agent 自动调用高德能力,返回路线、时长、站点与餐饮建议。

05 CASE:旅游攻略 MCP(qwen agent框架)
1)安装依赖)
pip install -U "qwen-agent[gui,mcp]"
2)配置 MCP 服务(示例)
以高德地图与网页部署 MCP 服务器为例。前往ModelScope的MCP 广场,分别找到高德地图与EdgeOne Pages,通过右侧的通过SSE URL连接服务获取专属URL。
高德地图可以完成路径规划、天气查询等功能;EdgeOne Pages 可以将 HTML 内容部署为可公网访问的链接。
用 MCP 服务的专属 URL 替换tools中的对应位置并运行代码。
{
"mcpServers": {
"amap-maps": {
"type": "sse",
"url": "YOUR_AMAP_MCP_SSE_URL"
},
"pages-deploy": {
"type": "sse",
"url": "YOUR_PAGES_MCP_SSE_URL"
}
}
}
最小可用代码(可直接跑)
import os
from qwen_agent.agents import Assistant
llm_cfg = {
"model": "qwen-plus-latest",
"model_server": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"api_key": os.getenv("DASHSCOPE_API_KEY"), # 用环境变量管理
}
system = "你是会查询地图/天气,并能把 HTML 部署到公网的旅行助手。"
tools = [{
"mcpServers": {
"amap-maps": {"type": "sse", "url": "YOUR_AMAP_MCP_SSE_URL"},
"pages-deploy":{"type": "sse", "url": "YOUR_PAGES_MCP_SSE_URL"}
}
}]
bot = Assistant(
llm=llm_cfg,
name="旅行助手",
description="高德地图、天气查询、公网页面部署",
system_message=system,
function_list=tools,
)
messages = []
while True:
q = input("\n你的问题:").strip()
if not q:
continue
messages.append({"role":"user","content":q})
buf, in_tool = "", False
for chunk in bot.run(messages):
last = chunk[-1]
if "function_call" in last:
in_tool = True
print("\n[工具调用] ->", last["function_call"].get("name",""))
elif in_tool and "function_call" not in last:
in_tool = False
print("\n[工具结果] <-", str(last)[:300], " ...")
elif last.get("role")=="assistant" and "content" in last:
delta = last["content"][len(buf):]
print(delta, end="", flush=True)
buf += delta
messages.extend(chunk)
示例提问
“我爸妈今天下午到萧山机场,请规划去阿里巴巴云谷园区的公共交通路线(地铁/巴士均可),并生成可访问的网页链接让我转发。”
纯代码版结果

使用带gui版本的代码,运行结果如下

06 附录:配置清单与模板
(1)环境变量示例(.env)
DASHSCOPE_API_KEY=YOUR_DASHSCOPE_API_KEY
AMAP_KEY=YOUR_AMAP_KEY
(2)Cursor 的 mcp.json(合集示例)
{
"mcpServers": {
"amap-maps-streamableHTTP": {
"url": "https://mcp.amap.com/mcp?key=${AMAP_KEY}"
},
"amap-maps": {
"type": "sse",
"url": "YOUR_AMAP_MCP_SSE_URL"
},
"pages-deploy": {
"type": "sse",
"url": "YOUR_PAGES_MCP_SSE_URL"
}
}
}
如果你觉得这篇 MCP 实战 有帮助,欢迎转发/在看/收藏。
**🤖 讨论区互动:**你想用agent解决什么问题?
更多推荐
所有评论(0)