7.3 模型上下文协议(MCP)
上一节介绍了 Function Call 机制——模型通过 JSON 格式声明工具调用意图,应用程序执行后返回结果。但 Function Call 只解决了单个模型调用单个工具的问题。当智能体需要同时接入行情数据、新闻资讯、财务报表、研报数据库等多个外部系统时,每个工具都要单独对接,工作量急剧膨胀。
模型上下文协议(Model Context Protocol, MCP)就是为解决这个问题而生的标准化方案。Anthropic 于 2024 年 11 月发布了这一开源协议,随后 OpenAI、Google、Microsoft 相继宣布支持。MCP 已成为 AI 智能体连接外部工具的行业标准。

7.3.1 MCP 解决什么问题
M×N 集成困境
假设市场上有 M 个 AI 应用(Opencode、ChatGPT、Cursor 等),N 个外部数据源(Wind、Bloomberg、Tushare 等)。如果每个应用为每个数据源单独开发适配代码,总共需要 M×N 个集成方案。
MCP 的思路是:定义一套标准协议,让每个应用只需实现一次协议接口,每个数据源也只需实现一次。总集成量从 M×N 降为 M+N。
| 场景 | 应用数(M) | 数据源数(N) | 集成数量 |
|---|---|---|---|
| 传统方式 | 5 | 10 | 50 |
| MCP 方式 | 5 | 10 | 15 |
MCP 将集成复杂度从 M×N 降为 M+N。每个 AI 应用实现一次 MCP 接口,每个外部工具实现一次 MCP 接口,双方即可互相连接。这是一个典型的标准化降低交易成本的案例。
用经济学的语言说,MCP 降低了工具市场的交易成本。没有标准协议时,每对供需方(AI 应用与工具)都要单独谈判和适配;有了标准协议,市场参与者只需遵守统一规则,连接成本趋近于零。
MCP 生态的网络外部性
MCP 生态已积累了大量可直接使用的工具服务(称为 MCP Server),涵盖文件操作、数据库查询、网页搜索、浏览器自动化、代码仓库管理等各类能力。金融领域的 MCP Server 也在逐步涌现,Wind、Tushare、AkShare 等数据源都可以封装为 MCP Server。
MCP 生态具有网络外部性(Network Externality)特征:每多一个 MCP Server,所有 AI 应用的可用工具增加一个;每多一个支持 MCP 的 AI 应用,Server 开发者的潜在用户群扩大一分。这种正反馈循环是 MCP 标准快速普及的关键动力。
7.3.2 实操:为智能体添加 MCP 工具
理解了 MCP 的价值,我们来实际操作。以添加 Playwright MCP Server 为例——它能让智能体获得浏览器操作能力,访问网页、点击按钮、提取数据。
第一步:找到需要的 MCP Server
MCP Server 的来源有几类:
| 来源 | 说明 | 示例 |
|---|---|---|
| MCP 官方仓库 | modelcontextprotocol 组织维护 | filesystem、memory、sqlite |
| 厂商官方 | 各厂商为自家产品开发的 Server | Microsoft 的 playwright、Sentry |
| 社区开发 | 开发者贡献的开源 Server | puppeteer、各类数据接口 |
| 商业服务 | 数据提供商官方 Server | 金融数据平台的 MCP 接口 |
| 自行创建 | 用 Vibe Coding 让智能体帮你写 | 下一小节介绍 |
可以在 GitHub 搜索 “MCP Server”,或在 mcp.so、glama.ai/mcp 等目录站浏览可用 Server。
第二步:添加 MCP Server
Opencode 提供三种方式添加 MCP Server,从”最 Vibe Coding”到”最手动”依次介绍。
方式一:直接告诉智能体(Vibe Coding 方式)
最符合本书理念的方式——直接在对话中让智能体帮你完成配置:
你:帮我添加 Playwright MCP Server,我需要浏览器自动化能力
智能体:好的,我来帮你配置。Playwright MCP Server 由 Microsoft 维护,
可以让我操作浏览器、导航网页、提取数据。
[Edit] 已将以下配置写入 opencode.json:
{
"mcp": {
"playwright": {
"type": "local",
"command": ["npx", "-y", "@playwright/mcp"]
}
}
}
请重启 Opencode 以加载新的 MCP Server。你甚至可以把 MCP Server 的文档页面内容直接粘贴给智能体,让它自行解析并完成配置——不需要你理解 JSON 语法,不需要手动编辑文件。这正是 Vibe Coding 的核心:用自然语言驱动一切操作。
方式二:CLI 命令交互式添加
Opencode 提供 opencode mcp add 命令,通过交互式界面引导你完成配置:
$ opencode mcp add
┌ Add MCP server
│
◇ Enter MCP server name
│ playwright
│
◇ Select MCP server type
│ Local
│
◇ Enter command (space-separated)
│ npx -y @playwright/mcp
│
◆ MCP server "playwright" added successfully
└对于远程 Server,选择 Remote 类型并输入 URL:
$ opencode mcp add
┌ Add MCP server
│
◇ Enter MCP server name
│ svelte
│
◇ Select MCP server type
│ Remote
│
◇ Enter MCP server URL
│ https://mcp.svelte.dev/mcp
│
◆ MCP server "svelte" added successfully
└CLI 命令会自动将配置写入 opencode.json,无需手动编辑 JSON。你也可以用 opencode mcp list 查看已配置的 Server 及其连接状态。
方式三:手动编辑配置文件
在项目根目录创建或编辑 opencode.json,在 mcp 字段中添加 Server 的连接信息:
{
"mcp": {
"playwright": {
"type": "local",
"command": ["npx", "-y", "@playwright/mcp"]
}
}
}配置的含义很直观:"playwright" 是你给这个 Server 起的名字;type 表示本地启动方式;command 是一个数组,包含启动命令及其参数。
如果 Server 需要 API 密钥等认证信息,通过 environment 字段传递环境变量:
{
"mcp": {
"financial-data": {
"type": "local",
"command": ["npx", "-y", "some-finance-mcp-server"],
"environment": {
"API_KEY": "{env:FINANCE_API_KEY}"
}
}
}
}{env:FINANCE_API_KEY} 引用的是你系统中的环境变量,密钥不会明文出现在配置文件里。
MCP 配置中的 API 密钥属于敏感信息。始终使用 {env:VAR} 引用环境变量,不要将明文密钥写入配置文件。如果 opencode.json 需要提交到 Git 仓库,确保其中不包含任何密钥。
第三步:验证 MCP Server
添加配置后,重启 Opencode。智能体会自动发现并连接配置的 MCP Server。用一句话验证:
你:帮我打开 https://finance.sina.com.cn 并截图
智能体:我来使用 Playwright 工具打开这个网页。
[MCP 调用] browser_navigate(url="https://finance.sina.com.cn")
[MCP 调用] browser_screenshot()
→ 截图已保存,页面显示了新浪财经首页...添加 MCP Server 之前,智能体没有操作浏览器的能力;添加之后,它就具备了导航网页、点击按钮、提取页面数据等完整的浏览器交互能力。
第四步(可选):添加更多 Server
一个智能体可以同时连接多个 MCP Server。例如,在同一个 opencode.json 中添加浏览器和数据库 Server:
{
"mcp": {
"playwright": {
"type": "local",
"command": ["npx", "-y", "@playwright/mcp"]
},
"sqlite": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-sqlite", "./data/stocks.db"]
}
}
}这样智能体就同时具备了浏览器操作和数据库查询两种能力,可以从网页抓取数据后存入本地数据库进行分析。
人在回路确认机制
当智能体调用 MCP 工具时,系统会展示工具名称和参数,等待你确认后才执行。这是安全设计的核心——你始终对工具调用行为保持知情权和控制权。
智能体想要执行 MCP 工具:browser_navigate
参数:{"url": "https://finance.sina.com.cn"}
是否允许?(y/n)7.3.3 进阶:用 Vibe Coding 创建自定义 MCP Server
现成的 MCP Server 覆盖了很多通用场景,但金融领域的特定需求——查询 A 股行情、获取财务报表、抓取宏观经济数据——往往需要自定义工具。
你不需要自己写代码。CLI 智能体本身就是开发工具,你可以用自然语言指导它创建 MCP Server,然后配置给自己使用。这正是第 2 章介绍的 Vibe Coding 方法论的典型应用。
完整示例:创建 A 股行情查询 MCP Server
以下是一次真实的对话流程。
第一轮:描述需求。
你:帮我创建一个 MCP Server,功能是查询 A 股股票的实时行情。
使用 AkShare 库获取数据,提供以下工具:
1. 根据股票代码查询最新价格、涨跌幅、成交量
2. 根据股票代码查询最近 N 个交易日的 K 线数据
用 Python 实现,放在 tools/stock-mcp-server/ 目录下。智能体收到指令后,会自动完成以下工作:
- 创建项目目录和文件结构
- 编写 MCP Server 的 Python 代码
- 定义两个工具函数及其参数格式
- 生成配置说明
第二轮:测试和迭代。
你:运行一下这个 Server,测试查询贵州茅台(600519)的行情
智能体:[Bash] cd tools/stock-mcp-server && python server.py
测试结果:
- 贵州茅台(600519)最新价 1680.50,涨幅 2.30%
- 工具响应正常,耗时 1.2 秒如果测试发现问题,继续用自然语言修正:
你:返回结果里缺少市盈率字段,帮我加上
智能体:[Edit] 修改 server.py,在返回数据中增加 pe_ratio 字段...第三轮:配置并使用。
确认 Server 正常运行后,将它添加到 opencode.json:
{
"mcp": {
"a-stock": {
"type": "local",
"command": ["python", "tools/stock-mcp-server/server.py"]
}
}
}重启智能体后,你就可以用自然语言查询股票了:
你:贵州茅台最近 10 个交易日的走势如何?
智能体:[MCP 调用] get_kline_data(symbol="600519", days=10)
→ 返回 K 线数据...
贵州茅台近 10 个交易日整体呈震荡上行趋势,
区间涨幅 3.8%,最高价 1695.00 元,最低价 1638.20 元...Vibe Coding 创建 MCP Server 的完整循环:描述需求 → 智能体生成代码 → 测试验证 → 迭代优化 → 配置使用。整个过程中你只需要用自然语言表达需求,不需要编写任何代码。这是第 2 章提出的 Effective Vibe Coding 方法论在工具扩展场景中的实践。
适合自定义 MCP Server 的金融场景
| 场景 | 数据源 | 工具功能 |
|---|---|---|
| A 股行情查询 | AkShare / Tushare | 实时价格、K 线、财务指标 |
| 宏观经济数据 | 国家统计局 API | GDP、CPI、PMI 等时间序列 |
| 基金净值查询 | 天天基金网 | 基金净值、收益率、持仓 |
| 外汇汇率 | 央行数据 | 人民币汇率中间价 |
| 债券数据 | 中国债券信息网 | 国债收益率曲线 |
每一个场景,你都可以用同样的方式——向智能体描述需求,让它帮你创建 MCP Server,然后配置使用。随着你积累的自定义 Server 越来越多,智能体的能力边界也在持续扩展。