首页 游戏 软件 资讯 排行榜 专题
首页
AI
Spring注解集成Claude API调用业务接口实战

Spring注解集成Claude API调用业务接口实战

热心网友
91
转载
2026-05-18

MCP协议目前仍在快速演进,其中Streamable-HTTP是最近才定稿的传输协议,相比SSE更适合云原生无状态部署场景。另外需要注意的是,Spring AI的注解API在各个里程碑版本之间可能会有调整,遇到问题时,首先确认使用的版本与文档是否对应。

去年年底,团队里有同事提出一个需求:如何让Claude直接查询我们系统的订单状态?当时的第一反应,自然是走Function Calling这条路——把接口描述塞进Prompt,让模型按格式返回参数,然后在业务层拦截调用。折腾了两天,流程虽然跑通了,但代码实在不够优雅:换一个模型就得重新适配一套格式,换到Cursor又要再折腾一遍。

后来接触到MCP,只用了五分钟就把同一个接口接入了Claude Desktop,在Cursor里也能直接使用,核心代码仅仅是增加了三个注解。这其中的差异和具体实现,正是本文要详细拆解的内容。

MCP与Function Calling的本质区别

这两项技术经常被混为一谈,但它们本质上解决的是不同层面的问题。

Function Calling是Prompt级别的能力。你在单次请求中告诉模型“目前有这些函数可用,参数格式如下”,由模型决定是否调用,并返回一个结构化的调用指令。随后,你的代码去执行这个指令,再将结果塞回给模型。整个过程紧密绑定在一次模型请求的生命周期内,工具描述随着Prompt流动。这意味着,更换模型通常需要重写一遍格式,更换AI客户端也需要重新适配一套接口。

MCP(Model Context Protocol)则是协议级别的能力。你的服务可以独立部署为一个MCP Server,任何支持MCP协议的客户端——无论是Claude Desktop、Cursor,还是自己编写的Agent——都能自动发现并调用其中定义的工具。它不依赖于具体模型,实现了“一次开发,到处复用”。

Anthropic在2024年11月开源了MCP规范,目前Claude、ChatGPT、VS Code Copilot、Cursor、Gemini等主流AI工具均已支持,公开的MCP Server数量已超过5000个。可以将其理解为AI工具调用的“USB-C接口”:过去每种设备都需要特定的线缆,而现在有了统一的标准。

Function Calling vs MCP 架构对比示意图Function Calling vs MCP 架构对比示意图

MCP协议定义了三种核心原语:Tool(AI可以执行的有副作用操作)、Resource(AI可以读取的幂等只读数据)以及Prompt(预置的提示词模板)。Spring AI为这三者都提供了对应的注解支持。

环境准备:引入依赖

从Spring AI 1.0.0-M6版本开始,提供了MCP Server的Starters。你需要根据选择的传输协议引入对应的依赖(协议选型后续会详细说明):


    org.springframework.ai
    spring-ai-starter-mcp-server-webmvc

    org.springframework.ai
    spring-ai-starter-mcp-server-webflux

    org.springframework.ai
    spring-ai-starter-mcp-server

推荐使用BOM进行版本管理,以避免潜在的依赖冲突:


    
        
            org.springframework.ai
            spring-ai-bom
            1.0.0-M7
            pom
            import
        
    

前置环境要求为Ja va 17+和Spring Boot 3.2+。

@McpTool:将现有方法暴露为AI工具

在任何Spring Bean的方法上添加@McpTool注解,Spring AI便会自动将其扫描并注册为MCP Tool,同时自动生成JSON Schema,无需手动编写。

来看一个实际例子,将订单查询接口暴露出去:

import org.springframework.ai.mcp.spring.annotation.McpTool;
import org.springframework.ai.mcp.spring.annotation.McpToolParam;
import org.springframework.stereotype.Component;

@Component
public class OrderMcpTools {
    private final OrderService orderService;

    public OrderMcpTools(OrderService orderService) {
        this.orderService = orderService;
    }

    @McpTool(
        name = "queryOrder",
        description = "根据订单号查询订单状态和详情,支持查询最近 90 天内的订单。" +
                      "返回字段包括:订单状态、实付金额、下单时间、收货地址、物流单号。"
    )
    public OrderDetail queryOrder(
        @McpToolParam(description = "订单号,格式为 ORD-XXXXXXXXXX,10 位数字后缀", required = true)
        String orderId,
        @McpToolParam(description = "是否返回商品明细列表,默认 false,true 时额外返回每个商品的名称和数量")
        boolean includeItems
    ) {
        // 直接复用现有业务逻辑,无需修改
        return orderService.getOrderDetail(orderId, includeItems);
    }

