【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?

【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?

本文介绍了MCP大模型上下文协议的的概念,并对比了MCP协议和function call的区别,同时用python sdk为例介绍了mcp的使用方式。

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服务器提供的各种工具,大大提高了大模型使用外部工具的便捷性。

image.png

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.0import json # 后续会用到jsondefmain(): 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())

运行程序,发出请求后,大模型就会根据用户提出的问题和提供的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格式响应,包含了我们的参数

"message":{ "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",

Read more

Flutter for OpenHarmony: Flutter 三方库 dio_smart_retry 让鸿蒙应用的网络请求具备“由于断网瞬间”自动治愈的能力(网络高可用专家)

Flutter for OpenHarmony: Flutter 三方库 dio_smart_retry 让鸿蒙应用的网络请求具备“由于断网瞬间”自动治愈的能力(网络高可用专家)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的移动端应用开发时,网络环境的不稳定性是常态: 1. 网络切换:用户从电梯出来,Wi-Fi 切换为 5G。 2. 瞬时波动:隧道内信号闪断,导致 API 请求超时。 3. 服务端偶发异常:后端由于负载均衡调整,短暂返回 503。 如果每次波动都直接弹窗报错“网络不可用”,用户体验会极差。dio_smart_retry 是流行的网络库 Dio 的王牌插件。它能根据配置,在网络抖动时自动、优雅地进行重试,让你的鸿蒙应用具备“自愈”能力。 一、网络异常重试决策模型 该插件拦截异常,并根据策略判断是否需要再次发起请求。 符合重试条件 不符合/达到上限 发起网络请求

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 cross_file 为鸿蒙多端提供统一的文件抽象接口(跨平台文件处理基石)

Flutter for OpenHarmony: Flutter 三方库 cross_file 为鸿蒙多端提供统一的文件抽象接口(跨平台文件处理基石)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 OpenHarmony 应用开发中,文件操作是一个极其常见的需求(如上传图片、读取配置、保存日志)。然而,由于 Flutter 运行在多个平台上,文件在各个环境的表现形式差异巨大: * 在鸿蒙/Android/iOS 上,文件是真实的磁盘路径(path/to/file)。 * 在 Web 浏览器上,文件只是内存中的一串二进制(Blob)。 这就导致你编写的代码由于平台不同而变得支离破碎。cross_file (即著名的 XFile) 解决了这个难题。它提供了一个通用的、不依赖平台的抽象类,让你能用同一套逻辑处理鸿蒙物理文件和 Web 虚拟文件。 一、核心抽象设计解析 cross_file 的核心是 XFile 类。它屏蔽了底层存储的实现细节。

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 image_size_getter 零加载极速获取图片尺寸(鸿蒙 UI 布局优化必备)

Flutter for OpenHarmony: Flutter 三方库 image_size_getter 零加载极速获取图片尺寸(鸿蒙 UI 布局优化必备)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用布局时,我们经常遇到这样的挑战:为了防止 UI 抖动,需要在图片完全加载前预留一段占位空间。如果直接使用 Image.network 或 Image.file,直到图片解码完成前,我们都无法获知其宽高比。如果此时一次性加载大量高清大图,仅为了获取尺寸而消耗内存和流量,显然是不理智的。 image_size_getter 是一个极其聪明的库。它通过读取图片头部的少量二进制字节(通常只有几百字节),就能瞬间识别出 JPG、PNG、GIF、WebP 甚至 PSD 的原始尺寸。 一、核心原理图解 该库通过解析各种图片格式的 Header 结构实现免解码探测。 本地/网络图片文件 读取前 1KB 字节流 校验魔数

By Ne0inhk
Flutter 三方库 fast_base 的鸿蒙化适配指南 - 实现极速的基础架构搭建、支持响应式 Repository 封装与业务模型注入

Flutter 三方库 fast_base 的鸿蒙化适配指南 - 实现极速的基础架构搭建、支持响应式 Repository 封装与业务模型注入

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 fast_base 的鸿蒙化适配指南 - 实现极速的基础架构搭建、支持响应式 Repository 封装与业务模型注入 前言 在进行 Flutter for OpenHarmony 的快速迭代码开发中,重复编写数据转换、异常处理、Repository 模板是极大的资源浪费。fast_base 是一个专注于提升底层基建效率的类库。它通过一套高度封装的 API,让开发者在几分钟内就能构建起一套具备错误处理和响应式特性的业务层。本文将探讨如何在鸿蒙端利用 fast_base 打造敏捷开发的“特种兵”级架构。 一、原理解析 / 概念介绍 1.1 基础原理 fast_base 采用了典型的分层架构思想。它提供了一套基类(Base Classes),内部集成了对异步流的自动管理、

By Ne0inhk