Spring AI 智能体通过 MCP 集成本地文件数据

news/2025/1/10 0:46:51/文章来源:https://www.cnblogs.com/o-O-oO/p/18663142

以下文章来源于阿里云云原生 ,作者刘军

一、Model Context Protocol(MCP)简介

模型上下文协议(即 Model Context Protocol,MCP)[1]是一个开放协议,它规范了应用程序如何向大型语言模型(LLM)提供上下文。MCP 提供了一种统一的方式将 AI 模型连接到不同的数据源和工具,它定义了统一的集成方式。在开发智能体(Agent)的过程中,我们经常需要将将智能体与数据和工具集成,MCP 以标准的方式规范了智能体与数据及工具的集成方式,可以帮助您在 LLM 之上构建智能体(Agent)和复杂的工作流。
目前已经有大量的服务接入并提供了 MCP server 实现[2],当前这个生态正在以非常快的速度不断的丰富中。

二、Spring AI MCP 简介

Spring AI MCP 为模型上下文协议提供 Java 和 Spring 框架集成。它使 Spring AI 应用程序能够通过标准化的接口与不同的数据源和工具进行交互,支持同步和异步通信模式。

Spring AI MCP 采用模块化架构,包括以下组件:

Spring AI 应用程序:使用 Spring AI 框架构建想要通过 MCP 访问数据的生成式 AI 应用程序

Spring MCP 客户端:MCP 协议的 Spring AI 实现,与服务器保持 1:1 连接

MCP 服务器:轻量级程序,每个程序都通过标准化的模型上下文协议公开特定的功能

本地数据源:MCP 服务器可以安全访问的计算机文件、数据库和服务

远程服务:MCP 服务器可以通过互联网(例如,通过 API)连接到的外部系统

三、通过一个示例快速体验 Spring AI MCP

这里我们提供一个示例智能体应用,这个智能体可以通过 MCP 查询或更新本地文件系统,并以文件系统中的数据作为上下文与模型交互。次示例演示如何使用模型上下文协议(MCP)将 Spring AI 与本地文件系统进行集成。

示例完整源码[3]:https://github.com/springaialibaba/spring-ai-alibaba-examples/spring-ai-alibaba-mcp-example

示例架构(源码说明)

前文中我们讲解了 Spring AI 与 MCP 集成的基础架构,在接下来的示例中,我们将用到以下关键组件:

1、 MCP Client,与 MCP 集成的关键,提供了与本地文件系统进行交互的能力。

2、 Function Callbacks,Spring AI MCP 的 function calling 声明方式。

3、 Chat Client,Spring AI 关键组件,用于 LLM 模型交互、智能体代理。

【声明 ChatClient】

// List<McpFunctionCallback> functionCallbacks;
var chatClient = chatClientBuilder.defaultFunctions(functionCallbacks).build();

和开发之前的 Spring AI 应用一样,我们先定义一个 ChatClient Bean,用于与大模型交互的代理。需要注意的是,我们为 ChatClient 注入的 functions 是通过 MCP 组件(McpFunctionCallback)创建的。
接下来让我们具体看一下 McpFunctionCallback 是怎么使用的。
【声明 MCP Function Callbacks】
以下代码段通过 mcpClient与 MCP server 交互,将 MCP 工具通过 McpFunctionCallback 适配为标准的 Spring AI function。

1、发现 MCP server 中可用的工具 tool(Spring AI 中叫做 function)列表。

2、依次将每个 tool 转换成 Spring AI function callback。

3、最终我们会将这些 McpFunctionCallback 注册到 ChatClient 使用。

@Bean
public List<McpFunctionCallback> functionCallbacks(McpSyncClient mcpClient) {return mcpClient.listTools(null).tools().stream().map(tool -> new McpFunctionCallback(mcpClient, tool)).toList();
}

