AIStor 的模型上下文协议 (MCP) 服务器: 工作原理

在本系列的前几篇博文中,我们讨论了MinIO AIStor 模型上下文协议 (MCP) 服务器的用户级和管理员级功能。在第一篇博文中,我们学习了如何查看存储桶的内容、分析对象并标记它们以便将来处理。在第二篇博文中,我们还学习了如何使用管理员命令以及获取集群信息。所有这些都是通过人类语言命令以及与集群的简单交互来完成的。

现在,让我们讨论一下内部结构:它是如何工作的以及我们如何开发这个 MCP 服务器。

高级 MCP 架构

模型上下文协议 (MCP) 旨在充当大型语言模型 (LLM) 与各种资源和工具之间的通用中介。该协议与语言模型配合使用,将人类语言转换为资源或工具可接受的语言。对于 AIStor 服务器,我们将人类语言请求(例如“列出存储桶‘demo’中的对象”)转换为 MCP 工具调用,然后再转换为对 AIStor 对象存储的 SDK 调用。

MCP 工作流程中的语言转换过程如下:

1、用户要求 LLM 客户端(例如,Claude Desktop)使用自然语言执行操作(例如,“列出存储桶演示中的对象”)。

2、LLM 将请求从人类语言转换为带有参数(例如存储桶名称)的 JSON-RPC 2.0 请求。

3、该请求被发送到 MCP 服务器,服务器将其转换为来自资源 SDK(例如,适用于 Go 的 MinIO SDK)的函数调用。

4、资源将响应发送回 MCP 服务器(例如,以 Go 切片形式呈现此存储桶中的对象列表)。

5、MCP 服务器将此列表转换为纯文本或 JSON 并将其发送回客户端。

6、客户端将此响应发送给 LLM 以将其翻译成人类语言。

这是流程图。

工具和语言

MCP 提供多种适用于不同语言的 SDK。一些 SDK 由 Anthropic 提供(例如 Python、TypeScript、Kotlin 和 Java),而其他 SDK 由社区创建(例如 Go、Rust 等)。

该服务器的原型是使用 Anthropic 提供的 SDK 在 Python 中创建的。

对于生产版本,我们切换到了 Go。MinIO 对象存储软件的大部分代码都是用 Go 编写的,因此 Go 对我们来说是自然而然的选择。我们使用 MinIO SDK for Go 实现了 MCP 服务器的功能,例如列出存储桶、检索对象信息以及设置对象标签。使用 Go,我们可以轻松地为各种架构和操作系统创建和分发可执行文件。

我们使用由Mark III Labs创建的mcp-go库,该库被社区广泛接受。

服务器架构

该服务器包含 25 多个与对象存储集群配合使用的工具,包括“列出存储桶”、“获取对象标签”、“获取存储桶转换规则”等核心命令。每个函数都是对象存储集群和 MCP 客户端之间的网关。它将从集群收到的响应转换为纯文本或 JSON 格式,并将其发送到客户端(在本例中为 Claude for Desktop)。

功能根据其对集群资源的访问级别进行分组:

  • 只读工具(默认启用)
  • 可以写入集群的工具(通过–allow-write标志启用)
  • 可以删除对象和存储桶的工具(通过–allow-delete标志启用)
  • 管理工具(通过–allow-admin标志启用)

根据启动服务器时使用的标志,它会启用某些工具组。例如,allow-write在配置文件中的服务器命令中添加该标志将启用创建对象和存储桶的功能。

分配

此服务器以 Docker 容器的形式在您的主机操作系统上运行。我们决定将其作为标准 OCI 容器镜像分发,因为我们的用户更倾向于在台式机或笔记本电脑上安装容器平台(例如 Docker 或 Podman),而不是其他服务器通常使用的 Python 或 Node.js 工具。

要运行此服务器,您无需克隆存储库或安装uvPython 工具。您可以claude_desktop_config.json通过添加适当的docker或podman命令并设置必要的标志和环境变量来配置文件。

MCP 客户端

