模型上下文协议(MCP)| Agentic Design Patterns | 智能体设计模式

内容纲要

一、核心定义

模型上下文协议(MCP):一个开放标准,为大语言模型(LLM)与外部应用、数据源、工具之间提供标准化的通信接口。就像是通用电源插座,让任何兼容工具都能被任何兼容LLM访问和使用。

核心类比

工具函数调用  →  定制工具包(专用扳手+螺丝刀)
MCP协议      →  通用电源接口(任何设备都能接入)

三大核心元素

  1. Tools(工具):可执行的功能(如发送邮件、查询数据库)
  2. Resources(资源):静态数据(如文件、数据库记录)
  3. Prompts(提示模板):指导LLM如何交互的模板

二、MCP vs 工具函数调用

维度 工具函数调用 MCP协议
标准化 厂商专有,格式各异 开放标准,统一规范
范围 直接调用特定预定义函数 完整的发现与通信框架
架构 LLM与工具一对一直接交互 客户端-服务器架构
发现机制 静态配置可用工具 动态发现和查询能力
可复用性 与特定应用深度绑定 独立部署,跨平台复用
适用场景 简单应用,固定功能 复杂系统,动态扩展

核心区别

  • 函数调用:直接给AI一套专用工具
  • MCP:建立标准接口,任何工具都能即插即用

三、MCP 架构组件

四大核心角色

组件 角色 类比
LLM 智能核心,决策者 大脑
MCP Client LLM的封装应用 翻译官
MCP Server 外部能力的网关 桥梁
3P Service 实际执行的外部工具/API 手脚

交互流程

1. 发现(Discovery)
   Client → Server: 查询可用能力
   Server → Client: 返回工具/资源清单

2. 请求构建(Request Formulation)  
   LLM: 决定使用哪个工具,构造请求参数

3. 客户端通信(Client Communication)
   Client → Server: 发送标准化调用请求

4. 服务器执行(Server Execution)
   Server: 验证→执行→调用底层API

5. 响应返回(Response)
   Server → Client → LLM: 返回执行结果

四、典型应用场景

1. 数据库集成

智能体用自然语言 → MCP工具箱 → 查询BigQuery → 生成报表

价值:自然语言驱动的数据库操作

2. 生成式媒体编排

MCP连接 → Imagen(图片) + Veo(视频) + Chirp(语音) + Lyria(音乐)

价值:统一接口调度多种媒体生成服务

3. 外部API交互

MCP标准化接口 → 天气API + 股票API + 邮件API + CRM系统

价值:扩展LLM能力边界

4. 基于推理的信息提取

传统搜索: 返回整篇文档
MCP+LLM: 精准提取具体条款/数据/关键陈述

价值:深度理解+精准提取

5. 自定义工具开发

开发者 → 构建专属工具 → MCP Server(FastMCP) → 标准化暴露

价值:企业私有能力快速接入

6. 复杂工作流编排

查客户数据 → 生成营销图片 → 撰写邮件 → 自动发送

价值:多服务协同完成复杂任务

7. 物联网设备控制

自然语言 → MCP → 智能家居/工业传感器/机器人

价值:自然语言控制物理世界

8. 金融服务自动化

MCP对接 → 金融数据源 + 交易平台 + 合规系统

价值:智能化金融操作


五、关键设计考虑

核心要素对比

要素 说明 重要性
Tool vs Resource vs Prompt 工具(可执行)、资源(静态数据)、提示(交互模板) 明确角色定位
可发现性 动态查询可用能力 适应新功能
安全性 身份验证+权限控制 保护数据和功能
实现复杂度 框架(Anthropic/FastMCP)简化开发 降低门槛
错误处理 清晰反馈错误,支持重试 提升鲁棒性

部署模式

模式 适用场景 优势
本地Server 敏感数据、追求速度 安全、低延迟
远程Server 跨组织共享 可扩展、统一管理
按需调用 实时交互 即时响应
批处理 大规模数据分析 高吞吐

传输机制

  • 本地通信:JSON-RPC over STDIO (进程间通信)
  • 远程通信:Streamable HTTP + Server-Sent Events(SSE)

六、实战:ADK + MCP

1. 连接本地MCP服务器(文件系统)

核心代码

from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StdioServerParameters

