Skip to content
CloudyWingPublic

About

以 Docker Compose 執行的 MCP 服務集合,提供受控的資料庫、身分、訊息與文件工具。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

MCP Lab

AI Agent 在沒有專屬工具的情況下操作資料庫時,通常會透過「寫程式 → 執行 → 觀察輸出 → 調整」的迂迴流程來完成任務。這個專案的目的是提供直接的資料庫操作工具,讓 Agent 能夠跳過這個過程。

內容包含許多個人化的設計決策,不建議直接採用,請優先選擇社群或官方維護的成熟專案。

服務

類別 服務 Port Runtime 功能
api mcp-api-contract 9851 .NET 10 OpenAPI spec 檢視、drift 比對與有限 response 驗證
datastores mcp-sql-server 9800 .NET 10 SQL Server 查詢、schema 瀏覽、寫入防護
datastores mcp-oracle 9801 .NET 10 Oracle 查詢、schema 瀏覽、寫入防護
datastores mcp-elasticsearch 9802 .NET 10 Elasticsearch 索引、搜尋、文件操作
datastores mcp-redis 9803 .NET 10 Redis key 讀寫、TTL 管理、伺服器資訊
identity mcp-oidc 9850 .NET 10 OIDC discovery、JWKS 與 JWT 檢查
messaging mcp-mosquitto 9820 .NET 10 MQTT 發佈、訂閱與 broker 狀態
messaging mcp-rabbitmq 9821 .NET 10 RabbitMQ queue、exchange 與發佈
tools mcp-mailpit 9830 .NET 10 Mailpit 測試信箱唯讀檢查
documents mcp-reader 9840 Python 3.12 文件、圖片、文字檔讀取與搜尋
system mcp-docker 9860 .NET 10 Docker / Compose read-only 狀態檢查

多連線支援

每個服務支援同時連線多個實例,以 {TYPE}_CONN_{ALIAS}_* 格式設定(ALIAS 為大寫英數,如 PROD、STAGE):

MSSQL_CONN_PROD_NAME=production
MSSQL_CONN_PROD_HOST=prod-server
MSSQL_CONN_PROD_PORT=1433
MSSQL_CONN_PROD_USER=sa
MSSQL_CONN_PROD_PASSWORD=pw1

MSSQL_CONN_STAGE_NAME=staging
MSSQL_CONN_STAGE_HOST=stage-server
MSSQL_CONN_STAGE_PORT=1433
MSSQL_CONN_STAGE_USER=sa
MSSQL_CONN_STAGE_PASSWORD=pw2

Agent 可呼叫 list_connections() 查詢可用連線,再以 connection="staging" 指定目標。未指定時自動使用第一個已設定的連線。

服務 環境變數前綴 必填欄位
mcp-api-contract API_CONTRACT_CONN SPEC_URL 或 SPEC_PATH
mcp-sql-server MSSQL_CONN HOST, PORT
mcp-oracle ORACLE_CONN HOST, PORT, SERVICE
mcp-elasticsearch ES_CONN URL
mcp-redis REDIS_CONN HOST, PORT
mcp-oidc OIDC_CONN ISSUER
mcp-mosquitto MQTT_CONN HOST, PORT
mcp-rabbitmq RABBITMQ_CONN HOST, MGMTPORT
mcp-mailpit MAILPIT_CONN URL

快速開始

cp .env.example .env
# 填入至少一個連線設定
docker compose up -d --build
docker compose ps

設定熱重載

各 MCP 服務會把專案根目錄的 .env 以唯讀方式掛載到容器內 /app/.env,並由服務進程監聽檔案內容。修改 .env 後,不需要重啟容器;下一次呼叫 list_connections()、list_runtime_limits() 或實際查詢工具時會讀取新的 runtime 設定。

熱重載涵蓋連線設定與查詢限制,例如 MSSQL_CONN_*_HOST、ORACLE_QUERY_TIMEOUT、MSSQL_MAX_ROWS、ES_SEARCH_SIZE、DOCUMENT_LIST_DEFAULT_LIMIT。Compose 與建置階段設定不熱重載,例如 *_TAG、MCP_*_PORT、COMPOSE_PROJECT_NAME、DOCKER_GID、DOCKER_SOCKET_PATH、TZ、MCP_SMOKE_*。

.env 變更後通常會在 1 秒內生效。若 .env 語法錯誤,服務會保留前一份可用設定並輸出 warning log;修正檔案後 watcher 會再次載入。既有請求與 driver connection pool 不會被主動中斷。

