【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/mac/wsl如何使用claude code,并配置免费的硅基流动API?(官方的需要付费订阅)

具体操作: 方式一:一键安装及配置脚本 1. 在终端中运行以下命令: bash -c "$(curl -fsSL https://sf-maas-uat-prod.oss-cn-shanghai.aliyuncs.com/sample/ccsf_v260130.sh)" 切换模型使用目前 Claude Code 并不支持添加多个自定义模型(Custom Model),您可以再次执行上述 1~5 步,选择并更新 ANTHROPIC_MODEL 环境变量的方式切换模型 方式二:手动配置 Claude Code 环境变量(注意,需要先安装claude code,用本文方式一里的命令) 如果你想手动配置 Claude Code 的环境变量,可以在终端中运行下列命令: export ANTHROPIC_

By Ne0inhk
HarmonyOS 跨端游戏开发实战:从手机触控到 PC 键鼠操作的统一架构设计

HarmonyOS 跨端游戏开发实战:从手机触控到 PC 键鼠操作的统一架构设计

HarmonyOS 跨端游戏开发实战:从手机触控到 PC 键鼠操作的统一架构设计 引言 随着 HarmonyOS PC 正式商用,鸿蒙生态首次具备了覆盖移动与桌面的游戏分发能力。对独立开发者和小型团队而言,这意味着一个前所未有的机会: 用一套代码,同时发布手机休闲游戏与 PC 端轻量级游戏,触达更广用户群。 但挑战也随之而来: * 手机依赖 触屏滑动/点击,PC 依赖 键盘+鼠标; * 手机性能受限需降帧,PC 可跑 60fps 甚至 120fps; * 手机为全屏沉浸,PC 需支持窗口化、多开、最小化暂停。 若简单“放大手机版”,PC 用户将因操作反人类而迅速流失。 本文将以一款 2D 物理益智游戏《Ball Bounce》(类似《弹球消除》)为例,手把手教你构建真正跨端的

By Ne0inhk
[笔记] 最新版 - JRebel 插件激活与配置教程 : 高效开发的必备指南,包含许可证服务器完整部署指南

[笔记] 最新版 - JRebel 插件激活与配置教程 : 高效开发的必备指南,包含许可证服务器完整部署指南

文章目录 * 不好意思了,各位,我给我部署的服务停掉了。有人攻击部署的服务器,是我想得太好了,真恶心。 * 一. 安装插件 && 激活 * 1. 安装插件 * 2. 激活 JRebel * 二. 相关设置 * 1. JRebel设置成离线工作模式 * 2. 设置自动编译 * 3. 打开运行时编译 * 4. 修改热部署时间 * 三. 使用 不好意思了,各位,我给我部署的服务停掉了。有人攻击部署的服务器,是我想得太好了,真恶心。 在现代软件开发中,提高开发效率是每个程序员的追求。JRebel 作为一款强大的热部署工具,能够显著减少应用程序重启时间,帮助开发者快速看到代码修改后的效果。本文将详细介绍 JRebel 的安装、激活方法以及相关设置,并解决常见问题,助你轻松上手并高效使用这一工具。 * jrebel 官网 :jrebel

By Ne0inhk
Flutter for OpenHarmony:icon_font_generator — 自动化图标字体工作流

Flutter for OpenHarmony:icon_font_generator — 自动化图标字体工作流

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 前言 在鸿蒙(OpenHarmony)应用中,使用 IconFont 是优化性能与包体积的最佳实践。icon_font_generator 命令行工具能将 SVG 图标一键转换为 .ttf 字体文件并生成 Dart 引用类,大幅提升了图标资产管理的自动化程度。 一、核心价值 1.1 基础概念 图标字体的本质是将矢量图映射到字体的特定“码点”(Glyph)上。 引用名字 SVG 图标文件夹 icon_font_generator HarmonyIcons.ttf: 字体文件 harmony_icons.dark: 代码类 IconData: 名字对应码点 鸿蒙 UI 页面

By Ne0inhk