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"
}
}
}Resumen de MCP Servers
# 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 reLo que la gente pregunta sobre manifold
¿Qué es nonchan7720/manifold?
+
nonchan7720/manifold es mcp servers para el ecosistema de Claude AI. MCP Gateway(Support for OAS, Swagger and MCP Server) Tiene 4 estrellas en GitHub y su última actualización registrada es del 2026-09-29.
¿Cómo se instala manifold?
+
Puedes instalar manifold clonando el repositorio (https://github.com/nonchan7720/manifold) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar nonchan7720/manifold?
+
Nuestro agente de seguridad ha analizado nonchan7720/manifold y le ha asignado un Trust Score de 95/100 (tier: Verified). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene nonchan7720/manifold?
+
nonchan7720/manifold es mantenido por nonchan7720. La última actividad registrada en GitHub es del 2026-09-29, con 9 issues abiertos.
¿Hay alternativas a manifold?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega manifold en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](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>Más 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.