測試

單元測試不依賴外部服務,可直接執行:

dotnet test

本機整合 smoke test 需要 Docker Compose 堆疊已啟動,並且 .env 已指向可連線的測試環境:

python3 scripts/smoke-test.py
python3 scripts/smoke-test.py --check-hot-reload

此腳本會檢查 Compose 容器健康狀態、read_only、cap_drop: [ALL]、no-new-privileges、/tmp tmpfs、非 root 使用者,並呼叫各 MCP 服務的 ping 或唯讀查詢工具。SQL Server 與 Oracle 會驗證 query 工具拒絕同一段輸入中的寫入語句。加入 --check-hot-reload 時,腳本會暫時修改 .env 中第一個 MSSQL_CONN_*_HOST,確認 list_connections() 在 1 秒內反映新值後還原原檔。

Oracle 查詢預設略過,因為專案未內建 Oracle 資料庫。若 .env 已設定可查詢的 Oracle 連線,可明確啟用:

python3 scripts/smoke-test.py --include-oracle

可使用分層檢查腳本串接單元測試、Docker build 與 smoke test:

python3 scripts/check-all.py
python3 scripts/check-all.py --build-services --smoke
python3 scripts/check-all.py --build-services --smoke --include-oracle

環境變數一覽

完整清單請見 docs/environment-variables.md。

設定原則

.env.example 不預設任何主機位址,請依你的部署位置填寫。

常見情境:

  • 目標服務在同一台 Docker 主機上:使用 host.docker.internal
  • 目標服務為遠端機器:填 DNS 名稱或 IP
  • Elasticsearch 使用 HTTPS 自簽憑證:設定 ES_CONN_{ALIAS}_SSL_SKIP_VERIFY=true

資料服務工具限制

SQL Server、Oracle 與 Elasticsearch 的查詢回傳量與逾時有上限,避免單次 MCP 呼叫回傳過大內容或長時間卡住。

服務 變數 預設值 上限
SQL Server MSSQL_QUERY_TIMEOUT / QUERY_TIMEOUT 60 秒 300 秒
SQL Server MSSQL_MAX_ROWS / MAX_ROWS 500 5000
Oracle ORACLE_QUERY_TIMEOUT / QUERY_TIMEOUT 60 秒 300 秒
Oracle ORACLE_MAX_ROWS / MAX_ROWS 500 5000
Elasticsearch ES_SEARCH_SIZE / MAX_ROWS 10 1000
Redis REDIS_MAX_ROWS / MAX_ROWS 100 1000

可用 list_runtime_limits() 查詢 SQL Server、Oracle、Elasticsearch、Redis 與 Reader 目前生效的限制值。

MCP Tool 回應格式

.NET MCP 服務的 tool 回應使用固定 JSON envelope:

{
  "ok": true,
  "kind": "ok",
  "message": "OK",
  "data": {}
}

kind 的常見值:

kind 說明
ok 工具執行成功且有資料或操作結果
empty 工具執行成功,但沒有符合條件的資料
blocked 輸入被安全規則阻擋
error 執行失敗或輸入格式錯誤

Tool 回應會遮罩常見機密片段,例如 password、token、secret、API key 與 URL userinfo。

Healthcheck

.NET MCP 服務提供 /health endpoint,Docker Compose healthcheck 會檢查 HTTP 200,而不是只檢查 TCP port 是否開啟。mcp-reader 使用 Python FastMCP,仍維持 TCP healthcheck。

API Contract / Drift 服務

mcp-api-contract 是可選的 OpenAPI 輔助 MCP,用於讀取 OpenAPI JSON/YAML spec、列出 endpoint、查詢 operation schema、比較兩份 spec 的 endpoint/status drift,並以有限 JSON schema 檢查 response。

API 呼叫功能預設關閉。只有在 profile 明確設定 INVOKE_ENABLED=true 時,invoke_endpoint 才會依 method allow-list 呼叫 API;預設 allow-list 為 GET、HEAD、OPTIONS。

範例連線:

API_CONTRACT_CONN_STAGE_NAME=stage
API_CONTRACT_CONN_STAGE_SPEC_URL=https://api-stage.example.test/openapi.json
API_CONTRACT_CONN_STAGE_BASE_URL=https://api-stage.example.test
API_CONTRACT_CONN_STAGE_INVOKE_ENABLED=false
API_CONTRACT_CONN_STAGE_ALLOWED_METHODS=GET,HEAD,OPTIONS

