【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】VSCode Remote-SSH 无法连接并反复要求输入密码问题详解

【Linux】VSCode Remote-SSH 无法连接并反复要求输入密码问题详解

文章目录 * 一、问题现象描述 * 1. 典型表现 * 2. 常见的误区尝试 * 二、原因分析 * 三、解决方案详解 * 1. 首选方式:清除服务器上的 vscode-server * 2. 备选方式:使用 Remote-SSH 提供的清理命令 * 3. 验证连接是否恢复正常 * 四、其他可能性排查 * 1. 检查 SSH 密钥方式是否启用 * 2. 确保服务器未被防火墙或权限阻止 * 3. 更新 Remote-SSH 插件 Visual Studio Code(简称 VS Code)作为一款广受欢迎的轻量级编辑器,其 Remote-SSH 插件为开发者带来了便捷的远程开发体验。然而,在使用 Remote-SSH 插件连接远程服务器的过程中,很多用户会遇到输入密码后仍无法连接的问题,甚至被持续提示输入密码。

By Ne0inhk
Flutter 三方库 dart_style — 鸿蒙应用全方位代码格式化与规范治理神器,实现鸿蒙深度适配下的工程化整洁代码规范全实战

Flutter 三方库 dart_style — 鸿蒙应用全方位代码格式化与规范治理神器,实现鸿蒙深度适配下的工程化整洁代码规范全实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter 三方库 dart_style — 鸿蒙应用全方位代码格式化与规范治理神器,实现鸿蒙深度适配下的工程化整洁代码规范全实战 前言 在鸿蒙(OpenHarmony)大型项目的多人协作中,代码风格的不统一是引发合并冲突(Merge Conflict)和降低 Code Review 效率的首要原因。有人喜欢两格缩进,有人喜欢四格;有人喜欢在 Widget 的末尾加逗号,有人则反其道而行。 dart_style 提供了一个官方推荐的、具有“强迫症风格”的代码格式化程序。它是 dart format 指令背后的灵魂所在。在 Flutter for OpenHarmony 的工程化体系中,强制落地 dart_style 规范,不仅能让鸿蒙应用的代码变得美观统一,更能通过消除非必要的空白字符差异,显著降低

By Ne0inhk
【2026 OPC计划】3分钟部署OpenClaw(Mac/Windows/阿里云)

【2026 OPC计划】3分钟部署OpenClaw(Mac/Windows/阿里云)

3分钟部署OpenClaw(Mac/Windows/阿里云 * 一、MacOS主流部署方案 * 二、Windows部署流程 * 三、基于阿里云的Moltbot部署流程 * 1 选购轻量服务器 * 2 创建阿里百炼API-KEY * 3 开启服务 一、MacOS主流部署方案 首先是MacOS上如何安装OpenClaw。可以说截止目前,OpenClaw对Mac系统是最友好的,不仅安装流程简单、运行稳定,甚至还推出了专门的MacOS App。 在Mac中安装OpenClaw,首先我们需要先安装Node.js基础运行环境,登陆nodejs.org即可下载对应操作系统的安装包, 具体的Node.js的安装过程非常简单,根据提示,一路点击下一步即可,安装完成后按住command+空格,搜索并打开终端,先输入node -v确认Node.js的版本号,需要确保大于V22, node -v 然后输入npm install命令,来安装OepnClaw, npm install -g openclaw@

By Ne0inhk
Flutter 三方库 midi_util 的鸿蒙化适配指南 - 实现标准 MIDI 协议的消息解析、支持电子乐器底层的指令通讯与音符数据处理

Flutter 三方库 midi_util 的鸿蒙化适配指南 - 实现标准 MIDI 协议的消息解析、支持电子乐器底层的指令通讯与音符数据处理

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 midi_util 的鸿蒙化适配指南 - 实现标准 MIDI 协议的消息解析、支持电子乐器底层的指令通讯与音符数据处理 前言 在进行 Flutter for OpenHarmony 的音乐编创、教学或专业音频应用开发时,与电子乐器(如电子琴、打击垫)进行数字通信是不可或缺的功能。midi_util 是一个专注于 MIDI(Musical Instrument Digital Interface)协议编解码的轻量级工具库。它能让你在鸿蒙端以对象化的方式处理复杂的字节流指令。本文将探讨如何在鸿蒙系统下构建专业的 MIDI 交互流。 一、原原理性解析 / 概念介绍 1.1 基础原理 midi_util 核心是对 MIDI 1.

By Ne0inhk