可以看出,ChatClient 与模型交互的过程是没有变化的,模型在需要的时候告知 ChatClient 去做函数调用,只不过 Spring AI 通过 McpFunctionCallback 将实际的函数调用过程委托给了 MCP,通过标准的 MCP 协议与本地文件系统交互:

  • 在与大模交互的过程中,ChatClient 处理相关的 function calls 请求
    
  • ChatClient 调用 MCP 工具(通过 McpClient)
    
  • McpClient 与 MCP server(即 filesystem)交互
    

【初始化 McpClient】
该智能体应用使用同步 MCP 客户端与本地运行的文件系统 MCP server 通信:

@Bean(destroyMethod = "close")
public McpSyncClient mcpClient() {var stdioParams = ServerParameters.builder("npx").args("-y", "@modelcontextprotocol/server-filesystem", "path)).build(); // 1var mcpClient = McpClient.sync(new StdioServerTransport(stdioParams),Duration.ofSeconds(10), new ObjectMapper()); //2var init = mcpClient.initialize(); // 3System.out.println("MCP Initialized: " + init);return mcpClient;
}

在以上代码中:

  1. 配置 MCP server 启动命令与参数。

  2. 初始化 McpClient:关联 MCP server、指定超时时间等。

  3. Spring AI 会使用 npx -y @modelcontextprotocol/server-filesystem "/path/to/file"在本地机器创建一个独立的子进程(代表本地 Mcp server),Spring AI 与 McpClient 通信,McpClient 进而通过与 Mcp server 的连接操作本地文件。

运行示例

【前提条件】
1、 安装 npx(Node Package eXecute)
首先确保本地机器安装了 npm[4],然后运行如下命令:

npm install -g npx

2、下载示例源码

git clone https://github.com/springaialibaba/spring-ai-alibaba-examples.git
cd spring-ai-alibaba-examples/spring-ai-alibaba-mcp-example/filesystem

3、 设置环境变量


# 通义大模型 Dashscope API-KEY
export AI_DASHSCOPE_API_KEY=${your-api-key-here}

4、构建示例

./mvnw clean install

运行示例应用

运行示例,智能体将向模型发起提问(源码中包含预置问题,可通过源码查看),可通过控制台查看输出结果。

./mvnw spring-boot:run

如果您是在 IDE 中运行示例,并且遇到 filesystem mcp server 返回的文件访问权限问题,请确保指定当前进程工作目录为 spring-ai-alibaba-mcp-example/filesystem 目录。

总结

MCP 作为一款开放协议,直接规范了应用程序如何向LLM提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
对于 Spring AI Alibaba 来说,我们将会从两个方面快速推进与 MCP 生态的集成:

客户端,让 Spring AI 开发的智能体可以快速接入 MCP 生态中的各种 server 服务。

服务端,帮助大量的 Java 服务快速转为 MCP server,通过 Spring AI Alibaba 将传统的 Spring Boot、Spring Cloud、Dubbo 等开发的单体或微服务应用发布为 MCP server。

相关链接:

[1] 模型上下文协议(即 Model Context Protocol,MCP):https://modelcontextprotocol.io/[2] MCP server 实现:https://github.com/modelcontextprotocol/servers[3] 示例完整源码:https://github.com/springaialibaba/spring-ai-alibaba-examples/spring-ai-alibaba-mcp-example[4] npm:https://docs.npmjs.com/downloading-and-installing-node-js-and-npm

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

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

相关文章

5G新通话的安全卫士——DTLS协议

5G 新通话作为运营商的一种全新通话概念的探索,虽名为通话,实则远不止于此,更是一种实时的沉浸式互动体验。针对 5G 新通话,3GPP 在 R16 阶段完成了 5G 网络 IMS Data Channel 实时交互通道的相关技术标准,并于 2020 年 3 月将其写入并发布了 TS26.114 V16.5.0 版本,实现…

CSS设计模式

OOCSSOO(“Object Oriented”):面向对象。OOCSS:Object Oriented css(面向对象css)的缩写,是一种用最简单的方式编写的CSS代码,从而使代码 重用性,可维护性和可扩展性更好的书写方法。OOCSS 解决的问题 很多开发者在编写 CSS 时,经常会遇到以下问题:样式重复: 同样的…

【待发】5G新通话的安全卫士——DTLS协议

5G 新通话作为运营商的一种全新通话概念的探索,虽名为通话,实则远不止于此,更是一种实时的沉浸式互动体验。针对 5G 新通话,3GPP 在 R16 阶段完成了 5G 网络 IMS Data Channel 实时交互通道的相关技术标准,并于 2020 年 3 月将其写入并发布了 TS26.114 V16.5.0 版本,实现…

pwn ciscn_2019_n_1 1

可以看到用gets让用户输入v1,还比较了v2的值,但此之前已经设置了v2的值为0.0 法一 可以用传统的方法栈溢出,覆盖返回地址为system的地址法二 v2也存在栈上,也可以通过gets栈溢出修改v2原本的数据 movss xmm0, [rbp+var_4] #将v2的值放到xmm0里面 ucomiss xmm0, cs:dword…

语境学习(in-context-learning)

(高级机器学习的作业,反正写了干脆搬过来)4.1 引言 请考虑这样一句话“该公司预计其营业利润会有所改善。” 可以发现,这句话的情感是积极向上的。我们期待如果把这句话输入给大语言模型,它能够返回“积极(Positive)”这样的词汇。 然而,如果我们直接把这句话输入给大模…

hello-algo

复杂度分析 迭代与递归函数返回前上下文存储在栈帧空间,故递归比迭代耗费更多内存空间 递归调用函数有额外开销,故递归时间效率也更低迭代while循环更灵活,for循环更简洁尾递归和正常递归尾递归会被编译器优化,空间效率相当于迭代!!!原因是尾递归无需保存上下文,正常递…

DataWorks数据分层

在阿里巴巴的数据体系中,我们建议将数据仓库分为三层,自下而上为:数据引入层(ODS,Operation Data Store)、数据公共层(CDM,Common Data Model)和数据应用层(ADS,Application Data Service)。数据仓库的分层和各层级用途如下图所示。数据引入层ODS(Operation Data …

实用且功能丰富的IT工具箱-IT-tools

介绍 IT-Tools是为开发人员度身打造的一套便捷在线工具。 它提供全面功能,使开发者能以更高效方式完成任务。 优秀的用户体验确保用户愉悦使用工具,并获得卓越成果。 经由IT-Tools,开发人员能轻松应对各类技术挑战,享受工作中的便利与灵活。 官网正式稳定版在线版正式稳定版…

《CPython Internals》阅读笔记:p61-p75

《CPython Internals》学习第 4 天,p61-p75 总结,总计 15 页。 一、技术总结 1.编译器类型 (1)self-hosted compiler Self-hosted compilers are compilers written in the language they compile, such as the Go compiler. This is done by a process known as bootstrap…

ETHERCAT转CCLINK网关对接ethercat通讯协议的高效解析指南

在某汽车零部件制造工厂的自动化生产线升级项目中,部分关键设备采用了支持 ETHERCAT 总线的 PLC 进行控制,而工厂原有的一些设备则遵循 CCLINK 协议标准。由于这两种协议之间无法直接通信,导致生产线的数据交互受阻,难以实现整体的协同运作与高效管理,迫切需要一种可靠的解…

妙用编辑器:列编辑在编写Markdown表格时的使用技巧

1 妙用编辑器:列编辑在编写Markdown表格时的使用技巧经常写Markdown笔记的朋友应该清楚,Markdown的表格比较麻烦,定义表格每列时需要使用|线进行绘制表格边界。比如有下面一段文字名称, 大小, 类型, 修改, 属性 …

Python用K-Means均值聚类、LRFMC模型对航空公司客户数据价值可视化分析指标应用

全文链接:https://tecdat.cn/?p=38708 原文出处:拓端数据部落公众号 分析师:Yuling Fang 信息时代的来临使得企业营销焦点从产品中心转向客户中心,客户关系管理成为企业的核心问题。客户关系管理的关键是客户分群,通过客户分群,区分无价值客户和高价值客户,同时更好的了…