模型上下文协议(MCP)
补充说明:MCP 由 Anthropic 公司于 2023 年提出,旨在解决 LLM 与外部系统集成的标准化问题。它类似于计算机领域的 USB 或 HTTP 协议,为 AI 系统提供统一的"插件"接口,让不同厂商的工具能够即插即用。
为了让 LLM 成为真正的智能体,必须具备与外部环境交互的能力——访问实时数据、调用外部软件。没有标准化通信协议,每次集成都需定制开发,难以复用,阻碍了复杂 AI 系统的扩展和互联。
模型上下文协议(MCP)通过开放标准,成为 LLM 与外部系统的通用接口。它定义了能力发现和调用的标准流程,采用客户端-服务器架构,服务器可向任意合规客户端暴露工具、数据资源和 Prompt。
核心思想:标准化连接 —— MCP 像通用电源插座系统,不直接提供工具,但允许任何合规工具接入,打造动态、可扩展的智能体工作坊。
与函数调用的区别
函数调用适合简单场景(固定少量函数),MCP 则是复杂、互联 AI 系统不可或缺的标准化通信框架。
| 定义方式 | 代码中硬编码函数 | 服务器动态暴露工具 |
| 发现机制 | 无,开发者预先定义 | 客户端可动态查询服务器能力 |
| 可扩展性 | 每次新增需改代码 | 新服务器上线即可被发现使用 |
| 适用场景 | 简单、固定的工具集 | 复杂、多工具、多数据源的企业系统 |
补充说明:在实际项目中,函数调用和 MCP 可以结合使用。例如,核心业务逻辑使用函数调用保证性能,而需要动态扩展的部分(如第三方服务集成)使用 MCP。这种混合架构既能保持核心系统的稳定性,又能享受 MCP 带来的扩展性优势。
MCP 架构
MCP 采用客户端-服务器模型,标准化信息流:
用户 → [LLM] → [MCP 客户端] ←→ [MCP 服务器] ←→ [第三方服务]
(数据库/API/SaaS)
四个核心组件
补充说明:这四个组件构成了 MCP 的完整生态链。LLM 作为"大脑"负责决策,MCP 客户端作为"翻译官"负责协议转换,MCP 服务器作为"网关"负责权限控制,第三方服务则是具体的"执行者"。这种分层设计实现了关注点分离,让每个组件专注于自己的职责。
交互流程
补充说明:MCP 的交互流程体现了"声明式"编程思想。LLM 只需要声明"要做什么",而不需要关心"如何做"。这种抽象让 LLM 能够专注于高级推理和规划,而将具体的执行细节交给专门的 MCP 服务器处理。
#mermaid-svg-QHZB1kt3deTKEmuc{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QHZB1kt3deTKEmuc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QHZB1kt3deTKEmuc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QHZB1kt3deTKEmuc .error-icon{fill:#552222;}#mermaid-svg-QHZB1kt3deTKEmuc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QHZB1kt3deTKEmuc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QHZB1kt3deTKEmuc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QHZB1kt3deTKEmuc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QHZB1kt3deTKEmuc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QHZB1kt3deTKEmuc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QHZB1kt3deTKEmuc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QHZB1kt3deTKEmuc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QHZB1kt3deTKEmuc .marker.cross{stroke:#333333;}#mermaid-svg-QHZB1kt3deTKEmuc svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QHZB1kt3deTKEmuc p{margin:0;}#mermaid-svg-QHZB1kt3deTKEmuc .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-QHZB1kt3deTKEmuc .cluster-label text{fill:#333;}#mermaid-svg-QHZB1kt3deTKEmuc .cluster-label span{color:#333;}#mermaid-svg-QHZB1kt3deTKEmuc .cluster-label span p{background-color:transparent;}#mermaid-svg-QHZB1kt3deTKEmuc .label text,#mermaid-svg-QHZB1kt3deTKEmuc span{fill:#333;color:#333;}#mermaid-svg-QHZB1kt3deTKEmuc .node rect,#mermaid-svg-QHZB1kt3deTKEmuc .node circle,#mermaid-svg-QHZB1kt3deTKEmuc .node ellipse,#mermaid-svg-QHZB1kt3deTKEmuc .node polygon,#mermaid-svg-QHZB1kt3deTKEmuc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QHZB1kt3deTKEmuc .rough-node .label text,#mermaid-svg-QHZB1kt3deTKEmuc .node .label text,#mermaid-svg-QHZB1kt3deTKEmuc .image-shape .label,#mermaid-svg-QHZB1kt3deTKEmuc .icon-shape .label{text-anchor:middle;}#mermaid-svg-QHZB1kt3deTKEmuc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QHZB1kt3deTKEmuc .rough-node .label,#mermaid-svg-QHZB1kt3deTKEmuc .node .label,#mermaid-svg-QHZB1kt3deTKEmuc .image-shape .label,#mermaid-svg-QHZB1kt3deTKEmuc .icon-shape .label{text-align:center;}#mermaid-svg-QHZB1kt3deTKEmuc .node.clickable{cursor:pointer;}#mermaid-svg-QHZB1kt3deTKEmuc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QHZB1kt3deTKEmuc .arrowheadPath{fill:#333333;}#mermaid-svg-QHZB1kt3deTKEmuc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QHZB1kt3deTKEmuc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QHZB1kt3deTKEmuc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QHZB1kt3deTKEmuc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QHZB1kt3deTKEmuc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QHZB1kt3deTKEmuc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QHZB1kt3deTKEmuc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QHZB1kt3deTKEmuc .cluster text{fill:#333;}#mermaid-svg-QHZB1kt3deTKEmuc .cluster span{color:#333;}#mermaid-svg-QHZB1kt3deTKEmuc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QHZB1kt3deTKEmuc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QHZB1kt3deTKEmuc rect.text{fill:none;stroke-width:0;}#mermaid-svg-QHZB1kt3deTKEmuc .icon-shape,#mermaid-svg-QHZB1kt3deTKEmuc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QHZB1kt3deTKEmuc .icon-shape p,#mermaid-svg-QHZB1kt3deTKEmuc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QHZB1kt3deTKEmuc .icon-shape .label rect,#mermaid-svg-QHZB1kt3deTKEmuc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QHZB1kt3deTKEmuc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QHZB1kt3deTKEmuc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QHZB1kt3deTKEmuc :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
5. 响应与更新
返回标准化响应
更新LLM上下文
继续后续任务
4. 服务器执行
认证与校验
调用底层服务
执行操作
3. 客户端通信
MCP客户端标准化请求
发送至MCP服务器
2. 请求构造
LLM决策选择工具
构造请求指定参数
1. 发现阶段
MCP客户端查询能力
MCP服务器返回工具/资源/Prompt清单
图2:MCP 交互流程图 – 展示从发现到执行的完整5步流程
#mermaid-svg-hMY13YjKg96vtBFA{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hMY13YjKg96vtBFA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hMY13YjKg96vtBFA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hMY13YjKg96vtBFA .error-icon{fill:#552222;}#mermaid-svg-hMY13YjKg96vtBFA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hMY13YjKg96vtBFA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hMY13YjKg96vtBFA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hMY13YjKg96vtBFA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hMY13YjKg96vtBFA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hMY13YjKg96vtBFA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hMY13YjKg96vtBFA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hMY13YjKg96vtBFA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hMY13YjKg96vtBFA .marker.cross{stroke:#333333;}#mermaid-svg-hMY13YjKg96vtBFA svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hMY13YjKg96vtBFA p{margin:0;}#mermaid-svg-hMY13YjKg96vtBFA .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-hMY13YjKg96vtBFA .cluster-label text{fill:#333;}#mermaid-svg-hMY13YjKg96vtBFA .cluster-label span{color:#333;}#mermaid-svg-hMY13YjKg96vtBFA .cluster-label span p{background-color:transparent;}#mermaid-svg-hMY13YjKg96vtBFA .label text,#mermaid-svg-hMY13YjKg96vtBFA span{fill:#333;color:#333;}#mermaid-svg-hMY13YjKg96vtBFA .node rect,#mermaid-svg-hMY13YjKg96vtBFA .node circle,#mermaid-svg-hMY13YjKg96vtBFA .node ellipse,#mermaid-svg-hMY13YjKg96vtBFA .node polygon,#mermaid-svg-hMY13YjKg96vtBFA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hMY13YjKg96vtBFA .rough-node .label text,#mermaid-svg-hMY13YjKg96vtBFA .node .label text,#mermaid-svg-hMY13YjKg96vtBFA .image-shape .label,#mermaid-svg-hMY13YjKg96vtBFA .icon-shape .label{text-anchor:middle;}#mermaid-svg-hMY13YjKg96vtBFA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hMY13YjKg96vtBFA .rough-node .label,#mermaid-svg-hMY13YjKg96vtBFA .node .label,#mermaid-svg-hMY13YjKg96vtBFA .image-shape .label,#mermaid-svg-hMY13YjKg96vtBFA .icon-shape .label{text-align:center;}#mermaid-svg-hMY13YjKg96vtBFA .node.clickable{cursor:pointer;}#mermaid-svg-hMY13YjKg96vtBFA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hMY13YjKg96vtBFA .arrowheadPath{fill:#333333;}#mermaid-svg-hMY13YjKg96vtBFA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hMY13YjKg96vtBFA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hMY13YjKg96vtBFA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hMY13YjKg96vtBFA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hMY13YjKg96vtBFA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hMY13YjKg96vtBFA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hMY13YjKg96vtBFA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hMY13YjKg96vtBFA .cluster text{fill:#333;}#mermaid-svg-hMY13YjKg96vtBFA .cluster span{color:#333;}#mermaid-svg-hMY13YjKg96vtBFA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hMY13YjKg96vtBFA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hMY13YjKg96vtBFA rect.text{fill:none;stroke-width:0;}#mermaid-svg-hMY13YjKg96vtBFA .icon-shape,#mermaid-svg-hMY13YjKg96vtBFA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hMY13YjKg96vtBFA .icon-shape p,#mermaid-svg-hMY13YjKg96vtBFA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hMY13YjKg96vtBFA .icon-shape .label rect,#mermaid-svg-hMY13YjKg96vtBFA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hMY13YjKg96vtBFA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hMY13YjKg96vtBFA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hMY13YjKg96vtBFA :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
第三方服务
MCP 服务器
MCP 客户端
大语言模型
用户
自然语言请求
LLM Agent决策与规划
协议转换器发现与通信
服务网关认证与执行
数据库
API服务
SaaS平台
文件系统
物联网设备
图1:MCP 整体架构图 – 展示用户、LLM、MCP客户端、MCP服务器和第三方服务之间的数据流
工具、资源与 Prompt 的区别
| 资源(Resource) | 静态数据,供 LLM 读取 | PDF 文件、数据库记录、配置文件 |
| 工具(Tool) | 可执行功能,供 LLM 调用 | 发邮件、API 查询、文件写入 |
| Prompt | 引导 LLM 与资源或工具交互的模板 | 结构化查询模板、操作指引 |
补充说明:理解这三者的区别对设计 MCP 服务器至关重要。资源适合提供静态参考数据,工具适合执行具体操作,而 Prompt 则用于引导 LLM 的思考过程。一个设计良好的 MCP 服务器通常会同时提供这三种能力,形成完整的能力矩阵。
MCP 的更多考量
| 可发现性 | 客户端可动态查询服务器能力,实现"即时发现",智能体无需重启即可适应新功能 |
| 安全性 | 必须支持认证和授权,控制客户端访问权限和操作范围 |
| 实现复杂度 | 部分厂商(Anthropic、FastMCP)已推出 SDK,简化开发流程 |
| 错误处理 | 协议需定义错误如何反馈给 LLM,便于智能体尝试替代方案 |
| 本地 vs 远程 | 本地适合敏感数据和高性能,远程便于共享和扩展 |
| 按需 vs 批量 | 支持实时交互(对话型)和批量处理(数据分析流水线) |
| 传输机制 | 本地:JSON-RPC over STDIO;远程:Streamable HTTP + SSE |
适用场景
MCP 极大拓展了 AI/LLM 能力,常见九大应用场景:
| 数据库集成 | 通过 MCP 无缝访问结构化数据库,如查询 BigQuery,自然语言驱动 |
| 生成式媒体编排 | 集成 Imagen(图片)、Veo(视频)、Chirp 3 HD(语音)、Lyria(音乐)等生成服务 |
| 外部 API 交互 | 获取实时天气、股票价格,发送邮件,对接 CRM 系统 |
| 推理型信息抽取 | 利用 LLM 推理能力按需抽取信息,超越传统检索 |
| 自定义工具开发 | 用 FastMCP 等框架快速开发工具,通过 MCP 服务器暴露 |
| 标准化通信 | 降低集成成本,促进不同厂商间互操作 |
| 复杂流程编排 | 组合多种工具实现多步骤流程(获取数据→生成图片→撰写邮件→发送) |
| 物联网设备控制 | 通过 MCP 控制智能家居、工业传感器、机器人 |
| 金融服务自动化 | 对接数据源、交易平台、合规系统,实现分析、交易、报告 |
经验法则
构建复杂、可扩展或企业级智能体系统,需与多样化外部工具、数据源和 API 交互时,优先采用 MCP。尤其当需要不同 LLM 与工具互操作、智能体可动态发现新能力时,MCP 是最佳选择。若仅需固定少量函数,直接工具调用即可。
代码示例
示例 1:ADK 连接文件系统 MCP 服务器
#mermaid-svg-wjPIygx61uETytOm{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wjPIygx61uETytOm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wjPIygx61uETytOm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wjPIygx61uETytOm .error-icon{fill:#552222;}#mermaid-svg-wjPIygx61uETytOm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wjPIygx61uETytOm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wjPIygx61uETytOm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wjPIygx61uETytOm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wjPIygx61uETytOm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wjPIygx61uETytOm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wjPIygx61uETytOm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wjPIygx61uETytOm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wjPIygx61uETytOm .marker.cross{stroke:#333333;}#mermaid-svg-wjPIygx61uETytOm svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wjPIygx61uETytOm p{margin:0;}#mermaid-svg-wjPIygx61uETytOm .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wjPIygx61uETytOm .cluster-label text{fill:#333;}#mermaid-svg-wjPIygx61uETytOm .cluster-label span{color:#333;}#mermaid-svg-wjPIygx61uETytOm .cluster-label span p{background-color:transparent;}#mermaid-svg-wjPIygx61uETytOm .label text,#mermaid-svg-wjPIygx61uETytOm span{fill:#333;color:#333;}#mermaid-svg-wjPIygx61uETytOm .node rect,#mermaid-svg-wjPIygx61uETytOm .node circle,#mermaid-svg-wjPIygx61uETytOm .node ellipse,#mermaid-svg-wjPIygx61uETytOm .node polygon,#mermaid-svg-wjPIygx61uETytOm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wjPIygx61uETytOm .rough-node .label text,#mermaid-svg-wjPIygx61uETytOm .node .label text,#mermaid-svg-wjPIygx61uETytOm .image-shape .label,#mermaid-svg-wjPIygx61uETytOm .icon-shape .label{text-anchor:middle;}#mermaid-svg-wjPIygx61uETytOm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wjPIygx61uETytOm .rough-node .label,#mermaid-svg-wjPIygx61uETytOm .node .label,#mermaid-svg-wjPIygx61uETytOm .image-shape .label,#mermaid-svg-wjPIygx61uETytOm .icon-shape .label{text-align:center;}#mermaid-svg-wjPIygx61uETytOm .node.clickable{cursor:pointer;}#mermaid-svg-wjPIygx61uETytOm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wjPIygx61uETytOm .arrowheadPath{fill:#333333;}#mermaid-svg-wjPIygx61uETytOm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wjPIygx61uETytOm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wjPIygx61uETytOm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wjPIygx61uETytOm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wjPIygx61uETytOm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wjPIygx61uETytOm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wjPIygx61uETytOm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wjPIygx61uETytOm .cluster text{fill:#333;}#mermaid-svg-wjPIygx61uETytOm .cluster span{color:#333;}#mermaid-svg-wjPIygx61uETytOm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wjPIygx61uETytOm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wjPIygx61uETytOm rect.text{fill:none;stroke-width:0;}#mermaid-svg-wjPIygx61uETytOm .icon-shape,#mermaid-svg-wjPIygx61uETytOm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wjPIygx61uETytOm .icon-shape p,#mermaid-svg-wjPIygx61uETytOm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wjPIygx61uETytOm .icon-shape .label rect,#mermaid-svg-wjPIygx61uETytOm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wjPIygx61uETytOm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wjPIygx61uETytOm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wjPIygx61uETytOm :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
MCP 服务器
ADK 环境
用户自然语言指令
filesystem_assistant_agentLLM Agent
MCPToolsetADK工具集
StdioServerParametersSTDIO连接参数
npx @modelcontextprotocol/server-filesystemNode.js文件系统服务器
本地文件系统mcp_managed_files目录
图3:ADK连接文件系统MCP服务器架构 – 展示从用户到文件系统的完整调用链
演示如何通过 MCPToolset + StdioServerParameters 连接本地文件系统 MCP 服务器:
用户 → [filesystem_assistant_agent] → MCPToolset → npx @modelcontextprotocol/server-filesystem → 本地文件系统
- MCPToolset:ADK 中连接 MCP 服务器的工具集
- StdioServerParameters:通过 STDIO 启动本地 MCP 服务器进程
- npx:npm 自带的包执行工具,无需全局安装即可运行 Node.js 包
- tool_filter(可选):限制暴露的工具,如只允许读取
运行方式:进入脚本所在父目录,执行 adk web,在浏览器中选择 filesystem_assistant_agent,即可通过自然语言管理文件。
import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters
GEMINI_MODEL = "gemini-2.0-flash"
# 获取 agent.py 同级目录下 'mcp_managed_files' 文件夹的绝对路径
TARGET_FOLDER_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mcp_managed_files")
os.makedirs(TARGET_FOLDER_PATH, exist_ok=True)
root_agent = LlmAgent(
model=GEMINI_MODEL,
name='filesystem_assistant_agent',
instruction=(
'帮助用户管理文件。你可以列出、读取和写入文件。'
f'你的操作目录为:{TARGET_FOLDER_PATH}'
),
tools=[
MCPToolset(
connection_params=StdioServerParameters(
command='npx',
args=[
"-y",
"@modelcontextprotocol/server-filesystem",
TARGET_FOLDER_PATH,
],
),
# 可选:限制暴露的工具,如只允许读取
# tool_filter=['list_directory', 'read_file']
)
],
)
示例 2:FastMCP 服务器
#mermaid-svg-d28tdsJoV2phloBm{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-d28tdsJoV2phloBm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-d28tdsJoV2phloBm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-d28tdsJoV2phloBm .error-icon{fill:#552222;}#mermaid-svg-d28tdsJoV2phloBm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-d28tdsJoV2phloBm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-d28tdsJoV2phloBm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-d28tdsJoV2phloBm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-d28tdsJoV2phloBm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-d28tdsJoV2phloBm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-d28tdsJoV2phloBm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-d28tdsJoV2phloBm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-d28tdsJoV2phloBm .marker.cross{stroke:#333333;}#mermaid-svg-d28tdsJoV2phloBm svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-d28tdsJoV2phloBm p{margin:0;}#mermaid-svg-d28tdsJoV2phloBm .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-d28tdsJoV2phloBm .cluster-label text{fill:#333;}#mermaid-svg-d28tdsJoV2phloBm .cluster-label span{color:#333;}#mermaid-svg-d28tdsJoV2phloBm .cluster-label span p{background-color:transparent;}#mermaid-svg-d28tdsJoV2phloBm .label text,#mermaid-svg-d28tdsJoV2phloBm span{fill:#333;color:#333;}#mermaid-svg-d28tdsJoV2phloBm .node rect,#mermaid-svg-d28tdsJoV2phloBm .node circle,#mermaid-svg-d28tdsJoV2phloBm .node ellipse,#mermaid-svg-d28tdsJoV2phloBm .node polygon,#mermaid-svg-d28tdsJoV2phloBm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-d28tdsJoV2phloBm .rough-node .label text,#mermaid-svg-d28tdsJoV2phloBm .node .label text,#mermaid-svg-d28tdsJoV2phloBm .image-shape .label,#mermaid-svg-d28tdsJoV2phloBm .icon-shape .label{text-anchor:middle;}#mermaid-svg-d28tdsJoV2phloBm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-d28tdsJoV2phloBm .rough-node .label,#mermaid-svg-d28tdsJoV2phloBm .node .label,#mermaid-svg-d28tdsJoV2phloBm .image-shape .label,#mermaid-svg-d28tdsJoV2phloBm .icon-shape .label{text-align:center;}#mermaid-svg-d28tdsJoV2phloBm .node.clickable{cursor:pointer;}#mermaid-svg-d28tdsJoV2phloBm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-d28tdsJoV2phloBm .arrowheadPath{fill:#333333;}#mermaid-svg-d28tdsJoV2phloBm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-d28tdsJoV2phloBm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-d28tdsJoV2phloBm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d28tdsJoV2phloBm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-d28tdsJoV2phloBm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d28tdsJoV2phloBm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-d28tdsJoV2phloBm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-d28tdsJoV2phloBm .cluster text{fill:#333;}#mermaid-svg-d28tdsJoV2phloBm .cluster span{color:#333;}#mermaid-svg-d28tdsJoV2phloBm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-d28tdsJoV2phloBm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-d28tdsJoV2phloBm rect.text{fill:none;stroke-width:0;}#mermaid-svg-d28tdsJoV2phloBm .icon-shape,#mermaid-svg-d28tdsJoV2phloBm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d28tdsJoV2phloBm .icon-shape p,#mermaid-svg-d28tdsJoV2phloBm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-d28tdsJoV2phloBm .icon-shape .label rect,#mermaid-svg-d28tdsJoV2phloBm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d28tdsJoV2phloBm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-d28tdsJoV2phloBm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-d28tdsJoV2phloBm :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
FastMCP 服务器
MCP 客户端
ADK Agent
其他MCP客户端
自定义客户端
FastMCP实例
@mcp_server.tool装饰器注册greet函数
HTTP服务127.0.0.1:8000
图4:FastMCP服务器架构 – 展示FastMCP服务器与多个客户端的连接关系
用 FastMCP 框架快速创建一个 greet 工具的 MCP 服务器:
- @mcp_server.tool:装饰器注册工具函数,文档字符串和类型提示自动生成接口规范
- 运行后监听 127.0.0.1:8000,任何 MCP 客户端均可调用
# pip install fastmcp
from fastmcp import FastMCP, Client
mcp_server = FastMCP()
@mcp_server.tool
def greet(name: str) –> str:
"""
生成个性化问候语。
Args:
name: 要问候的人名。
Returns:
问候语字符串。
"""
return f"你好,{name}!很高兴认识你。"
if __name__ == "__main__":
mcp_server.run(
transport="http",
host="127.0.0.1",
port=8000
)
示例 3:ADK 消费 FastMCP 服务器
#mermaid-svg-CVrGF3t4gr376Xxr{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CVrGF3t4gr376Xxr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CVrGF3t4gr376Xxr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CVrGF3t4gr376Xxr .error-icon{fill:#552222;}#mermaid-svg-CVrGF3t4gr376Xxr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CVrGF3t4gr376Xxr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CVrGF3t4gr376Xxr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CVrGF3t4gr376Xxr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CVrGF3t4gr376Xxr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CVrGF3t4gr376Xxr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CVrGF3t4gr376Xxr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CVrGF3t4gr376Xxr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CVrGF3t4gr376Xxr .marker.cross{stroke:#333333;}#mermaid-svg-CVrGF3t4gr376Xxr svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CVrGF3t4gr376Xxr p{margin:0;}#mermaid-svg-CVrGF3t4gr376Xxr .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-CVrGF3t4gr376Xxr .cluster-label text{fill:#333;}#mermaid-svg-CVrGF3t4gr376Xxr .cluster-label span{color:#333;}#mermaid-svg-CVrGF3t4gr376Xxr .cluster-label span p{background-color:transparent;}#mermaid-svg-CVrGF3t4gr376Xxr .label text,#mermaid-svg-CVrGF3t4gr376Xxr span{fill:#333;color:#333;}#mermaid-svg-CVrGF3t4gr376Xxr .node rect,#mermaid-svg-CVrGF3t4gr376Xxr .node circle,#mermaid-svg-CVrGF3t4gr376Xxr .node ellipse,#mermaid-svg-CVrGF3t4gr376Xxr .node polygon,#mermaid-svg-CVrGF3t4gr376Xxr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CVrGF3t4gr376Xxr .rough-node .label text,#mermaid-svg-CVrGF3t4gr376Xxr .node .label text,#mermaid-svg-CVrGF3t4gr376Xxr .image-shape .label,#mermaid-svg-CVrGF3t4gr376Xxr .icon-shape .label{text-anchor:middle;}#mermaid-svg-CVrGF3t4gr376Xxr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CVrGF3t4gr376Xxr .rough-node .label,#mermaid-svg-CVrGF3t4gr376Xxr .node .label,#mermaid-svg-CVrGF3t4gr376Xxr .image-shape .label,#mermaid-svg-CVrGF3t4gr376Xxr .icon-shape .label{text-align:center;}#mermaid-svg-CVrGF3t4gr376Xxr .node.clickable{cursor:pointer;}#mermaid-svg-CVrGF3t4gr376Xxr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CVrGF3t4gr376Xxr .arrowheadPath{fill:#333333;}#mermaid-svg-CVrGF3t4gr376Xxr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CVrGF3t4gr376Xxr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CVrGF3t4gr376Xxr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CVrGF3t4gr376Xxr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CVrGF3t4gr376Xxr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CVrGF3t4gr376Xxr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CVrGF3t4gr376Xxr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CVrGF3t4gr376Xxr .cluster text{fill:#333;}#mermaid-svg-CVrGF3t4gr376Xxr .cluster span{color:#333;}#mermaid-svg-CVrGF3t4gr376Xxr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CVrGF3t4gr376Xxr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CVrGF3t4gr376Xxr rect.text{fill:none;stroke-width:0;}#mermaid-svg-CVrGF3t4gr376Xxr .icon-shape,#mermaid-svg-CVrGF3t4gr376Xxr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CVrGF3t4gr376Xxr .icon-shape p,#mermaid-svg-CVrGF3t4gr376Xxr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CVrGF3t4gr376Xxr .icon-shape .label rect,#mermaid-svg-CVrGF3t4gr376Xxr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CVrGF3t4gr376Xxr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CVrGF3t4gr376Xxr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CVrGF3t4gr376Xxr :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
远程服务器
ADK 环境
用户输入'向 John Doe 问好'
fastmcp_greeter_agentADK LLM Agent
MCPToolset工具集
HttpServerParametersHTTP连接参数
FastMCP服务器localhost:8000
greet工具函数返回问候语
响应:'你好,John Doe!很高兴认识你。'
图5:ADK消费FastMCP服务器流程 – 展示HTTP连接和工具调用的完整过程
ADK Agent 作为 MCP 客户端连接 FastMCP 服务器:
"向 John Doe 问好" → [fastmcp_greeter_agent] → HttpServerParameters → FastMCP 服务器 → greet("John Doe")
- HttpServerParameters:通过 HTTP 连接远程 MCP 服务器
- tool_filter=['greet']:只允许使用 greet 工具
运行步骤:
import os
from google.adk.agents import LlmAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, HttpServerParameters
GEMINI_MODEL = "gemini-2.0-flash"
# 定义 FastMCP 服务器地址
# 请确保 7.2MCP示例_FastMCP服务器.py 已在该端口运行
FASTMCP_SERVER_URL = "http://localhost:8000"
root_agent = LlmAgent(
model=GEMINI_MODEL,
name='fastmcp_greeter_agent',
instruction='你是一个友好的助手,可以通过 "greet" 工具向人问好。',
tools=[
MCPToolset(
connection_params=HttpServerParameters(
url=FASTMCP_SERVER_URL,
),
# 可选:限制 MCP 服务器暴露的工具
# 本例只允许使用 'greet'
tool_filter=['greet']
)
],
)
示例 4:其他连接方式
展示 python3 和 uvx 两种 STDIO 连接参数配置:
- python3:连接自己编写的 Python MCP 服务器脚本,可通过 env 传递环境变量
- uvx:Python 命令行工具,利用 uv 临时隔离环境运行 Python 包,无需全局安装,适合运行社区 MCP 服务器
"""
MCP 服务器的其他连接方式示例。
展示 python3 和 uvx 两种 STDIO 连接参数配置。
"""
from google.adk.tools.mcp_tool.mcp_toolset import StdioServerParameters
# ============================================================
# 示例 1:通过 python3 连接自定义 MCP 服务器
# ============================================================
# 适用于自己编写的 Python MCP 服务器脚本
SERVICE_ACCOUNT_PATH = "/path/to/service_account.json"
DRIVE_FOLDER_ID = "your-drive-folder-id"
python_connection_params = StdioServerParameters(
command="python3",
args=["./agent/mcp_server.py"],
env={
"SERVICE_ACCOUNT_PATH": SERVICE_ACCOUNT_PATH,
"DRIVE_FOLDER_ID": DRIVE_FOLDER_ID
}
)
# ============================================================
# 示例 2:通过 uvx 连接社区 MCP 服务器
# ============================================================
# uvx 是 Python 命令行工具,利用 uv 临时隔离环境运行 Python 包,无需全局安装
uvx_connection_params = StdioServerParameters(
command="uvx",
args=["mcp-google-sheets@latest"],
env={
"SERVICE_ACCOUNT_PATH": SERVICE_ACCOUNT_PATH,
"DRIVE_FOLDER_ID": DRIVE_FOLDER_ID
}
)
关键要点
- MCP 是开放标准,规范 LLM 与外部应用、数据源和工具的通信
- 采用客户端-服务器架构,定义资源、Prompt 和工具的暴露与消费方式
- ADK 支持消费现有 MCP 服务器,也可将自身工具暴露为 MCP 服务
- FastMCP 简化 MCP 服务器开发,尤其适合 Python 工具的快速集成
- MCP Genmedia 工具支持智能体集成 Google Cloud 生成式媒体服务
- MCP 让 LLM 和智能体能访问真实世界系统、动态信息,并执行超越文本生成的操作
总结
模型上下文协议(MCP)是连接大语言模型与外部系统的开放标准。它采用客户端-服务器架构,让 LLM 能通过标准化工具访问资源、利用 Prompt、执行操作。MCP 支持数据库访问、生成式媒体编排、物联网控制和金融自动化等场景。文中通过文件系统服务器和 FastMCP 服务器的智能体集成示例,展示了 MCP 与 ADK 的实际应用。MCP 是打造具备交互能力的智能体系统不可或缺的核心组件。
网硕互联帮助中心





评论前必须登录!
注册