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

内容纲要

导语

工具函数调用是定制工具包,每个厂商格式各异,难以复用。模型上下文协议(MCP)是通用电源接口,任何兼容工具都能被任何兼容LLM访问和使用。MCP通过标准化通信接口,让智能体与外部应用、数据源、工具无缝集成,打造可互操作的生态系统。本文介绍MCP的核心概念、架构组件、FastMCP实战与ADK集成,适合需要构建企业级智能体系统的开发者。

TL;DR

  • 核心:MCP是开放标准,为LLM与外部系统提供标准化通信接口,包含Tools(工具)、Resources(资源)、Prompts(提示模板)三大元素。
  • 价值:互操作性(任何LLM访问任何工具)、可复用性(工具独立部署)、动态发现(无需重新部署)、生态系统(推动标准化组件)。
  • 架构:LLM → MCP Client → MCP Server → 3P Service,通过发现、请求构建、客户端通信、服务器执行、响应返回五步流程。
  • 实现:FastMCP简化MCP Server开发,ADK通过MCPToolset连接MCP服务器,支持本地STDIO和远程HTTP/SSE通信。
  • 边界:底层API质量决定效果,需要针对智能体优化;数据格式需智能体友好(Markdown而非PDF)。

是什么:MCP的核心定义

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

核心类比

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

三大核心元素

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

常见误解澄清

  • ❌ MCP就是函数调用:MCP是完整的发现与通信框架,函数调用只是直接调用预定义函数。
  • ❌ MCP会增加很多延迟:会增加发现和标准化通信层,但换来互操作性和可扩展性。
  • ❌ 所有工具都需要MCP:简单应用用函数调用即可,复杂系统需要动态扩展时用MCP。

为什么:产生背景与适用场景

产生背景

工具函数调用的局限:

  • 厂商专有,格式各异:不同厂商的工具调用格式不同,难以复用。
  • 与特定应用深度绑定:工具与特定LLM或应用紧密耦合。
  • 静态配置可用工具:无法动态发现和适应新能力。

MCP协议的优势:

  • ✅ 开放标准,统一规范
  • ✅ 完整的发现与通信框架
  • ✅ 客户端-服务器架构
  • ✅ 动态发现和查询能力
  • ✅ 独立部署,跨平台复用

核心区别

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

MCP vs 工具函数调用

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

怎么做: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: 返回执行结果

实战: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优势

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

部署模式

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

传输机制

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

对比与取舍:MCP的关键价值与局限

✅ 核心价值

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

⚠️ 关键局限

  1. 底层API质量决定效果

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

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

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

常见错误与排错

典型坑位

问题 症状 识别方法 修复建议
API质量差 智能体难以使用工具 检查API返回格式 优化API设计,返回智能体友好格式
数据格式不兼容 PDF等格式无法处理 检查返回数据类型 转换为Markdown或JSON格式
连接失败 无法连接到MCP服务器 检查网络和认证 验证URL、认证信息、网络连接
工具发现失败 无法发现可用工具 检查Agent Card配置 确保Agent Card正确配置

调试技巧

  1. 测试MCP服务器独立运行:先单独测试服务器,再集成到智能体。
  2. 检查Agent Card:确保工具描述清晰,LLM能理解。
  3. 验证通信协议:检查STDIO或HTTP/SSE通信是否正常。
  4. 查看日志:记录MCP通信过程,便于调试。

FAQ

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

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

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

Q3:如何确保MCP安全?
A:1) 身份验证和授权;2) 限制工具访问范围;3) 输入验证;4) 审计日志。

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

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

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

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


延伸阅读与引用

官方文档


总结

模型上下文协议(MCP)是标准化LLM与外部系统连接的核心协议。通过Tools、Resources、Prompts三大元素和客户端-服务器架构,MCP实现了任何LLM访问任何工具的互操作性,推动了标准化组件生态的发展。FastMCP等框架简化了MCP Server的开发,Google ADK等平台提供了原生支持。虽然MCP增加了通信层,但换来了可复用性、动态发现和生态系统优势。

滚动至顶部