多服务MCP服务器集成

通过Docker Compose部署多服务的MCP服务器,连接AI助手至各类服务,包括邮件、任务管理、路由器控制等。

  • by Offbeat-IoT
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Lance-Uppercut/mcp-server-setup

使用说明

MCP服务器设置

Docker Compose设置用于托管多个MCP服务器,以将您的AI助手连接到各种服务。

公共事业

服务 MCP服务器 端口 传输 URL
OpenCode命令行界面 MCP客户端 - 交互式 docker compose exec opencode bash
雅虎邮箱 自定义Node.js SSE包装器→ 云飞珠/mcp邮件服务器 3101 SSE http://localhost:3101/mcp/sse
警报管理器 ntk148v/警报管理器mcp服务器 8001 SSE http://localhost:8001/sse
Tado 自定义Java MCP(本地) 3102 SSE http://localhost:3102/sse
信号 自定义Python MCP+信号cli-rest api 3107 SSE http://localhost:3107/sse
Slack 自定义Python MCP(本地) 3108 SSE http://localhost:3108/sse
谷歌工作区 自定义Node.js MCP(本地) 3103 SSE http://localhost:3103/sse
Todoist koki开发/Todoist mcp服务器 3104 SSE http://localhost:3104/sse
华硕路由器 自定义Node.js MCP(本地) 3105 SSE http://localhost:3105/sse
剧作家 微软剧作家MCP 3106 SSE http://localhost:3106/sse
GitHub GitHub mcp服务器 - stdio 仅限克劳德桌面
Jenkins 自定义Python MCP(本地) 3117 SSE http://localhost:3117/sse
Portainer(6台服务器) 自定义FastMCP包装器(本地) 3111-3116 SSE http://localhost:3111/sse(1号楼)
净空代理 上下文压缩代理 8787 HTTP http://localhost:8787/v1

注: 标记为“仅限Claude Desktop”的服务器使用stdio传输,必须通过以下方式运行 docker compose run --rm.

快速开始

# Start all servers
docker compose up -d

# Start OpenCode CLI (interactive MCP client)
docker compose exec opencode bash

# Or start specific servers
docker compose up -d yahoo-mail-mcp alertmanager-mcp

仅限华硕MCP路由器

如果您只需要华硕路由器MCP服务器,请使用专用的编写文件:

开始之前,在中设置一个明确的ASUS主机 .env:

ROUTER_HOST=192.168.1.2
# optional profile map when switching targets
ROUTER_HOSTS=build1=192.168.1.2,build2=192.168.1.18
ROUTER_PROFILE=build1

192.168.1.1 通常是上游网关,不应假设为华硕UI。

# Build and run only ASUS Router MCP
docker compose -f docker-compose.asus.yml up -d --build

# Verify it's running
curl http://localhost:3105/sse

# Stop it
docker compose -f docker-compose.asus.yml down

要并行运行两个ASUS MCP实例(主+次):

ROUTER_HOST=192.168.1.2
ROUTER_HOST_SECONDARY=192.168.1.18
docker compose -f docker-compose.asus.yml --profile multi-asus up -d --build

净空代理

净空 是位于LLM客户端和提供程序之间的上下文压缩代理。它在工具输出、日志、文件和对话历史到达LLM之前对其进行压缩-- 令牌减少60-95%,答案相同.

运作原理

Your LLM client → http://headroom-proxy:8787/v1 → Headroom compresses → Upstream provider API

代理是一个与OpenAI兼容的端点。指向任何客户 http://headroom-proxy:8787/v1 它在转发给您的提供商之前透明地压缩请求。

与Claude Code一起使用(在opencode内部)

# Inside the opencode container, wrap claude to use the proxy automatically
headroom wrap claude

# Or configure the proxy directly
export ANTHROPIC_BASE_URL=http://headroom-proxy:8787/v1

与任何兼容OpenAI的客户端一起使用

export OPENAI_BASE_URL=http://headroom-proxy:8787/v1

配置上游

默认情况下,代理会转发到OpenAI。要通过其他提供商路由,请执行以下操作:

# In .env:
HEADROOM_TARGET_API_URL=https://api.anthropic.com

