李锋镝的博客

  • 首页
  • 时间轴
  • 评论区显眼包🔥
  • 左邻右舍
  • 博友圈
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
  • 留言
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. AI
  3. 正文

MCP深度解析:从协议本质到实战落地,彻底搞懂 AI 工具交互的标准化方案

2025年11月11日 220点热度 0人点赞 0条评论

在 AI 工具化的浪潮中,Function Call 让 LLM 具备了调用外部工具的能力,但随着工具数量增多、LLM 厂商林立,“接口不统一、迁移成本高、生态碎片化”的问题日益凸显。MCP(Model Context Protocol)的出现,如同 AI 世界的“HTTP 协议”,为 LLM 与工具的交互建立了统一标准。

一、先回顾:Function Call 为何需要 MCP ?

在理解 MCP 之前,我们需要先明确:Function Call 解决了“LLM 不会用工具”的问题,但带来了新的麻烦。原文提到了 Function Call 的核心痛点,本节将结合具体场景,补充更多细节:

1. Function Call 的工作原理(快速回顾)

Function Call 是 LLM 调用外部工具的基础机制,核心流程:

  1. 开发者通过 JSON Schema 定义工具(函数名、描述、参数);
  2. 将工具定义与用户查询一起传给 LLM;
  3. LLM 解析查询,判断是否需要调用工具,返回函数名和参数;
  4. 开发者执行工具调用,将结果回传给 LLM;
  5. LLM 整合结果,生成自然语言回复。

2. Function Call 的 5 大核心痛点

(1)无统一标准,跨 LLM 迁移成本极高

不同 LLM 厂商的 Function Call 实现差异巨大,导致“一套代码适配一个 LLM”:

  • 参数定义差异:OpenAI 用 functions 参数,Anthropic 用 tools 参数,百度文心一言用 plugin 参数;
  • 返回格式差异:OpenAI 返回 function_call 字段,Claude 返回 tool_calls 字段,参数结构也不同;
  • 场景示例:将 OpenAI 的 Function Call 代码迁移到 Claude,需修改工具定义格式、返回值解析逻辑,迁移成本达 80%。

(2)JSON Schema 维护困难,无法共享

Function Call 的工具描述依赖 JSON Schema,存在两大问题:

  • 可读性差:复杂工具的 JSON Schema 冗长,修改参数需手动编辑 JSON,易出错;
  • 无法共享:工具定义与代码强绑定,无法在不同项目、不同团队间复用,形成“信息孤岛”。

(3)工具增多导致 Token 浪费严重

当工具数量超过 10 个时,每次调用 LLM 都需携带所有工具的 JSON Schema,导致:

  • 输入 Token 暴增:10 个复杂工具的 JSON Schema 可能占用上千 Token,远超用户查询本身;
  • 算力浪费:用户查询无需工具调用时,仍需传递所有工具定义,增加 LLM 推理负担。

(4)依赖 LLM 能力,稳定性不足

Function Call 的有效性完全依赖 LLM 的理解能力:

  • 需通过复杂的 System Prompt 约束 LLM 输出格式,不同 LLM 对 Prompt 的敏感度不同;
  • 部分低能力 LLM 会出现“误调用工具”“参数提取错误”,需额外开发容错逻辑。

(5)无中间层,LLM 与工具强绑定

Function Call 让 LLM 直接与工具交互,导致:

  • 工具升级或替换时,需修改 LLM 调用代码;
  • 无法统一管理工具的权限、速率限制、错误处理;
  • 不支持 LLM 无感切换,一旦绑定某个 LLM,替换成本极高。

3. 痛点总结:Function Call 是“点解决方案”,而非“生态方案”

Function Call 解决了 LLM 与工具“能不能交互”的问题,但没解决“如何高效、标准化、可扩展交互”的问题——这正是 MCP 诞生的核心原因。

二、MCP 协议本质:AI 工具交互的“HTTP 标准”

MCP(Model Context Protocol)是 Anthropic 开源的LLM 与工具交互的标准化协议,核心目标是“让 LLM 与工具的交互像 HTTP 通信一样通用、简单、可扩展”。

1. MCP 的核心设计理念

  • 解耦:将 LLM 与工具分离,通过 MCP 中间层实现通信,避免强绑定;
  • 标准化:定义统一的工具描述格式、通信流程、数据交互规范;
  • 生态化:支持工具的共享、复用、发现,形成“工具市场”;
  • 兼容性:兼容所有支持 Function Call 的 LLM,无需修改 LLM 本身。

2. MCP 的核心组件与职责

MCP 架构包含三大核心组件,分工明确:

