Manifold
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ManifoldList all tools from the OpenAPI backend"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Manifold
One interface. Many connections. Manifold.
English | 日本語
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 |
Related MCP server: MCP Context Forge Gateway
Architecture
MCP Client
│
▼
┌─────────────┐
│ Manifold │ ← this server
└─────────────┘
│ │
▼ ▼
External OpenAPI / Swagger
MCP REST API Server
ServerFeatures
OpenAPI / Swagger → MCP conversion: Automatically generates MCP tools from OpenAPI 3.x / Swagger 2.x specifications
MCP backend aggregation: Transparent reverse proxy to external MCP servers
Built-in OAuth 2.1 server: Authorization server with PKCE (S256) support
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: Connects to backends on first request (no backend dependency at gateway startup)
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.
Build from source
git clone https://github.com/nonchan7720/manifold.git
cd manifold
go build -o manifold .Docker
docker pull ghcr.io/nonchan7720/manifold:latestUsage
Start the gateway
# 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:latestDocker Compose (development)
Starts a development environment including Redis.
docker compose up -dReady-to-run configuration examples are available in the examples/ directory.
Configuration
Place a configuration file (config.yaml) in the current directory or in a config/ subdirectory.
Configuration values support environment variable expansion in the form ${VAR} or ${VAR:-default}.
Connecting to an MCP backend
Expose an external MCP server through Manifold.
gateway:
port: 9999
# openssl rand -base64 32
encryptKey: ${ENCRYPT_KEY}
mcpServers:
my-mcp-server:
description: External MCP server
transport: http
url: http://localhost:8080/mcp
sqlite:
path: ./tmp/manifold.dbConnecting to an OpenAPI / Swagger backend
Automatically generate MCP tools from an OpenAPI specification.
gateway:
port: 9999
encryptKey: ${ENCRYPT_KEY}
mcpServers:
my-api:
description: Sample REST API
spec: https://example.com/api/openapi.json
baseURL: https://example.comOpenAPI backend with OAuth 2.0 authentication
gateway:
port: 9999
encryptKey: ${ENCRYPT_KEY}
mcpServers:
my-api:
description: OAuth-protected API
spec: https://example.com/api/openapi.json
baseURL: https://example.com
oauth2:
clientID: YOUR_CLIENT_ID
clientSecret: YOUR_CLIENT_SECRET
authURL: https://example.com/oauth/authorize
tokenURL: https://example.com/oauth/token
scopes:
- read
- write
redis:
addrs:
- "${REDIS_ADDRS:-localhost:6379}"
db: ${REDIS_DB:-0}Configuration reference
gateway
Field | Type | Description |
| int | Listening port (default: 8081) |
| string | TLS private key file path (optional) |
| string | TLS certificate file path (optional) |
| string | Token encryption key (required). Base64-encoded 32-byte AES-256 key. Generate with |
mcpServers.<name>
Server names (<name>) are used in URL paths, so only alphanumerics, _, and - are allowed.
Field | Type | Description |
| string | Server description (required; included in |
| string | Transport for MCP backends ( |
| string | Endpoint for the HTTP transport |
| string | Command for the stdio transport |
| []string | Arguments for the stdio command |
| map[string]string | Environment variables for the stdio process |
| string | Path or URL of an OpenAPI/Swagger specification |
| string | API base URL in OpenAPI mode (required when |
| map[string]string | Extra headers added to API requests |
| object | Static authentication settings ( |
| object | OAuth 2.0 settings (see below) |
| object | Token Exchange settings (see below) |
authValue / oauth2 / tokenExchange are mutually exclusive; only one may be configured at a time.
mcpServers.<name>.oauth2
Field | Type | Description |
| string | Client ID (required) |
| string | Client secret (required) |
| string | Authorization endpoint (required; absolute URL) |
| string | Token endpoint (required; absolute URL) |
| []string | Scopes to request |
mcpServers.<name>.tokenExchange
Exchanges the API key received from the client for an OAuth token at the specified token exchange endpoint, and uses it for backend requests. Exchange results are cached, and rate limits (429) are respected.
Field | Type | Description |
| string | Absolute URL of the token exchange endpoint (required) |
redis
Field | Type | Description |
| string | Redis URL (e.g. |
| []string | List of host:port pairs (for Cluster/Sentinel) |
| string | Username |
| string | Password |
| int | Database number |
| string | Sentinel master name |
| bool | Enable TLS |
| bool | Enable Cluster mode |
sqlite
Field | Type | Description |
| string | Database file path ( |
Either redis or sqlite must be configured.
storage
Stores content included in OpenAPI/Swagger tool responses (images, binaries, etc.) in external storage and returns resource links (download URLs). When unset, no storage is used.
Field | Type | Description |
| string | Storage type. Currently only |
| string | Host for download URLs (when set, content is served via Manifold's |
| string | S3 bucket name (required when |
| string | S3 object key prefix (required when |
storage:
type: s3
hostURL: https://manifold.example.com
s3:
bucket: my-bucket
keyPrefix: manifold/mediafileFetch
When a URL is passed to a file input field of an OpenAPI/Swagger tool, Manifold downloads the file from that URL. As an SSRF countermeasure, connections to private/loopback/link-local IPs and the http:// scheme are rejected by default.
Field | Type | Description |
| bool | Allow connections to private/loopback IPs and |
| []string | Allowlist of hosts (hostname, or |
| int64 | Maximum bytes for downloaded/base64/text content. 0 or unset defaults to 524288000 (500 MiB) |
Each field can also be overridden via environment variables (FILEFETCH_MAXSIZE, FILEFETCH_ALLOWLOCAL, FILEFETCH_ALLOWEDHOSTS).
fileFetch:
allowLocal: false
maxSize: 524288000 # 500MiB
# allowedHosts:
# - example.com
# - files.example.com:8443telemetry
Output settings for traces, metrics, and logs via OpenTelemetry.
Field | Type | Description |
| string | Service name |
| string | Environment name ( |
| bool | Gzip compression for OTLP export |
| object | Trace settings ( |
| object | Metrics settings ( |
| object | Log settings ( |
For the http / grpc exporters, specify addr (host:port) or url. grpc also accepts insecure. With metrics.exporterType: pull, Prometheus-format metrics are exposed at the /metrics endpoint instead of OTLP push.
telemetry:
serviceName: manifold
trace:
enabled: true
grpc:
addr: localhost:4317
insecure: true
metrics:
enabled: true
exporterType: push
grpc:
addr: localhost:4317
insecure: true
logs:
enabled: true
grpc:
addr: localhost:4317
insecure: trueHTTP endpoints
The HTTP endpoints exposed by Manifold.
MCP
Method | Path | Description |
|
| MCP requests (Streamable HTTP) |
|
| List registered servers (names and descriptions) |
OAuth 2.1
Method | Path | Description |
|
| Authorization Server metadata |
|
| Protected Resource metadata |
|
| Redirect to the login page |
|
| OAuth callback |
|
| Token issuance |
|
| Dynamic client registration (RFC 7591) |
|
| Aliases without a server name |
|
| Aliases without a server name |
Other
Method | Path | Description |
|
| Download stored content (only when |
|
| Prometheus metrics (only when |
Development
See CONTRIBUTING.md for how to set up a development environment and submit changes.
Test
make testLint
make lintInspiration
This project is inspired by the Agent / MCP Gateway of LiteLLM.
Just as LiteLLM's MCP Gateway provides a unified access point to multiple MCP servers, Manifold aims to be a gateway that connects a single MCP interface to many MCP servers / REST APIs.
License
MIT License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseCqualityDmaintenanceA powerful gateway for the Model Context Protocol (MCP) that unifies AI toolchains by federating multiple MCP servers, wrapping REST APIs as MCP tools, and supporting multiple transport methods with an admin dashboard.Last updated1
- -license-quality-maintenanceA feature-rich Model Context Protocol gateway that federates MCP and REST services, unifying discovery, authentication, and transport protocols while providing virtualization of legacy APIs as MCP-compliant tools.Last updated
- Alicense-qualityCmaintenanceA gateway that aggregates multiple MCP servers into a single endpoint, namespacing their tools and forwarding calls, so an agent connects to one MCP to access the entire stack.Last updatedMIT
- Alicense-qualityCmaintenanceA gateway that aggregates multiple MCP servers into a single endpoint with authentication, group-based access control, and audit logging for AI agents.Last updated34MIT
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
MCP gateway federating 21 biomedical MCP servers behind one endpoint: gnomAD, ClinVar, HPO, VEP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nonchan7720/manifold'
If you have feedback or need assistance with the MCP directory API, please join our Discord server