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

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

MCP(Model Context Protocol)是大模型上下文协议,旨在统一 AI 大模型与外部工具的交互方式。相较于 Function Call 需针对不同模型定制开发,MCP 采用 C/S 架构支持远程或本地服务调用。通过 Python SDK 示例解析了 Function Call 的工作流程,涵盖工具配置、参数传递及上下文维护机制。

落日余晖发布于 2026/2/8更新于 2026/10/25107 浏览
MCP 协议详解:与 Function Call 区别及使用方法

1. 什么是 MCP?

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

2025 年,Anthropic 提出了 MCP 协议。MCP 全称为 Model Context Protocol,翻译过来是大模型上下文协议。这个协议的主要为 AI 大模型和外部工具(比如让 AI 去查询信息,或者让 AI 操作本地文件)之间的交互提供了一个统一的处理协议。我们常用的 USB TypeC 接口(USB-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  # 1.75.0
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 度"
}

将上述消息追加到 messages 列表中,再次发送给大模型,大模型会根据工具返回的内容生成最终的回答给用户。通过这种方式,实现了 AI 与外部工具的闭环交互。

目录

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

更多推荐文章

查看全部
  • 金仓 KES V9 兼容 MongoDB 的运维替代思路
  • Java SpringBoot+Vue3+MyBatis 英语知识应用网站系统架构设计
  • 技术拆解:用 Web Audio API 实现音乐可视化动效
  • 数据结构入门:详解顺序表的实现与操作
  • 多旋翼无人机电源系统详解
  • C/C++ 算法入门:一维动态规划基础实战
  • PaperRed AI 论文写作与查重工具功能详解
  • 基于 AR 眼镜的 Android 亲戚称呼助手开发
  • Flutter 三方库 discord_interactions 的鸿蒙化适配指南
  • Stable Diffusion WebUI 云端环境搭建与参数调优实战
  • Faster-Whisper 本地实时语音识别部署实战
  • DeerFlow 2.0:基于 LangGraph 的开源智能体编排框架
  • 基于 Spring Boot 的教室信息管理系统设计与实现
  • Spring 国际化核心原理详解:4 大组件实现企业级多语言开发
  • 重要算法思想:贪心、二分、正难则反、多重与完全背包精练
  • Web 自动化测试入门指南:从概念到 Selenium 实战
  • SmolRTSP:嵌入式系统高效 RTSP 流媒体服务实践
  • 基于 GLM 4.7 与 Flutter 开发 AI 漫剧 APP 实战
  • AI 绘画:GPU 算力租赁助力数字艺术创作
  • AI 绘画关键词网站效率提升实战:从数据预处理到模型加速

相关免费在线工具

  • 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