Swagger MCP Bridge

io.github.Neo1228由 GitHub 帳號 Neo1228 發布v0.1.0更新於 Oct 24, 2026

Spring Boot example that exposes SpringDoc OpenAPI operations as safe MCP tools.

已驗證STDIO僅桌面開發者工具AI 與機器學習

概覽

AI 產生的概覽

將 Spring Boot 應用程式的 SpringDoc OpenAPI 操作轉換為 MCP 工具,並提供探索、驗證與多步驟工作流程的閘道層。

可以做什麼
Swagger MCP Bridge 是一個 Spring Boot starter,可從執行中的應用程式探索 SpringDoc OpenAPI 操作並註冊為 MCP 工具,工具名稱帶有可設定的前綴(例如 api_)。它提供閘道中繼工具,用於能力檢視、分組探索、工具描述、預檢驗證、工作流程試跑規劃與循序執行,並支援 JSONPath 回應裁剪與結構化錯誤碼。執行防護包括必填參數驗證、路徑範本保護、請求標頭允許/拒絕清單,以及對高風險 HTTP 方法的確認權杖。
適用情境
當你已有以 SpringDoc 記錄文件的 Spring Boot API,並希望 MCP 用戶端直接呼叫這些端點,而不必為每個操作手寫工具封裝時使用。它適合較大的 API,此時探索、驗證與多步驟編排比單純的逐端點封裝更重要。
執行需求
需要 Java 17 或更新版本的 Spring Boot 3.5.x 應用程式,包含 Spring Web 與 springdoc-openapi 2.8.x,以及相依套件 io.github.neo1228:openapi-mcp-spring-boot-starter。封裝範例以 Docker 映像檔執行,在 /mcp 暴露 MCP Streamable HTTP 端點。未宣告帳號、API 金鑰或環境變數。
安裝前請注意
產生的工具會呼叫真實 API 端點,因此高風險方法(POST、PUT、PATCH、DELETE)可能修改或刪除資料;預設需要 _confirm 權杖,並可透過 _headers 允許/拒絕清單控制用戶端傳入的請求標頭。只有在使用 dryRun 時,工作流程執行才預設安全。此伺服器僅限桌面端,無法在網頁中執行。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Swagger MCP Bridge,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Swagger MCP Bridge

[CI] [License] [Java] [Spring Boot] [Awesome MCP Servers]

Turn any SpringDoc-powered Spring Boot API into a production-ready MCP gateway.

Swagger MCP Bridge discovers your OpenAPI operations, publishes them as safe MCP tools, and adds a smart gateway layer for API discovery, validation, response shaping, and multi-step workflow orchestration.

Naming and Coordinates

This repository intentionally separates the public surfaces so each one reads naturally in its own ecosystem:

SurfaceName
Project / docsSwagger MCP Bridge
Maven dependencyio.github.neo1228:openapi-mcp-spring-boot-starter
Official MCP Registry serverio.github.Neo1228/swagger-mcp-bridge
Runnable example imageghcr.io/neo1228/swagger-mcp-bridge-example:<version>
Spring configuration prefixswagger.mcp.*

The project name keeps the established bridge branding, while the Maven artifact uses the neutral OpenAPI/Spring Boot starter coordinate expected by Java consumers. The registry server and GHCR image identify the packaged runnable example used by MCP directories.

Why Swagger MCP Bridge

Most MCP API bridges stop at a thin tool wrapper. Swagger MCP Bridge is designed as a runtime gateway: it exposes your existing Spring controllers to LLM clients while preserving contracts, guardrails, and operational visibility.

