🚀 DMCP - 動態模型上下文協議
為MCP實現語義工具發現 - 通過向量搜索使工具發現以查詢為驅動,解決“工具過多”的問題。
🚀 快速開始
前提條件
1. 克隆並啟動
git clone https://github.com/yourusername/dmcp.git
cd dmcp
docker compose up -d
docker compose ps
2. 索引工具
docker compose run --rm indexer
curl http://localhost:3001/health
3. 配置 VS Code
在 .vscode/mcp.json 中添加以下內容:
{
"servers": {
"dmcp": {
"type": "http",
"url": "http://localhost:3001/mcp"
}
}
}
完成! 現在,search_tools 元工具已可在 VS Code / GitHub Copilot 中使用。
✨ 主要特性
- 🔍 語義搜索:使用 ToolRet 訓練的 E5 模型進行準確的工具檢索
- ⚡ 快速:約 50ms 的搜索延遲,減少 98% 的令牌使用
- 🔄 連接恢復能力:自動重試、健康檢查和重新連接
- 🐳 Docker 就緒:包含 Redis VSS + 嵌入服務的完整堆棧
- 📊 可觀測性:提供健康端點、會話日誌和連接狀態
- ✅ 經過測試:使用 vitest 進行了 56 個單元測試
📦 安裝指南
克隆倉庫
git clone https://github.com/yourusername/dmcp.git
cd dmcp
啟動服務
docker compose up -d
索引工具
docker compose run --rm indexer
配置 VS Code
在 .vscode/mcp.json 中添加:
{
"servers": {
"dmcp": {
"type": "http",
"url": "http://localhost:3001/mcp"
}
}
}
💻 使用示例
基礎用法
User: "Create a GitHub issue for this bug"
LLM calls: search_tools(query="create GitHub issue")
→ Returns top-15 relevant tools (via semantic vector search)
→ Tools become available for use
LLM calls: github_create_issue(...)
→ Issue created!
高級用法
User: "search for kubernetes tools"
→ search_tools("kubernetes")
← Returns: 15 k8s tools (get_pods, list_deployments, ...)
📚 詳細文檔
🏗️ 架構
┌─────────────────────────────────────────────────────────────────────────────┐
│ VS Code / GitHub Copilot │
│ │
│ User: "search for kubernetes tools" │
│ → search_tools("kubernetes") │
│ ← Returns: 15 k8s tools (get_pods, list_deployments, ...) │
└─────────────────────────────────┬───────────────────────────────────────────┘
│ HTTP (Streamable HTTP Transport)
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ DMCP Server (port 3001) │
│ │
│ • Exposes 1 meta-tool: search_tools │
│ • Pure vector search (COSINE similarity, HNSW index) │
│ • Sends listChanged notifications when tools discovered │
│ • Connection keep-alive with health checks (30s interval) │
│ • Auto-retry on connection failures (3 attempts, exponential backoff) │
└────────────┬──────────────────────────────────────────────────┬─────────────┘
│ │
│ Query embeddings │ Tool calls (SSE)
▼ ▼
┌────────────────────────────────┐ ┌────────────────────────────┐
│ Redis Stack (port 6380) │ │ Backend MCP Servers │
│ │ │ (via Agent Gateway) │
│ • Vector Index (HNSW) │ │ │
│ • COSINE similarity │ │ • GitHub, Jira, Confluence│
│ • 400+ tools indexed │ │ • Google Workspace, Notion│
└────────────────────────────────┘ │ • Kubernetes, AWS, Azure │
▲ │ • And more... │
│ └────────────────────────────┘
┌────────────────────────────────┐
│ Infinity Embedding Service │
│ (port 5000) │
│ │
│ • ToolRet e5-large-v2 model │
│ • 1024 dimensions │
│ • OpenAI-compatible API │
└────────────────────────────────┘
📁 項目結構
dmcp/
├── docker-compose.yml # Full stack configuration
├── server/ # DMCP Server (TypeScript)
│ ├── src/
│ │ ├── dmcp-server.ts # Main server with connection management
│ │ ├── redis-vss.ts # Redis vector similarity search
│ │ ├── custom-embedding-provider.ts
│ │ ├── dmcp-server.test.ts # Unit tests (28 tests)
│ │ └── redis-vss.test.ts # Unit tests (28 tests)
│ ├── vitest.config.ts
│ └── package.json
├── indexer/ # Tool Indexer (TypeScript)
│ └── src/
│ └── index.ts # CLI indexer with parallel discovery
└── README.md
🐳 Docker 命令
docker compose up -d
docker compose logs -f dmcp-server
docker compose run --rm indexer
docker compose --profile worker up -d
docker compose build dmcp-server && docker compose up -d dmcp-server
docker compose down
docker compose down -v
⚙️ 配置
環境變量
| 變量 |
默認值 |
描述 |
PORT |
3000 |
服務器端口(容器內部) |
REDIS_HOST |
localhost |
Redis 服務器主機 |
REDIS_PORT |
6379 |
Redis 服務器端口 |
EMBEDDING_URL |
http://localhost:5000 |
嵌入服務 URL |
DMCP_TOP_K |
15 |
每次搜索返回的最大工具數 |
DMCP_MIN_SCORE |
0.3 |
最小相似度閾值 |
連接恢復能力
| 變量 |
默認值 |
描述 |
DMCP_RETRY_ATTEMPTS |
3 |
最大連接重試次數 |
DMCP_RETRY_DELAY_MS |
1000 |
重試之間的基本延遲(指數退避) |
DMCP_HEALTH_INTERVAL_MS |
30000 |
後端連接的健康檢查間隔 |
DMCP_CONNECTION_TIMEOUT_MS |
10000 |
連接超時時間 |
Docker Compose 服務
| 服務 |
容器 |
主機端口 |
描述 |
redis-vss |
mcp-redis-vss |
6380 |
支持向量搜索的 Redis Stack |
embedding-service |
mcp-embedding-infinity |
5000 |
Infinity 嵌入服務 |
dmcp-server |
dmcp-server |
3001 |
DMCP MCP 服務器 |
indexer |
dmcp-indexer |
- |
一次性索引器 |
indexer-worker |
dmcp-indexer-worker |
- |
持續同步(可選) |
🔍 搜索工作原理
DMCP 使用 純向量搜索 和 ToolRet 嵌入模型:
- 使用 ToolRet 訓練的 E5-large-v2 對查詢進行嵌入
- Redis 執行 HNSW 最近鄰搜索
- 按餘弦相似度對前 K 個結果進行排序並返回
- 通過
notifications/tools/list_changed 使工具可用
示例查詢:
| 查詢 |
查找結果 |
"create GitHub issue" |
GitHub 工具 |
"ticket management" |
Jira 工具 |
"check pod logs" |
Kubernetes 工具 |
"search emails" |
Google Workspace 工具 |
"query Notion database" |
Notion 工具 |
🏥 健康與監控
健康端點
curl http://localhost:3001/health
響應:
{
"status": "healthy",
"toolCount": 440,
"activeSessions": 2,
"backendConnections": {
"total": 5,
"healthy": 5,
"details": [
{"serverId": "github", "healthy": true, "lastCheck": 1704700000000},
{"serverId": "serena", "healthy": true, "lastCheck": 1704700000000}
]
},
"config": {
"retryAttempts": 3,
"retryDelayMs": 1000,
"healthIntervalMs": 30000,
"connectionTimeoutMs": 10000
},
"uptime": 3600
}
服務器日誌
docker compose logs -f dmcp-server
🧪 測試
cd server
npm test
npm run test:watch
npm run test:coverage
測試覆蓋率:56 個測試涵蓋:
- 工具名稱清理和解析
- 連接重試和健康檢查邏輯
- Redis 向量搜索操作
- 嵌入操作
🔧 本地開發
docker compose up -d redis-vss embedding-service
cd server
npm install
REDIS_PORT=6380 EMBEDDING_URL=http://localhost:5000 npm run start
npm test
➕ 添加 MCP 服務器
DMCP 可與任何 MCP 服務器配合使用。示例配置位於 gateway/config_parts/ 中。
Notion MCP 服務器
Notion MCP 提供用於搜索、讀取和創建 Notion 頁面/數據庫的工具。
- 在 notion.so/my-integrations 創建一個 Notion 集成
- 將以下內容添加到網關配置文件(
gateway/config_parts/70-notion.yaml)中:
targets:
- name: notion
type: mcp
target_config:
command: npx
args:
- -y
- "@notionhq/notion-mcp-server"
env:
OPENAPI_MCP_HEADERS: '{"Authorization": "Bearer ${NOTION_API_KEY}", "Notion-Version": "2022-06-28"}'
- 設置 API 密鑰:
export NOTION_API_KEY=ntn_...
- 重啟網關並重新索引:
docker compose run --rm indexer
其他流行的 MCP 服務器
| 服務器 |
包 |
文檔 |
| GitHub |
@modelcontextprotocol/server-github |
GitHub MCP |
| Slack |
@modelcontextprotocol/server-slack |
Slack MCP |
| Google Drive |
@modelcontextprotocol/server-gdrive |
GDrive MCP |
| PostgreSQL |
@modelcontextprotocol/server-postgres |
Postgres MCP |
📊 性能
| 指標 |
值 |
| 索引工具數 |
440 |
| 索引時間 |
~45 秒 |
| 搜索延遲 |
~50ms |
| 令牌減少 |
98% |
| 嵌入模型 |
ToolRet-e5-large-v2 (1024 維) |
📐 MCP 規範合規性
實現了 MCP 規範 並使用 可流式 HTTP 傳輸:
- ✅
listChanged: true 功能
- ✅
notifications/tools/list_changed 通知
- ✅ 基於搜索的動態工具可用性
- ✅ 可流式 HTTP 傳輸(POST/GET/DELETE)
- ✅ 使用 UUID 會話 ID 進行會話管理
- ✅ 使用 SSE 進行異步通知
🔬 研究基礎
基於 "Retrieval Models Aren't Tool-Savvy"(ACL 2025)實現:
關鍵見解:通用信息檢索模型在工具檢索方面表現不佳,特定於工具的訓練至關重要。
🎬 靈感來源
📄 許可證
本項目採用 MIT 許可證。