14-MCP协议-标准化定义工具接口
14|MCP协议:标准化定义工具接口
概述
MCP(Model Context Protocol,模型上下文协议)是2024年Anthropic提出的革命性协议,正在彻底改变AI Agent与外部世界交互的方式。它通过标准化协议实现生态复用与架构解耦。
核心概念
1. 什么是MCP协议?
MCP本质:一套”协议”(Protocol),不是具体软件或开源项目,类似HTTP协议。
两端架构:
- MCP Client:Agent或AI应用,负责理解用户自然语言、推理决策
- MCP Server:提供底层工具和数据源(企业邮箱、数据库、OA系统)
核心机制:Server按MCP标准格式暴露能力(工具名称、描述、参数JSON Schema),Client自动发现、理解、动态调用,无需硬编码业务逻辑。
2. 核心价值
| 价值 | 说明 |
|---|---|
| 生态复用 | Write Once, Use Anywhere。一次开发,CrewAI/LangChain/Claude客户端都能用 |
| 架构解耦 | AI团队与后端团队权责分离,后端按标准提供接口,AI团队直接接入 |
3. MCP资源获取渠道
| 渠道 | 说明 |
|---|---|
| 官方收录 | registry.modelcontextprotocol.io(Anthropic维护) |
| 第三方资源站 | Smithery.ai、MCP.so |
| AI应用商店 | Cursor、Cline、Glama、Windsurf内置MCP商店 |
| 托管基站 | Composio、Val Town(将代码转为Web Server) |
| 开源社区 | awesome-mcp-servers、best-of-mcp-servers |
4. 工具分布现状
- 开发者工具(绝大多数):git、数据库、流水线等
- 通用AI工具:浏览器、搜索、文档处理
- 互联网大厂API:Google Maps、Slack、飞书等
- 垂类应用(较少):金融、法律、股票行情等
5. 自研MCP Server(FastAPI框架)
框架地址:https://github.com/kid0317/fastapi_mcpserver_base
企业级特性:
- 高性能异步:支持2025 Streamable HTTP传输协议
- 开箱即用:预集成JSON日志、Prometheus监控、API Key鉴权
- 开发友好:装饰器模式,函数上加注解即可注册工具
核心开发步骤:
- 定义工具逻辑(业务代码)
- 应用Prompt模板(规范名称、触发时机、适用边界)
- 参数精细化(取值边界、默认值、示例)
安全设计:
- 密钥加密存储(Fernet对称加密)
- 身份映射:X-User-Id通过HTTP Header传递,AI接触不到敏感信息
6. MCP Client集成(CrewAI)
代码位置:https://github.com/kid0317/crewai_mas_demo/blob/main/m2l9/m2l9_mcp.py
email_agent = Agent(
role="电子邮件收发员",
mcps=[MCPServerHTTP(
url="http://localhost:8005/mcp",
headers={
"Authorization": "Bearer your_key", # 传输层鉴权
"X-User-Id": "user01" # 业务层多租户
},
tool_filter=static_filter, # 安全过滤器
)]
)
工具过滤器(白名单):
- 使用
create_static_tool_filter限制Agent只能使用指定工具 - 即使Server新增100个工具,Agent也看不到,防止安全风险
执行流程:
- 工具发现:Agent启动时调用
tools/list拉取Schema - 决策规划:LLM匹配Schema中的”触发时机”决定是否调用
- 标准化执行:Agent通过协议请求,Server执行并返回JSON
7. 底层注入机制
框架底层的”暗箱操作”:
- 自动握手与发现:通过HTTP/SSE获取Tool List
- 过滤与防越权:经static_filter剥离高危工具
- Schema组装:动态生成工具名,拼接到System Prompt
- 无缝调用:大模型像使用本地工具一样调用远程微服务
关键要点
- 协议标准化:MCP是协议而非软件,两端按标准通信即可
- 一次开发多处使用:Server开发一次,所有Client都能接入
- 安全白名单:必须用tool_filter限制可见工具,防止风险
- 密钥隔离:敏感信息走headers,绝不暴露给LLM
- 幂等设计:网络抖动可能导致重试,工具必须支持request_id幂等
实践示例
MCP Server开发(装饰器模式)
from fastapi_mcpserver import mcp_tool
@mcp_tool(
name="send_email",
description="发送邮件。触发时机:用户要求发送邮件时。适用边界:只支持PDF附件"
)
async def send_email(to: str, subject: str, body: str) -> str:
"""参数已定义取值边界和示例"""
# 业务逻辑...
return "邮件发送成功"
MCP Client集成
from crewai.mcp import MCPServerHTTP
from crewai.mcp.filters import create_static_tool_filter
# 白名单过滤
static_filter = create_static_tool_filter(
allowed_tool_names=["send_email", "read_inbox"]
)
agent = Agent(
role="邮件助手",
mcps=[MCPServerHTTP(
url="http://localhost:8005/mcp",
headers={"X-User-Id": user_id},
tool_filter=static_filter,
)]
)
常见问题/坑点
| 反模式 | 后果 | 解决方案 |
|---|---|---|
| 巨型MCP | 一个接口返回20+工具,占用13.7K Token | 保持克制和垂直,拆分多个Server |
| 粒度过细 | 5-6次往返调用,Token和失败风险增加 | Server端做业务聚合,语义完整性 |
| 同步阻塞 | 重I/O操作无心跳,Client超时断开 | 异步处理 + 心跳机制 |
| 模型传安全参数 | 极高的越权风险 | 敏感信息走headers,不暴露给LLM |
| 非幂等设计 | 网络重试导致重复执行 | 支持request_id,确保幂等性 |
关联知识
- 12-工具设计哲学-从API到Agent-Native的范式跃迁:工具设计原则
- 13-自定义工具封装-构建Tools的五步标准SOP:工具封装方法论
- 16-Skills生态-让Agent接入大量工具:Skills与MCP的关系
参考资源
- FastAPI MCP框架:https://github.com/kid0317/fastapi_mcpserver_base
- 邮件MCP示例:https://github.com/kid0317/mail_mcpserver
- MCP官方注册表:https://registry.modelcontextprotocol.io
- CrewAI MCP集成:https://github.com/kid0317/crewai_mas_demo/blob/main/m2l9/m2l9_mcp.py
学习时间
- 课程时长:35:14
- 笔记整理:2026-04-10
状态
- 课程学习
- MCP Server实践
- MCP Client集成
下次复习日期
2026-04-17