Sandbox
@itmaaa/mcp-proxy

OpenAPI to MCP proxy for managed tools

This project sits in front of OpenAPI or Swagger services and exposes their paths as MCP tools. It generates tool schemas, validates arguments, forwards requests to the upstream API, and lets you turn paths on or off from the dashboard.

49 stars0 forksGoUpdated 1mo ago
Who it's for

Builders who want to expose existing APIs as MCP tools and manage them from one place.

What it delivers

You can connect an API-backed workflow to your agent without hand-writing a separate MCP server for every service.

What it does

OpenAPI and Swagger import

Loads OpenAPI 3 and Swagger 2 specs and turns supported paths into MCP tools.

Multiple server modes

Runs endpoints over HTTP, SSE, or STDIO depending on the configured endpoint.

Dashboard management

Lets you create, edit, and inspect endpoints from the embedded web UI.

Per-path visibility controls

Enable or disable individual Swagger paths without changing the upstream spec.

Request example display

Shows copyable tool-call request examples and response examples in the dashboard.

Parameter validation

Checks required path, query, header, form, and body parameters before calling upstream.

Upstream auth forwarding

Supports `none`, `basic`, `bearer`, and `api_key` auth when proxying requests.

Dashboard access control

Supports an optional admin key for write operations on the dashboard API.

How to get it

  1. 1From the repository root, initialize a fresh database with the bundled SQL file. Run…
    mysql -u root -p -e "source docs/endpoints.sql"
  2. 2Start the bundled mock upstream in a separate terminal
    go run ./test_tools/mock_upstream
  3. 3Start the proxy
    go run ./cmd --config config.yaml
  4. 4Open the dashboard
    http://localhost:18081/mcp/
  5. 5Connect an MCP client to
    http://127.0.0.1:18993/mcp/

README

MCP Proxy

English | 简体中文

MCP Proxy turns OpenAPI/Swagger endpoints into runnable MCP tools. It loads upstream API specs, generates MCP tool schemas, starts one MCP server per configured endpoint, and provides a dashboard for managing endpoints, tool visibility, request examples, response examples, health status, and metrics.

Dashboard

MCP Proxy dashboard

Demo

Import an OpenAPI document, enable a generated tool, and call it through MCP:

OpenAPI to MCP tool call demo

Features

  • Generate MCP tools from OpenAPI 3 and Swagger 2 specifications.
  • Run endpoints in HTTP, SSE, or STDIO mode.
  • Manage upstream endpoints from the embedded dashboard.
  • Enable or disable individual Swagger paths without editing upstream specs.
  • Show copyable tool-call request examples and response examples.
  • Validate required path/query/header/form/body parameters before calling upstream.
  • Forward upstream auth with none, basic, bearer, or api_key.
  • Optional dashboard admin key for write operations.
  • Optional app-client JWT auth for MCP server access.
  • Prometheus metrics for upstream request latency and status classes.
  • MySQL-backed storage for endpoints, cached swagger specs, and path toggles.

Requirements

  • Go 1.24.1 or newer

Quick Start

  1. From the repository root, initialize a fresh database with the bundled SQL file. Run this once; skip it when reusing an initialized database:

    mysql -u root -p -e "source docs/endpoints.sql"
    

    This creates the mcp_proxy database, the required tables, and the test-params endpoint used by the local demo.

  2. Update config.yaml with your MySQL connection:

    db:
      driver: "mysql"
      host: "127.0.0.1"
      port: 3306
      user: "root"
      password: ""
      database: "mcp_proxy"
      params: "parseTime=true&charset=utf8mb4&collation=utf8mb4_unicode_ci"
    
  3. Start the bundled mock upstream in a separate terminal:

    go run ./test_tools/mock_upstream
    

    The mock API listens on http://127.0.0.1:18900, and its OpenAPI document is available at http://127.0.0.1:18900/openapi.json.

  4. Start the proxy:

    go run ./cmd --config config.yaml
    
  5. Open the dashboard:

    http://localhost:18081/mcp/
    
  6. Select test-params in the Dashboard. It was created by the SQL script in step 1. If you skipped database initialization and the endpoint does not exist, click New and enter the following values:

    {
      "name": "test-params",
      "enabled": true,
      "version": "1.0.0",
      "mode": "http",
      "host": "0.0.0.0",
      "port": 18993,
      "timeout": "30s",
      "base_url": "http://127.0.0.1:18900",
      "gateway_url": "http://127.0.0.1:18900",
      "doc_path": "/openapi.json",
      "auth_type": "none",
      "auth_config": {},
      "headers": {}
    }
    
  7. Open test-params in the Dashboard and enable /ping or any other paths you want to expose. New upstream paths are disabled by default.

  8. Connect an MCP client to:

    http://127.0.0.1:18993/mcp/
    

    The generated tools now call the local mock upstream and return the request details it received, so the full OpenAPI-to-MCP request flow can be tested without an external API.

