【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

Linux 用户和组的创建机制

Linux 用户和组的创建机制

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 Linux 用户和组的创建机制 问题提出 从图中,可以看出,我创建了一个张三的用户,并添加到Linux组里 查看Linux组,也存在张三的用户。但是我检查当前家目录权限时,显示zhangsan用户,在zhangsan组下: 问题是我并没有创建zhangsan组呀!更没有把zhangsan用户添加到zhangsan组下!通过问deepseek才了解到根本原因。分享给大家。 为什么显示的是 zhangsan 组而不是 linux 组? 查看用户信息 逐部分解析: 1. uid=1001(zhangsan) * uid:用户ID(User ID) * 1001:系统分配给

By Ne0inhk
【Linux】应用层协议http

【Linux】应用层协议http

一. HTTP 协议介绍 HTTP(HyperText Transfer Protocol)超文本传输协议,是互联网中客户端与服务器传输的协议。HTTP 无连接无状态,每次请求都是独立的,每次请求都要重新创建新链接,需要 session 和 cookie 保存登陆信息状态;始终由客户端发送请求,服务端不会向客户端发送请求;可以传输多种数据格式,音频视频图片等等。 二. HTTP 协议工作过程 当我们在浏览器输入一个网址时,此时浏览器会给服务器发送一个 HTTP 请求,服务器收到这个请求之后,经过计算返回一个 HTTP 响应。 客户端是主动访问的一端发起请求的一端,服务端是被动接受请求的一端,请求是客户端发送给服务端的数据,响应是服务端返回给客户端的数据。 三. HTTP 协议格式 了解了 HTTP 就是网络通信的协议之后,我们来大致看看协议请求和响应的协议格式 请求格式: 请求格式包含请求方法,url,http版本,请求报头,以及正文;

By Ne0inhk
鸿蒙电商购物全栈项目——数据安全与合规

鸿蒙电商购物全栈项目——数据安全与合规

《鸿蒙APP开发从入门到精通》第39篇:鸿蒙电商购物全栈项目——数据安全与合规 🛡️📝📊 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第39篇——数据安全与合规篇,100%承接第38篇的数据分析与商业洞察场景,并基于电商购物场景的数据安全与合规要求,设计并实现鸿蒙电商购物全栈项目的数据安全与合规功能。 学习目标: * 掌握鸿蒙应用数据安全的核心设计与实现; * 实现数据加密、数据脱敏、数据备份; * 理解数据合规的战略设计与实现; * 实现GDPR合规、用户数据权益保护、数据审计; * 掌握数据安全与合规的协同管理策略; * 优化电商购物项目的数据安全与合规水平。 学习重点: * 鸿蒙应用数据安全的全流程设计原则; * 数据合规的战略规划与技术落地; * 数据安全与合规的协同管理策略。 一、 数据安全基础 🛡️ 1.1 数据安全定义 数据安全是指保护电商购物项目中的数据安全,主要包括以下方面: * 数据加密:加密数据; * 数据脱敏:脱敏数据; * 数据备份:备份数据。 1.2 数据安全架构 数据安全采用分层架构,

By Ne0inhk
指尖的诗篇:在Vim的世界里书写代码与梦想,Linux下vim编辑器的使用详解

指尖的诗篇:在Vim的世界里书写代码与梦想,Linux下vim编辑器的使用详解

文章目录 * 前言 * 一、Vim的起源与背景 * 1.1 安装vim * 二、Vim的模式设计:极简而深邃 * 三、vim的强大功能 * 3.1 打开和退出文件 * 3.2 基本编辑操作 * 3.3 移动光标 * 3.4 删除文字 * 3.5 复制 * 3.6 替换 * 3.7 更改 * 3.8 跳至指定的行 * 3.9 撤销上一次操作 * 3.10 查找和替换 * 四、vim的强大功能 * 四、Vim的学习曲线:一段与自我对话的旅程 * 小结 前言 在浩瀚的Linux世界中,

By Ne0inhk