TARGET_FOLDER_PATH = "/path/to/your/folder"

root_agent = LlmAgent(
    model='gemini-2.0-flash',
    name='filesystem_assistant_agent',
    instruction='帮助用户管理文件',
    tools=[
        MCPToolset(
            connection_params=StdioServerParameters(
                command='npx',  # Node Package Execute
                args=["-y", "@modelcontextprotocol/server-filesystem", 
                      TARGET_FOLDER_PATH]
            )
        )
    ]
)

关键点

  • <code>npx</code>:直接运行npm包,无需全局安装
  • <code>StdioServerParameters</code>:本地服务器通信参数
  • <code>TARGET_FOLDER_PATH</code>:文件操作根目录

2. 使用FastMCP创建自定义服务器

定义服务器

from fastmcp import FastMCP

mcp_server = FastMCP()

@mcp_server.tool
def greet(name: str) -&gt; str:
    &quot;&quot;&quot;生成个性化问候&quot;&quot;&quot;
    return f&quot;Hello, {name}! Nice to meet you.&quot;

# 启动HTTP服务器
if __name__ == &quot;__main__&quot;:
    mcp_server.run(transport=&quot;http&quot;, host=&quot;127.0.0.1&quot;, port=8000)

连接服务器(客户端)

from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, HttpServerParameters

root_agent = LlmAgent(
    model=&#039;gemini-2.0-flash&#039;,
    name=&#039;fastmcp_greeter_agent&#039;,
    instruction=&#039;友好的问候助手&#039;,
    tools=[
        MCPToolset(
            connection_params=HttpServerParameters(url=&quot;http://localhost:8000&quot;),
            tool_filter=[&#039;greet&#039;]  # 可选:限制可用工具
        )
    ]
)

FastMCP优势

  • 简单装饰器定义工具
  • 自动生成接口规范
  • 支持服务器组合和代理

七、MCP的关键价值与局限

✅ 核心价值

  1. 互操作性:任何LLM访问任何工具
  2. 可复用性:工具独立部署,跨项目使用
  3. 动态发现:无需重新部署即可适应新能力
  4. 生态系统:推动标准化组件生态
  5. 简化集成:减少定制开发工作量

⚠️ 关键局限

  1. 底层API质量决定效果

    • 问题:简单封装遗留API效果差
    • 解决:需要针对智能体优化API(如添加过滤、排序)
  2. 数据格式兼容性

    • 问题:返回PDF等非文本格式,智能体难处理
    • 解决:API应返回智能体友好格式(如Markdown)
  3. 非确定性需要确定性支撑

    • 智能体不能替代传统工作流
    • 需要更强的确定性基础设施

八、关键概念速查

概念 定义
MCP LLM与外部系统的标准化通信协议
MCP Client 封装LLM的应用,发起MCP请求
MCP Server 暴露工具/资源/提示的服务端
Tool 可执行功能
Resource 静态数据
Prompt 交互模板
Discovery 动态查询可用能力
FastMCP 简化MCP Server开发的Python框架
STDIO 本地进程间通信方式
HTTP/SSE 远程通信方式

九、常见问题

Q1:何时用MCP,何时用函数调用?

  • 简单应用,固定功能 → 函数调用
  • 复杂系统,需要动态扩展 → MCP

Q2:MCP会增加延迟吗?
会,因为增加了发现和标准化通信层。但换来的是互操作性和可扩展性。

Q3:如何确保MCP安全?

1) 身份验证和授权;2) 限制工具访问范围;3) 输入验证;4) 审计日志。

Q4:现有工具如何接入MCP?
用FastMCP等框架封装现有API,暴露为MCP Server。注意要优化数据格式和API设计。

Q5:本地 vs 远程MCP Server如何选择?

  • 本地:敏感数据、低延迟
  • 远程:跨组织共享、可扩展

Q6:MCP与LangChain的关系?
MCP是通信协议标准,LangChain可以作为MCP Client使用MCP服务器暴露的工具。


十、参考资源

官方文档

代码示例

  • ADK + 本地MCP服务器(章节内嵌)
  • FastMCP自定义服务器(章节内嵌)

扩展阅读

  • 原文章节:<code>16-Chapter-10-Model-Context-Protocol.md</code>
  • 第5章:工具使用(MCP的基础概念)

滚动至顶部