若 API 需要固定 header,可透過環境變數注入,工具回應不會回傳 header value:

API_CONTRACT_CONN_STAGE_AUTH_HEADER_NAME=Authorization
API_CONTRACT_CONN_STAGE_AUTH_HEADER_VALUE=Bearer <token>

可用工具

工具 說明
list_connections 列出 API contract profiles,不回傳 auth header value
get_spec_summary 讀取 OpenAPI spec 摘要
list_endpoints 依 path prefix、method 或 tag 列出 endpoints
get_endpoint_schema 取得指定 operation JSON
compare_specs 比較 baseline 與 candidate 的 endpoint/status drift
invoke_endpoint profile 啟用後依 allow-list 呼叫 API endpoint
validate_response 以有限 OpenAPI response schema 檢查 status code 與 JSON body

OIDC / JWT 服務

mcp-oidc 用於檢查 OpenID Connect provider 與 JWT token。工具只讀取 discovery document、JWKS 公鑰與本機 JWT 內容,不執行登入、不呼叫 token endpoint,也不修改 identity provider 設定。

範例連線:

OIDC_CONN_LOCAL_NAME=local
OIDC_CONN_LOCAL_ISSUER=http://host.docker.internal:8180/realms/demo
OIDC_CONN_LOCAL_REQUIRE_HTTPS_METADATA=false
OIDC_CONN_LOCAL_AUDIENCE=account

正式或測試環境建議維持 OIDC_CONN_<ALIAS>_REQUIRE_HTTPS_METADATA=true。

可用工具

工具 說明
list_connections 列出 OIDC provider profiles,不回傳 token
get_discovery_document 讀取 discovery document 摘要
get_jwks 讀取 JWKS 公鑰摘要
inspect_jwt 解析 JWT header 與 claims;不驗證簽章
validate_jwt 使用 provider JWKS 驗證 JWT 簽章、issuer、audience 與 lifetime

Mailpit 服務

mcp-mailpit 是可選測試輔助 MCP,僅用於讀取 Mailpit 測試信箱,協助測試流程確認預期信件是否出現。 寄信、信件刪除、已讀狀態變更與 Mailpit 管理功能不在此服務範圍;驗證流程與判斷規則由測試腳本或 Skill 定義。 工具只包裝不會改變信件狀態的 API;Mailpit 的 GET /api/v1/message/{ID} 會標記已讀,因此不提供該工具。

本機範例連線:

MAILPIT_CONN_DEFAULT_NAME=default
MAILPIT_CONN_DEFAULT_URL=http://host.docker.internal:8025

可用工具

工具 說明
list_connections 列出 Mailpit 連線
ping_connection 取得 Mailpit 版本與信件計數
list_messages 列出最新信件摘要
search_messages 使用 Mailpit 搜尋語法查詢信件摘要
wait_for_message 輪詢等待符合條件的信件出現
get_message_headers 取得信件 headers,不標記已讀
get_message_source 取得信件 raw source,不標記已讀

Docker / Compose 服務

mcp-docker 透過 Docker Engine API 讀取本機 Docker 狀態,工具只呼叫 read-only API,不提供 restart、exec、 remove、prune 等會改變狀態的操作。此服務仍套用 read_only、cap_drop: [ALL]、no-new-privileges 與非 root 使用者。Docker Desktop 可能把 socket 掛成容器內 root:root 660,Compose 會讓容器使用者加入 root group 與 DOCKER_GID,以相容 Docker Desktop 與 native Linux Docker。

查詢 Docker socket group id:

stat -c "%g" /var/run/docker.sock

可用工具

工具 說明
ping_docker 檢查 Docker Engine 是否可連線
get_docker_version 取得 Docker Engine 版本資訊
list_compose_projects 依容器 label 彙整 Compose project
list_containers 列出容器,可依 Compose project 或 service 篩選
inspect_container 檢視容器狀態、ports、networks、mounts,不回傳環境變數
get_container_logs 讀取容器最近 stdout/stderr logs,限制 tail 並套用回應遮罩
get_container_stats 取得單一容器 CPU、記憶體、網路與 block I/O 快照

SQL / Oracle 寫入防護

execute 工具內建 SqlGuard,防止危險寫入操作:

規則 說明
禁止 DROP SQL Server:拒絕 DROP TABLE/DATABASE/SCHEMA;Oracle:拒絕 DROP TABLE/USER/TABLESPACE
禁止 TRUNCATE 拒絕清空資料表
DELETE/UPDATE 需 WHERE 無條件刪除或更新一律拒絕
拒絕無效 WHERE WHERE 1=1、WHERE TRUE 等繞過條件一律拒絕

query 工具僅允許唯讀 SELECT / WITH 查詢。

Base64 工具(避免字元清洗)

部分 MCP client 會清洗單引號等字元,造成 SQL/JSON 內容失真。當你發現字串常值或 JSON 內容被清洗(例如單引號消失)時,可改用 Base64 版本工具傳輸,同時支援 Base64URL(-、_)與省略 padding(=):

  • SQL Server:query_base64、execute_base64
  • Oracle:query_base64、execute_base64
  • Elasticsearch:search_base64、index_document_base64、delete_by_query_base64

範例(SQL Server query_base64):

SQL: SELECT 'alpha' AS name
Base64: U0VMRUNUICdhbHBoYScgQVMgbmFtZQ==

文件服務

mcp-reader 採單一 DOCUMENT_HOST_MOUNT_ROOT 模型:先把一個共同根目錄掛進容器,再直接傳完整 Windows/WSL 路徑給 MCP,不需要先同步,也不一定要先列檔。

基本設定

DOCUMENT_HOST_MOUNT_ROOT=C:/Users/<你的帳號>/Documents
DOCUMENT_MAX_TEXT_MB=10

DOCUMENT_HOST_MOUNT_ROOT 是 Reader 對外接受與回傳的 host 路徑根。若 Docker Compose 實際需要使用不同格式掛載同一個目錄,可另外設定 DOCUMENT_HOST_MOUNT_SOURCE。例如從 Windows PowerShell 使用 Docker Desktop 啟動時,DOCUMENT_HOST_MOUNT_SOURCE=C:/Workspace 會比 /mnt/c/Workspace 更穩定。

Windows 路徑與 WSL 路徑均可直接傳入:

read_document(path="C:\Users\<你的帳號>\Documents\mcp-reader\sample.txt")
read_document(path="/home/<你的帳號>/documents/mcp-reader/sample.txt")

路徑規則

  • 傳入路徑必須落在 DOCUMENT_HOST_MOUNT_ROOT 底下。
  • Windows via WSL 時,不要把根目錄設成 /mnt;請直接掛 /mnt/c、/mnt/d 或更窄的共同父層。
  • MCP JSON 應以 UTF-8 傳送,reader 會直接處理中文路徑。
  • 如果 Agent 只有部分檔名或不確定完整路徑,先呼叫 resolve_document_path。例如傳入 C:\Workspace\Reader\ECK,reader 會回傳候選完整路徑,再把結果交給 read_document。

大檔說明

  • PDF / PPTX / DOCX / XLSX 的常見限制是 MCP client 或終端顯示。
  • 純文字檔才受 DOCUMENT_MAX_TEXT_MB 控制;設為 0 表示不限制。
  • 若回應太大,優先用 start_page / end_page 分段讀 PDF、PPTX。
  • XLSX 讀取預設限制列數與儲存格數,避免一次回傳整本大型工作簿。

列舉與搜尋限制

list_documents 預設不遞迴列舉,並限制最大回傳筆數;回應中會包含 returned_count、depth_limited 與 truncated,用來判斷是否仍有未回傳的候選檔案。需要掃描子目錄時,明確傳入 recursive=true、max_depth 與 limit。

search_documents 會限制掃描檔案數與回傳結果數,預設不對圖片執行 OCR 搜尋。若搜尋結果回傳 truncated=true,請縮小 subpath、提高限制值,或改用更精確的檔名前綴搭配 resolve_document_path。

啟動注意事項

  • 從 Windows PowerShell 使用 Docker Desktop 啟動時,建議把 Windows 目錄寫成 C:/Workspace。
  • 若 DOCUMENT_HOST_MOUNT_ROOT 是 WSL 路徑(如 /mnt/c/...、/home/...),請從 WSL shell 執行 docker compose up。
  • 直接從 Windows PowerShell 啟動時,容器在某些環境下可能只看到空目錄。

支援格式

類型 副檔名
辦公室文件 .pdf, .docx, .pptx, .xlsx
圖片 .jpg, .jpeg, .png, .gif, .bmp, .webp, .tiff, .tif, .svg
文字 .txt, .md, .log, .csv, .json, .yaml, .yml, .toml, .ini, .xml, .html

