MetaMCP is a MCP proxy that lets you dynamically aggregate MCP servers into a unified MCP server, and apply middlewares. MetaMCP itself is a MCP server so it can be easily plugged into ANY MCP clients. For more details, consider visiting our documentation site: https://docs.metamcp.com English | 中文 - 🎯 Use Cases - 📖 Concepts - 🖥️ MCP Server - 🔐 Environment Variables \& Secrets (STDIO MCP Serve
Add this skill
npx mdskills install metatool-ai/metatool-appComprehensive MCP proxy infrastructure for aggregating servers with middleware and endpoints
1# 🚀 MetaMCP (MCP Aggregator, Orchestrator, Middleware, Gateway in one docker) <!-- omit in toc -->23<div align="center">45<div align="center">6 <a href="https://discord.gg/mNsyat7mFX" style="text-decoration: none;">7 <img src="https://img.shields.io/badge/Discord-MetaMCP-5865F2?style=flat-square&logo=discord&logoColor=white" alt="Discord" style="max-width: 100%;">8 </a>9 <a href="https://docs.metamcp.com" style="text-decoration: none;">10 <img src="https://img.shields.io/badge/Documentation-docs.metamcp.com-blue?style=flat-square&logo=book" alt="Documentation" style="max-width: 100%;">11 </a>12 <a href="https://opensource.org/licenses/MIT" style="text-decoration: none;">13 <img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square" alt="MIT License" style="max-width: 100%;">14 </a>15 <a href="https://github.com/metatool-ai/metamcp/pkgs/container/metamcp" style="text-decoration: none;">16 <img src="https://img.shields.io/badge/GHCR-available-green.svg?style=flat-square&logo=github" alt="GHCR" style="max-width: 100%;">17 </a>18 <a href="https://deepwiki.com/metatool-ai/metamcp"><img src="https://img.shields.io/badge/DeepWiki-metatool--ai%2Fmetamcp-blue.svg?style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==" alt="DeepWiki: MetaMCP"></a>19</div>2021</div>2223> **📢 Update:** *[From the author: apologize for some recent maintainence delay, but will at least keep merging PRs, more background [here](recent-updates.md)]*2425**MetaMCP** is a MCP proxy that lets you dynamically aggregate MCP servers into a unified MCP server, and apply middlewares. MetaMCP itself is a MCP server so it can be easily plugged into **ANY** MCP clients.26272829---3031For more details, consider visiting our documentation site: https://docs.metamcp.com3233English | [中文](./README_cn.md)34## 📋 Table of Contents <!-- omit in toc -->3536- [🎯 Use Cases](#-use-cases)37- [📖 Concepts](#-concepts)38 - [🖥️ **MCP Server**](#️-mcp-server)39 - [🔐 **Environment Variables \& Secrets (STDIO MCP Servers)**](#-environment-variables--secrets-stdio-mcp-servers)40 - [🏷️ **MetaMCP Namespace**](#️-metamcp-namespace)41 - [🌐 **MetaMCP Endpoint**](#-metamcp-endpoint)42 - [⚙️ **Middleware**](#️-middleware)43 - [🔍 **Inspector**](#-inspector)44 - [✏️ **Tool Overrides \& Annotations**](#️-tool-overrides--annotations)45- [🚀 Quick Start](#-quick-start)46 - [🐳 Run with Docker Compose (Recommended)](#-run-with-docker-compose-recommended)47 - [📦 Build development environment with Dev Containers (VSCode/Cursor)](#-build-development-environment-with-dev-containers-vscodecursor)48 - [💻 Local Development](#-local-development)49- [🔌 MCP Protocol Compatibility](#-mcp-protocol-compatibility)50- [🔗 Connect to MetaMCP](#-connect-to-metamcp)51 - [📝 E.g., Cursor via mcp.json](#-eg-cursor-via-mcpjson)52 - [🖥️ Connecting Claude Desktop and Other STDIO-only Clients](#️-connecting-claude-desktop-and-other-stdio-only-clients)53 - [🔧 API Key Auth Troubleshooting](#-api-key-auth-troubleshooting)54- [❄️ Cold Start Problem and Custom Dockerfile](#️-cold-start-problem-and-custom-dockerfile)55- [🧾 Log Levels](#-log-levels)56- [🔐 Authentication](#-authentication)57- [🚦 Traffic Management](#-traffic-management)58 - [🚧 **MCP Rate Limit**](#-mcp-rate-limit)59- [🔗 OpenID Connect (OIDC) Provider Support](#-openid-connect-oidc-provider-support)60 - [🛠️ **Configuration**](#️-configuration)61 - [🏢 **Supported Providers**](#-supported-providers)62 - [🔒 **Security Features**](#-security-features)63 - [📱 **Usage**](#-usage)64- [⚙️ Registration Controls](#️-registration-controls)65 - [🎛️ **Available Controls**](#️-available-controls)66 - [🏢 **Enterprise Use Cases**](#-enterprise-use-cases)67 - [🛠️ **Configuration**](#️-configuration-1)68- [🌐 Custom Deployment and SSE conf for Nginx](#-custom-deployment-and-sse-conf-for-nginx)69- [🏗️ Architecture](#️-architecture)70 - [📊 Sequence Diagram](#-sequence-diagram)71- [🗺️ Roadmap](#️-roadmap)72- [🌐 i18n](#-i18n)73- [🤝 Contributing](#-contributing)74- [📄 License](#-license)75- [🙏 Credits](#-credits)7677## 🎯 Use Cases78- 🏷️ **Group MCP servers into namespaces, host them as meta-MCPs, and assign public endpoints** (SSE or Streamable HTTP), with auth. One-click to switch a namespace for an endpoint.79- 🎯 **Pick tools you only need when remixing MCP servers.** Apply other **pluggable middleware** around observability, security, etc. (coming soon)80- 🔍 **Use as enhanced MCP inspector** with saved server configs, and inspect your MetaMCP endpoints in house to see if it works or not.81- 🔍 **Use as Elasticsearch for MCP tool selection** (coming soon)8283Generally developers can use MetaMCP as **infrastructure** to host dynamically composed MCP servers through a unified endpoint, and build agents on top of it.8485Quick demo video: https://youtu.be/Cf6jVd2saAs86878889## 📖 Concepts9091### 🖥️ **MCP Server**92A MCP server configuration that tells MetaMCP how to start a MCP server.9394```json95"HackerNews": {96 "type": "STDIO",97 "command": "uvx",98 "args": ["mcp-hn"]99}100```101102#### 🔐 **Environment Variables & Secrets (STDIO MCP Servers)**103104For **STDIO MCP servers**, MetaMCP supports three ways to handle environment variables and secrets:105106**1. Raw Values** - Direct string values (not recommended for secrets):107```108API_KEY=your-actual-api-key-here109DEBUG=true110```111112**2. Environment Variable References** - Use `${ENV_VAR_NAME}` syntax:113```114API_KEY=${OPENAI_API_KEY}115DATABASE_URL=${DB_CONNECTION_STRING}116```117118**3. Auto-matching** - If the expected environment variable name in your tool matches the container's environment variable, you can omit it entirely. MetaMCP will automatically pass through matching environment variables.119120> **🔒 Security Note**: Environment variable references (`${VAR_NAME}`) are resolved from the MetaMCP container's environment at runtime. This keeps actual secret values out of your configuration and git repository.121122> **⚙️ Development Note**: For local development with `pnpm run dev:docker`, ensure your environment variables are listed in `turbo.json` under `globalEnv` to be passed to the development processes. This is not required for production Docker deployments.123124### 🏷️ **MetaMCP Namespace**125- Group one or more MCP servers into a namespace126- Enable/disable MCP servers or at tool level127- Apply middlewares to MCP requests and responses128- Override tool names/titles/descriptions per namespace and attach custom MCP annotations (e.g. `{ "annotations": { "readOnlyHint": false } }`)129130### 🌐 **MetaMCP Endpoint**131- Create endpoints and assign namespace to endpoints132- Multiple MCP servers in the namespace will be aggregated and emitted as a MetaMCP endpoint133- Choose between API-Key Auth (in header or query param) or standard OAuth in MCP Spec 2025-06-18134- Host through **SSE** or **Streamable HTTP** transports in MCP and **OpenAPI** endpoints for clients like [Open WebUI](https://github.com/open-webui/open-webui)135136### ⚙️ **Middleware**137- Intercepts and transforms MCP requests and responses at namespace level138- **Built-in example**: "Filter inactive tools" - optimizes tool context for LLMs139- **Future ideas**: tool logging, error traces, validation, scanning140141### 🔍 **Inspector**142Similar to the official MCP inspector, but with **saved server configs** - MetaMCP automatically creates configurations so you can debug MetaMCP endpoints immediately.143144### ✏️ **Tool Overrides & Annotations**145- Open a namespace → **Tools** tab to see every tool coming from connected MCP servers.146- Each saved tool can be expanded and edited inline: update the display **name/title/description** or provide a JSON blob with namespace-specific annotations (for example `{ "annotations": { "readOnlyHint": false } }`).147- Badges in the table ("Overridden", "Annotations") show which tools currently have custom metadata. Hover them to read a tooltip describing what was overridden.148- Annotation overrides are merged with whatever the upstream MCP server returns, so you can safely add custom UI hints without losing provider metadata.149150## 🚀 Quick Start151152### **🐳 Run with Docker Compose (Recommended)**153154Clone repo, prepare `.env`, and start with docker compose:155156```bash157git clone https://github.com/metatool-ai/metamcp.git158cd metamcp159cp example.env .env160docker compose up -d161```162163If you modify APP_URL env vars, make sure you only access from the APP_URL, because MetaMCP enforces CORS policy on the URL, so no other URL is accessible.164165Note that the pg volume name may collide with your other pg dockers, which is global, consider rename it in `docker-compose.yml`:166167```168volumes:169 metamcp_postgres_data:170 driver: local171```172173### **📦 Build development environment with Dev Containers (VSCode/Cursor)**174175You can use the VSCode/Cursor extension to build the development environment in a container.176177It only requires that you have an environment running Docker or a similar alternative (the `docker`/`docker compose` command is required), and no other dependent components need to be installed on your host machine.1781791. First, clone the MetaMCP source code, open project in Visual Studio Code.180```bash181git clone https://github.com/metatool-ai/metamcp.git182cd metamcp183code .184```1852. Switch to Dev Containers. Open the VSCode Command Palette, and execute `Dev Containers: Reopen in Container`.186187VSCode will open the Dev Containers project in a new window, where it will build the runtime and install the toolchain according to the `Dockerfile` before starting the connection and finally installing the MetaMCP dependencies.188<img width="895" height="153" alt="image" src="https://github.com/user-attachments/assets/d3e1420d-43c1-4ed6-9229-b91ea09c142a" />189190> **note**191> This process requires a reliable network connection, and it will access Docker Hub, GitHub, and some other sites. You will need to ensure the network connection yourself, otherwise the container build may fail.192193Wait some minutes, depending on the internet connection or computer performance, it may take from a few minutes to tens of minutes, you can click on the Progress Bar in the bottom right corner to view a live log where you will be able to check unusual stuck.194<img width="732" height="173" alt="image" src="https://github.com/user-attachments/assets/6e5752f8-7353-4a8f-b489-c13daef6700e" />195196After finished, you can run `pnpm dev` to start the development server.197198### **💻 Local Development**199200Still recommend running postgres through docker for easy setup:201202```bash203pnpm install204pnpm dev205```206207## 🔌 MCP Protocol Compatibility208209- ✅ **Tools, Resources, and Prompts** supported210- ✅ **OAuth-enabled MCP servers** tested for 03-26 version211212If you have questions, feel free to leave **GitHub issues** or **PRs**.213214## 🔗 Connect to MetaMCP215216### 📝 E.g., Cursor via mcp.json217218Example `mcp.json`219220```json221{222 "mcpServers": {223 "MetaMCP": {224 "url": "http://localhost:12008/metamcp/<YOUR_ENDPOINT_NAME>/sse"225 }226 }227}228```229230### 🖥️ Connecting Claude Desktop and Other STDIO-only Clients231232Since MetaMCP endpoints are remote only (SSE, Streamable HTTP, OpenAPI), clients that only support stdio servers (like Claude Desktop) need a local proxy to connect.233234**Note:** While `mcp-remote` is sometimes suggested for this purpose, it's designed for OAuth-based authentication and doesn't work with MetaMCP's API key authentication. Based on testing, `mcp-proxy` is the recommended solution.235236Here's a working configuration for Claude Desktop using `mcp-proxy`:237238Using Streamable HTTP239240```json241{242 "mcpServers": {243 "MetaMCP": {244 "command": "uvx",245 "args": [246 "mcp-proxy",247 "--transport",248 "streamablehttp",249 "http://localhost:12008/metamcp/<YOUR_ENDPOINT_NAME>/mcp"250 ],251 "env": {252 "API_ACCESS_TOKEN": "<YOUR_API_KEY_HERE>"253 }254 }255 }256}257```258259Using SSE260261```json262{263 "mcpServers": {264 "ehn": {265 "command": "uvx",266 "args": [267 "mcp-proxy",268 "http://localhost:12008/metamcp/<YOUR_ENDPOINT_NAME>/sse"269 ],270 "env": {271 "API_ACCESS_TOKEN": "<YOUR_API_KEY_HERE>"272 }273 }274 }275}276```277278**Important notes:**279- Replace `<YOUR_ENDPOINT_NAME>` with your actual endpoint name280- Replace `<YOUR_API_KEY_HERE>` with your MetaMCP API key (format: `sk_mt_...`)281282For more details and alternative approaches, see [issue #76](https://github.com/metatool-ai/metamcp/issues/76#issuecomment-3046707532).283284### 🔧 API Key Auth Troubleshooting285286- `?api_key=` param api key auth doesn't work for SSE. It only works for Streamable HTTP and OpenAPI.287- Best practice is to use the API key in `Authorization: Bearer <API_KEY>` header.288- Try disable auth temporarily when you face connection issues to see if it is an auth issue.289290## ❄️ Cold Start Problem and Custom Dockerfile291292- MetaMCP pre-allocate idle sessions for each configured MCP servers and MetaMCPs. The default idle session for each is 1 and that can help reduce cold start time.293- If your MCP requires dependencies other than `uvx` or `npx`, you need to customize the Dockerfile to install dependencies on your own.294- Check [invalidation.md](invalidation.md) for a seq diagram about how idle session invalidates during updates.295296🛠️ **Solution**: Customize the Dockerfile to add dependencies or pre-install packages to reduce cold start time.297298## 🧾 Log Levels299300MetaMCP’s backend writes logs to files and optionally mirrors selected levels to the console. Control console mirroring with the `LOG_LEVEL` environment variable.301302- Files303 - `app.log`: receives `DEBUG`, `INFO`, and `WARN`304 - `error.log`: receives `ERROR`305306- Console mirroring (`LOG_LEVEL`)307 - `all`: mirror `DEBUG`, `INFO`, `WARN`, `ERROR` to console308 - `info`: mirror only `INFO` to console309 - `errors-only`: mirror `WARN` and `ERROR` to console310 - `none`: no console output311312- Defaults and examples313 - Default (when unset or invalid): `errors-only`314 - `.env` example:315 ```bash316 LOG_LEVEL='errors-only' # 'all', 'info', 'errors-only', 'none'317 ```318 - `docker-compose.dev.yml` uses: `LOG_LEVEL: ${LOG_LEVEL:-all}`319320## 🔐 Authentication321322- 🛡️ **Better Auth** for frontend & backend (TRPC procedures)323- 🍪 **Session cookies** enforce secure internal MCP proxy connections324- 🔑 **API key authentication** for external access via `Authorization: Bearer <api-key>` header325- 🪪 **MCP OAuth**: Exposed endpoints have options to use standard OAuth in MCP Spec 2025-06-18, easy to connect.326- 🏢 **Multi-tenancy**: Designed for organizations to deploy on their own machines. Supports both private and public access scopes. Users can create MCPs, namespaces, endpoints, and API keys for themselves or for everyone. Public API keys cannot access private MetaMCPs.327- ⚙️ **Separate Registration Controls**: Administrators can independently control UI registration and SSO/OAuth registration through the settings page, allowing for flexible enterprise deployment scenarios.328329## 🚦 Traffic Management330331### 🚧 MCP Rate Limit332The MCP Rate Limit feature allows you to set the maximum requests a MCP tool (a endpoint) will accept in a given time window. There are two different strategies to set limits that you can use separately or together:333334 * `Endpoint rate-limiting (Rate Limiting)`: applies simultaneously to all clients using the endpoint, sharing a unique counter.335 * `User rate-limiting (Client Rate Limiting)`: sets a counter to each individual user.336337Both types can coexist and they complement each other, and store the counters in-memory. On a cluster, each machine sees and counts only its passing traffic.338339### **Endpoint rate-limiting**340The endpoint rate limit acts on the number of simultaneous transactions an endpoint can process. This type of limit protects the service for all customers.341When the users connected to an endpoint together exceed the `rate-limiting`, MetaMCP starts to reject connections with a status code `503 Service Unavailable`.342343#### **Endpoint rate-limiting options**344 * `Max Rate`: Defines how many requests will you accept from all users together at any given instant. When the gateway starts, the bucket is full. As requests from users come, the remaining tokens in the bucket decrease. At the same time, the rate-limiting refills the bucket at the desired rate until its maximum capacity is reached.345 * `Max Rate Seconds`: Time period in which the maximum rates operate in seconds. For instance, if you set an max rate seconds of 60s and a rate-limiting of 5, you are allowing 5 requests every sixty seconds.346347### **User rate-limiting**348The client or user rate limit applies one counter to each individual user and endpoint. When a single user connected to an endpoint exceeds their `client-max-rate`, MetaMCP starts rejecting connections with a status code `429 Too Many Requests`349350#### **User rate-limiting options**351 * `Client Max Rate`: Number of tokens you add to the Token Bucket for each individual user (user quota) in the time interval you want (Client Max Rate Seconds). The remaining tokens in the bucket are the requests a specific user can do.352 * `Client Max Rate Seconds`: Time period in which the maximum rates operate in seconds. For instance, if you set an every of 60s and a rate of 5, you are allowing 5 requests every sixty seconds.353 * `Client Max Rate Strategy`: Sets the strategy you will use to set client counters. Choose ip when the restrictions apply to the client’s IP address, or set it to header when there is a header that identifies a user uniquely. That header must be defined with the key entry.354 * `Client Max Rate Strategy Key`: It is the header name containing the user identification (e.g., Authorization on tokens, or X-Original-Forwarded-For for IPs).355356## 🔗 OpenID Connect (OIDC) Provider Support357358MetaMCP supports **OpenID Connect authentication** for enterprise SSO integration. This allows organizations to use their existing identity providers (Auth0, Keycloak, Azure AD, etc.) for authentication.359360### 🛠️ **Configuration**361362Add the following environment variables to your `.env` file:363364```bash365# Required366OIDC_CLIENT_ID=your-oidc-client-id367OIDC_CLIENT_SECRET=your-oidc-client-secret368OIDC_DISCOVERY_URL=https://your-provider.com/.well-known/openid-configuration369370# Optional customization371OIDC_PROVIDER_ID=oidc372OIDC_SCOPES=openid email profile373OIDC_PKCE=true374```375376### 🏢 **Supported Providers**377378MetaMCP has been tested with popular OIDC providers:379380- **Auth0**: `https://your-domain.auth0.com/.well-known/openid-configuration`381- **Keycloak**: `https://your-keycloak.com/realms/your-realm/.well-known/openid-configuration`382- **Azure AD**: `https://login.microsoftonline.com/your-tenant-id/v2.0/.well-known/openid-configuration`383- **Google**: `https://accounts.google.com/.well-known/openid-configuration`384- **Okta**: `https://your-domain.okta.com/.well-known/openid-configuration`385386### 🔒 **Security Features**387388- 🔐 **PKCE (Proof Key for Code Exchange)** enabled by default389- 🛡️ **Authorization Code Flow** with automatic user creation390- 🔄 **Auto-discovery** of OIDC endpoints391- 🍪 **Seamless session management** with existing auth system392393### 📱 **Usage**394395Once configured, users will see a **"Sign in with OIDC"** button on the login page alongside the email/password form. The authentication flow automatically creates new users on first login.396397For more detailed configuration examples and troubleshooting, see **[CONTRIBUTING.md](CONTRIBUTING.md#openid-connect-oidc-provider-setup)**.398399## ⚙️ Registration Controls400401MetaMCP provides **separate controls** for different registration methods, allowing administrators to fine-tune user access policies for enterprise deployments.402403### 🎛️ **Available Controls**404405- **UI Registration**: Controls whether users can create accounts via the registration form406- **SSO Registration**: Controls whether users can create accounts via SSO/OAuth providers (OIDC, etc.)407408### 🏢 **Enterprise Use Cases**409410This separation enables common enterprise scenarios:411412- **Block UI registration, allow SSO**: Prevent manual signups while allowing corporate SSO users413- **Block SSO registration, allow UI**: Allow manual signups while restricting SSO access414- **Block both**: Completely disable new user registration415- **Allow both**: Default behavior for open deployments416417### 🛠️ **Configuration**418419Access the **Settings** page in the MetaMCP admin interface to configure these controls:4204211. Navigate to **Settings** → **Authentication Settings**4222. Toggle **"Disable UI Registration"** to control form-based signups4233. Toggle **"Disable SSO Registration"** to control OAuth/OIDC signups424425Both controls work independently, giving you full flexibility over your registration policy.426427## 🌐 Custom Deployment and SSE conf for Nginx428429If you want to deploy it to a online service or a VPS, a instance of at least 2GB-4GB of memory is required. And the larger size, the better performance.430431Since MCP leverages SSE for long connection, if you are using reverse proxy like nginx, please refer to an example setup [nginx.conf.example](nginx.conf.example)432433## 🏗️ Architecture434435- **Frontend**: Next.js436- **Backend**: Express.js with tRPC, hosting MCPs through TS SDK and internal proxy437- **Auth**: Better Auth438- **Structure**: Standalone monorepo with Turborepo and Docker publishing439440### 📊 Sequence Diagram441442*Note: Prompts and resources follow similar patterns to tools.*443444```mermaid445sequenceDiagram446 participant MCPClient as MCP Client (e.g., Claude Desktop)447 participant MetaMCP as MetaMCP Server448 participant MCPServers as Installed MCP Servers449450 MCPClient ->> MetaMCP: Request list tools451452 loop For each listed MCP Server453 MetaMCP ->> MCPServers: Request list_tools454 MCPServers ->> MetaMCP: Return list of tools455 end456457 MetaMCP ->> MetaMCP: Aggregate tool lists & apply middleware458 MetaMCP ->> MCPClient: Return aggregated list of tools459460 MCPClient ->> MetaMCP: Call tool461 MetaMCP ->> MCPServers: call_tool to target MCP Server462 MCPServers ->> MetaMCP: Return tool response463 MetaMCP ->> MCPClient: Return tool response464```465466## 🗺️ Roadmap467468**Potential next steps:**469470- [ ] 🔌 Headless Admin API access471- [ ] 🔍 Dynamically apply search rules on MetaMCP endpoints472- [ ] 🛠️ More middlewares473- [ ] 💬 Chat/Agent Playground474- [ ] 🧪 Testing & Evaluation for MCP tool selection optimization475- [ ] ⚡ Dynamically generate MCP servers476477## 🌐 i18n478479See [README-i18n.md](README-i18n.md)480481Currently en and zh locale are supported, but welcome contributions.482483## 🤝 Contributing484485We welcome contributions! See details at **[CONTRIBUTING.md](CONTRIBUTING.md)**486487## 📄 License488489**MIT**490491Would appreciate if you mentioned with back links if your projects use the code.492493## 🙏 Credits494495Some code inspired by:496- [MCP Inspector](https://github.com/modelcontextprotocol/inspector)497- [MCP Proxy Server](https://github.com/adamwattis/mcp-proxy-server)498499Not directly used the code by took ideas from500- https://github.com/open-webui/openapi-servers501- https://github.com/open-webui/mcpo502
Full transparency — inspect the skill content before installing.