组件 核心职责 示例实现
MCP Client 对接 LLM,发起工具查询、执行调用 Claude Desktop、Cursor、自定义客户端
MCP Server 提供工具能力,注册工具元信息、处理调用请求 天气查询 Server、数据库操作 Server、API 代理 Server
MCP 协议 定义通信规范(工具描述、请求/响应格式) 工具元数据格式、RPC 通信协议、错误码标准

关键补充:MCP Server 的核心能力

  • 工具注册:向 Client 暴露工具元信息(名称、描述、参数、返回格式);
  • 请求处理:接收 Client 的工具调用请求,执行逻辑并返回结果;
  • 权限控制:支持 API Key、角色权限等访问控制;
  • 错误处理:统一的错误码和异常描述,便于 Client 处理。

3. MCP 协议核心规范(详细版)

MCP 协议的核心是“工具描述格式”和“通信流程”,以下是关键规范细节:

(1)工具元数据规范

MCP 定义了统一的工具描述格式,比 Function Call 的 JSON Schema 更易读、可维护:

{
  "schemaVersion": "v1", // 协议版本
  "tool": {
    "name": "weather_query", // 工具唯一标识
    "description": "查询指定城市和日期的天气信息", // 工具描述
    "inputSchema": { // 输入参数 schema
      "type": "object",
      "properties": {
        "city": {
          "type": "string",
          "description": "城市名称(如北京、上海)",
          "required": true
        },
        "date": {
          "type": "string",
          "format": "YYYY-MM-DD",
          "description": "查询日期(支持未来7天)",
          "required": true
        },
        "unit": {
          "type": "string",
          "enum": ["celsius", "fahrenheit"],
          "default": "celsius",
          "description": "温度单位"
        }
      }
    },
    "outputSchema": { // 输出参数 schema
      "type": "object",
      "properties": {
        "location": {"type": "string"},
        "temperature": {"type": "string"},
        "unit": {"type": "string"},
        "description": {"type": "string"}
      }
    },
    "errorSchema": { // 错误输出 schema
      "type": "object",
      "properties": {
        "code": {"type": "integer"},
        "message": {"type": "string"},
        "detail": {"type": "object"}
      }
    }
  }
}

(2)通信流程规范

MCP 采用 RPC 风格的通信流程,核心步骤:

  1. 初始化:MCP Client 与 Server 建立连接,Client 调用 list_tools() 获取工具列表;
  2. 工具筛选:Client 根据用户查询,筛选出可能需要的工具(解决 Token 浪费问题);
  3. LLM 推理:Client 将筛选后的工具元信息与用户查询传给 LLM,判断是否调用工具;
  4. 工具调用:LLM 决定调用工具后,Client 按 MCP 格式向 Server 发送调用请求;
  5. 结果返回:Server 执行工具逻辑,返回结果,Client 回传给 LLM;
  6. 生成回复:LLM 整合结果,生成自然语言回复。

(3)数据交互格式规范

  • 通信协议:支持 JSON-RPC 2.0、gRPC 两种方式,默认 JSON-RPC;
  • 编码格式:UTF-8,支持文本、JSON、二进制数据(如图片、文件);
  • 错误码标准:
    • 4xx:客户端错误(参数错误、权限不足);
    • 5xx:服务端错误(工具执行失败、服务不可用);
    • 6xx:协议错误(版本不兼容、格式错误)。

4. MCP 与 Function Call 的核心差异(扩展版)

对比维度 Function Call MCP(Model Context Protocol)
核心定位 LLM 调用工具的实现方案 LLM 与工具交互的标准化协议
跨 LLM 兼容性 差(各厂商自定义) 好(统一协议,适配所有 LLM)
工具描述维护 复杂(JSON Schema 嵌入代码) 简单(独立元数据文件,支持共享)
工具数量扩展性 差(工具增多导致 Token 暴增) 好(支持工具筛选,按需传递)
生态化支持 无(工具无法共享) 有(工具市场、跨平台复用)
开发复杂度 低(快速实现单个工具) 中(需搭建 Server,但后续复用成本低)
错误处理 需手动实现 协议统一处理,Client/Server 各司其职
适用场景 简单工具调用、快速验证 复杂工具生态、多 LLM 适配、企业级应用

三、MCP 实战:从零搭建 MCP Server 与 Client

理论不如实践,本节将用 Python 实现一个“天气查询”的 MCP Server 和 Client,让你直观感受 MCP 的工作流程。

1. 环境准备

  • 依赖库:mcp-python(MCP 官方 SDK)、fastapi(搭建 Server)、requests(HTTP 工具调用);
  • 安装命令:

    pip install mcp-python fastapi uvicorn requests

