🚀 MetaMCP(MCP聚合器、编排器、中间件、网关在一个docker中)
📢 更新: *\来自作者:为最近的一些维护延迟道歉,但至少会继续合并PR,更多背景信息 [这里\]*
MetaMCP 是一个MCP代理,它允许您将MCP服务器动态聚合到一个统一的MCP服务器中,并应用中间件。MetaMCP本身是一个MCP服务器,因此可以轻松插入 任何 MCP客户端。
______________________________________________________________________
有关更多详细信息,请考虑访问我们的文档网站:https://docs.metamcp.com
英语| 中文
📋 目录
- 🖥️ MCP服务器 - 🔐 环境变量和秘密(STDIO MCP服务器) - 🏷️ MetaMCP命名空间 - 🌐 MetaMCP端点 - ⚙️ 中间件 - 🔍 检查员 - ✏️ 工具替换和注释
- - 📦 使用开发容器(VSCode/Cursor)构建开发环境 - 💻 本地开发
- 📝 例如,通过mcp.json调用游标 - 🖥️ 连接Claude Desktop和其他仅限STDIO的客户端 - 🔧 API密钥验证疑难解答
- 🛠️ 配置 - 🏢 支持的提供商 - 🔒 安全特性 - 📱 用法
- 📊 顺序图
🎯 用例
- 🏷️ 将MCP服务器分组到命名空间中,将其作为元MCP托管,并分配公共端点 (SSE或流式HTTP),带身份验证。单击一下即可切换终结点的命名空间。
- 🎯 选择仅在重新混合MCP服务器时需要的工具。 应用其他 可插拔中间件 围绕可观察性、安全性等。(即将推出)
- 🔍 用作增强型MCP检查器 使用已保存的服务器配置,并在内部检查您的MetaMCP端点,查看其是否正常工作。
- 🔍 用作MCP工具选择的Elasticsearch (即将推出)
通常,开发人员可以将MetaMCP用作 基础设施 通过统一的端点托管动态组合的MCP服务器,并在其上构建代理。
快速演示视频:https://youtu.be/Cf6jVd2saAs
📖 概念
🖥️ MCP服务器
一种MCP服务器配置,告诉MetaMCP如何启动MCP服务器。
"HackerNews": {
"type": "STDIO",
"command": "uvx",
"args": ["mcp-hn"]
}🔐 环境变量和秘密(STDIO MCP服务器)
对于 STDIO MCP服务器,MetaMCP支持三种处理环境变量和机密的方法:
1.原始值 -直接字符串值(不建议用于机密):
API_KEY=your-actual-api-key-here
DEBUG=true2.环境变量引用 -使用 ${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部署所必需的。
🏷️ MetaMCP命名空间
- 将一个或多个MCP服务器分组到命名空间中
- 启用/禁用MCP服务器或在工具级别
- 将中间件应用于MCP请求和响应
- 覆盖每个命名空间的工具名称/标题/描述,并附加自定义MCP注释(例如。
{ "annotations": { "readOnlyHint": false } })
🌐 MetaMCP端点
- 创建端点并为端点分配命名空间
- 命名空间中的多个MCP服务器将被聚合并作为MetaMCP端点发出
- 在API-Key Auth(在标头或查询参数中)或MCP规范2025-06-18中的标准OAuth之间进行选择
- 主机通过 上海证券交易所 或 流式HTTP MCP中的传输 开放应用程序接口 客户端的端点,如 打开WebUI
⚙️ 中间件
- 在命名空间级别拦截和转换MCP请求和响应
- 内置示例:“筛选非活动工具”-优化LLM的工具上下文
- 未来想法:工具日志记录、错误跟踪、验证、扫描
🔍 检查员
与MCP官方检查员类似,但 已保存的服务器配置 -MetaMCP会自动创建配置,以便您可以立即调试MetaMCP端点。
✏️ 工具替换和注释
- 打开命名空间→ 工具 选项卡,查看来自连接的MCP服务器的每个工具。
- 每个保存的工具都可以在线展开和编辑:更新显示 姓名/职务/描述 或者提供具有命名空间特定注释的JSON blob(例如
{ "annotations": { "readOnlyHint": false } }). - 表中的徽章(“覆盖”、“注释”)显示了哪些工具当前具有自定义元数据。悬停它们以阅读描述被覆盖内容的工具提示。
- 注释覆盖与上游MCP服务器返回的任何内容合并,因此您可以安全地添加自定义UI提示,而不会丢失提供程序元数据。
🚀 快速开始
🐳 使用Docker Compose运行(推荐)
克隆仓库,准备 .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。
请注意,pg卷名可能会与其他pg停靠器冲突,这是全局的,请考虑在中重命名它 docker-compose.yml:
volumes:
metamcp_postgres_data:
driver: local📦 使用开发容器(VSCode/Cursor)构建开发环境
您可以使用VSCode/Cursor扩展在容器中构建开发环境。
它只需要你有一个运行Docker或类似替代品的环境( docker/docker compose 命令是必需的),并且不需要在主机上安装其他依赖组件。
- 首先,克隆MetaMCP源代码,在Visual Studio code中打开项目。
git clone https://github.com/metatool-ai/metamcp.git
cd metamcp
code .- 切换到开发容器。打开VSCode命令面板,并执行
Dev Containers: Reopen in Container.
VSCode将在新窗口中打开Dev Containers项目,在那里它将根据 Dockerfile 在开始连接并最终安装MetaMCP依赖项之前。
笔记 这个过程需要可靠的网络连接,它将访问Docker Hub、GitHub和其他一些网站。您需要自己确保网络连接,否则容器构建可能会失败。
等待几分钟,具体取决于互联网连接或计算机性能,可能需要几分钟到几十分钟,您可以单击右下角的进度栏查看实时日志,在那里您可以检查异常卡住的情况。
完成后,您可以运行 pnpm dev 启动开发服务器。
💻 本地开发
仍然建议通过docker运行postgres以方便设置:
pnpm install
pnpm dev🔌 MCP协议兼容性
- ✅ 工具、资源和提示 支持
- ✅ 启用OAuth的MCP服务器 针对03-26版本进行了测试
如果你有任何问题,请随时离开 GitHub问题 或 公共关系.
🔗 连接到MetaMCP
📝 例如,通过mcp.json调用游标
示例 mcp.json
{
"mcpServers": {
"MetaMCP": {
"url": "http://localhost:12008/metamcp//sse"
}
}
}🖥️ 连接Claude Desktop和其他仅限STDIO的客户端
由于MetaMCP端点仅是远程的(SSE、Streamable HTTP、OpenAPI),因此只支持stdio服务器的客户端(如Claude Desktop)需要一个本地代理来连接。
注: 当 mcp-remote 有时建议用于此目的,它是为基于OAuth的身份验证而设计的,不适用于MetaMCP的API密钥身份验证。基于测试, mcp-proxy 是推荐的解决方案。
以下是Claude Desktop的工作配置,使用 mcp-proxy:
使用流式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": ""
}
}
}
}重要提示:
- 替换 `` 使用您的实际端点名称
- 替换 `
使用您的MetaMCP API密钥(格式:sk_mt_...`)
有关更多详细信息和替代方法,请参阅 问题#76.
🔧 API密钥验证疑难解答
?api_key=param-api密钥认证不适用于SSE。它只适用于Streamable HTTP和OpenAPI。- 最佳实践是在
Authorization: Bearer头球 - 当您遇到连接问题时,尝试暂时禁用身份验证,以查看是否是身份验证问题。
❄️ 冷启动问题和自定义Dockerfile
- MetaMCP为每个配置的MCP服务器和MetaMCP预分配空闲会话。每个会话的默认空闲会话为1,这有助于减少冷启动时间。
- 如果您的MCP需要以下依赖项
uvx或npx,您需要自定义Dockerfile来自行安装依赖项。 - 检查 无效.md 关于空闲会话在更新过程中如何失效的序列图。
🛠️ 解决方案:自定义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}
🔐 认证
- 🛡️ 更好的认证 前端和后端(TRPC程序)
- 🍪 会话Cookie 强制执行安全的内部MCP代理连接
- 🔑 API密钥验证 用于外部访问
Authorization: Bearer头球 - 🪪 MCP OAuth:暴露的端点可以选择使用MCP Spec 2025-06-18中的标准OAuth,易于连接。
- 🏢 多租户技术:专为组织在自己的机器上部署而设计。支持私有和公共访问范围。用户可以为自己或每个人创建MCP、名称空间、端点和API密钥。公共API密钥无法访问私有MetaMCP。
- ⚙️ 单独的注册控制:管理员可以通过设置页面独立控制UI注册和SSO/Outhor注册,允许灵活的企业部署场景。
🚦 交通管理
🚧 MCP速率限制
MCP速率限制功能允许您设置MCP工具(端点)在给定时间窗口内接受的最大请求。有两种不同的策略可以设置限制,您可以单独使用或一起使用:
Endpoint rate-limiting (Rate Limiting):同时应用于使用端点的所有客户端,共享一个唯一的计数器。User rate-limiting (Client Rate Limiting):为每个用户设置一个计数器。
这两种类型可以共存,它们相互补充,并将计数器存储在内存中。在集群上,每台机器只看到并计算其经过的流量。
端点速率限制
端点速率限制作用于端点可以处理的同时事务的数量。这种类型的限制保护了所有客户的服务。 当连接到端点的用户总数超过 rate-limiting,MetaMCP开始拒绝具有状态代码的连接 503 Service Unavailable.
端点速率限制选项
Max Rate:定义在任何给定时刻,您将同时接受来自所有用户的请求数量。网关启动时,存储桶已满。随着用户请求的到来,存储桶中剩余的令牌会减少。同时,限速器以所需的速度重新填充铲斗,直到达到其最大容量。Max Rate Seconds:最大速率以秒为单位运行的时间段。例如,如果将最大速率秒数设置为60秒,速率限制为5秒,则每60秒允许5个请求。
用户速率限制
客户端或用户速率限制对每个单独的用户和端点应用一个计数器。当连接到端点的单个用户超过其 client-max-rate,MetaMCP开始拒绝具有状态代码的连接 429 Too Many Requests
用户速率限制选项
Client Max Rate:在所需的时间间隔(客户端最大速率秒)内,为每个用户(用户配额)添加到令牌桶中的令牌数。桶中剩余的令牌是特定用户可以执行的请求。Client Max Rate Seconds:最大速率以秒为单位运行的时间段。例如,如果您设置每60秒一次,速率为5,则每60秒允许5个请求。Client Max Rate Strategy:设置用于设置客户端计数器的策略。当限制适用于客户端的ip地址时,选择ip,或者当有唯一标识用户的标头时,将其设置为标头。该标头必须使用密钥条目定义。Client Max Rate Strategy Key:它是包含用户标识的标头名称(例如,令牌授权,或IP的X-Original-Forwarded-For)。
🔗 OpenID连接(OIDC)提供商支持
MetaMCP支持 OpenID连接身份验证 用于企业SSO集成。这允许组织使用其现有的身份提供程序(Auth0、Keycloak、Azure AD等)进行身份验证。
🛠️ 配置
将以下环境变量添加到您的 .env 文件:
# Required
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
# Optional customization
OIDC_PROVIDER_ID=oidc
OIDC_SCOPES=openid email profile
OIDC_PKCE=true🏢 支持的提供商
MetaMCP已经与流行的OIDC提供商进行了测试:
- 身份验证0:
https://your-domain.auth0.com/.well-known/openid-configuration - 钥匙斗篷:
https://your-keycloak.com/realms/your-realm/.well-known/openid-configuration - Azure Active Directory:
https://login.microsoftonline.com/your-tenant-id/v2.0/.well-known/openid-configuration - 谷歌:
https://accounts.google.com/.well-known/openid-configuration - 八月:
https://your-domain.okta.com/.well-known/openid-configuration
🔒 安全特性
- 🔐 PKCE(代码交换证明密钥) 默认启用
- 🛡️ 授权码流 自动创建用户
- 🔄 自动发现 OIDC端点
- 🍪 无缝会话管理 使用现有的身份验证系统
📱 用法
配置后,用户将看到 “使用OIDC登录” 登录页面上电子邮件/密码表单旁边的按钮。身份验证流程会在首次登录时自动创建新用户。
有关更详细的配置示例和故障排除,请参阅 贡献.md.
⚙️ 注册控制
MetaMCP提供 单独控制 对于不同的注册方法,允许管理员为企业部署微调用户访问策略。
🎛️ 可用控制
- UI注册:控制用户是否可以通过注册表单创建帐户
- SSO注册:控制用户是否可以通过SSO/Outhor提供程序(OIDC等)创建帐户
🏢 企业用例
这种分离实现了常见的企业场景:
- 阻止UI注册,允许SSO:禁止手动注册,同时允许企业SSO用户
- 阻止SSO注册,允许UI:允许手动注册,同时限制SSO访问
- 阻止两者:完全禁用新用户注册
- 允许两者:打开部署的默认行为
🛠️ 配置
访问 设置 在MetaMCP管理界面中的页面中配置这些控件:
- 导航到 设置 → 认证设置
- 切换 “禁用UI注册” 控制基于表单的注册
- 切换 “禁用SSO注册” 控制OAuth/OIDC注册
这两个控件独立工作,使您在注册策略上具有完全的灵活性。
🌐 Nginx的自定义部署和SSE配置文件
如果您想将其部署到在线服务或VPS,则需要至少2GB至4GB内存的实例。而且尺寸越大,性能越好。
由于MCP利用SSE进行长连接,如果您使用像nginx这样的反向代理,请参阅示例设置 nginx.conf示例
🏗️ 建筑
- 前端:Next.js
- 后端:带tRPC的Express.js,通过TS SDK和内部代理托管MCP
- 认证:更好的认证
- 结构:带有Turborepo和Docker发布的独立monorepo
📊 顺序图
*注意:提示和资源遵循与工具类似的模式。*
sequenceDiagram
participant MCPClient as MCP Client (e.g., Claude Desktop)
participant MetaMCP as MetaMCP Server
participant MCPServers as Installed MCP Servers
MCPClient ->> MetaMCP: Request list tools
loop For each listed MCP Server
MetaMCP ->> MCPServers: Request list_tools
MCPServers ->> MetaMCP: Return list of tools
end
MetaMCP ->> MetaMCP: Aggregate tool lists & apply middleware
MetaMCP ->> MCPClient: Return aggregated list of tools
MCPClient ->> MetaMCP: Call tool
MetaMCP ->> MCPServers: call_tool to target MCP Server
MCPServers ->> MetaMCP: Return tool response
MetaMCP ->> MCPClient: Return tool response🗺️ 路线图
下一步可能采取的措施:
- \[ \] 🔌 无头管理API访问
- \[ \] 🔍 在MetaMCP端点上动态应用搜索规则
- \[ \] 🛠️ 更多中间产品
- \[ \] 💬 聊天/代理游乐场
- \[ \] 🧪 MCP刀具选择优化的测试与评估
- \[ \] ⚡ 动态生成MCP服务器
🌐 国际化
目前支持en和zh-locate,但欢迎贡献。
🤝 贡献
我们欢迎捐款!详情请参阅 贡献.md
📄 许可证
麻省理工学院
如果您在后面的链接中提到您的项目是否使用该代码,我们将不胜感激。
🙏 学分
一些代码的灵感来自:
不直接使用代码从
- https://github.com/open-webui/openapi-servers
- https://github.com/open-webui/mcpo