What You Get

  • Zero-boilerplate discovery of SpringDoc OpenAPI operations from your running Spring app
  • Automatic MCP tool registration for discovered API operations
  • Smart-context gateway tools: meta_get_api_capabilities, meta_validate_api_call, meta_discover_api_tools, meta_describe_api_tool, meta_list_api_groups, meta_plan_api_workflow, meta_invoke_api_workflow, meta_invoke_api_by_intent
  • API catalog and workflow layer for capability inspection, preflight validation, grouped exploration, dry-run planning, and sequential execution
  • Rich MCP input schemas generated from OpenAPI constraints: required fields, enums, numeric/string/object limits, examples, and deprecation hints
  • Response shaping with JSONPath projection and summarization controls
  • Execution guardrails: required argument validation, unresolved path-template protection, and safe _headers filtering
  • Structured MCP error responses with stable codes such as INVALID_ARGUMENT, SECURITY_DENIED, WORKFLOW_ERROR, and HTTP_DISPATCH_FAILED
  • Java 17 bytecode with CI coverage on Java 17, 21, and 25
  • Optional virtual-thread HTTP dispatch on Java 21+ runtimes, with automatic platform-thread fallback on Java 17
  • Production guardrails for dangerous operations: _confirm, blocked paths, role checks, audit logs, and structured client errors

Architecture

mermaid
graph TD    User([User / LLM Client]) <--> MCP[MCP Client / Claude Desktop]    MCP <--> Bridge[Swagger MCP Bridge /starter/]    Bridge --> Catalog[Operation Catalog /groups + contracts/]    Bridge --> Workflow[Workflow Orchestrator /plan + dry-run + execute/]    Bridge <--> Docs[SpringDoc OpenAPI /v3/api-docs]    Bridge <--> API[Your Spring Controller /hello]

Quick Start

1. Create a Spring Boot app

Use:

  • Java 17+
  • Spring Boot 3.5.x
  • Spring Web

2. Add dependencies

Gradle (build.gradle.kts):

kotlin
plugins {    id("org.springframework.boot") version "3.5.14"    id("io.spring.dependency-management") version "1.1.7"    java}
java {    sourceCompatibility = JavaVersion.VERSION_17}
repositories {    mavenCentral()}
dependencies {    implementation("org.springframework.boot:spring-boot-starter-web")    implementation("org.springdoc:springdoc-openapi-starter-webmvc-api:2.8.17")    implementation("io.github.neo1228:openapi-mcp-spring-boot-starter:<version>")}

The Maven artifact intentionally uses the neutral OpenAPI name rather than Swagger branding:

text
io.github.neo1228:openapi-mcp-spring-boot-starter

Maven (pom.xml):

xml
<properties>  <openapi-mcp.version>0.1.0-SNAPSHOT</openapi-mcp.version></properties>
<dependencies>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>    <groupId>org.springdoc</groupId>    <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>    <version>2.8.17</version>  </dependency>  <dependency>    <groupId>io.github.neo1228</groupId>    <artifactId>openapi-mcp-spring-boot-starter</artifactId>    <version>${openapi-mcp.version}</version>  </dependency></dependencies>

Use a release version (for example 0.1.0) when consuming from a remote artifact repository.

3. Add one controller

java
import io.swagger.v3.oas.annotations.Operation;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestControllerpublic class HelloController {
    @Operation(operationId = "getHello", summary = "Get greeting message")    @GetMapping("/hello")    public Map<String, Object> hello(@RequestParam(defaultValue = "world") String name) {        return Map.of("message", "Hello " + name);    }}

4. Add configuration (application.yml)

yaml
spring:  ai:    mcp:      server:        protocol: STREAMABLE_HTTP        streamable-http:          mcp-endpoint: /mcp
swagger:  mcp:    enabled: true    api-docs-path: /v3/api-docs    tool-name-prefix: api_

5. Run and verify

  1. Start app: ./gradlew bootRun or ./mvnw spring-boot:run
  2. Verify OpenAPI: http://localhost:8080/v3/api-docs
  3. Verify MCP endpoint: http://localhost:8080/mcp
  4. Connect from an MCP client

Generated tool names follow <tool-name-prefix><operation-id> (example: api_gethello).

MCP Client Workflow

