
概述

2025.03.28
1
JavaMCP 服务OpenAPI 转换开发效率
openapi-mcp-server 是一个基于 SpringBoot 和 SpringMVC 的 MCP(Model Context Protocol)服务,旨在将使用 OpenAPI(Swagger)作为接口文档的接口转换为 MCP 服务。该服务支持多 Session 和认证功能,允许开发者通过 MCP 客户端(如 Cursor、Claude Desktop 等)直接操作业务逻辑,而无需开发前端页面。
View on GitHub
Overview
基本能力
产品定位
openapi-mcp-server 是一个 MCP 服务,旨在将 OpenAPI(Swagger)接口转换为 MCP 服务,支持通过 MCP 客户端直接操作业务逻辑。
核心功能
- 多 Session 支持:支持多个会话同时操作。
- 认证支持:提供认证功能,确保接口安全。
- MCP 协议支持:将 OpenAPI 接口转换为 MCP 服务。
适用场景
- 快速业务操作:通过 MCP 客户端直接操作业务逻辑,无需开发前端页面。
- AI 超级应用:适用于未来基于语言的交互方式,开发者只需关注后端接口开发。
工具列表
- InternalWebMvcSseServerTransport.java:SSE 传输实现。
- McpConfig.java:MCP 配置类。
- RestApiToolProvider.java:REST API 工具提供者。
- UserContextSetter.java:用户上下文设置接口。
常见问题解答
- 依赖问题:确保使用 Java 17+ 和 SpringBoot、SpringMVC。
- 认证实现:需实现
UserContextSetter
接口以支持认证。
使用教程
使用依赖
- Java 17+:确保已安装 Java 17 或更高版本。
- SpringBoot 和 SpringMVC:确保项目中已集成 SpringBoot 和 SpringMVC。
安装教程
- 添加 MCP 原生依赖:
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-spring-webmvc</artifactId>
<version>0.7.0</version>
</dependency>
- 复制代码文件:将
InternalWebMvcSseServerTransport.java
、McpConfig.java
、RestApiToolProvider.java
和UserContextSetter.java
复制到项目中。 - 实现
UserContextSetter
接口:
@Component
@AllArgsConstructor
public class MyUserContextSetter implements UserContextSetter{
private JwtConfig jwtConfig;
@Override
public void set(String auth) {
UserContext.set(jwtConfig.getUserContextFromTokenWithoutException(auth));
}
@Override
public void clear() {
UserContext.clear();
}
}
- 补充基础设施:根据需要添加拦截器等以满足业务需求。
调试方式
- 启动服务:确保服务正常运行。
- 使用 MCP 客户端连接:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
const transport = new SSEClientTransport(new URL("http://localhost:8080/mcp/sse/eyJhbGciOiJIUzI1NiJ9.eyJ0ZW5hbnRfaWQiOjIsImlzX2FkbWluIjpmYWxzZSwic3ViIjoiMiIsImlhdCI6MTc0MzA4MTE5MiwiZXhwIjoxNzQzMTY3NTkyfQ.newz2wj0l5nWk1U_lHNg575bi1FubWSLXqji4o2W-P0"));
const client = new Client(
{
name: "MCP Server",
version: "1.0.0"
}
);
await client.connect(transport);
const tools = await client.listTools();
console.log("Tools: ", JSON.stringify(tools));
const result = await client.callTool({
name: "TenantController.pageUser",
arguments: {
current: 1,
pageSize: 10
}
});
console.log("Result: ", JSON.stringify(result));
- 检查日志:确保服务端和客户端日志无错误。
许可证
None