此服务器可与支持 MCP 协议的多个客户端配合使用。它已在 Claude 桌面版、Cursor IDE、mcp-cli文本客户端等平台上测试过。

安全

我们之前在博客中提到过安全方面的考虑。以下是一些实施细节。

服务器通过claude_desktop_config.json文件配置。要访问对象存储集群,您必须通过环境变量提供凭据,包括访问密钥和密钥。您可以使用个人凭据,也可以为 MCP 服务器创建一个特殊的用户帐户。我们推荐后者。创建特殊用户帐户时,您可以创建并附加细粒度的策略,仅授予该帐户访问特定存储桶和函数的权限。有关创建此类策略的信息,请参阅 MinIO 文档(访问管理 - Linux 版 MinIO 对象存储)。

序列图

让我们看一下这里更详细的事件序列图。它显示了用户、LLM、MCP 服务器和 AIStor 对象存储之间的流程。

无需解释千言万语也能理解的“一张图片”,但需要注意的是,对象不会离开对象存储。即使你询问有关图像内容的问题,它也是在对象存储集群内部进行分析,而不是由你使用的 LLM 进行分析。

结论

MinIO AIStor 的 MCP 服务器是对通过命令行和/或 UI 与对象存储交互的传统方法的绝佳补充。它就像一个通用翻译器,可以将您想要执行的操作与机器需要听到的内容进行翻译。无需再记忆复杂的命令或语法,只需用简单的语言告诉它您需要什么即可。

除了将自然语言翻译成服务器语言之外,MCP 服务器还可以利用 LLM 汇总集群信息,包括存储桶内容、存储分布和集群状态。这是仅使用 CLI 或 UI 工具无法实现的。

随着语言模型变得越来越复杂,我们与存储系统交互的方式将变得越来越自然。

MCP 服务器的安全性是近期的热门话题之一。我们内置了灵活而强大的安全机制,确保管理员仍然可以控制访问权限。我们在此服务器上实施了多层安全保护,并始终遵循最小权限原则。

借助这款 MCP 服务器,MinIO 不仅实现了对象存储的大众化,还在重新思考在这个机器越来越善于理解我们的情况下,我们如何与技术协同工作。我们期待看到您将使用这项技术实现哪些精彩的成果,以及它将如何改变您与数据的关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总

汇编语言深度指南:从基础到字符串操作

基础知识 CPU简介 CPU是计算机的核心,负责: 执行机器指令:解码并执行二进制指令 mov eax, 5 ; 将值5移动到EAX寄存器暂存少量数据:通过内部寄存器快速存取访问存储器:读写内存数据 mov [0x1000], eax ; 将EAX值…

树莓派5-ubuntu 24.04 安装 ros环境

在开始安装ros环境前,需要确保已经准备好了以下操作 1.树莓派5开发板,已经烧录了 ubuntu 24.04,并做好了一些基础配置,如:远程访问配置,语言配置,网络配置等 2.新手建议在上面安装一个宝塔面板…

【狂飙AGI】第2课:大模型方向市场分析

目录 (一)产业规模(二)政策引导(三)人才需求(四)工作年限(五)年薪分析(六)薪资情况分析(七)地域及匹配薪资&am…

word用endnote插入国标参考文献

1.在endnote中先设置output style为我的GB格式 参考 Endnote使用——参考文献的插入及引用_endnote怎么引用参考文献-CSDN博客 已经修改好的GB导出格式:Chinese Std GBT7714 (numeric)-spx.ens Peixuan Shu/Chinese_Std_GBT7714 - 码云 - 开源中国 把这个style…

Peiiieee的Linux笔记(1)

基本指令 1. ls指令 语法:ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其它信息。 -a:列出目录下的所有文件,包括以.开头的隐含文件。 -l&am…

Docker快速构建并启动Springboot程序,快速发布和上线/

Docker部署SpringBoot 1.工作木目录:/mnts/jar_work/vx_kefu/ruoyi_ruoyiwechatinfo 里面的目录是lib文件夹,logs文件夹,Dockerfile文件,SpringBoot的jar包,start.sh的命令,stop.sh的命令,tpid文件进程。 …