This starter exposes direct API tools and a meta-tool layer so general MCP clients can work with large APIs without guessing tool names upfront:

  1. meta_get_api_capabilities returns API catalog stats, available gateway tools, orchestration features, safety policy, and response controls.
  2. meta_list_api_groups summarizes the exposed API catalog by OpenAPI tag/group.
  3. meta_discover_api_tools finds relevant operations for a natural-language request.
  4. meta_describe_api_tool returns the selected tool's method/path, parameters, required arguments, request body schema, risk flags, and full MCP input schema.
  5. meta_validate_api_call validates one generated API tool call without dispatching HTTP, including required arguments, risky-operation confirmation, and dispatch preview.
  6. meta_plan_api_workflow turns a workflow goal into a deterministic candidate step plan with contracts and risk flags.
  7. meta_invoke_api_workflow dry-runs or executes multiple generated API tools sequentially.
  8. meta_invoke_api_by_intent can select and invoke the best matching operation when the client already has enough arguments.

The configured tool-name-prefix is still applied, so the default generated names are api_meta_get_api_capabilities, api_meta_validate_api_call, api_meta_list_api_groups, api_meta_discover_api_tools, api_meta_describe_api_tool, api_meta_plan_api_workflow, api_meta_invoke_api_workflow, and api_meta_invoke_api_by_intent.

When a tool call is rejected, the text content remains human-readable and structuredContent.error gives clients a stable machine contract:

json
{  "error": {    "code": "INVALID_ARGUMENT",    "message": "Missing required argument(s): path parameter: orderId",    "status": 400,    "retryable": false,    "details": { "toolName": "api_getorder" }  }}

Recommended client loop:

  1. Call api_meta_get_api_capabilities once to learn the gateway features and safety policy.
  2. Use api_meta_discover_api_tools or api_meta_list_api_groups to find candidate operations.
  3. Use api_meta_describe_api_tool for exact argument schema.
  4. Use api_meta_validate_api_call before risky or generated calls.
  5. For multi-step work, call api_meta_plan_api_workflow, then api_meta_invoke_api_workflow with dryRun=true, then execute with dryRun=false only after validation is clean.

Workflow execution is intentionally safe by default:

  • meta_validate_api_call and meta_invoke_api_workflow dry-runs validate tool names, arguments, required fields, dispatch paths, and risk flags before dispatching HTTP.
  • A workflow step has { "id": "...", "toolName": "...", "arguments": { ... } }.
  • Later steps can read previous structured results with JSONPath interpolation: ${create:$.order.id}.
  • If the whole argument value is a template, the resolved raw value is passed through. If a template is embedded in a longer string, the value is stringified.
  • Recursive meta-tool orchestration is blocked; workflow steps can invoke generated API operation tools only.
  • Risky HTTP methods still require the configured _confirm token even inside a workflow.

Example validation payload:

json
{  "toolName": "api_getorder",  "arguments": {    "orderId": "order-1"  }}

Example workflow payload:

json
{  "dryRun": false,  "steps": [    {      "id": "create",      "toolName": "api_createorder",      "arguments": {        "body": { "id": "order-1", "item": "shoe" },        "_confirm": "CONFIRM"      }    },    {      "id": "read",      "toolName": "api_getorder",      "arguments": {        "orderId": "${create:$.order.id}"      }    }  ]}

For larger APIs, set swagger.mcp.smart-context.gateway-only=true to expose only this gateway/meta layer instead of registering every operation as a top-level MCP tool.

Local Development Install

If the artifact is not published to a remote registry yet:

  1. Build and publish to local Maven cache:
    • ./gradlew publishToMavenLocal
  2. In your consumer app:
    • add mavenLocal() repository
    • use version 0.1.0-SNAPSHOT (or your chosen local version)

