前言¶
在 DSH 里让智能体帮你看服务是否在线,常见做法是临时 curl 或写一次性脚本:每次对话都要重新描述目标,结果格式也不统一。若你维护的是小规模自托管环境,更稳妥的做法是把「要盯什么」写进固定清单,由工具按同一套规则做 HTTP、TCP、SSL 与 Docker 探测,且只读、不重启、不修复。社区插件 lowspecai/dsh-home-monitor(维护者 lowspecai,分类:联网工具)就是按这个思路实现的:同一套检查既可注册为 DSH 工具,也可单独作为 MCP stdio 服务运行。
这是什么¶
home-monitor 面向 dsh 0.2.0-rc.2 及以上(package.json 中 engines.dsh 为 >=0.2.0-rc.2),许可证 MIT,当前版本 0.1.0。它只做只读健康检查:打开连接、读取、关闭,不写配置、不重启进程、不执行修复命令。
两种打包方式共用 server/config.json:
- DSH 插件:向智能体注册五个工具——
monitor_http、monitor_tcp、monitor_ssl、monitor_docker、monitor_targets。 - 独立 MCP stdio 服务:同一套逻辑,工具名为
check_http、check_tcp、check_ssl、check_docker、monitor_status,任意 MCP 客户端均可调用。
插件层 lib/index.js 直接引用 server/monitors/ 下的模块;MCP 子包 server/ 单独依赖 @modelcontextprotocol/sdk,MCP 链路异常时不会拖垮 DSH 侧五个工具。
核心功能¶
HTTP¶
对 config.json 里 http.targets[] 中的 { name, url, expect?, headers? } 发起请求,返回状态码、延迟与 body 大小。expect 可为单个状态码或数组;例如 [200, 302, 401] 表示任一码即视为健康——受保护端点返回 401 仍可能是「服务在线且鉴权生效」,而非故障。
TCP¶
对 tcp.targets[] 中的 { name, host, port } 做连接探测,默认连接超时 8000 ms(HTTP)/ 5000 ms(TCP),可在对应节调整 timeoutMs。
SSL¶
对 ssl.targets[] 检查证书过期时间、剩余天数、签发者与链信任;全局 ssl.warnDays 默认 21 天。单目标可设 warnDays、servername、allowSelfSigned 等。
Docker¶
默认 关闭(docker.enabled: false 时工具返回 status: "unavailable")。开启后通过 docker.socket(默认 /var/run/docker.sock)做 engine ping,并按 docker.expectRunning[] 校验容器是否处于 running。挂载 Docker 套接字等于高权限,需显式 opt-in。
调用约定¶
targets[].name 即工具参数 { "target": "name" };省略 target 则检查该协议下的全部目标。批量结果统一为 JSON:ok、checked、failed(失败名称列表)、results[](含 name、ok、ms 及协议细节);未知 target 返回 ok: false 与 known 列表。失败以字段表达,不抛异常。
安装与启用¶
以下步骤假设容器内源码路径为 /workspace/home-monitor(宿主机常见为挂载的 ./workspace)。官方 README 亦提供 git clone 获取源码;若你已有目录,可用 docker cp 拷入容器。
1. 安装 MCP 子包依赖¶
在 DSH 容器内执行:
docker exec dsh sh -c 'cd /workspace/home-monitor/server && npm i'
容器内 npm i 需能访问 registry;镜像默认常用 npmmirror,可用 npm config get registry 确认。
2. 解析 @deepseek-ai/dsh-tools¶
lib/index.js 通过 bare name 引用 @deepseek-ai/dsh-tools,peer 为 optional,npm i 不会自动安装。在 stock 镜像中需手动链到 DSH 自带副本:
docker exec dsh sh -c 'mkdir -p /workspace/home-monitor/node_modules/@deepseek-ai && ln -sfn /usr/local/lib/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/dsh-tools /workspace/home-monitor/node_modules/@deepseek-ai/dsh-tools'
@deepseek-ai/dsh-mcp-client 由 dsh 包自带,patch 行加载时从 DSH 的 node_modules 解析,一般无需额外链接。
3. 接入 profile(任选一种)¶
方式 A:安装到 profile 并在 patch 中引用包名:
docker exec dsh sh -c 'cd /data/profiles/web && corepack enable pnpm && pnpm add /workspace/home-monitor'
在 /data/profiles/web/cordis.patch.yml 增加:
- insert:
- id: home-monitor
name: home-monitor
方式 C:不装 pnpm,直接指向插件入口:
- insert:
- id: home-monitor
name: '/workspace/home-monitor/lib/index.js'
编辑 cordis.patch.yml 前建议备份;无效 patch 可能导致容器重启循环。改完后可用 overlay 先验证再重启生产:
docker exec dsh sh -c 'cd /workspace && dsh --profile headless --patch /tmp/ol.yml --dump-config' | grep -n home-monitor
其中 /tmp/ol.yml 内容与方式 C 的 insert 相同。
4. 确认并重载¶
docker exec dsh dsh --profile web --dump-config | grep -n 'home-monitor\|mcp-client'
docker restart dsh && docker logs --tail 40 dsh
stock 配置下 HMR root 为空,改 patch 后需重启容器。合并配置末尾会列出已应用的 patch 层;成功后 harness 可出现 MCP 侧工具(如文档中的 mcp__home_monitor__check_http)。
插件还通过 package.json 的 dsh.bundle.patch 指向 cordis.patch.yml,用于把 MCP 服务行写入 bundle patch;与 profile 行的叠加顺序见 README「Patch layering」。
配置 server/config.json¶
整份监控清单放在 server/config.json(纯 JSON,JSON.parse 解析;以下划线 _ 开头的键仅作文档,代码忽略)。
| 键 | 含义 |
|---|---|
http.timeoutMs |
单次请求超时,默认 8000 |
http.targets[] |
{ name, url, expect?, headers? } |
tcp.timeoutMs |
连接超时,默认 5000 |
tcp.targets[] |
{ name, host, port } |
ssl.timeoutMs |
握手超时,默认 10000 |
ssl.warnDays |
过期预警天数,默认 21 |
ssl.targets[] |
{ name, host, port?, warnDays?, servername?, allowSelfSigned? } |
docker.enabled |
默认 false |
docker.socket |
默认 /var/run/docker.sock |
docker.expectRunning[] |
必须为 running 的容器名 |
修改 config.json 后需重启相关进程;工具发现列表在启动时快照。
典型用法¶
在 DSH 对话中¶
配置好 target 名称后,让智能体调用 monitor_http 等工具,传入 { "target": "dsh" } 或省略以扫描整组。README 截图说明:对需鉴权的 / 返回 401 可判定为探测成功(鉴权门仍在响应)。
独立 MCP 服务¶
cd server && npm i
node index.js
在 MCP 客户端中注册(路径按实际安装调整):
{
"mcpServers": {
"home_monitor": {
"command": "node",
"args": ["/workspace/home-monitor/server/index.js"],
"env": { "PATH": "/usr/local/bin:/usr/bin:/bin" }
}
}
}
经 @deepseek-ai/dsh-mcp-client 接入时,未显式传入的 env 会被清理,需保留 PATH 以便找到 node。serverName 须匹配 [A-Za-z0-9_-]{1,32}。
无客户端时可管道 smoke test:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| node index.js
适用场景与注意¶
适合:家庭实验室、少量自托管服务(Web、端口、证书、可选 Docker)需要统一清单、只读探测,并希望在 DSH 对话或 MCP 客户端里复用同一配置。
不适合:需要自动修复、告警推送、历史存储或出站地址白名单的场景——本插件故意不做写入与过滤,且将 config.json 视为受信输入;勿把 MCP 服务或 Docker 套接字暴露给不可信网络。
权限与安全:插件与 MCP 进程以当前 DSH 容器权限运行;安装前请阅读 GitHub 源码 与 MIT 许可证。SSL 检查使用 rejectUnauthorized: false 以便报告链信任结果,是否算失败由 authorized 与 allowSelfSigned 决定。无出站地址过滤,可探测内网私有地址。
其他限制:MCP 子进程异常退出需手动重启;DSH 内工具调用另有约 20 秒硬超时;容器内无 ps,排查 MCP 子进程可参考 README 中的 /proc 与 docker top 说明。
结尾¶
dsh-home-monitor 把自托管监控清单收敛到单一 server/config.json,以只读探测方式接入 DSH 五个工具或独立 MCP,适合「先列清单、再让智能体查状态」的工作流。目录页:https://www.skillhub.cn/plugins/lowspecai/dsh-home-monitor;源码与完整接线说明:https://github.com/lowspecai/dsh-home-monitor。DSH 社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系;生态上 DSH 仍遵循「一切皆插件」的扩展方式。