2. 第一步:搭建 MCP Server(天气查询服务)

MCP Server 负责注册工具、处理调用请求,核心代码如下:

from mcp.server import Server, Tool
from mcp.types import InputSchema, OutputSchema, ErrorSchema
from pydantic import BaseModel
import requests

# 1. 定义工具输入/输出/错误模型
class WeatherInput(BaseModel):
    city: str  # 城市名称
    date: str  # 日期(YYYY-MM-DD)
    unit: str = "celsius"  # 温度单位,默认摄氏度

class WeatherOutput(BaseModel):
    location: str  # 城市
    temperature: str  # 温度
    unit: str  # 单位
    description: str  # 天气描述

class WeatherError(BaseModel):
    code: int  # 错误码
    message: str  # 错误信息
    detail: dict = None  # 错误详情

# 2. 实现天气查询工具逻辑
def query_weather(input_data: WeatherInput) -> WeatherOutput:
    # 模拟调用天气 API(实际场景替换为真实 API)
    api_key = "your_weather_api_key"
    url = f"https://api.weatherapi.com/v1/forecast.json?key={api_key}&q={input_data.city}&dt={input_data.date}"
    response = requests.get(url)
    data = response.json()

    if response.status_code != 200:
        raise ValueError(f"天气查询失败:{data.get('error', {}).get('message', '未知错误')}")

    # 解析返回结果
    forecast = data["forecast"]["forecastday"][0]["day"]
    return WeatherOutput(
        location=input_data.city,
        temperature=str(forecast["avgtemp_c"] if input_data.unit == "celsius" else forecast["avgtemp_f"]),
        unit=input_data.unit,
        description=forecast["condition"]["text"]
    )

# 3. 创建 MCP Server 并注册工具
server = Server()

# 注册天气查询工具
weather_tool = Tool(
    name="weather_query",
    description="查询指定城市和日期的天气信息",
    input_schema=InputSchema(model=WeatherInput),
    output_schema=OutputSchema(model=WeatherOutput),
    error_schema=ErrorSchema(model=WeatherError),
    handler=query_weather  # 工具执行逻辑
)

server.register_tool(weather_tool)

# 4. 启动 MCP Server(基于 FastAPI)
if __name__ == "__main__":
    import uvicorn
    # 以 FastAPI 方式启动,端口 8000
    uvicorn.run(server.fastapi_app, host="0.0.0.0", port=8000)

3. 第二步:搭建 MCP Client(对接 LLM 与 MCP Server)

MCP Client 负责与 Server 通信、筛选工具、对接 LLM,核心代码如下:

from mcp.client import Client
from openai import OpenAI
import json

# 1. 初始化 MCP Client 和 LLM 客户端
mcp_client = Client(base_url="http://localhost:8000")  # 连接 MCP Server
llm_client = OpenAI(api_key="your_openai_key", base_url="https://api.openai.com/v1")

# 2. 工具筛选函数(解决 Token 浪费问题)
def filter_tools(tools, user_query: str) -> list:
    """根据用户查询筛选相关工具(简化版,实际可结合 RAG 优化)"""
    relevant_keywords = ["天气", "温度", "下雨", "晴天", "预报"]
    if any(keyword in user_query for keyword in relevant_keywords):
        return [tool for tool in tools if tool.name == "weather_query"]
    return []

# 3. 核心交互流程
def process_user_query(user_query: str) -> str:
    # 步骤 1:从 MCP Server 获取所有工具
    tools = mcp_client.list_tools()

    # 步骤 2:筛选与用户查询相关的工具
    relevant_tools = filter_tools(tools, user_query)
    if not relevant_tools:
        # 无相关工具,直接调用 LLM 回复
        response = llm_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": user_query}]
        )
        return response.choices[0].message.content

    # 步骤 3:将工具元信息转换为 LLM 可理解的格式
    llm_tools = [{
        "type": "function",
        "function": {
            "name": tool.name,
            "description": tool.description,
            "parameters": tool.input_schema.model.schema()["properties"],
            "required": [k for k, v in tool.input_schema.model.schema()["properties"].items() if v.get("required", False)]
        }
    } for tool in relevant_tools]

    # 步骤 4:调用 LLM,判断是否需要工具调用
    llm_response = llm_client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": user_query}],
        tools=llm_tools,
        tool_choice="auto"
    )
    message = llm_response.choices[0].message

    # 步骤 5:如果需要工具调用,执行 MCP Server 调用
    if hasattr(message, "tool_calls") and message.tool_calls:
        tool_call = message.tool_calls[0]
        tool_name = tool_call.function.name
        tool_args = json.loads(tool_call.function.arguments)

        # 调用 MCP Server 工具
        mcp_response = mcp_client.call_tool(tool_name, tool_args)

        # 步骤 6:将工具结果回传给 LLM,生成最终回复
        final_response = llm_client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "user", "content": user_query},
                message.model_dump(),
                {
                    "role": "tool",
                    "name": tool_name,
                    "content": json.dumps(mcp_response.content[0].text)
                }
            ]
        )
        return final_response.choices[0].message.content

    # 无需工具调用,直接返回 LLM 回复
    return message.content