Key Configuration

  • swagger.mcp.enabled: enable/disable bridge (default true)
  • swagger.mcp.api-docs-path: OpenAPI docs path (default /v3/api-docs)
  • swagger.mcp.tool-name-prefix: tool name prefix (default api_)
  • swagger.mcp.smart-context.gateway-only: expose only meta tools
  • swagger.mcp.execution.virtual-threads-enabled: run outbound API dispatch through virtual threads when the current runtime supports them (default true; safely falls back on Java 17)
  • swagger.mcp.execution.allowed-argument-headers: optional allowlist for dynamic _headers passed by MCP clients
  • swagger.mcp.execution.blocked-argument-headers: denylist for dynamic _headers; defaults block hop-by-hop/transport-sensitive headers like Host, Content-Length, Connection, and Transfer-Encoding
  • swagger.mcp.security.require-confirmation-for-risky-operations: require _confirm token for risky methods

For risky HTTP methods (POST, PUT, PATCH, DELETE), default policy requires _confirm=CONFIRM. The adapter also validates missing required path/query/header/body arguments before dispatching HTTP, so MCP clients get a clear tool error instead of a malformed API call.

Compatibility Matrix

StarterJavaSpring Bootspringdoc-openapiSpring AI BOM
0.1.x17, 21, 25 tested; Java 17 bytecode3.5.x2.8.171.1.5

Spring Boot 4.x is intentionally not supported in the 0.1.x line. Stay on Spring Boot 3.5.x with springdoc-openapi 2.8.x unless this repository cuts a new major/minor compatibility line. The build uses --release 17, so the artifact remains consumable on Java 17 while CI verifies newer runtimes including Java 25.

Example Consumer Project

See examples/minimal-webmvc-gradle for a minimal Spring Boot app using Swagger MCP Bridge.

The example can also be built as a runnable MCP server image for registry and marketplace submissions:

bash
docker build \  -f examples/minimal-webmvc-gradle/Dockerfile \  -t ghcr.io/neo1228/swagger-mcp-bridge-example:local \  .
docker run --rm -p 8080:8080 ghcr.io/neo1228/swagger-mcp-bridge-example:local

Manual smoke checks after startup:

  • OpenAPI: http://localhost:8080/v3/api-docs
  • sample API: http://localhost:8080/hello?name=Bridge
  • MCP Streamable HTTP endpoint: http://localhost:8080/mcp
  • Smithery/server-card metadata: http://localhost:8080/.well-known/mcp/server-card.json
  • MCP Registry server metadata: http://localhost:8080/.well-known/mcp/server.json

Agent / Marketplace Install Guide

  • Agent install instructions: llms-install.md
  • Marketplace readiness guide: docs/marketplace-readiness.md
  • Marketplace logo: docs/assets/swagger-mcp-bridge-logo.png

Registry And Release Readiness

  • Maven Central release bundle workflow: .github/workflows/release-central.yml
  • GHCR example-server image workflow: .github/workflows/publish-example-server.yml
  • MCP Registry metadata: registry/server.json
  • Static discovery metadata: examples/minimal-webmvc-gradle/src/main/resources/static/.well-known/mcp/
  • Metadata verification script: scripts/verify-marketplace-metadata.sh
  • Central bundle helper: scripts/build-central-bundle.sh

The official MCP Registry accepts Docker/OCI metadata, so the published example image carries the required io.modelcontextprotocol.server.name=io.github.Neo1228/swagger-mcp-bridge label and uses registry/server.json as the submission source. The starter artifact remains a normal Maven dependency with coordinates io.github.neo1228:openapi-mcp-spring-boot-starter. Smithery URL publishing is compatible once the example server is hosted at a public HTTPS /mcp endpoint; until then the repository provides the required static server-card and local/Uplink validation path.

Release And Versioning

  • Release process: RELEASING.md
  • Versioning policy: VERSIONING.md
  • Changelog: CHANGELOG.md

Development

  • Run tests: ./gradlew test
  • Contribution guide: CONTRIBUTING.md
  • Security reporting: SECURITY.md

License

Apache License 2.0 (LICENSE)

來源:README.md,提交 982cc6b

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分