使用说明
Swagger MCP服务器
将Backend API的Swagger文档作为MCP服务器提供,客户端开发人员在Claude Code中 用自然语言搜索API和 自动生成完整的网络代码允许的系统。
通过基于LLM的查询取代了以往直接浏览Swagger UI并查看端点、请求/响应结构的过程,从而缩短了过程。
创建Swagger MCP Server第1篇-基于LLM的API导航自动化设计
创建Swagger MCP Server第2篇-解析Swagger API
创建Swagger MCP Server第3篇-数据库存储设计和故障排除
创建Swagger MCP Server第4篇-使用Spring AI构建MCP服务器,并与Claude Code集成
关键点
개발자: "로그인 API 찾아서 DTO 만들어줘"
↓
Claude가 자동으로:
1. searchApiByKeyword("로그인") 호출 → API 찾기
2. getApiDetail(apiId) 호출 → Request/Response 스키마 조회
3. 즉시 Kotlin/Swift DTO 코드 생성 + 네트워크 호출 코드 작성
用法
前提条件
- Java 21+
- 码头工人
本地运行
# 1. .env 파일 생성
cp .env.example .env # 값 채워넣기
# 2. 컨테이너 실행 (MySQL + App)
docker compose up -d
# 3. 또는 로컬 직접 실행
./gradlew bootRun
.env设置值
MYSQL_ROOT_PASSWORD=
MYSQL_DATABASE=
MYSQL_USER=
MYSQL_PASSWORD=
MCP_ACCESS_TOKEN=
APP_IMAGE=
MCP端点
GET /mcp
Authorization: Bearer {MCP_ACCESS_TOKEN}
Claude Code连接
claude mcp add --transport http swagger-mcp http://{SERVER_IP}:{SERVER_PORT}/mcp \
--header "Authorization: Bearer {MCP_ACCESS_TOKEN}" --scope project
特性
1.Swagger解析和数据库存储
- 从Backend服务器下载和解析OpenAPI 3.0 JSON
$ref决心#/components/schemas/LoginRequest→转换为实际的schema结构- 将API端点、Request/Response/Error架构结构化存储在SQL中
- 解析NDGL错误代码格式:
DOMAIN-CATEGORY-DETAIL
2.提供MCP工具(Spring AI MCP)
- searchApiBy关键字:使用关键字搜索API(path、summary、tags)
- getApi详情:查询API详细信息(包括请求、响应和错误)
- Getrequisites格式:返回Request DTO模式
- getResponse格式:返回Success Response DTO模式
- getErrorFormats:返回Error Response列表
3.AI友好型响应格式
- DB存储格式→转换为AI易于理解的结构(SchemaSupporter)
- 明确区分嵌套对象、数组类型和Required/Optional字段
- 提供Example值可立即生成代码
🏗️ 架构
四层架构
Controller → Facade(UseCase) → Service → Repository
- 控制器:HTTP请求/响应处理,仅依赖于UseCase
- 用例(正面):多个服务组合(orchestration)
- 服务:基于单一责任原则的细分业务逻辑
- 仓库:基于Spring Data JPA的数据访问
Swagger同步流
SyncController
↓
SyncSwaggerUseCase (Facade)
├─→ SwaggerFetchService (Swagger JSON 다운로드)
├─→ SwaggerExtractorService (메타데이터 추출)
├─→ SwaggerParserService (파싱 오케스트레이션)
│ ├─ EndpointBasicInfoParser
│ ├─ RequestSchemaParser ($ref resolution)
│ ├─ ResponseSchemaParser ($ref resolution)
│ ├─ ErrorResponseParser ($ref resolution, 에러 코드 파싱)
│ └─ TagParser
└─→ SwaggerSyncService (DB 저장)
MCP查询流程
Claude Code
↓
SwaggerMcpTools (@Tool)
↓
ApiSearchService
├─→ Repository (DB 조회)
└─→ SchemaSupporter (DB 포맷 → AI 친화적 포맷)
🛠️ 技术堆栈
| 类别 | 技术 |
|---|---|
| 框架 | Spring Boot 3.5.9 |
| 语言 | Java 21 |
| 数据库 | MySQL 8.0 |
| ORM | 春季数据JPA |
| MCP | Spring AI MCP 1.1.2 |
| 解析器 | Jackson,Swagger解析器2.1.37 |
| 公用事业 | 龙目岛 |
| 部署 | Docker、GitHub操作 |
项目结构
src/main/java/com/ndgl/swaggermcp/
├── sync/ # Swagger 동기화 도메인
│ ├── presentation/http/
│ │ └── SyncController
│ ├── application/
│ │ ├── usecase/
│ │ │ └── SyncSwaggerUseCase (Facade)
│ │ ├── service/
│ │ │ ├── SwaggerFetchService
│ │ │ ├── SwaggerParserService
│ │ │ ├── SwaggerExtractorService
│ │ │ └── SwaggerSyncService
│ │ └── parser/
│ │ ├── EndpointBasicInfoParser
│ │ ├── RequestSchemaParser
│ │ ├── ResponseSchemaParser
│ │ ├── ErrorResponseParser
│ │ └── TagParser
│ ├── support/
│ │ └── JsonSchemaParsingSupport ($ref 해석, Example 추출)
│ └── dto/
│ ├── ParsedApiEndpoint
│ ├── ParsedRequestBody
│ ├── ParsedParameter
│ ├── ParsedResponseSchema
│ └── ParsedErrorResponse
│
├── ai/ # MCP 서버 도메인
│ ├── presentation/mcp/
│ │ └── SwaggerMcpTools (MCP Tool 구현)
│ ├── service/
│ │ └── ApiSearchService
│ ├── support/
│ │ └── SchemaSupporter (DB 포맷 → AI 친화적 포맷)
│ └── dto/
│ ├── ApiDetailForAI
│ ├── RequestForAI
│ ├── ResponseForAI
│ ├── ErrorForAI
│ ├── FieldInfo
│ ├── ParameterInfo
│ └── ApiSummary
│
├── persistence/ # 데이터 접근 계층
│ ├── entity/
│ │ ├── ApiEndpoint
│ │ ├── RequestSchema
│ │ ├── Parameter
│ │ ├── ResponseSchema
│ │ ├── ErrorResponse
│ │ └── SwaggerMetadata
│ └── repository/
│
└── common/
├── config/
│ ├── JpaConfig
│ └── RestClientConfig
└── filter/
└── ApiKeyAuthFilter (MCP 인증)
MCP工具规范
1. searchApiByKeyword(keyword: String)
说明:使用关键字搜索API
搜索对象:路径、摘要、描述、操作ID
返还: List<ApiSummary> (id、方法、路径、摘要、标签)
例子:
searchApiByKeyword("로그인")
→ [
{
"id": 1,
"method": "POST",
"path": "/api/v1/auth/login",
"summary": "사용자 로그인",
"tags": ["인증"]
}
]
2. getApiDetail(apiId: Long)
说明:查询API详细信息(包括请求、响应和错误)
返还: ApiDetailForAI
响应结构:
{
"id": 1,
"method": "POST",
"path": "/api/v1/auth/login",
"summary": "사용자 로그인",
"request": {
"body": {
"email": {"type": "string", "required": true, "example": "user@example.com"},
"password": {"type": "string", "required": true, "example": "password123"}
},
"parameters": []
},
"responses": {
"200": {"fields": {"accessToken": {"type": "string"}, "refreshToken": {"type": "string"}}}
},
"errors": {
"401": {"code": "AUTH-LOGIN-INVALID_CREDENTIALS", "message": "인증 실패"}
}
}
3. getRequestFormat(apiId: Long)
说明:请求Body+Parameters查询/ 返还: RequestForAI
4. getResponseFormat(apiId: Long)
说明:按状态代码查看Success Response/ 返还: Map<Integer, ResponseForAI>
5. getErrorFormats(apiId: Long)
说明:按状态代码查询Error Response/ 返还: Map<Integer, ErrorForAI>