跳到主要内容
极客日志极客日志面向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/10/24100 浏览
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 二次处理

更多推荐文章

查看全部
  • 零基础网络安全入门学习路线与技术指南
  • Web 虚拟卡销售平台:Spring Boot + Vue 全栈实现方案
  • 数据库事务核心解析:ACID 特性、并发异常与隔离级别
  • 基于 Rokid 灵珠平台搭建旅游 AR 智能体实战
  • Python 性能分析实战:从 cProfile 到火焰图,精准定位性能瓶颈
  • Java 拼图小游戏开发:基于 Swing 的完整实现
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • Claude Code 辅助 Verilog 编程实战
  • 零基础黑客入门:普通人成为安全专家的十个步骤
  • Cursor 辅助开发 Web 版背单词应用实战
  • Linux 实践:匿名管道与 Shell 外壳程序完善
  • Kubernetes 边缘 AI 部署与运维最佳实践
  • 利用 PowerToys 将 Copilot 键映射为右 Ctrl 键
  • 使用 Servlet 快速构建 Web 应用原型
  • EhViewer:安卓端开源免费的 E-Hentai 漫画浏览工具安装与使用指南
  • 主流 Python IDE 优缺点对比与选型指南
  • Vitis 平台 AI 模型 FPGA 部署实战指南
  • Python 基础语法:数字、表达式与字符串
  • TanStack Table 核心特性与选型分析
  • VR + 具身智能 + 人形机器人:通往现实世界的智能接口

相关免费在线工具

  • 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