D-Hub MCP Server
by DuanZGit
README.md
# D-Hub:多 Agent 统一协调层
> **版本 v0.3.0** — 会话转录层 + 单向自动上传器(dhub-uploader)
## 一句话
D-Hub = 一个 Python 进程(:10101)+ 一个 PostgreSQL(:5432)。
记忆、Wiki、会话转录、MCP、技能、文件、Agent 路由、Dashboard,全在一个进程里。
Dashboard:`http://<服务器>:10101/ui`。根地址会自动跳转到 Dashboard;
`deploy/install.sh` 会生成 `DHUB_ADMIN_KEY`,仅供管理台和资产同步使用;运行期
Agent 使用注册时单独签发的密钥。
Agent 接入、原生 MCP 工具、资产 manifest 和提示词模板见
[AGENT_INTEGRATION.md](AGENT_INTEGRATION.md)。可运行示例位于
[`examples/agent-assets`](examples/agent-assets)。
## 设计原则
1. **单进程**:D-Hub 一个 Python 进程搞定所有协调
2. **单数据库**:PostgreSQL + pgvector 存储记忆和结构化数据
3. **三级隔离**:共识层(global)/ Agent 层(agents/<id>)/ Project 层(projects/<id>)
4. **读时合并**:MCP、Skills 配置每次请求实时合并,无缓存、无 cron
5. **Wiki git 化**:Markdown 文件 + 自动 commit,可回滚
6. **非 Docker**:原生 Python,systemd 管理
7. **定时任务只做语义同步**:记忆 ↔ Wiki 提炼(LLM 处理)
## 快速开始
### 1. 环境要求
- Linux 服务器,建议 Ubuntu 24.04
- Python 3.10+
- PostgreSQL 16 + pgvector
### 2. 安装依赖
```bash
sudo apt update
sudo apt install -y postgresql postgresql-contrib postgresql-16-pgvector
sudo systemctl enable --now postgresql
```
### 3. 准备数据库
```bash
sudo -u postgres psql -c "CREATE DATABASE mem0;"
sudo -u postgres psql -d mem0 -c "CREATE EXTENSION IF NOT EXISTS vector;"
sudo -u postgres psql -c "CREATE USER mem0 WITH PASSWORD 'your-password';"
sudo -u postgres psql -c "GRANT ALL ON DATABASE mem0 TO mem0;"
```
### 4. 部署 D-Hub
```bash
git clone https://github.com/DuanZGit/D-Hub.git
cd D-Hub
sudo bash deploy/install.sh
```
安装脚本会自动完成:
- 创建 `/opt/d-hub` 目录结构
- 安装 Python 依赖
- 配置 systemd 服务
- 启动 `dhub.service`
### 5. 验证
```bash
curl http://127.0.0.1:10101/health
```
## 如何使用
### 启动与停止
```bash
sudo systemctl start dhub
sudo systemctl stop dhub
sudo systemctl restart dhub
sudo systemctl status dhub
```
### 配置环境变量
编辑 `/opt/d-hub/config/dhub.env`:
```env
DHUB_ROOT=/opt/d-hub
DHUB_PORT=10101
DHUB_MEMORY_BACKEND=json
NEW_API_BASE_URL=http://127.0.0.1:3000/v1
NEW_API_KEY=your-key
DHUB_LLM_MODEL=your-model
DHUB_EMBED_MODEL=your-embedding-model
DHUB_EMBED_DIMS=1536
MEM0_DB_HOST=127.0.0.1
MEM0_DB_PORT=5432
MEM0_DB_NAME=mem0
MEM0_DB_USER=mem0
MEM0_DB_PASSWORD=your-password
```
修改后重启:
```bash
sudo systemctl restart dhub
```
### Dashboard
浏览器打开:
```
http://<服务器IP>:10101/ui
```
Dashboard 提供 12 个功能模块:总览、Agent、MCP、记忆、Wiki、会话、技能、文件、同步、日志、配置、备份。
### 常用 API 示例
#### Agent 注册
```bash
curl -X POST http://127.0.0.1:10101/register \
-H "Content-Type: application/json" \
-d '{"agent_id":"minis","projects":["project-a"]}'
```
#### 添加记忆
```bash
curl -X POST http://127.0.0.1:10101/memory/add \
-H "Content-Type: application/json" \
-d '{"namespace":"projects/project-a","agent_id":"minis","content":"决定使用 PostgreSQL"}'
```
#### 搜索记忆
```bash
curl -X POST http://127.0.0.1:10101/memory/search \
-H "Content-Type: application/json" \
-d '{"namespace":"projects/project-a","agent_id":"minis","query":"PostgreSQL"}'
```
#### 创建 Wiki 页面
```bash
curl -X POST http://127.0.0.1:10101/wiki/page \
-H "Content-Type: application/json" \
-d '{"namespace":"projects/project-a","title":"架构决策","content":"# 数据库选型\n\nPostgreSQL。"}'
```
#### 搜索 Wiki
```bash
curl "http://127.0.0.1:10101/wiki/search?namespace=projects%2Fproject-a&q=PostgreSQL"
```
#### 创建会话转录
```bash
curl -X POST http://127.0.0.1:10101/sessions \
-H "Content-Type: application/json" \
-d '{"namespace":"projects/project-a","title":"重构讨论","cwd":"/repo"}'
```
#### 追加消息到会话
```bash
curl -X POST http://127.0.0.1:10101/sessions/<session_id>/messages \
-H "Content-Type: application/json" \
-d '{"namespace":"projects/project-a","messages":[{"role":"user","content":"开始重构"}]}'
```
#### 搜索会话
```bash
curl "http://127.0.0.1:10101/sessions/search?namespace=projects%2Fproject-a&q=重构"
```
#### 上传文件
```bash
curl -X POST "http://127.0.0.1:10101/files/upload?namespace=global" \
-F "file=@/path/to/file.txt"
```
#### MCP 工具列表
```bash
curl -X POST http://127.0.0.1:10101/mcp/tools/list \
-H "Content-Type: application/json" \
-d '{"agent_id":"minis","project":"project-a"}'
```
### 启用 Mem0 记忆后端
1. 确认 PostgreSQL 和 pgvector 已安装
2. 在 `/opt/d-hub/config/dhub.env` 中配置:
- `NEW_API_KEY`
- `DHUB_LLM_MODEL`
- `DHUB_EMBED_MODEL`
- `MEM0_DB_PASSWORD`(与 PostgreSQL `mem0` 用户密码一致)
3. 重启服务:
```bash
sudo systemctl restart dhub
```
4. 验证后端:
```bash
curl http://127.0.0.1:10101/health
# 查看 "memory_backend": "mem0"
```
### 可插拔记忆后端(MemoryBackend)
D-Hub 将记忆后端抽象为可替换的 `MemoryBackend`:
```text
D-Hub REST / MCP / DSH Plugin
|
MemoryService
|
MemoryBackend Protocol
/ | \
Mem0 TencentDB JSON fallback
```
- 默认保持 Mem0(向量)/ JSON(降级)兼容路径,升级不自动切换。
- 腾讯 adapter 通过显式配置启用:`DHUB_MEMORY_BACKENDS=agent_memory`。
- 后端未配置时项目仍能正常启动;腾讯故障时 Mem0/JSON 仍可用。
- 可选双写/双读评测(`DHUB_MEMORY_DUAL_WRITE/READ`,默认关)。
- 查看后端状态:`GET /memory/backends`、`GET /memory/health`(admin)。
- 协议确认与支持范围见 `docs/tencentdb-agent-memory-protocol.md`。
### 跨电脑 Agent Connector
不同电脑上的 DSH 通过 dsh-dhub 插件**主动出站**连接同一个 D-Hub,共享记忆、
Wiki、状态与结构化 Agent 消息,无需开放入站端口。
```text
DSH Plugin A ─┐
├── outbound HTTPS/VPN → D-Hub
DSH Plugin B ─┘
```
- Connector API 见 `docs/Connector API.md`。
- DSH 插件见 `plugins/dsh-dhub/`。
- 跨电脑连接方案见 `docs/DSH跨电脑连接.md`。
- 检索评测见 `docs/memory-eval.md`。
### 备份与恢复
#### 手动备份
```bash
curl -X POST http://127.0.0.1:10101/backup
```
备份文件保存在 `/opt/d-hub/backups/<时间戳>/`。
#### 查看备份列表
```bash
curl http://127.0.0.1:10101/backups
```
#### 恢复备份
```bash
curl -X POST "http://127.0.0.1:10101/backup/<备份名>/restore"
```
### 定时任务
D-Hub 使用 systemd timer 管理定时任务:
| 任务 | 频率 | 说明 |
|---|---|---|
| 记忆 ↔ Wiki 语义同步 | 每 4 小时 | 需要配置 LLM 模型 |
| 完整备份 | 每天 02:00 | 文件 + PostgreSQL |
查看定时任务状态:
```bash
systemctl list-timers | grep dhub
```
## Agent 接入
Agent 通过三条通道接入 D-Hub:
### 1. MCP(运行时通道)
Agent 配置 Streamable HTTP MCP,连接 D-Hub 后可使用原生工具和上游工具。
**配置示例**(Claude Code / Cursor 等客户端):
```json
{
"mcpServers": {
"dhub": {
"url": "http://192.168.5.242:10101/mcp?agent_id=codex&project=project-a",
"transport": "streamable-http"
}
}
}
```
### 2. Manifest 同步(发布通道)
Agent 启动时通过 Manifest 发布自己的 MCP 配置、Skill、Wiki 和文件。
```bash
# 安装 D-Hub Python 包
pip install d-hub
# 注册并发布资产
dhub-agent-sync .dhub/dhub-agent.json
```
### 3. 单向手动同步(dhub-uploader)
多端 Agent 把本地资产**手动推送**到云 D-Hub。方向是**单向 push**——下载由 Agent 通过 MCP 工具(`dhub_session_get`、`dhub_memory_search` 等)按需主动拉取,不做反向实时同步。
每次运行扫描一次即退出,无守护进程、无轮询。想同步时手动跑一条命令即可。
支持的源:
| `--source` | 本地资产 | 映射到 D-Hub |
|---|---|---|
| `claude` | `~/.claude/projects/*/*.jsonl` | 会话转录 |
| `codex` | `~/.codex/sessions/*/rollout-*.jsonl` | 会话转录 |
| `minis` | `/var/minis/memory/*.md` | 记忆 + Wiki(GLOBAL.md) |
| `generic` | 任意目录(`--dir`) | 会话 + 记忆 |
```bash
# 手动同步一次(扫描后退出)
dhub-uploader --source minis --url http://<d-hub>:10101 \
--api-key <admin-key> --namespace agents/minis --agent-id minis
```
增量策略(重跑不重复):
- 会话转录**按行追加**(只上传新消息)
- 记忆**按内容哈希判重**(不变不重传)
- 状态文件记录映射,默认 `~/.dhub-uploader-state.json`
如果需要定时,交给 cron / systemd timer 自行调度(`dhub-uploader` 本身只做单次同步)。
### 4. 会话自动同步插件(推荐)
`dhub-uploader` 是手动一次性同步,但**会话自动同步**更优雅的方式是用各 Agent 的**原生插件**:会话一结束自动把 transcript 推上去,零安装、零依赖、增量去重。
| Agent | 机制 | 触发点 | 位置 |
|---|---|---|---|
| Codex | hooks | `SessionEnd` | [plugins/codex](plugins/codex/) |
| Pi | TypeScript extension | `session_shutdown` | [plugins/pi](plugins/pi/) |
详见 [plugins/README.md](plugins/README.md)。
另有一个 [dhub skill](skills/dhub/),让 agent 按需加载 D-Hub 用法速查(省 token),遵循 agentskills.io 标准,Claude Code / Codex / Pi 通用。
### 原生 MCP 工具
连接后,D-Hub 自动提供以下工具:
| 工具 | 用途 |
|---|---|
| `dhub_memory_search` | 搜索记忆 |
| `dhub_memory_add` | 写入记忆 |
| `dhub_wiki_search` | 搜索 Wiki |
| `dhub_wiki_put` | 创建/更新 Wiki |
| `dhub_skills_list` | 列出技能 |
| `dhub_files_list` | 列出文件 |
| `dhub_file_read` | 读取文件 |
| `dhub_session_create` | 创建会话转录 |
| `dhub_session_list` | 列出会话 |
| `dhub_session_get` | 读取会话 |
| `dhub_session_append` | 追加会话消息 |
| `dhub_session_search` | 搜索会话 |
更多细节见 [AGENT_INTEGRATION.md](AGENT_INTEGRATION.md) 和 [examples/agent-assets](examples/agent-assets)。
### 目录结构
```
/opt/d-hub/
├── mcp/ # MCP 服务器配置
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
├── skills/ # 技能仓库
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
├── wiki/ # Wiki 页面
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
├── files/ # 共享文件
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
├── sessions/ # 会话转录(JSON 元数据 + JSONL 消息流)
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
├── config/ # 配置文件
│ └── dhub.env
├── data/ # 数据文件
├── logs/ # 日志
├── backups/ # 备份
└── scripts/ # 脚本
```
## 技术栈
| 组件 | 技术 | 说明 |
|---|---|---|
| D-Hub | Python FastAPI | 一个进程,全包 |
| 记忆 | `import mem0` | Python 库,直接调用,不是独立服务 |
| Wiki | Python 内置 | Markdown 文件 CRUD + 全文搜索(whoosh) |
| MCP 路由 | Python 内置 | JSON-RPC 转发 + 三层配置合并 |
| 技能仓库 | 文件系统 | 三层目录:global / agents / projects |
| 文件共享 | 文件系统 | 三层目录:global / agents / projects |
| 会话转录 | 文件系统 | JSON 元数据 + JSONL 消息流,三层目录 |
| 手动同步 | `dhub-uploader` CLI | 单向 push,单次扫描增量同步 |
| Dashboard | FastAPI 静态文件 | 内嵌在 D-Hub |
| 数据库 | PostgreSQL + pgvector | 系统 apt 安装,仅 localhost |
| 同步 | systemd timer | 定时运行记忆 ↔ Wiki 语义同步 |
## 架构
```
┌─────────────────────────────────────────────────────────┐
│ D-Hub (:10101) — 唯一进程 │
│ │
│ FastAPI 服务 │
│ ├── /mcp/* MCP 路由(三层合并) │
│ ├── /memory/* 记忆(mem0ai 库直接调用) │
│ ├── /wiki/* Wiki(内置 Markdown 引擎) │
│ ├── /skills/* 技能仓库 │
│ ├── /files/* 文件共享 │
│ ├── /sessions/* 会话转录 │
│ ├── /agent/* Agent 注册 + 路由 │
│ ├── /sync/* 同步触发 │
│ └── /ui Dashboard │
│ │
│ mem0ai 库(import mem0) │
│ └── 直接读写 PostgreSQL │
└───────────────────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────┐
│ PostgreSQL + pgvector (:5432) — 唯一数据库 │
│ 仅 localhost,不对外暴露 │
└───────────────────────────────────────────────────────────┘
```
## 三级目录结构
所有资产(MCP、Skills、Wiki、Files、Sessions)统一走同一套目录模式:
```
/opt/d-hub/
├── mcp/ # MCP 服务器配置(JSON 文件)
│ ├── global/ # 全局共享
│ ├── agents/<id>/ # Agent 专属
│ └── projects/<id>/ # 项目专属
├── skills/ # 技能(SKILL.md 文件)
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
├── wiki/ # Wiki 页面(Markdown 文件)
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
├── files/ # 共享文件
│ ├── global/
│ ├── agents/<id>/
│ └── projects/<id>/
└── sessions/ # 会话转录(<id>.json + <id>.jsonl)
├── global/
├── agents/<id>/
└── projects/<id>/
```
**查找顺序**(MCP、Skills 一致):
```
Agent 请求资源 X
→ 查 project 层(/opt/d-hub/<type>/projects/<project>/X)
→ 查 agent 层(/opt/d-hub/<type>/agents/<agent>/X)
→ 查 global 层(/opt/d-hub/<type>/global/X)
→ 找不到 → 404
```
**合并规则**:同名覆盖(project > agent > global),不同名合并。
## 数据流 — MCP 路由(读时合并)
```
Agent → POST /mcp/tools/list {agent_id, project}
→ D-Hub 读取 mcp/global/ + mcp/agents/<id>/ + mcp/projects/<id>/
→ 合并(project 覆盖 agent 覆盖 global)
→ 返回合并后的工具列表
(无缓存、无 cron、每请求实时计算)
Agent → POST /mcp/tools/call {name, arguments}
→ d-hub 查合并后的配置表里该 tool 对应的 MCP server
→ 转发 JSON-RPC 请求
→ 返回结果
```
## 数据流 — Wiki(git 化)
```
Agent → POST /wiki/page {namespace, title, content}
→ d-hub 写入对应目录的 Markdown 文件
→ git add + git commit(自动)
→ 更新全文索引
回滚:
cd /opt/d-hub/wiki && git revert <commit>
```
## 端口分配
| 服务 | 端口 | 访问范围 | 说明 |
|---|---|---|---|
| d-hub | 10101 | 局域网 | 唯一入口 |
| PostgreSQL | 5432 | 仅 localhost | 数据库 |
## 同步机制(只有一种)
不是所有资产都需要同步。只有需要 LLM 处理的**语义同步**才需要定时任务:
```
systemd timer 每 4 小时:
记忆共识层(global:shared)
→ LLM 提取精华
→ 生成/更新 Wiki 共识页面
→ 回写确认
MCP 配置 / Skills / 文件:
→ 不需要 cron
→ 每次请求实时读目录合并
→ 文件变更立即生效
```
## 当前依赖状态
| 依赖 | 状态 | 说明 |
|---|---|---|
| UG(192.168.5.242) | ✅ 在线 | Ubuntu 24.04 |
| PostgreSQL + pgvector | ⚠️ 待安装 | apt install + 编译 |
| mem0ai | ⚠️ 待安装 | pip install mem0ai |
| Python 3.10+ | ✅ 已装 | 系统自带 |
| FastAPI 等 | ⚠️ 待安装 | pip install |
| Node.js | ❌ 不需要 | 全 Python,无外部运行时依赖 |
| gh CLI | ✅ 已装 | 账号 DuanZGit |
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues