概览
- MetaMCP 是一个强大的模型上下文协议(Model Context Protocol)聚合管理平台
- 适合多设备场景:统一部署 MCP 服务器,避免在每个设备上重复配置
- 经过 18 个同类方案对比,MetaMCP 在功能全面性和部署简易性方面脱颖而出
- 支持将多种 MCP 服务器统一管理,提供命名空间和端点功能
- 包含完整的 Docker 部署方案,预配置 11 种常用 MCP 服务器
- 集成 PostgreSQL 数据库和 SearXNG 搜索引擎
- 支持多客户端接入,提供 API Key 认证机制
前言
最近在折腾各种 AI 编程工具的时候,发现了一个很酷的项目——MetaMCP。它可以把各种 MCP(Model Context Protocol)服务器统一管理起来,然后通过一个端点暴露给外部使用。听起来是不是很厉害?哈哈 (ฅ´ω`ฅ)
简单来说,MCP 是一种让 AI 工具访问外部数据源的协议。比如网页搜索、数据库查询、API 调用等等。MetaMCP 的作用就是把这些分散的服务器统一管理,然后通过一个 HTTP 端点暴露给 AI 工具使用。
你可能会问:为什么不直接在每个设备上单独配置 MCP 服务器呢?这是一个好问题!(~ ̄▽ ̄)~
其实主要是因为我们可能会在多个设备上使用 Vibe Coding 工具——比如家里的台式机、公司的笔记本、甚至还有 Mac mini。如果每个设备都要单独配置一遍 MCP 服务器,不仅麻烦,而且配置还容易不一致。想象一下,你在家里电脑上配置了 10 个 MCP 服务器,结果换到公司电脑时又要从头配起……是不是很崩溃?:tired_face: 所以我就想:能不能把所有 MCP 服务器部署到远程服务器上,然后各个设备只需要连接这个统一的端点就行了?
经过深入的调研(我对比了 18 个不同的 MCP Gateway 方案,包括 IBM ContextForge、Docker MCP Gateway、MCPJungle 等),最终选择了 MetaMCP,原因很简单:
- ✅ All-in-One 设计:聚合器+编排器+中间件+网关四位一体,功能最全面
- ✅ 预配置丰富:内置 11 种常用 MCP 服务器,开箱即用
- ✅ 部署简单:单个 Docker 容器就能跑起来,不需要复杂配置
- ✅ Web 管理界面:可视化操作,不用折腾配置文件
- ✅ 多设备友好:通过 API Key 认证,支持多客户端同时接入
今天我就来分享一下如何在自己的服务器上搭建 MetaMCP,以及一些实用的配置技巧。小伙伴准备好了吗?我们开始吧! :satisfied
测试环境
uname -a # Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
docker --version # Docker version 20.10.5, build 55c4c88
docker-compose --version # docker-compose version 1.28.6, build 5db8d86f
准备工作
不了解 Docker 的小伙伴请先看:《Docker系列 学习Docker之前》和《Docker系列 配置Docker全局环境》。
确保你的 VPS 已经安装好 Docker 和 docker-compose。如果没有安装,可以参考上面的链接进行安装。
目录管理
# 工作目录请按需修改
path_docker=~/docker
# 创建 MetaMCP 目录
mkdir -p ${path_docker}/metamcp
cd ${path_docker}/metamcp
安装 MetaMCP
配置 docker-compose.yml
不了解 docker-compose 的小伙伴请先看:《Docker系列 了解Docker Compose的配置文件》。
创建新文件 docker-compose.yml 并添加内容如下:
services:
# ==================== MetaMCP Main Service ====================
metamcp-app:
image: ghcr.io/metatool-ai/metamcp:latest
container_name: metamcp-app
restart: always
env_file:
- .env
volumes:
- ./arxiv_data:/app/arxiv_data # 添加这行
expose:
- "12008"
environment:
# Use underscores instead of hyphens for better compatibility
- POSTGRES_HOST=${POSTGRES_HOST:-metamcp-db}
- POSTGRES_PORT=${POSTGRES_PORT:-5432}
- POSTGRES_USER=${POSTGRES_USER:-metamcp_user}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB:-metamcp_db}
# Ensure DATABASE_URL matches the individual variables
- DATABASE_URL=postgresql://${POSTGRES_USER:-metamcp_user}:${POSTGRES_PASSWORD}@${POSTGRES_HOST:-metamcp-db}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-metamcp_db}
- APP_URL=${APP_URL:-http://localhost:12008}
- NEXT_PUBLIC_APP_URL=${APP_URL:-http://localhost:12008}
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
- TRANSFORM_LOCALHOST_TO_DOCKER_INTERNAL=${TRANSFORM_LOCALHOST_TO_DOCKER_INTERNAL:-true}
- NODE_ENV=${NODE_ENV:-production}
# API Keys for MCP Servers
- CONTEXT7_API_KEY=${CONTEXT7_API_KEY}
- TAVILY_API_KEY=${TAVILY_API_KEY}
- SEARXNG_URL=${SEARXNG_URL}
- BRAVE_API_KEY=${BRAVE_API_KEY}
- PERPLEXITY_API_KEY=${PERPLEXITY_API_KEY}
- SERPER_API_KEY=${SERPER_API_KEY}
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
- BING_API_KEY=${BING_API_KEY}
- EXA_API_KEY=${EXA_API_KEY}
- SILICONFLOW_API_KEY=${SILICONFLOW_API_KEY}
networks:
- default
# ==================== PostgreSQL Database ====================
metamcp-db:
image: postgres:16-alpine
container_name: metamcp-db
restart: always
env_file:
- .env
environment:
- POSTGRES_DB=${POSTGRES_DB:-metamcp_db}
- POSTGRES_USER=${POSTGRES_USER:-metamcp_user}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- ./postgres_data:/var/lib/postgresql/data
ports:
- "${POSTGRES_EXTERNAL_PORT:-9433}:5432"
networks:
- default
# ================== SearXNG Search Engine ==================
metamcp-searxng:
image: searxng/searxng:latest
container_name: metamcp-searxng
restart: always
expose:
- "8080"
volumes:
- ./searxng:/etc/searxng
env_file:
- .env
environment:
- SEARXNG_BASE_URL=${SEARXNG_URL}
- SEARXNG_SETTINGS_FILE=/etc/searxng/settings.yml
networks:
- default
networks:
default:
name: npm_default
external: true
这里稍微解释一下几个关键配置:
env_file: - .env:使用单独的环境变量文件,更安全且易于管理expose: - "12008":在 Docker 内部网络暴露端口,通过 Nginx Proxy Manager 访问healthcheck:数据库健康检查,确保数据库就绪后再启动应用extra_hosts:添加host.docker.internal支持,方便容器访问宿主机服务npm_default网络:与 Nginx Proxy Manager 共享网络,方便反向代理配置
环境变量配置
创建 .env 文件并填入配置:
获取 API 密钥
MetaMCP 支持多种 API 密钥,至少需要配置一个搜索引擎才能正常使用。以下是常用的几个:
- Tavily(推荐):https://tavily.com – AI 搜索引擎,提供免费额度
- Context7:https://context7.com – 最新库文档查询,可选
- Brave Search:https://brave.com/search/api – 隐私搜索,每月 2000 次免费请求
- Perplexity:https://www.perplexity.ai – AI 增强搜索
- Serper(Google):https://serper.dev – Google 搜索结果
- Exa AI:https://exa.ai – AI 优化搜索,专为 LLM 设计
注册账号后获取 API Key,然后填入 .env 文件对应的变量即可。
启动服务
# 上线服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 确认运行状态
docker-compose ps
你应该能看到类似这样的输出:
NAME STATUS PORTS
metamcp-app running 12008/tcp
metamcp-db running 0.0.0.0:9433->5432/tcp
metamcp-searxng running 8080/tcp
注意:metamcp-app 的端口显示为 12008/tcp 而非 0.0.0.0:12008->12008/tcp,这是正常的。因为我们使用了 expose 而非 ports,容器端口只在 Docker 内部网络中可访问,通过 Nginx Proxy Manager 进行反向代理。
是不是很简单?哈哈 :yum:
配置 Nginx 反向代理
不了解 Nginx Proxy Manager 的小伙伴请先看:《Docker系列 两大神器NPM和ddns go的安装》。
Web UI 使用
登录管理界面
访问 https://metamcp.yourdomain.com,你应该能看到 MetaMCP 的登录界面。首次使用需要注册一个管理员账号;具体我就不教大家了。这里我已经为大家准备好这个JSON的内容,到时大家直接导入即可:
MCP服务正常工作时,无错误的状态占大多数就对了;界面大致是这样的:

创建命名空间
登录后,首先创建一个命名空间。命名空间是一组 MCP 服务器的集合。
- 点击 “Namespaces” → “Create Namespace”
- 输入命名空间名称,比如
my-tools。从下图看,可以添加多个组合的; 这个就会比较方便。 我一般是搜索用得多,所以专门有一个search的集合:

- 选择要包含的 MCP 服务器; 配置中间件(可选); 保存

创建端点
端点是外部访问 MetaMCP 的入口。
- 点击 “Endpoints” → “Create Endpoint”
- 输入端点名称,比如
default - 选择命名空间
- 选择传输协议(推荐 SSE)
- 配置认证方式(API Key),保存

正常工作时大致是这样的:

支持的协议很多; 不过,我感觉大部分Vibe Coding CLI对Streamable HTTP的支持似乎好一些。
生成 API Key
端点创建后,需要生成 API Key 才能被外部客户端使用。
- 进入端点详情页
- 点击 “API Keys” → “Generate API Key”
- 复制生成的 API Key

这个 API Key 要妥善保管,不要泄露给别人!
本地cc-switch配置
推荐使用 cc-switch 桌面应用来统一管理 MCP 服务器,省去手动编辑配置文件的麻烦。
cc-switch 是一个跨平台桌面应用,专为 Claude Code、Codex、Gemini CLI 设计的配置管理利器。它的核心功能是方便地管理多个不同的 API 中转站配置,一键切换不同的 Provider。同时,它的 MCP 管理功能也非常强大,可以统一管理各种 MCP 服务器,自动同步到不同的 AI 客户端。
cc-switch 目前维护非常活跃,社区也很流行。易用性极强,图形化界面让配置管理变得直观简单,是一个不容忽视的工具。如果你经常需要在不同的 API 服务商之间切换,或者管理多个 MCP 服务器,cc-switch 绝对能帮你省下不少时间和精力。

下载安装
访问 cc-switch GitHub Releases 下载对应平台的安装包:
- Windows:下载
.msi安装器或.zip便携版 - macOS:推荐使用 Homebrew 安装:
bash
brew tap farion1231/ccswitch
brew install --cask cc-switch - Linux:下载
.deb、.rpm或.AppImage文件
配置 MetaMCP
启动 cc-switch 后,点击右上角的 MCP 按钮进入 MCP 管理面板:
- 点击 Add Server 添加新的 MCP 服务器
- 填写配置信息:

配置大致如下:
{
"args": [
"mcp-proxy",
"--transport",
"streamablehttp",
"https://xxx.com/metamcp/xxx/mcp"
],
"command": "uvx",
"env": {
"API_ACCESS_TOKEN": "sk_mt_xxxx"
}
}
- 启用服务器开关
- 点击 Sync 同步到配置文件
如果你配置MCP服务的时候,正在使用Claude Code或者Codex,那么可能要进入一个全新的会话后,MCP才会生效。
就这么简单!cc-switch 会自动处理所有的配置细节,你不需要手动编辑任何配置文件。是不是很方便?哈哈 (~ ̄▽ ̄)~
测试连接
直接进入Claude Code里面,使用/mcp 查看服务可用性。比如,我这里就展示了两个可用的MetaMCP端点:

到这里就安装成功啦!不过,我发现VSCode里的Claude Code插件比较难正常识别这些远程MCP,不知道是不是我哪里设置不对。以后有机会会更新教程。
预配置的 MCP 服务器
按本教程,MetaMCP 预配置了 11 种常用的 MCP 服务器,只要配置好对应的 API Key 就可以直接使用:
| 服务器名称 | 类型 | 用途 | API 密钥要求 |
|---|---|---|---|
| context7 | STDIO | 获取最新库文档 | CONTEXT7_API_KEY |
| duckduckgo | STDIO | 隐私网页搜索 | 无 |
| tavily | STDIO | 高级搜索/爬取 | TAVILY_API_KEY(必需) |
| searxng | STDIO | 元搜索引擎 | SEARXNG_URL |
| wikipedia | STDIO | 百科全书查询 | 无 |
| arxiv | STDIO | 学术论文搜索 | SILICONFLOW_API_KEY |
| brave-search | STDIO | 隐私搜索引擎 | BRAVE_API_KEY |
| perplexity | STDIO | AI 增强搜索 | PERPLEXITY_API_KEY |
| serper | STDIO | Google 搜索 | SERPER_API_KEY |
| bing-search | STDIO | Bing 搜索 | BING_API_KEY |
| exa | HTTP | AI 优化搜索 | EXA_API_KEY |
基本上都是和搜索有关的MCP,毕竟我觉得这是最重要的应用场景!除了上述预配置的服务器外,MetaMCP 还提供了一个探索和搜索 MCP 服务器的界面,让你可以了解社区里还有哪些好用的 MCP 工具。这个功能虽然还处于测试阶段,但未来可期!你可以:
– 浏览社区贡献的各种 MCP 服务器
– 查看每个服务器的功能描述和使用方法
– 一键添加感兴趣的服务器到你的配置中
这样就能不断扩展你的 AI 编程工具能力边界啦! :sunglasses:
小结
总体来说,MetaMCP 对于需要统一管理多个 MCP 服务器的场景确实是一个不错的选择——它通过 Web UI 提供标准化配置,让你无需学习额外知识就能轻松管理各种数据源,同时具备命名空间端点、多客户端接入和预配置常用服务器等核心优势。经过本文的介绍,相信小伙伴已经能够成功搭建自己的 MetaMCP 服务器了,是不是感觉 Docker 布署真的很方便?如果你在实际使用中遇到什么问题,欢迎在评论区留言讨论,我们下期再见! :wave:
扩展阅读
- MetaMCP GitHub 仓库
- cc-switch – AI 编程工具配置管理
- Model Context Protocol 官方文档
- Claude Code 官方文档
- Docker Compose 完整指南
- Nginx 反向代理原理
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