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

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

MCP(Model Context Protocol)是由 Anthropic 提出的大模型上下文协议,旨在统一 AI 大模型与外部工具之间的交互标准。对比了传统 Function Call 与 MCP 协议的差异,分析了 Function Call 在配置工具、传递参数及维护上下文时的流程,并通过 Python SDK 示例展示了具体实现。此外,文章还补充了 MCP 的基本使用方式,介绍了基于 C/S 架构和 stdio 模式的客户端与服务端配置方法,帮助开发者理解如何利用 MCP 扩展大模型能力。

神经兮兮发布于 2026/2/4更新于 2026/9/106.4K 浏览
MCP 协议详解:与 Function Call 的区别及使用方式

MCP 协议详解

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": "{"city": "上海", "temperature": 25, "condition": "Sunny"}"
}

将上述工具响应添加到消息列表中,再次发送给大模型,大模型即可根据工具返回的数据生成最终的自然语言回答。

3. 如何使用 MCP?

MCP 的使用主要涉及客户端和服务端的配置。在 Python SDK 中,通常通过创建 MCP Client 实例并连接 Stdio 或 HTTP 服务端来实现。

  1. 安装依赖:确保安装了 mcp 相关的 Python 包。
  2. 配置服务端:定义一个 MCP Server,注册可用的 Tools 或 Resources。
  3. 建立连接:在客户端初始化时指定连接方式(如 stdio 命令或 URL)。
  4. 调用工具:通过客户端 API 触发工具执行,并将结果反馈给 LLM。

这种架构使得不同的大模型可以复用同一套工具生态,无需为每个模型单独编写适配代码。

目录

  1. MCP 协议详解
  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?

更多推荐文章

查看全部
  • Python 和 C++ 的性能差距,到底有多大
  • 北大法律大模型 ChatLaw 技术解析:版本、架构与训练细节
  • 大模型核心面试题与关键技术解析
  • 从深度伪造到深度信任:AI 安全的三场攻防战
  • 哈希算法:数字世界的安全指纹,从原理到实用全解析
  • 无人机 RemoteID 合规指南:ArduRemoteID 开源方案详解
  • FastReport Open Source:.NET 报表生成解决方案解析
  • Arcade:Python 轻量级 2D 游戏开发库入门与实战
  • C++ 类和对象:构造函数细节、静态成员、友元函数及编译器优化
  • 企业级 Code RAG 与代码库 Copilot 深度架构指南
  • Python 兼职接单常见方式与注意事项指南
  • Camunda 服务任务(Service Task)的 5 种实现方式详解
  • 2026 年 3 月科技圈大事件:AI 智能体爆发与芯片战争升级
  • FPGA DDR4 读写基础:MIG IP 核控制信号详解
  • Spring Cloud 微服务:Sentinel vs Resilience4j 深度对比与选型指南
  • 马腾宇发布首个多模态嵌入模型 voyage-multimodal-3 实现检索 SOTA
  • TRAE 接入方舟 Coding Plan 配置教程
  • 大疆无人机开发实战指南:MSDK/PSDK/上云 API
  • WEBGIS:空间数据库创建、数据发布与 WMS 服务调用
  • Graylog 开源日志管理平台使用指南

相关免费在线工具

  • 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