# 4. 测试交互
if __name__ == "__main__":
    user_query = "查询 2025-10-01 上海的天气"
    result = process_user_query(user_query)
    print("最终回复:", result)

4. 实战效果说明

  • 运行 MCP Server 后,Client 可通过 list_tools() 获取天气工具;
  • 用户查询包含“天气”关键词时,自动筛选并传递该工具给 LLM;
  • LLM 生成工具调用参数,Client 通过 MCP 协议调用 Server,获取天气数据;
  • 最终 LLM 整合结果,返回自然语言回复,整个过程完全标准化。

5. 关键优化点(解决原文提到的 Token 浪费问题)

  • 工具筛选:仅传递与用户查询相关的工具,减少 Token 消耗;
  • 标准化调用:无论后续替换 LLM(如从 GPT-3.5 切换到 Claude),只需修改 LLM 客户端配置,无需改动 MCP 交互逻辑。

四、MCP 的生态现状与核心价值

1. 支持 MCP 的核心玩家

(1)LLM 厂商

  • 官方支持:Claude 3 全系列、GPT-4/5、Qwen-2、Llama 3;
  • 间接支持:通过 MCP Client 适配,所有支持 Function Call 的 LLM 均可接入 MCP 生态。

(2)开发工具

  • IDE 集成:Cursor、Claude Desktop、Trae(AI 编程工具);
  • 框架支持:LangChain、LlamaIndex 已集成 MCP 协议,可直接调用 MCP Server。

(3)工具市场

  • Anthropic MCP Hub:官方工具市场,提供天气、翻译、数据库等常用 MCP Server;
  • 第三方市场:GitHub 上已有上百个开源 MCP Server,覆盖办公、开发、数据分析等场景。

2. MCP 的 3 大核心价值

(1)降低开发成本:一次开发,多端复用

  • MCP Server 开发一次,可被所有支持 MCP 的 LLM、Client 调用;
  • 无需为不同 LLM 适配工具,迁移成本从 80% 降至 5%。

(2)激活工具生态:从“孤岛”到“集市”

  • 工具元信息标准化,支持跨团队、跨项目共享;
  • 工具开发者可专注功能实现,无需关心 LLM 适配,加速工具生态繁荣。

(3)增强系统稳定性:解耦带来的弹性

  • LLM 与工具解耦,替换 LLM 或工具时,不影响整体系统;
  • 中间层统一处理错误、权限、速率限制,减少重复开发。

3. MCP 尚未解决的问题与优化方案

原文提到 MCP 未完全解决所有问题,本节补充具体优化方案:

(1)工具质量参差不齐

  • 问题:工具市场缺乏质量审核,部分 MCP Server 功能简陋、稳定性差;
  • 解决方案:建立工具评分机制、官方认证体系,Client 可根据评分筛选工具。

(2)Token 浪费仍存在(筛选不精准)

  • 问题:简单的关键词筛选可能遗漏相关工具,或误选无关工具;
  • 解决方案:结合 RAG 技术,将工具描述嵌入向量数据库,根据用户查询的语义相似度筛选工具。

(3)多工具协同复杂

  • 问题:MCP 仅解决单个工具调用的标准化,多工具协同(如“查天气→订机票→订酒店”)仍需手动处理;
  • 解决方案:与 Agent 结合,让 Agent 基于 MCP 协议实现多工具的自动调度。

五、MCP 与相关技术的结合场景

MCP 不是孤立的协议,它能与 RAG、Agent、向量数据库等技术结合,发挥更大价值:

1. MCP + RAG:智能工具筛选与知识增强

  • 用 RAG 管理工具元信息,用户查询时通过语义检索筛选工具;
  • 工具返回结果后,结合 RAG 补充相关知识,提升 LLM 回复质量。

2. MCP + Agent:标准化的 Agent 工具调用

  • Agent 负责任务拆解和工具调度,MCP 负责工具调用的标准化执行;
  • 无论 Agent 对接哪个 LLM,都通过 MCP 调用工具,实现 Agent 的跨 LLM 兼容。