RT-Thread Studio 配置使用详细教程

文章目录 一、新建工程1.1 创建基于芯片的工程1.1.1 选择创建的rtt版本1.1.2 配置工程基本属性1.1.3 初创工程目录结构1.1.4 修改时钟配置1.1.5 配置调试下载器 1.2 创建基于开发板的工程 二、配置内核三、配置组件四、配置软件包五、适配配置六、其它问题 一、新建工程 1.1 创…

React 中的 useCallback 入门指南:是真需要,还是假怪?

在学习 React 时,很多人初步接触 useCallback 都有一个同样的疑问: “useCallback 到底是干啥的?不是简单地就是‘缓存一个函数’吗?我一直不明白它真正有什么用。” 这篇文章就来给你一个全方位、实操、有例实的 useCallback 入门…

14.计算机网络End

计算机网络end 一、概念 网络协议三要素:语法、语义、同步TCP/IP中为运输层提供服务的层级:网际层计算机网络性能指标(答5个即可): 带宽时延吞吐量往返时间(RTT)利用率 交换式以太网用户带宽&…

Next.js + Supabase = 快速开发 = 高速公路

Next.js Supabase介绍一下这2个好的,直说重点: ✅ Next.js:React 的“终极形态” 一句话概括: Next.js 是基于 React 的 Web 框架,帮你快速构建全栈应用,支持 SSR(服务端渲染)、AP…

机器学习用于算法交易(Matlab实现)

机器学习用于算法交易(Matlab实现) 摘要 随着金融市场的复杂性和交易量的不断增长,传统交易方式逐渐暴露出局限性,算法交易因其高效性和精准性已成为主流趋势。在此背景下,将机器学习融入算法交易具有重要的研究意义…

day64—回溯—组合数(LeetCode-77)

题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2: 输入&#xff1a…

机器学习与深度学习21-信息论

目录 前文回顾1.信息上的概念2.相对熵是什么3.互信息是什么4.条件熵和条件互信息5.最大熵模型6.信息增益与基尼不纯度 前文回顾 上一篇文章链接:地址 1.信息上的概念 信息熵(Entropy)是信息理论中用于度量随机变量不确定性的概念。它表示了…

chrome138版本及以上el-input的textarea输入问题

描述 项目基于vue2 element UI 问题简述&#xff1a;Chrome138及以上版本&#xff0c;把组件中的el-input的textarea的disabled属性从true设为false&#xff0c;无法输入 封装了一套表单输入组件&#xff0c;其中的textarea如下&#xff1a; <div v-if"item.type te…

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…

TASTE-Rob:推进面向任务的手-目标交互视频生成,实现可通用的机器人操作

25年3月来自香港中文大学的论文“TASTE-Rob: Advancing Video Generation of Task-Oriented Hand-Object Interaction for Generalizable Robotic Manipulation”。 本文也是在解决现有数据集和模型在面向任务的手部-目标交互视频生成方面的关键限制&#xff0c;这是为机器人模…

Trae AI IDE 全网最全的使用教程

Trae AI IDE 全网最全的使用教程 近期&#xff0c;字节发布了一款 AI Coding 产品 —— Trae&#xff0c;它是一款对标 Cursor 和 Windsurf 的全新 IDE&#xff0c;也是一款真正为中文开发者量身定制的工具&#xff0c;可谓是中文开发者的福音。 其优雅的 UI、丝滑的交互、母语…

GraspCorrect:通过视觉-语言模型引导反馈进行机器人抓握矫正

25年3月来自韩国 POSTECH 的论文 “GraspCorrect: Robotic Grasp Correction via Vision-Language Model-Guided Feedback”。 尽管机器人操作技术取得了显著进步&#xff0c;但实现一致且稳定的抓取仍然是一项根本挑战&#xff0c;常常限制复杂任务的成功执行。分析表明&…

浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用&#xff0c;首先下载一个这东西&#xff1a; npm install babel-loader -D webpack配置&#xff1a; const path requir…