# Or set directly on the service (uncomment in docker-compose.yml):
# - OPENAI_TARGET_API_URL=${HEADROOM_TARGET_API_URL:-}

验证它是否正在运行

curl http://localhost:8787/readyz
curl http://localhost:8787/v1/models

MCP集成

Headroom还提供用于压缩/检索/统计的MCP工具。在任何MCP客户端中安装:

# Inside a container with headroom installed:
headroom mcp install

这暴露了 headroom_compress, headroom_retrieve,以及 headroom_stats 工具。

OpenCode命令行界面

这 opencode 该服务为使用MCP工具提供了一个交互式CLI。

# Start opencode (use --profile to include)
docker compose --profile opencode up -d opencode

# Connect to the running container
docker compose exec opencode bash

# Inside bash, start opencode
opencode

MCP配置

MCP服务器已在中预先配置 opencode/config/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "yahoo-mail": {
      "type": "remote",
      "url": "http://yahoo-mail-mcp:3101/mcp/sse",
      "enabled": true
    },
    "alertmanager": {
      "type": "remote",
      "url": "http://alertmanager-mcp:8001/sse",
      "enabled": true
    },
    "github": {
      "type": "local",
      "command": ["docker", "run", "--rm", "-i", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server"],
      "environment": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
      },
      "enabled": true
    }
  }
}

编辑此文件以添加/删除MCP服务器。

使用MCP工具

# Check MCP servers are connected
docker compose exec opencode opencode mcp list

# Start interactive session
docker compose exec opencode opencode

# Inside opencode, use MCP tools
/opencode Show me my emails from Yahoo/
/opencode Show me current alerts from Alertmanager/
/opencode Show me my GitHub repositories/

Open WebUI的服务器URL

直接SSE服务器

http://localhost:3101/mcp/sse   # Yahoo Mail
http://localhost:8001/sse       # Alertmanager
http://localhost:3102/sse       # Tado
http://localhost:3107/sse       # Signal
http://localhost:3108/sse       # Slack
http://localhost:3103/sse       # Google Workspace
http://localhost:3104/sse       # Todoist
http://localhost:3105/sse       # ASUS Router
http://localhost:3106/sse       # Playwright

部署在build1上

http://build1:3101/mcp/sse      # Yahoo Mail
http://build1:8001/sse          # Alertmanager
http://build1:3102/sse          # Tado
http://build1:3107/sse          # Signal
http://build1:3108/sse          # Slack
http://build1:3103/sse          # Google Workspace
http://build1:3104/sse          # Todoist
http://build1:3105/sse          # ASUS Router
http://build1:3106/sse          # Playwright

克劳德桌面(stdio服务器)

添加 ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "todoist": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "todoist-mcp"]
    },
    "google-workspace": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "google-workspace-mcp"]
    },
    "github": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "github-mcp"]
    },
    "jenkins": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "jenkins-mcp"]
    },
    "tado": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "tado-mcp"]
    }
  }
}

设置

  1. 复制 .env.example 到 .env:

    cp .env.example .env
    
  2. 请填写您的凭据 .env

    华硕MCP所需:

    • ROUTER_HOST (或 ROUTER_HOSTS + ROUTER_PROFILE)
    • ROUTER_PASSWORD

    Slack MCP所需:

    • SLACK_BOT_TOKEN

    Slack MCP的可选配置:

    • SLACK_DEFAULT_REPLY_TIMEOUT_SECONDS
    • SLACK_REPLY_POLL_INTERVAL_SECONDS
  3. 在中配置SSH服务器 ssh/config:

    Host webserver
        HostName 192.168.1.10
        User admin
        IdentityFile ~/.ssh/id_rsa
    
  4. 启动服务:

    docker compose up -d
    

Jenkins部署秘密

Jenkins管道将Jenkins凭据绑定到 withCredentials(...),将它们映射到部署时间环境变量 withEnv([...]),确保Docker Swarm处于活动状态,并使用以下方式进行部署:

  1. docker stack deploy --with-registry-auth --prune -c docker-stack.yml -c docker-stack.build1.yml mcp-servers
  2. Swarm滚动更新(parallelism: 1, order: start-first,失败时回滚)
  3. 所有服务的放置限制 node.hostname == build1
  4. 使用外部群集覆盖网络 sentinel_sentinel-swarm-network

