文章

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鉴权
  • 开发友好:装饰器模式,函数上加注解即可注册工具

核心开发步骤

  1. 定义工具逻辑(业务代码)
  2. 应用Prompt模板(规范名称、触发时机、适用边界)
  3. 参数精细化(取值边界、默认值、示例)

安全设计

  • 密钥加密存储(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也看不到,防止安全风险

执行流程

  1. 工具发现:Agent启动时调用tools/list拉取Schema
  2. 决策规划:LLM匹配Schema中的”触发时机”决定是否调用
  3. 标准化执行:Agent通过协议请求,Server执行并返回JSON

7. 底层注入机制

框架底层的”暗箱操作”:

  1. 自动握手与发现:通过HTTP/SSE获取Tool List
  2. 过滤与防越权:经static_filter剥离高危工具
  3. Schema组装:动态生成工具名,拼接到System Prompt
  4. 无缝调用:大模型像使用本地工具一样调用远程微服务

关键要点

  1. 协议标准化:MCP是协议而非软件,两端按标准通信即可
  2. 一次开发多处使用:Server开发一次,所有Client都能接入
  3. 安全白名单:必须用tool_filter限制可见工具,防止风险
  4. 密钥隔离:敏感信息走headers,绝不暴露给LLM
  5. 幂等设计:网络抖动可能导致重试,工具必须支持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,确保幂等性

关联知识

参考资源

学习时间

  • 课程时长:35:14
  • 笔记整理:2026-04-10

状态

  • 课程学习
  • MCP Server实践
  • MCP Client集成

下次复习日期

2026-04-17