MCP Gateway(Support for OAS, Swagger and MCP Server)
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
git clone https://github.com/nonchan7720/manifold{
"mcpServers": {
"manifold": {
"command": "manifold"
}
}
}MCP Servers overview
# Manifold
**One interface. Many connections. Manifold.**
[](https://github.com/nonchan7720/manifold/actions/workflows/ci.yaml)
[](https://github.com/nonchan7720/manifold/releases)
[](LICENSE)
English | [日本語](README_ja.md)
Manifold is a gateway that acts as an MCP server while connecting to multiple external MCP servers and OpenAPI / Swagger-compliant REST APIs on the backend.
## Why "Manifold"?
The name **Manifold** comes from an engine's **intake manifold**.
An intake manifold is the component that distributes air and fuel evenly and efficiently from a single inlet to multiple cylinders. We named this project **Manifold** because its structure is similar.
| Engine manifold | This project |
| ---------------------- | ------------------------------------ |
| Single inlet | Requests from MCP clients |
| Distribution / routing | Protocol conversion / routing |
| To multiple cylinders | To multiple external MCP / REST APIs |
## Architecture
```text
MCP Client
│
▼
┌─────────────┐
│ Manifold │ ← this server
└─────────────┘
│ │
▼ ▼
External OpenAPI / Swagger
MCP REST API Server
Server
```
## Features
- **OpenAPI / Swagger → MCP conversion**: Automatically generates MCP tools from OpenAPI 3.x / Swagger 2.x specifications
- **Static tool catalog**: Inspect the MCP tools an OpenAPI spec would generate before starting the gateway (`manifold openapi tools`), and start from a committed, diffable generated file instead of fetching the spec at boot (`manifold openapi generate`, `mcpServers.<name>.tools.file`)
- **Breaking-change detection**: Classify upstream spec changes as breaking or not with [oasdiff](https://github.com/oasdiff/oasdiff), mapped to the affected MCP tools (`manifold openapi diff`, `manifold openapi generate --check`)
- **MCP backend aggregation**: Transparent reverse proxy to external MCP servers
- **A2A agents as MCP servers**: Expose an [A2A (Agent2Agent)](https://a2a-protocol.org/) agent's Agent Card skills as MCP tools (`agents`), with the caller's session id carried as the A2A `contextId` and the response context returned in `_meta.a2a`
- **Built-in OAuth 2.1 server**: Authorization server with PKCE (S256) support. Downstream clients register through DCR (RFC 7591) or a client ID metadata document (CIMD), and can be mapped one-to-one onto upstream OAuth clients
- **Pluggable backend authentication**: Choose one of static header (`authValue`) / OAuth 2.0 (`oauth2`) / API key Token Exchange (`tokenExchange`)
- **Resource links**: Stores binary content from tool responses in S3 and returns download URLs (resource links)
- **Lazy connection (stdio) / stateless connection (http)**: stdio backends connect on first request (no backend dependency at gateway startup); http backends open a fresh connection per request and never share a session across callers
- **Selectable storage**: Session / token management backed by Redis or SQLite
- **OpenTelemetry support**: OTLP export of traces, metrics, and logs (metrics also support Prometheus-style pull)
## Requirements
- Go 1.26+
- Redis or SQLite (for session management)
## Installation
### Download binary
Download the latest binary from [Releases](https://github.com/nonchan7720/manifold/releases).
### Build from source
```bash
git clone https://github.com/nonchan7720/manifold.git
cd manifold
go build -o manifold .
```
### Docker
```bash
docker pull ghcr.io/nonchan7720/manifold:latest
```
## Usage
### Start the gateway
```bash
# Run the binary
manifold gateway
# Specify a config file explicitly (-c / --config, config name without extension)
manifold gateway -c config
# Run from source
go run main.go gateway
# Docker (working directory is /home/nonroot)
docker run -p 9999:9999 \
-v $(pwd)/config.yaml:/home/nonroot/config.yaml \
ghcr.io/nonchan7720/manifold:latest
```
### Docker Compose (development)
Starts a development environment including Redis.
```bash
docker compose up -d
```
Ready-to-run configuration examples are available in the [`examples/`](examples/) directory.
### Inspect and generate MCP tools
For OpenAPI-mode servers (`spec` and/or `tools.file` configured), `manifold openapi` shows what the gateway would register, and can write it to a file the gateway starts from — without ever fetching the spec at boot.
```bash
# Print the tools every OpenAPI-mode server would register (no gateway started)
manifold openapi tools -c config
# One server, with the full inputSchema
manifold openapi tools -c config --server petstore --json
# Write the generated tools file for every server that has tools.file configured
# (errors for a server that has no spec configured)
manifold openapi generate -c config
# CI: fail if the committed file doesn't match the live spec, without writing anything
manifold openapi generate -c config --check
# Show breaking changes between the committed file and the live spec (oasdiff)
manifold openapi diff -c config
```
`openapi tools` output:
```text
SERVER TOOL OPERATION DESCRIPTION
petstore addpet POST /pet Add a new pet to the store.
petstore getpetbyid GET /pet/{petId} Find pet by ID.
```
The generated file (`tools.file`) is YAML, with a diffable `tools` section followed by the resolved spec:
```yaml
version: 1
generatedBy: manifold 1.12.0
source:
spec: https://petstore3.swagger.io/api/v3/openapi.json
sha256: "..."
fetchedAt: "2026-09-04T00:00:00Z"
format: openapi3
tools:
- name: getpetbyid
operation: GET /pet/{petId}
description: Find pet by ID.
binaryResponse: false
inputSchema: { ... }
spec: { ... } # openapi3 document, external $refs internalized
```
#### Binary fields and responses
A `multipart/form-data` or `application/x-www-form-urlencoded` property with `format: binary` is not exposed as a plain string. It becomes a `oneOf` that accepts either a string (base64 content or a URL to fetch the file from) or an object naming the source explicitly (`url` / `base64` / `text` / `content`, plus optional `filename` and `contentType`), and carries `_meta.manifold.file: true` so clients can recognize it as a file input. An operation whose success response is binary (e.g. `image/png`, `application/octet-stream`) is marked `binaryResponse: true`; at runtime such responses are handled as binary content and, when `storage` is configured, returned as resource links (see [`storage`](#storage)). From a spec with one upload and one download operation:
```yaml
tools:
- name: uploadfile
operation: POST /files
description: Upload a file
binaryResponse: false
inputSchema:
properties:
file:
_meta:
manifold:
file: true
fileInputHint: 'Provide the file content as a base64-encoded string, or as a URL (e.g. a presigned URL) to download the file from. For explicit control, an object may be passed instead with one of these keys: {url:"..."} ...'
description: File to upload
oneOf:
- description: Base64-encoded file content, or a URL (e.g. a presigned URL) to download the file from.
type: string
- description: Explicit file source; provide exactly one of url/base64/text/content.
properties:
base64: { type: string, description: Base64-encoded file content. }
url: { type: string, description: URL to download the file content from. }
text: { type: string, description: Raw (non-base64-encoded) text file content. }
content: { type: string, description: Legacy auto-detected base64 or URL content. }
filename: { type: string, description: Filename to use for the upload. }
contentType: { type: string, description: MIME content type to use for the upload. }
type: object
label:
_meta: {}
description: ""
type: string
required:
- file
type: object
- name: downloadfile
operation: GET /files/{fileId}/content
description: Download a file
binaryResponse: true
inputSchema:
properties:
fileId:
description: ""
type: string
required:
- fileId
type: object
```
Recommended workflow:
1. Add `tools.file` to the server's config (see [`mcpServers.<name>.tools`](#mcpserversnametools)) and run `manifold openapi generate -c config`.
2. Commit the generated file. Its `tools` section makes upstream spec changes reviewable as a normal PR diff.
3. Start the gateway (`manifold gateway -c config`) — it reads the tools from the file, with no network access to `spec` at startup.
4. After the upstream spec changes, re-run `manifold openapi generate -c config` and commit the update. A stale file (spec changed but the file wasn't regenerated) fails gateway startup with an error telling you to regenerate.
5. Add `manifold openapi generate -c config --check` as a CI step, so a PR that changes the upstream spec without regenerating the file fails before merge.
**CI**: `--check` only checks servers with `tools.file` configured — a server without one is skipped with a stderr note, and `--server` restricts the check to a single server. For each, it rebuilds the catalog from the live spec and compares it against the committed file: `source.sha256` (the upstream spec's raw bytes), the `tools` section, and the embedded `spec` section (the internalized document the gateway actually runs from) — `generatedBy` and `source.fetchedAt` are not compared. It exits non-zero on any difference, including a spec change that leaves the tool list untouched, since the embedded spec also drives runtime reWhat people ask about manifold
What is nonchan7720/manifold?
+
nonchan7720/manifold is mcp servers for the Claude AI ecosystem. MCP Gateway(Support for OAS, Swagger and MCP Server) It has 4 GitHub stars and its last recorded update is dated 2026-09-29.
How do I install manifold?
+
You can install manifold by cloning the repository (https://github.com/nonchan7720/manifold) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is nonchan7720/manifold safe to use?
+
Our security agent has analyzed nonchan7720/manifold and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains nonchan7720/manifold?
+
nonchan7720/manifold is maintained by nonchan7720. The last recorded GitHub activity is dated 2026-09-29, with 9 open issues.
Are there alternatives to manifold?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy manifold to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/nonchan7720-manifold)<a href="https://claudewave.com/repo/nonchan7720-manifold"><img src="https://claudewave.com/api/badge/nonchan7720-manifold" alt="Featured on ClaudeWave: nonchan7720/manifold" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
The fastest path to AI-powered full stack observability, even for lean teams.