    @McpTool(
        name = "listRecentOrders",
        description = "查询用户最近的订单列表,返回最多 20 条,按下单时间倒序排列"
    )
    public List listRecentOrders(
        @McpToolParam(description = "用户 ID,Long 类型", required = true) Long userId,
        @McpToolParam(description = "查询天数范围,1-90 之间,默认 30") int days
    ) {
        return orderService.listRecentOrders(userId, days);
    }
}

description的写法至关重要——这是模型决定“是否调用此工具”以及“如何填充参数”的主要依据,而非写给开发者的注释。像“订单号,格式为 ORD-XXXXXXXXXX,10 位数字后缀”这样的描述,就比简单的“the order ID”包含更多有效信息,能帮助模型更准确地推断参数。

application.yml中开启注解扫描:

spring:
  ai:
    mcp:
      server:
        type: SYNC          # SYNC 同步 / ASYNC 响应式
        protocol: SSE       # 传输协议
        annotation-scanner:
          enabled: true

正常启动Spring Boot应用后,MCP Server便已就绪。

Spring AI MCP Server 内部架构图Spring AI MCP Server 内部架构图

这里有个容易踩的坑:方法的返回值必须是可JSON序列化的。如果OrderDetail中包含LocalDateTime类型的字段,需要确保Jackson配置了时间模块(例如jackson-datatype-jsr310),否则模型收到的将是序列化异常,而非工具执行结果。另一个更隐蔽的问题是Optional类型,Jackson默认不会特殊处理,直接返回Tnull会更稳妥。

传输协议选型:STDIO、SSE与Streamable-HTTP

Spring AI MCP Server支持三种传输协议,选型错误可能导致本地可用但生产环境无法运行,或者部署方式不匹配。

STDIO模式最容易出问题:当Claude Desktop使用STDIO协议时,它会将你的Spring Boot应用作为子进程直接启动。这意味着服务不能监听额外的HTTP端口(否则会产生冲突),并且绝对不能在代码中使用System.out.println——标准输出已被MCP协议占用,随意打印日志会污染消息帧,导致工具调用解析失败。解决方案是将所有日志重定向到文件或stderr


    System.err
    
        %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
    

生产环境推荐使用SSE:它基于持久的HTTP连接,服务端可以主动推送工具执行进度。多个AI客户端可以同时连接,服务可以像普通的Spring Boot应用一样独立部署,并与现有的REST接口共享同一个端口。

Streamable-HTTP则更适合无状态部署场景:每次请求都是独立的,没有持久连接,在K8s环境中进行横向扩容时,无需考虑连接亲和性问题。如果你的服务部署在带有负载均衡的环境中,可以优先考虑此协议。

配置Claude Desktop连接你的MCP Server

STDIO模式(本地调试最方便):

找到Claude Desktop的配置文件——macOS在~/Library/Application Support/Claude/claude_desktop_config.json,Windows在%APPDATA%\Claude\claude_desktop_config.json——添加如下配置:

{
  "mcpServers": {
    "order-service": {
      "command": "ja va",
      "args": [
        "-jar",
        "/absolute/path/to/your-mcp-server.jar"
      ]
    }
  }
}

SSE模式(服务已独立部署):

{
  "mcpServers": {
    "order-service": {
      "url": "https://localhost:8080/sse"
    }
  }
}

如果服务端需要鉴权,可以在请求头中携带Token:

{
  "mcpServers": {
    "order-service": {
      "url": "https://your-server/sse",
      "headers": { "Authorization": "Bearer your-token" }
    }
  }
}

重启Claude Desktop后,工具栏会出现一个锤子图标,点击即可看到所有已注册的MCP Tool名称和描述。此时,直接在对话框中输入“帮我查一下订单 ORD-20260425001 的状态”,Claude会自动识别出需要调用queryOrder工具,填入参数、执行,并将结果转换为自然语言回复。

Claude Desktop 调用 MCP Server 完整时序图Claude Desktop 调用 MCP Server 完整时序图

进阶应用:使用@McpResource暴露只读数据