圖片讀取使用 Pillow 萃取 EXIF 與尺寸資訊;若系統安裝 Tesseract(容器已內建),另可提取 OCR 文字(支援繁中、簡中、英文)。

可用工具

工具 說明
get_document_root 查詢目前掛載根目錄與支援格式清單
resolve_document_path 驗證指定路徑是否可讀,或回傳同目錄下符合前綴的候選完整路徑
list_runtime_limits 查詢目前生效的文件讀取與搜尋限制
list_documents 以完整 Windows/WSL 路徑或相對路徑列出可讀取檔案,預設不遞迴且有回傳上限
read_document 以完整 Windows/WSL 路徑或相對路徑讀取指定檔案(含圖片)
read_document_text_only 僅讀取文字內容
search_documents 在指定 Windows/WSL 路徑下依關鍵字搜尋,限制掃描數與回傳結果數

AI 工具設定

各 AI 工具的 MCP 設定路徑與格式略有差異,請對照下方各節填入。

Gemini CLI / Codex CLI

設定檔格式:mcpServers + url

  • Gemini CLI:%USERPROFILE%\.gemini\settings.json
  • Codex CLI:%USERPROFILE%\.codex\mcp.json
{
  "mcpServers": {
    "mcp-api-contract": { "url": "http://127.0.0.1:9851/mcp" },
    "mcp-sql-server":    { "url": "http://127.0.0.1:9800/mcp" },
    "mcp-oracle":        { "url": "http://127.0.0.1:9801/mcp" },
    "mcp-elasticsearch": { "url": "http://127.0.0.1:9802/mcp" },
    "mcp-redis":         { "url": "http://127.0.0.1:9803/mcp" },
    "mcp-oidc":          { "url": "http://127.0.0.1:9850/mcp" },
    "mcp-mosquitto":     { "url": "http://127.0.0.1:9820/mcp" },
    "mcp-rabbitmq":      { "url": "http://127.0.0.1:9821/mcp" },
    "mcp-mailpit":       { "url": "http://127.0.0.1:9830/mcp" },
    "mcp-reader":        { "url": "http://127.0.0.1:9840/mcp" },
    "mcp-docker":        { "url": "http://127.0.0.1:9860/mcp" }
  }
}

Codex Desktop

設定檔格式:mcp_servers TOML table + url

  • %USERPROFILE%\.codex\config.toml
[mcp_servers.mcp-api-contract]
url = "http://127.0.0.1:9851/mcp"

[mcp_servers.mcp-sql-server]
url = "http://127.0.0.1:9800/mcp"

[mcp_servers.mcp-oracle]
url = "http://127.0.0.1:9801/mcp"

[mcp_servers.mcp-elasticsearch]
url = "http://127.0.0.1:9802/mcp"

[mcp_servers.mcp-redis]
url = "http://127.0.0.1:9803/mcp"

[mcp_servers.mcp-oidc]
url = "http://127.0.0.1:9850/mcp"

[mcp_servers.mcp-mosquitto]
url = "http://127.0.0.1:9820/mcp"

[mcp_servers.mcp-rabbitmq]
url = "http://127.0.0.1:9821/mcp"

[mcp_servers.mcp-mailpit]
url = "http://127.0.0.1:9830/mcp"

[mcp_servers.mcp-reader]
url = "http://127.0.0.1:9840/mcp"

[mcp_servers.mcp-docker]
url = "http://127.0.0.1:9860/mcp"

GitHub Copilot(VS Code)

設定檔格式:servers + type

  • %AppData%\Code\User\mcp.json
{
  "servers": {
    "mcp-api-contract": { "type": "http", "url": "http://127.0.0.1:9851/mcp" },
    "mcp-sql-server":    { "type": "http", "url": "http://127.0.0.1:9800/mcp" },
    "mcp-oracle":        { "type": "http", "url": "http://127.0.0.1:9801/mcp" },
    "mcp-elasticsearch": { "type": "http", "url": "http://127.0.0.1:9802/mcp" },
    "mcp-redis":         { "type": "http", "url": "http://127.0.0.1:9803/mcp" },
    "mcp-oidc":          { "type": "http", "url": "http://127.0.0.1:9850/mcp" },
    "mcp-mosquitto":     { "type": "http", "url": "http://127.0.0.1:9820/mcp" },
    "mcp-rabbitmq":      { "type": "http", "url": "http://127.0.0.1:9821/mcp" },
    "mcp-mailpit":       { "type": "http", "url": "http://127.0.0.1:9830/mcp" },
    "mcp-reader":        { "type": "http", "url": "http://127.0.0.1:9840/mcp" },
    "mcp-docker":        { "type": "http", "url": "http://127.0.0.1:9860/mcp" }
  }
}