Runtime Layout

The process exposes two kinds of HTTP servers:

  • Dashboard server: defaults to 0.0.0.0:18081
  • Endpoint MCP servers: one server per enabled endpoint row in the database

The dashboard server provides:

  • /mcp/: embedded dashboard UI
  • /mcp/servers: aggregated running MCP server and tool information
  • /mcp/api/endpoints: endpoint management API
  • /mcp/api/tools: per-path enable/disable API
  • /mcp/api/docs: Swagger UI for the dashboard API
  • /mcp/api/openapi.yaml: dashboard OpenAPI document
  • /metrics: Prometheus metrics

Endpoint MCP servers expose generated MCP tools on their configured port using the selected transport mode.

Configuration

config.yaml contains process-wide settings:

server:
  name: "MCP Proxy"
  version: "1.0.0"

logging:
  level: "info"
  format: "json"
  color: true
  disable_stacktrace: false
  output_path: "logs/mcp-proxy.log"
  append_to_file: true
  disable_console: false

app_auth:
  enabled: false
  jwt_secret: "test-secret-key-for-development-use-32bytes-minimum"
  token_expiry: "24h"

dashboard:
  admin_key: ""

Dashboard Admin Key

When dashboard.admin_key is empty, dashboard write operations are allowed. When it is non-empty, non-GET requests under /mcp/api/* must include:

X-Admin-Key: <admin_key>

The dashboard UI will prompt for the key when write access is required.

Upstream Authentication

Each endpoint can configure how requests are authenticated when forwarded to the upstream API:

  • none: no auth headers are added
  • basic: uses auth_config.username and auth_config.password
  • bearer: sends Authorization: Bearer <token>
  • api_key: sends auth_config.key in header auth_config.header

Example:

{
  "auth_type": "bearer",
  "auth_config": {
    "token": "upstream-token"
  }
}

App Client Authentication

When app_auth.enabled is true, MCP server access can be guarded by app-client JWTs. App clients are managed through /mcp/api/app-clients, and tokens are issued by /auth/token.

The dashboard API documentation at /mcp/api/docs includes the app-client schemas and auth endpoints.

Tool Generation Behavior

For each enabled Swagger/OpenAPI path, MCP Proxy creates tools from supported HTTP methods:

  • GET
  • POST
  • PUT
  • DELETE
  • PATCH

Generated tool names use the pattern:

<method>_<path>

For example, GET /v1/items/{id} becomes:

get_v1_items_id

Request arguments follow these rules:

  • Path, query, and header parameters stay at the top level.
  • JSON request bodies must be wrapped under the top-level body key.
  • Multipart form fields stay flat.
  • Required parameters are validated before the proxy calls upstream.

Example JSON-body call arguments:

{
  "id": "item-1",
  "trace_id": "abc",
  "body": {
    "name": "demo"
  }
}

Metrics

Prometheus metrics are exposed at:

GET /metrics

Custom upstream metrics include:

  • mcp_proxy_upstream_requests_total
  • mcp_proxy_upstream_request_duration_seconds

Labels are intentionally bounded:

  • endpoint
  • method
  • path
  • status_class

The default Go runtime and process collectors are also enabled.

Development

Run tests:

go test ./...

Run with a specific config file:

go run ./cmd --config config.yaml

Print version information:

go run ./cmd --version

Notes

  • Swagger specs are cached in MySQL after the first successful fetch.
  • Dashboard reload clears the cached swagger document and restarts the endpoint.
  • New remote paths are inserted into swagger_paths disabled by default.
  • Deleted remote paths are removed from swagger_paths during sync.
  • Spring Actuator paths are skipped and are not exposed as tools.

Files in the repo

Repository payload22 top-level entries
  • auth
  • cmd
  • config
  • docs
  • endpoint
  • logger
  • metrics
  • models
  • parser
  • registry
  • requester
  • server
  • test_tools
  • utils
  • web
  • .gitignore
  • config.yaml
  • go.mod
  • go.sum
  • LICENSE
  • README.md
  • README.zh-CN.md

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More connectors

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

43k

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code

14k
okf-memory/
okf-agent-memory

Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.

547
tirth8205/
code-review-graph

Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.

31k
2akouwu/
reverify

Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.

1.1k
t8y2/dbxConnectors

20 MB lightweight cross-platform database client for 90+ databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具,支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90+ 数据库,提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。

19k