📢 更新: 作者注:对近期维护延迟表示歉意,但至少会继续合并PR,更多背景信息[此处]
MetaMCP 是一款 MCP 代理,可让您动态聚合多个 MCP 服务器为一个统一的 MCP 服务器,并应用 middlewares。MetaMCP 本身就是一个 MCP 服务器,因此可以轻松接入任何 MCP 客户端。
有关更多详情,请访问我们的文档网站:[***]
英文 | 中文
通常,开发人员可以将 MetaMCP 用作基础设施,通过统一端点托管动态组合的 MCP 服务器,并在其之上构建代理。
快速演示视频:[***]
告知 MetaMCP 如何启动 MCP 服务器的配置。
"HackerNews": {
"type": "STDIO",
"command": "uvx",
"args": ["mcp-hn"]
}
对于STDIO MCP 服务器,MetaMCP 支持三种方式处理环境变量和密钥:
1. 原始值 - 直接字符串值(不建议用于密钥):
API_KEY=your-actual-api-key-here
DEBUG=true
2. 环境变量引用 - 使用 ${ENV_VAR_NAME} 语法:
API_KEY=${OPENAI_API_KEY}
DATABASE_URL=${DB_CONNECTION_STRING}
3. 自动匹配 - 如果工具中预期的环境变量名称与容器的环境变量匹配,则可以完全省略。MetaMCP 将自动传递匹配的环境变量。
🔒 安全说明:环境变量引用(
${VAR_NAME})在运行时从 MetaMCP 容器的环境中解析。这可确保实际密钥值不会出现在配置和 git 仓库中。
⚙️ 开发说明:对于使用
pnpm run dev:docker的本地开发,请确保环境变量在turbo.json的globalEnv下列出,以便传递给开发进程。生产 Docker 部署不需要此步骤。
{ "annotations": { "readOnlyHint": false } })与官方 MCP 检查器类似,但具有保存的服务器配置——MetaMCP 会自动创建配置,以便您立即调试 MetaMCP 端点。
{ "annotations": { "readOnlyHint": false } })。克隆仓库,准备 .env 文件,然后使用 docker compose 启动:
git clone https://github.com/metatool-ai/metamcp.git
cd metamcp
cp example.env .env
docker compose up -d
如果修改 APP_URL 环境变量,请确保仅通过 APP_URL 访问,因为 MetaMCP 会对该 URL 强制执行 CORS 策略,因此其他 URL 无法访问。
[!NOTE] pg 卷名称可能会与您其他的 pg docker 容器冲突(因为卷是全局的),建议在
docker-compose.yml中重命名它:
> volumes:
> metamcp_postgres_data:
> driver: local
>
您可以使用 VSCode/Cursor 扩展在容器中构建开发环境。
只需确保环境中运行着 Docker 或类似替代工具(需要 docker/docker compose 命令),无需在主机上安装其他依赖组件。
git clone https://github.com/metatool-ai/metamcp.git
cd metamcp
code .
Dev Containers: Reopen in Container。VSCode 将在新窗口中打开 Dev Containers 项目,根据 Dockerfile 构建运行时并安装工具链,然后启动连接,最后安装 MetaMCP 依赖。
[!NOTE] 此过程需要稳定的网络连接,会访问 Docker Hub、GitHub 及其他一些站点。您需要自行确保网络连接正常,否则容器构建可能失败。
等待几分钟,根据网络连接或计算机性能,此过程可能需要几分钟到几十分钟,您可以点击右下角的进度条查看实时日志,以检查是否出现异常卡住。
完成后,可运行 pnpm dev 启动开发服务器。
仍建议通过 docker 运行 postgres 以简化设置:
pnpm install
pnpm dev
如有疑问,欢迎提交 GitHub issues 或 PRs。
示例 mcp.json
{
"mcpServers": {
"MetaMCP": {
"url": "http://localhost:12008/metamcp/ /sse"
}
}
}
由于 MetaMCP 端点仅支持远程访问(SSE、Streamable HTTP、OpenAPI),仅支持 stdio 服务器的客户端(如 Claude Desktop)需要通过本地代理连接。
[!NOTE] 虽然有时会建议使用
mcp-remote实现此目的,但它专为基于 OAuth 的认证设计,不支持 MetaMCP 的 API 密钥认证。经测试mcp-proxy是推荐的解决方案。
以下是使用 mcp-proxy 连接 Claude Desktop 的有效配置:
使用 Streamable HTTP
{
"mcpServers": {
"MetaMCP": {
"command": "uvx",
"args": [
"mcp-proxy",
"--transport",
"streamablehttp",
"http://localhost:12008/metamcp/ /mcp"
],
"env": {
"API_ACCESS_TOKEN": " "
}
}
}
}
使用 SSE
{
"mcpServers": {
"ehn": {
"command": "uvx",
"args": [
"mcp-proxy",
"http://localhost:12008/metamcp/ /sse"
],
"env": {
"API_ACCESS_TOKEN": " "
}
}
}
}
[!IMPORTANT]
- 将
替换为实际的端点名称- 将
替换为您的 MetaMCP API 密钥(格式:sk_mt_...)
有关更多详细信息和替代方法,请参见 https://github.com/metatool-ai/metamcp/issues/76#issuecomment-3046707532%E3%80%82
?api_key= 参数式 API 密钥认证不适用于 SSE。仅适用于 Streamable HTTP 和 OpenAPI。Authorization: Bearer 头中使用 API 密钥。uvx 或 npx 之外的依赖项,需要自定义 Dockerfile 自行安装依赖。🛠️ 解决方案:自定义 Dockerfile 添加依赖或预安装软件包,以减少冷启动时间。
MetaMCP 后端将日志写入文件,并可选择将特定级别日志镜像到控制台。通过 LOG_LEVEL 环境变量控制控制台镜像。
文件
app.log:接收 DEBUG、INFO 和 WARN 级别日志error.log:接收 ERROR 级别日志控制台镜像(LOG_LEVEL)
all:将 DEBUG、INFO、WARN、ERROR 镜像到控制台info:仅将 INFO 镜像到控制台errors-only:将 WARN 和 ERROR 镜像到控制台none:无控制台输出默认值和示例
errors-only.env 示例:LOG_LEVEL='errors-only' # 'all', 'info', 'errors-only', 'none'
docker-compose.dev.yml 中使用:LOG_LEVEL: ${LOG_LEVEL:-all}Authorization: Bearer 头进行外部访问MCP 速率限制功能允许您设置 MCP 工具(端点)在给定时间窗口内接受的最大请求数。有两种不同的限制策略,可单独或同时使用:
端点速率限制(Rate Limiting):同时适用于使用该端点的所有客户端,共享一个唯一计数器。用户速率限制(Client Rate Limiting):为每个独立用户设置一个计数器。两种类型可以共存并相互补充,计数器存储在内存中。在集群中,每台机器仅查看和统计经过自身的流量。
端点速率限制作用于端点可处理的同时事务数。这种限制为所有客户保护服务。当连接到某个端点的用户共同超过 rate-limiting 时,MetaMCP 将开始拒绝连接,返回状态码 503 Service Unavailable。
MetaMCP 支持OpenID Connect 身份验证,用于企业单点登录(SSO)集成。这允许组织使用其现有的身份提供商(Auth0、Keycloak、Azure AD 等)进行身份验证。
在您的 .env 文件中添加以下环境变量:
# 必需
OIDC_CLIENT_ID=your-oidc-client-id
OIDC_CLIENT_SECRET=your-oidc-client-secret
OIDC_DISCOVERY_URL=https://your-provider.com/.well-known/openid-configuration
# 可选自定义
OIDC_PROVIDER_ID=oidc
OIDC_SCOPES=openid email profile
OIDC_PKCE=true
MetaMCP 已通过以下主流 OIDC 提供商的测试:
https://your-domain.auth0.com/.well-known/openid-configurationhttps://your-keycloak.com/realms/your-realm/.well-known/openid-configurationhttps://login.microsoftonline.com/your-tenant-id/v2.0/.well-known/openid-configurationhttps://accounts.google.com/.well-known/openid-configurationhttps://your-domain.okta.com/.well-known/openid-configuration配置完成后,用户将在登录页面上看到 “使用 OIDC 登录” 按钮,与电子邮件/密码表单并列。身份验证流程会在首次登录时自动创建新用户。
有关更详细的配置示例和故障排除,请参见 CONTRIBUTING.md。
MetaMCP 为不同的注册方式提供独立控制,允许管理员为企业部署微调用户访问策略。
这种分离支持常见的企业场景:
在 MetaMCP 管理界面中访问设置页面以配置这些控制项:
这两个控制项独立工作,让您可以完全灵活地制定注册策略。
如果要将其部署到在线服务或 VPS,至少需要 2GB-4GB 内存的实例。内存越大,性能越好。
由于 MCP 利用 SSE 实现长连接,如果您使用 nginx 等反向代理,请参考示例配置 nginx.conf.example。
注意:提示词和资源遵循与工具类似的模式。
sequenceDiagram
participant MCPClient as MCP 客户端(如 Claude 桌面版)
participant MetaMCP as MetaMCP 服务器
participant MCPServers as 已安装的 MCP 服务器
MCPClient ->> MetaMCP: 请求工具列表
loop 针对每个列出的 MCP 服务器
MetaMCP ->> MCPServers: 请求 list_tools
MCPServers ->> MetaMCP: 返回工具列表
end
MetaMCP ->> MetaMCP: 聚合工具列表并应用中间件
MetaMCP ->> MCPClient: 返回聚合后的工具列表
MCPClient ->> MetaMCP: 调用工具
MetaMCP ->> MCPServers: 向目标 MCP 服务器调用 call_tool
MCPServers ->> MetaMCP: 返回工具响应
MetaMCP ->> MCPClient: 返回工具响应
潜在后续步骤:
参见 README-i18n.md
目前支持 en(英文)和 zh(中文)语言环境,欢迎贡献。
我们欢迎贡献!详情参见 CONTRIBUTING.md
MIT
如果您的项目使用了本代码,欢迎提及并添加反向链接。
部分代码灵感来源于:
未直接使用代码,但借鉴了以下项目的思路:
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
不支持 push
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务