@McpTool适用于“执行操作”的场景(如下单、更新状态),而@McpResource则更适合“读取数据”(如商品详情、配置项)。两者的区别在于语义和使用时机:Resource是幂等且只读的,AI客户端在构建上下文时会主动拉取这些数据,而不是等到需要执行操作时才去调用。

@Component
public class ProductMcpResources {
    @McpResource(
        uri = "product://{productId}/info",
        name = "商品信息",
        description = "根据商品 ID 获取商品基本信息,包括价格、库存状态、分类"
    )
    public String getProductInfo(String productId) {
        Product product = productService.findById(productId);
        // Resource 返回字符串,可以是 JSON 格式或结构化文本
        return objectMapper.writeValueAsString(product);
    }

    @McpResource(
        uri = "config://feature-flags",
        name = "功能开关配置",
        description = "返回当前所有功能开关的状态,供 AI 了解系统当前支持的能力"
    )
    public String getFeatureFlags() {
        return featureFlagService.getAllFlags().toString();
    }
}

在实际使用中,@McpResource在“让AI了解你的系统状态”这一场景下特别有用。例如,先让AI读取功能开关配置,再决定推荐哪些操作,逻辑上比每次调用Tool更为清晰。

常见问题解答

Q:对现有服务进行改造需要改动多少代码?
只需添加依赖、编写一个@Component包装类来调用现有的Service,并在方法上添加注解。无需修改任何现有业务逻辑,原有的REST接口可以照常工作,两套机制可以并存,互不影响。

Q:如何编写有效的description?
描述信息的受众是AI模型,而非开发者。需要说清楚:工具是做什么的、适用于什么场景、参数有哪些限制(格式、范围、枚举值、默认值)。例如,“查询订单”这个描述就远不如“根据订单号查询,仅支持90天内的订单,返回状态和物流信息”来得有效,后者能为模型填充参数提供更充分的依据。

Q:MCP与Spring AI的FunctionCallback是什么关系?
这是两套完全独立的机制。FunctionCallback是你在编写自己的AI应用时,为模型Prompt绑定工具(即Function Calling)的方式;而@McpTool则是将你的服务暴露给外部AI客户端(遵循MCP协议)。两者可以同时使用——例如,你的服务既可以作为一个MCP Server供外部客户端调用,内部也可以使用FunctionCallback来驱动自己的业务AI流程。

Q:STDIO和SSE模式下如何配置日志?
在STDIO模式下,System.out会污染MCP消息流,因此必须将所有日志重定向到文件或stderr,例如将logback.xml中Console Appender的target改为System.err。SSE模式则没有这个限制,按正常方式配置即可。

Q:生产环境需要鉴权吗?
MCP协议本身没有内置鉴权机制,默认情况下任何人都可以调用你的MCP Server。在生产环境中,建议在Spring Security层添加HTTP Bearer Token或API Key验证,然后在客户端的配置文件中的headers字段里携带凭证。

说到底,MCP解决的核心问题是“工具定义与模型解耦”——你只需编写一次,任何支持MCP的AI客户端都能使用,无需随着每个模型的格式差异而反复调整。这个方向无疑是正确的,其生态成熟度也在快速提升。

来源:https://www.51cto.com/article/841752.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Karpathy LLM Wiki本地部署教程 有道云笔记与Claude Code实践指南
AI
Karpathy LLM Wiki本地部署教程 有道云笔记与Claude Code实践指南

你的手机里是不是存了几百篇“稍后再看”的文章?笔记软件里是不是躺着上千条收藏,落满了数字灰尘,再也未曾打开。 别不好意思,这几乎是数字时代每个人的通病。每天面对海量的行业报告、技术文章和灵感碎片,我们总在重复“收藏即遗忘”的动作。标签、文件夹、搜索功能,在信息量突破某个临界点后,便彻底失灵了。我们以

热心网友
05.17
Claude技能编写避坑指南:从入门到精通实战教程
AI
Claude技能编写避坑指南:从入门到精通实战教程

设计Claude Skills时,许多开发者容易陷入一个认知误区:认为功能越全面、指令越“智能”,最终效果就越好。然而实践往往证明恰恰相反。以下七个常见的设计陷阱,正是导致技能输出不稳定、难以复用的根本原因。我们将以具体的“Figma UI设计审计”技能为例,深入剖析如何有效避开这些陷阱,从而构建出

