专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
程序员的那些事  ·  清北 DeepSeek 教程"神仙打架",北 ... ·  4 天前  
程序员小灰  ·  Manus,又一国产AI封神了,一码难求! ·  3 天前  
OSC开源社区  ·  华为新笔记本被曝预装Linux系统 ·  2 天前  
编程技术进阶  ·  超详细的 Manus 分析报告流出(速领,待会删) ·  2 天前  
编程技术进阶  ·  超详细的 Manus 分析报告流出(速领,待会删) ·  2 天前  
程序猿  ·  雷军提出建议!他本人也曾是“受害者” ·  5 天前  
51好读  ›  专栏  ›  OSC开源社区

Spring AI再进化:支持MCP对话外部世界

OSC开源社区  · 公众号  · 程序员  · 2025-01-14 15:29

正文

随着 AI 技术的快速发展,如何让 AI 系统高效地获取和处理外部数据成为一个关键挑战。今天为大家介绍 Spring AI 最新支持的 MCP 协议,它将为 AI 应用打开一个全新的数据互联世界。

MCP:AI 与外部世界的"万能翻译官"

想象一下,如果你的 AI 应用需要同时读取数据库、访问文件系统、调用 API,以前你可能需要为每个数据源写一个专门的接口。而现在,Model Context Protocol (MCP)的出现彻底改变了这一切。

为什么 MCP 这么特别?

  • 统一标准 :一次开发,到处运行。MCP 就像一个"万能适配器",让 AI 应用可以用同一种方式与各种数据源对话。
  • 全面兼容 :无论是结构化的数据库表,还是非结构化的文本文件,MCP 都能轻松应对。
  • 即插即用 :想在聊天界面中直接查看 GitHub 代码或 Google 文档?MCP 让这一切变得自然而流畅。

MCP vs Function Calling:不止是简单的函数调用

很多开发者可能会问:这和 Function Calling 有什么不同?关键区别在于:

  • Function Calling 更像是"一次性订制":完成特定任务,但难以复用
  • MCP 则是"通用翻译官":为不同系统搭建沟通的桥梁,让数据和功能自由流动

Spring AI + MCP:几行代码搞定数据互联

让我们通过一个实际例子,看看如何在 Spring AI 中使用 MCP: 让 AI 帮你优化文章

有了 MCP 的支持,我们可以让 AI 直接读取本地文档,数据库,各种数据源,这种能力让 AI 应用的实用性大大提升,为内容创作、文档处理等场景带来新的可能。

1. 添加依赖

首先在 pom.xml 中添加必要的依赖:

<dependency>
    <groupId>org.springframework.experimentalgroupId>
    <artifactId>spring-ai-mcpartifactId>
    <version>0.4.1version>
dependency>

2. 基础配置

在 application.properties 中配置 AI 服务:

spring.ai.openai.base-url=your-api-base-url
spring.ai.openai.api-key=your-api-key

3. 核心实现

@Bean
 public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,
   List functionCallbacks, ConfigurableApplicationContext context)
 
{

  return args -> {
   var chatClient = chatClientBuilder
     .defaultFunctions(functionCallbacks.toArray(new McpFunctionCallback[0]))
     .build();
   String question1 = "mcp.txt 这篇文档有什么建议吗?方便公众号传播推广";
   System.out.println("ASSISTANT: " + chatClient.prompt(question1).call().content());
   context.close();
  };
 }

 @Bean
 public List functionCallbacks(McpSyncClient mcpClient) {

        return mcpClient.listTools(null)
                .tools()
                .stream()
                .map(tool -> new McpFunctionCallback(mcpClient, tool))
                .toList();
 }

 @Bean(destroyMethod = "close")
 public McpSyncClient mcpClient() {
  var stdioParams = ServerParameters.builder("npx")
    .args("-y""@modelcontextprotocol/server-filesystem", getDbPath())
    .build();

  var mcpClient = McpClient.using(new StdioClientTransport(stdioParams))
    .requestTimeout(Duration.ofSeconds(10)).sync();

  var






请到「今天看啥」查看全文