3. MCP + 向量数据库:工具能力的语义检索

  • 将工具的功能描述、适用场景嵌入向量数据库;
  • 用户查询时,先检索最匹配的工具,再通过 MCP 调用,提升工具调用精准度。

六、常见误区与避坑指南

1. 误区 1:MCP 是 Function Call 的替代者

  • 纠正:MCP 是 Function Call 的“标准化封装”,而非替代者;MCP 底层仍依赖 Function Call 实现 LLM 与工具的交互,只是统一了交互规范。

2. 误区 2:所有场景都需要 MCP

  • 纠正:简单场景(单个 LLM + 1-2 个工具)无需 MCP,直接用 Function Call 更高效;MCP 适合多 LLM、多工具、需长期维护的复杂场景。

3. 误区 3:MCP 会增加系统复杂度

  • 纠正:短期搭建 MCP Server 确实增加少量开发成本,但长期来看,标准化带来的复用、迁移、维护成本降低,远大于初期投入。

4. 避坑指南

  • 优先使用成熟的 MCP SDK(如 Python/Go/JS 官方 SDK),避免手动实现协议;
  • 开发 MCP Server 时,严格遵循工具元数据规范,确保兼容性;
  • 客户端必须实现工具筛选逻辑,否则会出现 Token 浪费问题;
  • 生产环境需为 MCP Server 配置监控、重试、熔断机制,避免单点故障。

七、总结:MCP 是 AI 生态的“基础设施”

MCP 的核心价值不在于“让 LLM 更聪明”,而在于“让 LLM 与工具的交互更高效、更标准、更生态化”。它就像 AI 世界的 HTTP 协议,看似简单,却为整个生态的繁荣奠定了基础。

随着 MCP 生态的完善,未来我们将看到:

  • 工具开发者:专注功能实现,一次开发即可接入所有 LLM;
  • 应用开发者:无需关心 LLM 与工具的适配,专注业务逻辑;
  • 普通用户:像装插件一样,为 LLM 添加各类工具,打造个性化 AI 助手。

对于开发者而言,现在学习 MCP 不是提前布局,而是应对 AI 工具化趋势的必备技能。无论是搭建企业内部的 AI 工具平台,还是开发面向公众的 AI 应用,MCP 都将成为不可或缺的标准化方案。

如果你正在搭建 AI 工具相关项目,不妨尝试用 MCP 规范工具交互——初期的一点投入,终将在后续的维护和扩展中得到丰厚回报。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/ren-gong-zhi-neng/4568

相关文章

  • 从技术本质到生态关联,一文吃透 AIGC、RAG、Agent、Function Call、MCP
  • AI Agent 扩展双雄:MCP 与 Agent Skill 深度拆解——从设计哲学到实战落地
  • 6款核心MCP协议工具让AI深度融入业务,告别“纸上谈兵”
  • 企业级自动化 Agent 架构深析:Prompt 演进驱动的智能工作流落地
  • LangChain 1.0 智能体实战:MCP 协议赋能工具标准化调用(从开发到落地)
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: AI Function Call MCP
最后更新:2025年11月10日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >

文章评论

1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
取消回复

我是人间惆怅客,知君何事泪纵横,断肠声里忆平生。

那年今日(04月14日)

  • 2010年:中国青海玉树大地震
  • 1894年:托马斯·爱迪生展示了其新发明活动电影放映机
  • 1629年:荷兰物理学家克里斯蒂安·惠更斯出生
  • 1578年:西班牙国王腓力三世出生
  • 605年:隋炀帝下令开凿大运河
  • 更多历史事件
最新 热点 随机
最新 热点 随机
Everything Claude Code 详细使用文档 配置Jackson使用字段而不是getter/setter来序列化和反序列化 这个域名注册整整十年了,十年时间,真快啊 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 Apollo配置中心中的protalDB的作用是什么 org.apache.ibatis.plugin.Interceptor类详细介绍及使用
AI时代,个人技术博客的出路在哪里?使用WireGuard在Ubuntu 24.04系统搭建VPN这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了做了一个WordPress文章热力图插件
开发者必懂的 AI 向量入门:从数学基础到实战应用 分代ZGC这么牛?底层原理是什么? 图解 | 原来这就是网络 使用springboot结合AI生成视频 Java枚举梳理总结一 Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法
标签聚合
设计模式 ElasticSearch docker 多线程 SpringBoot JAVA AI 分布式 MySQL JVM Spring SQL 架构 K8s IDEA WordPress 数据库 AI编程 Redis 日常
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 拾趣博客导航
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 蜗牛工作室
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos Made By Dylan

津ICP备2024022503号-3

京公网安备11011502039375号