容器化MCP服务器

基于Docker的集中式MCP(模型上下文协议)服务器,支持多客户端访问,提供论文搜索和浏览器自动化等功能。

  • by benkalmus
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 benkalmus/mcp-server-orchestration

使用说明

MCP服务器

用于多客户端访问的集中式基于Docker的MCP(模型上下文协议)服务器。每个MCP工具都在自己的容器化环境中运行,共享Docker网络上的任何消费者(OpenWebUI、Claude Code、OpenCode等)都可以通过HTTP访问。

目录结构

mcp-servers/
├── docker-compose.yml        ← Global orchestration (paper-search)
├── paper-search/             ← Paper search MCP tool
│   ├── Dockerfile
│   └── start.sh
├── playwright/               ← Browser automation MCP tool
│   ├── docker-compose.yml
│   └── mcpo-config.json
└── (future-tools)/           ← Add new MCPs here
    ├── Dockerfile
    └── start.sh

快速开始

先决条件

  • Docker和Docker Compose(v2: docker compose)
  • 已命名的现有Docker网络 shared-network:
    docker network create shared-network
    

启动特定MCP

# Start only paper-search
docker compose --profile paper-search up -d

# View status
docker compose ps

启动所有MCP

docker compose --profile all up -d

停止

docker compose down

查看日志

docker compose logs -f paper-search-mcpo

可用MCP

论文搜索(paper-search-mcpo)

HTTP API,用于搜索和下载ArXiv、PubMed、bioRxiv、medRxiv,Google Scholar、Semantic Scholar,CrossRef和IACR的学术论文。

  • 港口: 8765
  • API文件: http://localhost:8765/openapi.json
  • 网络名称: paper-search-mcpo (Docker网络内)
  • 外部链接: http://localhost:8765 (来自主持人)
  • 简介: paper-search 或 all

使用OpenWebUI(在共享网络上):

http://paper-search-mcpo:8765

主机使用情况:

curl http://localhost:8765/openapi.json

剧作家浏览器自动化(playwright-mcpo)

通过Playwright MCP实现无头Chromium浏览器自动化,并带有反检测隐形补丁。浏览网站,填写表单,点击元素,从JS密集的页面中提取数据。

备注:官方的Docker镜像只捆绑了Chromium。Firefox/WebKit需要自定义图像。

隐形配置 (stealth-init.js):

  • 兽皮 navigator.webdriver 旗帜

  • 覆盖WebGL供应商/渲染器(Mac上的Intel Iris)

  • 集合 navigator.platform 到 MacIntel

  • 补丁 HeadlessChrome 在用户代理字符串中

  • 使用模拟Mac Safari用户代理 en-GB 区域设置

  • 内部端口:8765(mcpo代理)

  • 主机端口: 8767

  • 剧作家MCP端口:8931(直接,用于OpenCode)

  • API文件: http://localhost:8767/playwright/openapi.json

  • 网络名称: playwright-mcpo (Docker网络内)

开始:

cd playwright && docker compose up -d --pull always

更新至最新Playwright MCP镜像:

cd playwright && docker compose up -d --pull always

使用OpenWebUI(在共享网络上):

http://playwright-mcpo:8765/playwright

主机使用情况:

curl http://localhost:8767/playwright/openapi.json

添加新的MCP工具

  1. 创建新的子目录:

    mkdir mcp-servers/my-tool
    
  2. 添加 Dockerfile 和 start.sh:

    • Dockerfile:构建MCP服务器
    • start.sh:启动服务器的入口点命令
  3. 更新 docker-compose.yml:

    services:
      my-tool:
        build:
          context: ./my-tool
          dockerfile: Dockerfile
        container_name: my-tool
        profiles:
          - my-tool
          - all
        ports:
          - "8766:8765"  # Adjust port (avoid conflicts)
        networks:
          - shared-network
        restart: unless-stopped
    
  4. 开始吧:

    docker compose --profile my-tool up -d
    

网络详细信息

所有MCP容器都在 shared-network Docker网络,允许它们使用容器主机名相互通信以及与其他服务(OpenWebUI、OpenCode等)通信。

  • 网络名称: shared-network (必须在外部创建)
  • 检查: docker network inspect shared-network

故障排除

容器无法启动

docker compose logs paper-search-mcpo

未找到网络

docker network create shared-network

端口已在使用中

在中修改端口映射 docker-compose.yml 并重新启动。

权限问题

确保您的用户可以访问Docker:

docker ps

建筑

论文搜索 (内置mcpo):

MCP Server (uv run)
      ↓
   mcpo (HTTP wrapper, same container)
      ↓
  HTTP API (port 8765)
      ↓
  shared-network

剧作家 (单独的容器):

mcr.microsoft.com/playwright/mcp (official image, port 8931)
      ↓
   mcpo proxy (separate container)
      ↓
  HTTP API (port 8765)
      ↓
  shared-network

这两种模式都公开了OpenWebUI、OpenCode、Claude Code等可使用的OpenAPI端点。