这使得部署无中断,并在构建群上运行MCP服务,同时将工作负载固定到构建1节点。

以这种方式导出的任何变量都可以用于 docker stack deploy,然后解决 ${...} 表达式在 docker-stack.yml 从这个环境。

在运行管道之前创建这些Jenkins凭据:

  • 机密文本: mcp-google-client-id
  • 机密文本: mcp-google-client-secret
  • 机密文本: mcp-jenkins-url
  • 机密文本: mcp-jenkins-username
  • 机密文本: mcp-jenkins-api-token
  • 机密文本: slack-bot-token
  • 机密文本: mcp-todoist-api-token
  • 机密文本: mcp-yahoo-email
  • 机密文本: mcp-yahoo-app-password
  • 机密文本: mcp-alertmanager-url
  • 机密文本: mcp-router-password
  • 机密文本: mcp-portainer-build1-token
  • 机密文本: mcp-portainer-build2-token
  • 机密文本: mcp-portainer-monitor-token
  • 机密文本: mcp-portainer-observability1-token
  • 机密文本: mcp-portainer-tools1-token
  • 机密文本: mcp-portainer-production1-token
  • 机密文件: mcp-google-gauth-json
  • 机密文件: mcp-google-accounts-json
  • 机密文件: mcp-google-oauth2-seed-json
  • 机密文件: mcp-tado-tokens-json

管道默认将信号基URL设置为 http://signal-proxy:8080.

信号消息的接收是由以下因素驱动的 signal-mcp 容器轮询 signal-proxy.

  • SIGNAL_POLL_ENABLED (默认值 true)启用后台轮询。
  • SIGNAL_POLL_INTERVAL_SECONDS (默认值 10)控制轮询节奏。
  • SIGNAL_POLL_TIMEOUT_SECONDS (默认值 5)控件每次轮询都会接收超时。
  • SENTINEL_WEBHOOK_URL (可选)将每个接收到的消息有效载荷转发给Sentinel。

mcp-google-oauth2-seed-json 必须包含由Google OAuth凭据文件名键入的JSON对象:

{
  ".oauth2.user@example.com.json": {
    "access_token": "initial-access-token",
    "refresh_token": "initial-refresh-token",
    "expiry_date": 1767225600000
  }
}

持久OAuth状态

  • data/google-workspace/.gauth.json 和 data/google-workspace/.accounts.json 每次部署时都会从Jenkins刷新。
  • data/google-workspace/credentials/.oauth2.*.json 只有在缺失时才播种。
  • data/tado/tokens.json 只有在缺失时才播种。
  • Google和Tado可以在运行时刷新和持久化令牌文件;重新部署会保留那些刷新的文件。
  • ALERTMANAGER_USERNAME 和 ALERTMANAGER_PASSWORD 是可选的,默认为空。

MCP客户端配置

打开WebUI(环境变量)

通过添加MCP服务器 TOOL_SERVER_CONNECTIONS 环境变量:

# In your Open WebUI docker-compose
services:
  open-webui:
    environment:
      - MCP_ENABLE=true
      - TOOL_SERVER_CONNECTIONS=[
          {"url":"http://host.docker.internal:3101/mcp/sse","name":"yahoo-mail","type":"sse"},
          {"url":"http://host.docker.internal:8001/sse","name":"alertmanager","type":"sse"},
          {"url":"http://host.docker.internal:3102/sse","name":"tado","type":"sse"},
          {"url":"http://host.docker.internal:3107/sse","name":"signal","type":"sse"},
          {"url":"http://host.docker.internal:3103/sse","name":"google-workspace","type":"sse"},
          {"url":"http://host.docker.internal:3104/sse","name":"todoist","type":"sse"},
          {"url":"http://host.docker.internal:3105/sse","name":"asus-router","type":"sse"},
          {"url":"http://host.docker.internal:3106/sse","name":"playwright","type":"sse"}
        ]
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - mcp-network

打开WebUI(管理UI)

通过设置添加MCP服务器→ 连接→ 添加MCP服务器。

Claude桌面(JSON配置)

