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

MCP 协议详解:与 Function Call 的区别及 Python 实践

本文深入解析了 MCP(Model Context Protocol)协议的概念及其与 Function Call 的核心区别。通过对比传统 Function Call 在 AI Agent 开发中的多 SDK 适配痛点,阐述了 MCP 如何通过统一 C/S 架构和 stdio 模式简化大模型与外部工具的交互。文中提供了基于 Python SDK 的完整 Function Call 实战示例,涵盖工具配置、参数提取及上下文维护流程,帮助开发者理解从非标准化调用向标准化协议过渡的技术路径。

嘘发布于 2026/3/15更新于 2026/9/1168 浏览
MCP 协议详解:与 Function Call 的区别及 Python 实践

1. 什么是 MCP?

官网:Model Context Protocol

2025 年,Anthropic 提出了 MCP(Model Context Protocol)协议。简单来说,这是大模型上下文协议,旨在为 AI 大模型和外部工具之间的交互提供一个统一的处理标准。就像 USB-C 接口统一了物理连接方式一样,MCP 试图统一大模型调用工具的对接规范。

MCP 采用 C/S(客户端/服务端)架构,支持在客户端设备上调用远程 Server 提供的服务,同时也支持 stdio 流式传输模式,这意味着你可以在本地启动 MCP 服务端。只需在配置文件中新增 MCP 服务端,就能让大模型便捷地使用各种外部工具。

image.png

作为开源协议,MCP 鼓励所有 AI 厂商和工具将其集成到客户端中。生态越丰富,协议的生命力就越强。

2. 了解 Function Call

在 MCP 普及之前,AI Agent 开发若要调用外部工具,往往需要针对不同的大模型 SDK 编写适配代码。其中最为经典的是 OpenAI 提供的 Function Call 处理逻辑。

2.1. Function Call Demo
2.1.1. 配置工具,AI 提供参数

调用 Chat Completions 接口时,可以通过 tools 参数传入外部工具定义。这包含了工具的作用、所需参数及其释义。其中 tool_choice 字段设为 auto 代表让大模型自动选择是否调用工具,设为 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 代码如下。我们将工具列表放入 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()

运行后,大模型会根据用户问题和提供的工具生成参数。此时 content 通常为空,而 tool_calls 会包含调用的工具名称及参数。

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

响应 JSON 格式如下,清晰展示了参数结构:

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

拿到参数后,我们需要执行实际函数并将结果返回给大模型进行二次处理。这一步的关键是维护对话上下文:首先插入第一次请求的 Assistant 消息,然后追加一条 role: "tool" 的消息,内容即为函数执行结果。

{
  "role": "tool",
  "tool_call_id": "01964be6e485603d6a2a0acbbc7eba91",
  "content": "{'temperature': 25, 'city': '上海'}"
}

将这条消息加入上下文再次发送给模型,它就能结合真实数据给出最终回答。这种流程虽然有效,但每个模型的实现细节可能不同,导致 Agent 开发时需要针对特定 SDK 做适配。而 MCP 的出现,正是为了标准化这一过程。

目录

  1. 1. 什么是 MCP?
  2. 2. 了解 Function Call
  3. 2.1. Function Call Demo
  4. 2.1.1. 配置工具,AI 提供参数
  5. 2.1.2. 调用工具并让 AI 二次处理

更多推荐文章

查看全部
  • Java 继承复用避坑指南:常见陷阱与最佳实践
  • USB PD 协议深度解析:CC 引脚通信与 BMC 编码原理
  • 纯 Java 手写 TopoJSON 生成器:零依赖实现 GeoJSON 转换
  • AR Core 与 CameraX 融合:测量应用原理与实现
  • Android 用 AccessibilityService 做钉钉自动签到
  • Python 安装详细教程
  • Qwen3 与 Qwen Agent 智能体开发实战:接入 MCP 工具
  • 使用 Dify 低代码平台快速构建第一个 AI 应用
  • MCP 插件实战:Browser Tools 集成指南
  • 架构漫谈:什么是软件架构
  • 前端国际化开发实践:基于 i18next
  • C++ string 类基础用法与经典例题解析
  • AI 大模型在政务领域的落地应用与案例分析
  • 二分查找实战:A-B 数对与高考志愿问题解析
  • SpringBoot 项目创建的 5 种主流方式
  • PostgreSQL 模式 (SCHEMA) 详解:数据库对象的命名空间管理
  • 前端地图开发基础:服务类型、坐标系与 SDK 选型
  • Python 3.11.14 安装指南及安全修复说明
  • GitHub 日榜精选(2026-01-08):AI Agent、Web 分析与开发工具
  • C++ 面向对象:多态的概念与实现原理

相关免费在线工具

  • 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