如何用 Apache Dubbo 把现有 Triple 服务暴露为 MCP Server 并验证工具注册
【免费下载链接】dubboThe java implementation of Apache Dubbo. An RPC and microservice framework.项目地址: https://gitcode.com/GitHub_Trending/du/dubbo
如果你已经有一套运行在 Triple(tri)协议上的 Dubbo 服务,想让 MCP 客户端(如 LLM 应用)直接把这些服务方法当作 MCP 工具调用,而不是另起一个独立 MCP Server,可以在 Provider 侧启用 Apache Dubbo 的dubbo-mcp模块:Dubbo 会在应用启动时创建一个 MCP Server,把已导出的 Triple 服务方法注册为 MCP 工具,并通过 tri 协议对外提供 MCP 端点。仓库中dubbo-demo/dubbo-demo-mcp-server是一个可运行的完整示例,本文以它为主路径,说明开启方式、服务标记方式,以及启动后如何确认工具已注册。
前提条件
- 使用仓库源码集成时,从仓库根目录构建。根
README.md的版本表显示 3.3.7-SNAPSHOT 支持 JDK 1.8 – 25;demo 模块的 pom 配置了spring-boot-maven-plugin(2.7.18),并在 JDK 17+ 时通过 profilejdk-version-ge-17追加dubbo-spring-boot-3-autoconfigure依赖,因此 Spring Boot 2.x 与 3.x 环境均可运行。 - 服务必须以 Triple 协议导出。示例的协议配置为
dubbo.protocol.name: tri,端口50055。
引入 dubbo-mcp 依赖
参考 demo 的 pom.xml,核心依赖如下(dubbo-mcp是关键项,其余为 Triple/REST/启动所需):
<dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-rpc-triple</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-triple-servlet</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-rest-openapi</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-mcp</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-config-spring</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>demo 中这些org.apache.dubbo依赖的版本均为${project.version}(随源码一起构建),如果你基于已发布的 Dubbo 版本集成,把版本改为你使用的 Dubbo 版本号即可。demo 还额外依赖了dubbo-registry-zookeeper、dubbo-remoting-netty4、dubbo-serialization-hessian2,其application.yml中并没有配置注册中心,示例按本地方式运行。
开启 MCP Server 配置
示例的 application.yml 全文如下:
spring: application: name: dubbo-mcp-server dubbo: application: name: ${spring.application.name} qos-enable: false protocol: name: tri port: 50055 triple: verbose: true rest: openapi: enabled: true mcp: enabled: true protocol: streamable逐项说明:
dubbo.protocol.name: tri+port: 50055:MCP 服务通过 tri 协议导出。当没有单独指定 MCP 端口时,MCP 端点复用该协议端口(见下文端口解析逻辑)。dubbo.protocol.triple.rest.mcp.enabled: true:MCP Server 总开关。不打开时应用启动日志会打印MCP service is disabled, skipping initialization,且不会注册任何工具。dubbo.protocol.triple.rest.mcp.protocol: streamable:MCP 传输方式,取值streamable或sse。McpApplicationDeployListener 中这两种值分别构建 Streamable 或 SSE 传输;其他值会记录not support protocol xxx错误,MCP Server 不会创建。dubbo.protocol.triple.rest.openapi.enabled: true:同时开启 REST OpenAPI。工具转换类DubboOpenApiToolConverter依赖DefaultOpenAPIService提供的方法元数据来生成工具。
MCP 相关的完整配置项定义在 McpConstant 中,除上面用到的两项外还包括:
| 配置键 | 用途 |
|---|---|
dubbo.protocol.triple.rest.mcp.port | 单独指定 MCP 服务端口 |
dubbo.protocol.triple.rest.mcp.session-timeout | 长连接会话超时,代码默认 60 |
dubbo.protocol.triple.rest.mcp.include-patterns/exclude-patterns | 服务级暴露过滤模式 |
dubbo.protocol.triple.rest.mcp.default.enabled | 服务未显式声明时的默认启用状态 |
dubbo.protocol.triple.rest.mcp.path.sse/path.message | SSE 与消息路径,McpConfig 的说明给出默认值分别为/mcp/sse和/mcp/message |
将现有 Triple 服务标记为 MCP 工具
示例服务 HelloServiceImpl 通过@DubboService(mcpEnabled = true)声明该服务可暴露为 MCP 工具:
@DubboService(mcpEnabled = true) public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { System.out.println("HelloServiceImpl.sayHello called with: " + name); ... } ... }注册逻辑在 DubboServiceToolRegistry:服务导出时遍历服务接口声明的方法,由McpServiceFilter判断每个方法是否暴露,通过的方法逐一注册为工具。除注解外,McpConstant中还定义了按服务 URL 参数粒度的控制项:mcp.enabled、mcp.tool-name、mcp.description、mcp.tags、mcp.priority,用于对单个服务做开关与工具命名、描述调整。工具的默认描述模板为Execute method '%s' from service '%s'。
应用入口 McpDemoApplication 是一个标准 Spring Boot 应用,加上@EnableDubbo即可:
@SpringBootApplication @EnableDubbo public class McpDemoApplication { public static void main(String[] args) { SpringApplication.run(McpDemoApplication.class, args); } }启动应用
从仓库根目录执行(假设本地 Maven 可访问依赖仓库;-am会连带构建 demo 所依赖的 Dubbo 模块):
# 1. 构建并安装 demo 依赖的模块 ./mvnw -pl dubbo-demo/dubbo-demo-mcp-server -am install -DskipTests # 2. 启动 MCP demo 应用 ./mvnw -pl dubbo-demo/dubbo-demo-mcp-server spring-boot:runMCP 的初始化由McpApplicationDeployListener在应用onStarted阶段完成:读取dubbo.protocol.triple.rest.mcp.enabled,构建 MCP Server,遍历所有已导出的ProviderModel逐个注册工具,再把 MCP 端点作为内部服务以 tri 协议导出。
验证工具注册
启动完成后,从日志和端点两个层面确认:
初始化日志。依次出现以下日志说明 MCP Server 已建立且工具已注册,其中
{}为实际数量,{接口名}为服务接口:Initializing MCP server and dynamic service registration MCP server initialized successfully, {} existing tools registered, dynamic registration enabled MCP service exported on: {}demo 的
HelloService接口声明了sayHello与greetComplex两个方法,若均通过McpServiceFilter的暴露条件,日志中的数量应为 2。MCP service exported on:后跟的是导出 URL,从中可以确认 MCP 端点的地址与端口——demo 未单独配置mcp.port,因此复用 tri 协议端口50055。动态注册日志。启动后新导出的服务会触发 McpServiceExportListener 的动态注册:
Dynamically registered {} MCP tools for exported service: {}MCP 客户端连接。按所选
protocol连接对应端点:streamable模式下消息路径默认/mcp/message,即http://<host>:50055/mcp/message(sse模式下为/mcp/sse)。客户端通过 MCP 协议列出工具时,应能看到由服务方法生成的工具项;调用工具后会走 Dubbo 泛化调用打到服务端实现,demo 实现里会打印HelloServiceImpl.sayHello called with: <name>,据此可确认调用链路贯通。
端口解析顺序(见McpApplicationDeployListener.getRegisterPort):优先取dubbo.protocol.triple.rest.mcp.port;未配置时取name: tri的协议端口;再没有则取一个随机可用端口。
边界与限制
protocol只支持streamable与sse两种取值,其他值会记录not support protocol错误并跳过 MCP Server 创建。dubbo.protocol.triple.rest.mcp.enabled未开启时不会初始化任何 MCP 能力,日志为MCP service is disabled, skipping initialization,此时连接任何 MCP 端点都不会有工具可列。- 工具是否暴露由
McpServiceFilter决定,除服务上的mcpEnabled/mcp.enabled外,还受include-patterns、exclude-patterns与default.enabled影响;方法未通过过滤时该服务不会注册出工具,日志中也不会出现对应数量的注册记录。
【免费下载链接】dubboThe java implementation of Apache Dubbo. An RPC and microservice framework.项目地址: https://gitcode.com/GitHub_Trending/du/dubbo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考