添加 ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "todoist": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "todoist-mcp"]
    },
    "google-workspace": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "google-workspace-mcp"]
    },
    "github": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "github-mcp"]
    },
    "jenkins": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "jenkins-mcp"]
    },
    "tado": {
      "command": "docker",
      "args": ["compose", "-f", "/path/to/docker-compose.yml", "run", "--rm", "tado-mcp"]
    }
  }
}

MCP检查员/直接测试

直接测试任何MCP服务器:

# Yahoo Mail (SSE via custom wrapper around mcp-mail-server)
curl http://localhost:3101/mcp/sse

# Alertmanager (SSE)
curl http://localhost:8001/sse

# Tado (SSE)
curl http://localhost:3102/sse

# Signal (SSE)
curl http://localhost:3107/sse

# Google Workspace (SSE)
curl http://localhost:3103/sse

# Todoist (SSE)
curl http://localhost:3104/sse

# ASUS Router (SSE)
curl http://localhost:3105/sse

# Playwright (SSE)
curl http://localhost:3106/sse

# Jenkins (SSE)
curl http://localhost:3117/sse

# Stdio servers
docker compose run --rm github-mcp

验证所有MCP服务器

使用存储库验证脚本验证端点和 tools/list 在一次运行中:

# local deployment on the current host
./scripts/verify-mcp-servers.sh --host localhost

# verify deployed stack on build1 from another machine
./scripts/verify-mcp-servers.sh --host build1 --skip-containers

Jenkins管道在阶段中自动运行此验证 Verify MCP servers 部署后。

Docker构建网络

要使Open WebUI访问MCP服务器,请确保它们位于同一网络上:

# All MCP servers are attached to the shared sentinel network
# Add open-webui to the same network:
networks:
  mcp-network:
    name: sentinel_sentinel-network
    external: true

凭证设置

简洁日程

  1. 转到Todoist设置→ 集成
  2. 复制您的API令牌

邮件

  1. 启用两步验证
  2. 在以下位置生成应用程序密码https://login.yahoo.com/account/security

谷歌(Gmail/日历)

  1. 在以下位置创建项目https://console.cloud.google.com
  2. 启用Gmail API和Google日历API
  3. 创建OAuth 2.0凭据

GitHub

  1. 前往设置→ 开发者设置→ 个人访问令牌
  2. 生成具有适当作用域的新令牌

詹金斯

  1. 前往Jenkins→ User → 配置
  2. 添加新的API令牌

警报管理器

  1. 确保Alertmanager正在运行且可访问
  2. 可选配置基本身份验证

安全外壳协议

  1. 将服务器条目添加到 ssh/config
  2. 确保SSH密钥配置为无密码访问

塔多

  1. 登录您的Tado帐户https://my.tado.com
  2. 前往设置→ 账户→ 个人设置
  3. 通过Tado开发者门户创建OAuth凭据(或使用现有的客户端ID/secrete)
  4. 注:截至2025年,Tado使用OAuth2设备流进行身份验证

剧作家

看 微软剧作家MCP服务器 文件。

波特纳

Portainer MCP服务使用本地FastMCP SSE包装器 servers/portainer-mcp 并通过CI构建/推送 registry:5000/offbeat-iot/portainer-mcp:latest.

每个服务所需的环境变量:

  • PORTAINER_BASE_URL (或 PORTAINER_SERVER)对于Portainer主机
  • PORTAINER_TOKEN 用于API身份验证

可用的环境服务和SSE端点:

  • portainer-build1 -Portainer http://build1.home:6500上海证券交易所 http://localhost:3111/sse
  • portainer-build2 -Portainer http://build2.home:6500上海证券交易所 http://localhost:3112/sse
  • portainer-monitor -Portainer http://192.168.1.60:6500上海证券交易所 http://localhost:3113/sse
  • portainer-observability1 -Portainer http://192.168.1.80:6500上海证券交易所 http://localhost:3114/sse
  • portainer-tools1 -Portainer http://192.168.1.17:6500上海证券交易所 http://localhost:3115/sse
  • portainer-production1 -Portainer http://192.168.1.85:6500上海证券交易所 http://localhost:3116/sse

集 PORTAINER_{SERVER}_TOKEN 在 .env 文件。