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=pw2Agent 可呼叫 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 目前生效的限制值。
.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。
.NET MCP 服務提供 /health endpoint,Docker Compose healthcheck 會檢查 HTTP 200,而不是只檢查 TCP port 是否開啟。mcp-reader 使用 Python FastMCP,仍維持 TCP healthcheck。
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 |
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 |
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,不標記已讀 |
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 快照 |
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 查詢。
部分 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=10DOCUMENT_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 工具的 MCP 設定路徑與格式略有差異,請對照下方各節填入。
設定檔格式: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" }
}
}設定檔格式: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"設定檔格式: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" }
}
}設定檔格式: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" }
}
}設定檔格式: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" }
}
}設定檔格式: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 testThis project is MIT licensed. See LICENSE.md.