GitHub Copilot CLI

設定檔格式:mcpServers + type

  • %USERPROFILE%\.copilot\mcp-config.json
{
  "mcpServers": {
    "mcp-api-contract": { "type": "http", "url": "http://localhost:9851/mcp" },
    "mcp-sql-server":    { "type": "http", "url": "http://localhost:9800/mcp" },
    "mcp-oracle":        { "type": "http", "url": "http://localhost:9801/mcp" },
    "mcp-elasticsearch": { "type": "http", "url": "http://localhost:9802/mcp" },
    "mcp-redis":         { "type": "http", "url": "http://localhost:9803/mcp" },
    "mcp-oidc":          { "type": "http", "url": "http://localhost:9850/mcp" },
    "mcp-mosquitto":     { "type": "http", "url": "http://localhost:9820/mcp" },
    "mcp-rabbitmq":      { "type": "http", "url": "http://localhost:9821/mcp" },
    "mcp-mailpit":       { "type": "http", "url": "http://localhost:9830/mcp" },
    "mcp-reader":        { "type": "http", "url": "http://localhost:9840/mcp" },
    "mcp-docker":        { "type": "http", "url": "http://localhost:9860/mcp" }
  }
}

Claude Code

設定檔格式:mcpServers + type

  • %USERPROFILE%\.claude.json
{
  "mcpServers": {
    "mcp-api-contract": { "type": "http", "url": "http://localhost:9851/mcp" },
    "mcp-sql-server":    { "type": "http", "url": "http://localhost:9800/mcp" },
    "mcp-oracle":        { "type": "http", "url": "http://localhost:9801/mcp" },
    "mcp-elasticsearch": { "type": "http", "url": "http://localhost:9802/mcp" },
    "mcp-redis":         { "type": "http", "url": "http://localhost:9803/mcp" },
    "mcp-oidc":          { "type": "http", "url": "http://localhost:9850/mcp" },
    "mcp-mosquitto":     { "type": "http", "url": "http://localhost:9820/mcp" },
    "mcp-rabbitmq":      { "type": "http", "url": "http://localhost:9821/mcp" },
    "mcp-mailpit":       { "type": "http", "url": "http://localhost:9830/mcp" },
    "mcp-reader":        { "type": "http", "url": "http://localhost:9840/mcp" },
    "mcp-docker":        { "type": "http", "url": "http://localhost:9860/mcp" }
  }
}

Antigravity

設定檔格式:mcpServers + serverUrl

  • %USERPROFILE%\.gemini\antigravity\mcp_config.json
{
  "mcpServers": {
    "mcp-api-contract": { "serverUrl": "http://localhost:9851/mcp" },
    "mcp-sql-server":    { "serverUrl": "http://localhost:9800/mcp" },
    "mcp-oracle":        { "serverUrl": "http://localhost:9801/mcp" },
    "mcp-elasticsearch": { "serverUrl": "http://localhost:9802/mcp" },
    "mcp-redis":         { "serverUrl": "http://localhost:9803/mcp" },
    "mcp-oidc":          { "serverUrl": "http://localhost:9850/mcp" },
    "mcp-mosquitto":     { "serverUrl": "http://localhost:9820/mcp" },
    "mcp-rabbitmq":      { "serverUrl": "http://localhost:9821/mcp" },
    "mcp-mailpit":       { "serverUrl": "http://localhost:9830/mcp" },
    "mcp-reader":        { "serverUrl": "http://localhost:9840/mcp" },
    "mcp-docker":        { "serverUrl": "http://localhost:9860/mcp" }
  }
}

常用指令

docker compose up -d --build              # 啟動(含重新建置)
docker compose down -v                    # 停止並清除資料
docker compose ps                         # 查看狀態
docker compose logs -f mcp-sql-server     # 查看指定服務 log
docker compose restart mcp-reader         # 重啟指定服務
python3 scripts/smoke-test.py             # 執行本機整合 smoke test
python3 scripts/check-all.py --smoke      # 執行單元測試與 smoke test

授權

This project is MIT licensed. See LICENSE.md.

About

以 Docker Compose 執行的 MCP 服務集合,提供受控的資料庫、身分、訊息與文件工具。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages