跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

MCP 协议详解:与 Function Call 区别及使用方法

MCP(Model Context Protocol)是大模型上下文协议,用于统一 AI 大模型与外部工具的交互标准。文章通过 Python 示例演示了 Function Call 的工具配置、参数获取及结果回传流程,并分析了 MCP 协议与 Function Call 在架构设计上的差异。MCP 采用 C/S 架构,支持远程服务和本地流式传输,旨在解决不同大模型间工具调用的兼容性问题。Function Call 侧重于模型侧的指令执行,而 MCP 侧重于连接协议的标准化,两者共同推动 AI Agent 的能力扩展。

机器人发布于 2026/2/7更新于 2026/9/768 浏览
MCP 协议详解:与 Function Call 区别及使用方法

MCP 协议详解:与 Function Call 区别及使用方法

1. 什么是 MCP?

官网:https://modelcontextprotocol.io/introduction

2025 年,Anthropic 提出了 MCP 协议。MCP 全称为 Model Context Protocol,翻译过来是大模型上下文协议。这个协议的主要为 AI 大模型和外部工具(比如让 AI 去查询信息,或者让 AI 操作本地文件)之间的交互提供了一个统一的处理协议。我们常用的 USB Type-C 接口统一了 USB 接口的样式,MCP 协议就好比 AI 大模型中的 USB-C,统一了大模型与工具的对接方式。

MCP 协议采用了 C/S 架构,也就是服务端、客户端架构,能支持在客户端设备上调用远程 Server 提供的服务,同时也支持 stdio 流式传输模式,也就是在客户端本地启动 MCP 服务端。只需要在配置文件中新增 MCP 服务端,就能用上这个 MCP 服务器提供的各种工具,大大提高了大模型使用外部工具的便捷性。

MCP 是开源协议,能让所有 AI 厂商、AI 工具都将 MCP 集成到自己的客户端中,从而扩大 MCP 的可用面。毕竟只有用的人越多,协议才能不断发展,不断变得更好。

2. 了解 Function Call

在 MCP 没有出来之前,我们的 AI Agent 开发如果想调用外部工具需要针对不同的 AI 大模型 SDK 编写不同的代码,其中最为常用的是 OpenAI 提供的 Function Call 处理逻辑。

2.1. Function Call Demo

2.1.1. 配置工具,AI 提供参数

当我们调用 OpenAI Chat Completions 接口时,可以通过 tools 参数传入可供使用的外部工具。这个工具的调用中就包含了工具的作用,工具需要传入的参数,以及参数的释义。其中 tool_choice 字段设置为 auto 代表让大模型自动选择 tools,设置为 none 时不会调用外部工具。

{
  "tool_choice": "auto",
  "messages": [
    {
      "role": "system",
      "content": "你是一个天气查询助手"
    },
    {
      "role": "user",
      "content": "帮我查询上海的天气"
    }
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "获取指定城市的天气",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string",
              "description": "城市名"
            }
          },
          "required": ["city"]
        }
      }
    }
  ]
}

对应的 Python OpenAI 代码如下,我们将 tools 部分放入一个包含 dict 的 list,作为 create 函数的 tools 参数即可。同时 tool_choice 传入 auto 代表自动选择工具。这里用了硅基流动提供的 Qwen2.5 模型作为演示,运行下面这个代码需要修改 api_key 为正确值。

import openai
import json

def main():
    client = openai.OpenAI(
        api_key="xxxxx",
        base_url="https://api.siliconflow.cn/v1"
    )
    tools = [{
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "城市名"
                    }
                },
                "required": ["city"]
            }
        }
    }]
    res = client.chat.completions.create(
        model="Qwen/Qwen2.5-32B-Instruct",
        messages=[
            {"role": "system", "content": "你是一个天气查询助手"},
            {"role": "user", "content": "帮我查询上海的天气"}
        ],
        tools=tools,
        tool_choice="auto"
    )
    print("content:", res.choices[0].message.content)
    print("tools:", res.choices[0].message.tool_calls)
    print("message:", res.choices[0].message.to_dict())

if __name__ == "__main__":
    main()

运行程序,发出请求后,大模型就会根据用户提出的问题和提供的 tools,来为这个 tools 编写需要提供的参数。此时 content 会是空,不会输出内容,tool_calls 中会包含调用的工具和参数。

❯ uv run main.py
content: 
tools: [ChatCompletionMessageToolCall(id='01964be6e485603d6a2a0acbbc7eba91', function=Function(arguments='{"city": "上海"}', name='get_weather'), type='function')]
message: {'content': '', 'role': 'assistant', 'tool_calls': [{'id': '01964be6e485603d6a2a0acbbc7eba91', 'function': {'arguments': '{"city": "上海"}', 'name': 'get_weather'}, 'type': 'function'}]}

对应如下 JSON 格式响应,包含了我们的参数。

{
  "role": "assistant",
  "content": "",
  "tool_calls": [
    {
      "id": "01964be6e485603d6a2a0acbbc7eba91",
      "type": "function",
      "function": {
        "name": "get_weather",
        "arguments": "{\n \"city\": \"上海\"\n}"
      }
    }
  ]
}
2.1.2. 调用工具并让 AI 二次处理

随后,我们就可以根据这个大模型返回的参数来调用我们的函数,并得到函数的返回结果,再次与大模型进行对话。此时需要按下面的方式维护对话上下文,首先需要将第一次请求 AI 返回的结果插入到上下文中("role": "assistant" 的 json 字符串),然后再插入工具调用的数据,格式如下:

{
  "role": "tool",
  "tool_call_id": "01964be6e485603d6a2a0acbbc7eba91",
  "content": "上海天气晴朗,气温 25 度"
}

将上述工具返回结果追加到消息列表中,再次发送给大模型,大模型会根据工具返回的内容生成最终的回复给用户。

3. MCP 与 Function Call 对比

虽然 Function Call 已经实现了类似的功能,但 MCP 协议旨在解决更底层的标准化问题。

  • Function Call:通常是特定大模型 API 层面的功能实现,依赖于模型本身对工具调用的理解能力,不同厂商的实现细节可能不一致。
  • MCP 协议:是一个独立的通信协议层,定义了模型与工具之间的标准交互格式。它不依赖特定模型,而是通过标准化的连接方式(如 stdio、SSE)让任何支持 MCP 的客户端都能调用任意 MCP Server 提供的工具。

简单来说,Function Call 是模型'知道'如何调用工具,而 MCP 是规定了工具'如何'被模型发现、连接和调用的一套通用规则。MCP 的出现使得工具的开发可以独立于模型,提高了生态的兼容性。

4. 总结

MCP 协议为大模型集成外部工具提供了统一的解决方案。通过本文的 Function Call 示例,可以看到工具调用的基本流程。随着 MCP 生态的发展,未来大模型与外部系统的交互将更加标准化和便捷。

目录

  1. MCP 协议详解:与 Function Call 区别及使用方法
  2. 1. 什么是 MCP?
  3. 2. 了解 Function Call
  4. 2.1. Function Call Demo
  5. 2.1.1. 配置工具,AI 提供参数
  6. 2.1.2. 调用工具并让 AI 二次处理
  7. 3. MCP 与 Function Call 对比
  8. 4. 总结

更多推荐文章

查看全部
  • Llama-Factory 大模型微调框架详解与最佳实践
  • AI 编程:自动化代码生成、低代码与算法优化实践
  • Stable Diffusion WebUI 整合包安装与使用指南
  • Godot Copilot AI 代码生成插件安装与使用指南
  • Sobel 边缘检测算法详解
  • FPGA 入门实战:使用 Quartus II 点亮 LED
  • AI 产品经理核心能力体系与学习路径指南
  • C++ string 类原理与实战
  • Flutter BIP340 适配鸿蒙 HarmonyOS 实战:Schnorr 签名应用
  • OpenClaw 集成 GitHub Copilot 指南
  • node-llama-cpp 安装与配置:Windows、Linux 和 Mac 全平台教程
  • AI 智能体研发之路 - 工程篇(二):Dify 智能体开发平台一键部署
  • ChatGPT 降 AIGC 率指令实战:精准控制生成内容质量
  • 前端文档预览避坑指南:为何放弃微软 Office Online 接口
  • Android 离线语音识别 (STT) 高效集成与性能优化
  • 昇腾 CANN 生态语言体系解析与学习路径推荐
  • Python 最常用的 10 个内置函数详解
  • Ascend C 算子开发:从语法基础到算子实操与硬件架构
  • C++ 高性能定长内存池实现原理与测试
  • MIT 电机模式控制详解:参数、场景与调试建议

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online