热心网友
05.17
Claude API 压力测试脚本自动化生成指南
AI
Claude API 压力测试脚本自动化生成指南

面对图像生成类API的高并发压力测试需求,手动编写脚本不仅耗时费力,还容易引入人为错误。如今,借助Claude等AI助手强大的自然语言理解与代码生成能力,我们可以快速构建出精准、可执行的性能测试方案。以下五种自动化实现路径各具特色,能够帮助测试工程师和开发者灵活应对不同技术场景与安全要求。 一、使用

热心网友
05.17
ChatGPT卸载量激增413% Claude下载量暴涨100% 奥特曼帝国现裂痕
业界动态
ChatGPT卸载量激增413% Claude下载量暴涨100% 奥特曼帝国现裂痕

AI领域传来一则重磅消息。 4月29日,有消息称Anthropic正在进行新一轮融资谈判,其估值可能突破9000亿美元大关。 如果交易最终完成,这家成立尚不足四年的公司,将一举超越OpenAI,成为全球估值最高的AI独角兽。 9000亿美元。这个数字意味着什么? 放在A股市场,它超过了贵州茅台的市值

热心网友
05.17
Claude代码助手使用入门与实战教程
AI
Claude代码助手使用入门与实战教程

Claude Code的诞生,标志着AI工具从“对话应答”迈入了“自主执行”的新纪元。简而言之,它能将您的自然语言指令,直接转化为计算机上的具体操作。其高级能力更在于,可以协调多个智能体,如同一个专业团队般并行处理复杂项目的不同模块。 Claude Code是一款在终端中运行的AI智能体工具。“终端

热心网友
05.17

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

微星PRO MAX系列ATX 3.1白金全模组电源上市 579元起售
科技数码
微星PRO MAX系列ATX 3.1白金全模组电源上市 579元起售

微星PRO MAX系列ATX 3 1全模组电源现已于京东平台全面上市。该系列精心规划了850W、1000W与1200W三档功率规格,全线产品均严格通过80PLUS白金能效认证,为用户带来高效节能的供电体验。首发期间,850W版本售价579元,1000W版本679元,1200W版本799元,参与晒单活

热心网友
05.18
光帆科技发布首款带摄像头AI耳机5月15日正式上市
科技数码
光帆科技发布首款带摄像头AI耳机5月15日正式上市

行业首款集成视觉能力的AI智能耳机即将面世。光帆科技近日正式宣布,其创新产品“光帆全感AI耳机”定于5月15日全面发售。这款耳机以“全感知、主动式、个性化”为核心定位,旨在彻底革新用户与可穿戴音频设备之间的交互模式。 本质上,它颠覆了传统耳机的被动响应模式。根据官方介绍,这款AI耳机能够主动感知并理

热心网友
05.18
币安止损设置技巧与参考指标全解析
web3.0
币安止损设置技巧与参考指标全解析

止损是交易中控制风险的关键手段,在币安等交易平台设置止损时,主要参考市场波动率、技术分析关键位以及个人风险承受能力。合理的止损应基于对价格走势的客观判断,而非情绪化决策,同时需结合仓位管理,避免因单次止损过大而影响整体资金安全。动态调整止损位以适应市场变化,是提升交易纪律性的重要环节。

热心网友
05.18
Agent时代HTML逆袭 Markdown为何不再受宠
科技数码
Agent时代HTML逆袭 Markdown为何不再受宠

过去两年,要问大模型最习惯用什么格式交付内容,答案多半是Markdown。 原因不难理解:Markdown足够干净,没有冗余格式,复制到文档、知识库、GitHub,甚至直接粘贴到微信公众号后台,基本都不会出问题。某种程度上,它已经被公认为AI时代最理想的标记语言。 不过,随着Agent时代的到来,M

热心网友
05.18
iPhone 18 Pro七大升级曝光 小岛设计续航突破
科技数码
iPhone 18 Pro七大升级曝光 小岛设计续航突破

距离2026-2027年度旗舰手机的大幕拉开,大约还有四个月时间。按照惯例,届时在全球舞台上率先亮相的主流旗舰,很可能依然是苹果的iPhone 18 Pro系列。 就在昨天(5月8日),知名爆料人Jon Prosser发布了iPhone 18 Pro Max的视频渲染图,与此同时,关于该系列手机的七

热心网友
05.18