前言¶
给 DSH(DeepSeek Harness)做智能体开发时,接办公协作平台是个常见痛点:钉钉、飞书各自都有 CLI(dws、lark-cli),npm 上也能找到现成 MCP 包,但要挂进 DSH 往往还得另配 appId/appSecret,或者拿到的是 IM 桥而不是工具面。下面介绍的 dsh-chatops-mcp 就走了一个更省的路线:把钉钉、飞书、飞书项目(Meego)接成三个 MCP 工具服务器,挂进 DeepSeek Harness,钉钉和飞书直接复用本机已有 CLI 登录态,飞书项目直接用官方服务器,不需要应用密钥。维护者是 li-shaozhe,源码在 GitHub,包在 npm,社区目录页是 SkillHub。
一句话定位与维护者¶
插件名:li-shaozhe/dsh-chatops-mcp(npm 包名 dsh-chatops-mcp,当前版本 1.7.1,许可证 MIT)。它解决的是「把企业内部 IM / 研发平台的能力变成 DSH 里可调用的工具,且不用维护一套凭据」。
三个 MCP 服务器¶
README 开头就给出三个 server 的对应关系:
| MCP serverName | 工具前缀 | 实现方式 | 凭据来源 |
|---|---|---|---|
dingtalk |
mcp__dingtalk__* |
本包 server.js dingtalk,包装 dws CLI |
%USERPROFILE%\.dws 已有登录 |
feishu |
mcp__feishu__* |
本包 server.js feishu,包装 lark-cli |
%USERPROFILE%\.lark-cli 已有登录 |
meego |
mcp__meego__* |
官方 @lark-project/mcp(48 工具),经 meego-launch.js 注入 token |
%USERPROFILE%\.dsh\chatops\meego\.env |
钉钉和飞书复用本机已有 CLI 登录态,零新增应用密钥;飞书项目(Meego)直接用官方服务器,不自己实现 Open API。理由也很直接:dws 与 lark-cli 已登录且能自动续期,包一层 CLI 反而零凭据、随 CLI 升级自动获得新能力。
工具清单跟着 CLI 升级走¶
钉钉、飞书两条 surface 的工具清单不写死在代码里,而是读 CLI 自己的 schema 生成:
| CLI | 自描述命令 | 规模 | 冷启动耗时 |
|---|---|---|---|
dws |
dws schema --all --compact --format json |
27 个产品 / 1098 个命令 | ~4.4 s |
lark-cli |
lark-cli schema |
15 个 service / 246 个命令 | ~1.7 s |
1300 多个工具全量展开约需 40 万 token 的工具定义,不现实。所以每条 surface 恒定暴露三个元工具,其余按需生成:
dingtalk_catalog/feishu_catalog:一次调用列出 CLI 当前支持的所有命令,可按 product / query / effect 过滤,CLI 升级后新命令立刻出现。dingtalk_schema/feishu_schema:查单个命令的完整 flag 列表、类型、是否必填。dingtalk_cli/feishu_cli:逃生舱,{"argv": ["..."]}原样跑任意子命令。
在此之上,符合「产品白名单 × effect 过滤 × 数量上限」的命令各自变成一个独立工具,工具名由 CLI 路径规范化而来(如 contact user get-self → contact_user_get-self)。内置连接器默认 CHATOPS_TOOL_EFFECT=all,读写工具都会出现;想收紧成只读就把该项改成 read。名额先按产品轮转、再按语义优先级(CHATOPS_TOOL_PRIORITY,默认消息 / 事件 / 待办 / 任务 / 审批 / 文档 / 文件 / 节点 / 空间 / 工作项 / 日历 / 用户 / 群 / 搜索 一类高频名词)与命令路径长短排序;+快捷命令 与对应 raw API 只差 -/_ 的会去重,避免一个能力占两份名额。
effect 的判定规则是:只有 CLI 明确标 read 的才算只读,其余(含 dws 的 destructive、飞书的 high-risk-write)一律归为写,destructive 的高危命令在 catalog 与 schema 结果里会带 "destructive": true。schema 结果缓存在 %USERPROFILE%\.dsh\chatops\cache\<surface>.json(默认 8 小时),只有首次启动慢;缓存过期后重新扫,失败时回退旧缓存并在 catalog 里标注。
连接器面板¶
装完之后,左侧栏会多一个「钉钉/飞书连接器」(order 3),点开就是连接器卡片墙,不需要手动改 cordis.patch.yml。点卡片上的 +,按状态提示走完三步,最后写一行 MCP 配置:
| 连接器 | 缺 CLI 时 | 缺登录时 | 写入的条目 |
|---|---|---|---|
| 钉钉 | npm i -g dingtalk-workspace-cli |
dws auth login --device --no-browser --recommend,横幅里解析验证码与链接,后台进程轮询到授权完成 |
chatops-conn-dingtalk,serverName dingtalk |
| 飞书 | npm i -g @larksuite/cli |
lark-cli auth login --no-wait --json --recommend 拿 device_code + verification_url,点「我已授权」再 --device-code 换 token |
chatops-conn-feishu,serverName feishu |
| 飞书项目 | 官方服务器已在全局前缀下 | 填 MCP 用户令牌,写进 %USERPROFILE%\.dsh\chatops\meego\.env |
chatops-conn-meego,serverName meego |
写入走宿主 ctx.loader,而不是改文件:
await loader.create({ id: 'chatops-conn-dingtalk', name: '@deepseek-ai/dsh-mcp-client', config, disabled: false })
await loader.update(entryId, { config, disabled: false }) // 已存在时
loader.remove(entryId) // 断开连接
持久化方面,ctx.loader.create/remove 只改 Loader 的内存根树,Loader.write() 是空实现,所以插件自己落一份 %USERPROFILE%\.dsh\chatops\connections.json(可用 CHATOPS_CONNECTION_STORE 覆盖)。插件 apply(ctx) 第一件事就是 rehydrate(loader),把上次的连接恢复回来;还挂了 app-boot/config-reload 钩子 applyStoredFlags(loader),防止刷新时被 patch 里的默认值把 disabled 位覆盖掉。恢复结果可以通过 GET /chatops-mcp/connectors 的 rehydrate 字段看到(restored / resumed / failed / repaired)。
卡片上能直接看到状态:徽标与名称、右上角 +(未连接)或绿色 ·(已连接)、底部的 CLI 已装 / 需装 CLI / 需令牌、N 个工具(来自 tools.schemas() 里 mcp__<server>__* 的实际注册数)、已停用,以及顶部汇总 已连接 N / 注册工具 N / MCP 行 N。超过 80 个工具时会出现黄色告警条,因为工具过多会拉低回复质量。
安装与启用¶
README 只指明包在 npm 上名为 dsh-chatops-mcp,插件通过 bundle patch(cordis.patch.yml)接管宿主加载流程,左栏连接器入口在装完即出现;已抓取的 README 片段中没有给出独立的 shell 安装命令,因此这里不替作者补一条 dsh plugin add ...。启动后的行为有据可依:先做 CLI 探测(server.js 通过 PATH、npm 前缀与 CHATOPS_DWS_BIN / CHATOPS_LARK_BIN / CHATOPS_NODE_BIN 等环境变量兜底找可执行文件),再按需触发登录与安装,最后写配置与落盘。
典型用法¶
README 给到的可复现路径是:先在面板点 + 完成一键连接;连接后先用 *_catalog 确认当前 CLI 里有哪些命令,再用 *_schema 取需要的 flag 列表,最后调对应独立工具或逃生舱 *_cli。飞书项目一侧直接用官方服务器原生的 48 个工具,覆盖工作项增删改查、字段 / 视图 / 模板 / 角色配置、WBS 草稿、节点流转、MQL 搜索、评论、工时、附件上传,不需要 plugin_id / plugin_secret。要临时跑一个没被 surface 选中的命令,用逃生舱:
{"argv": ["message", "send", "--group", "xxx", "--text", "hi"]}
适用场景与注意¶
适合已经在本机登录过 dws 或 lark-cli、想以最小凭据成本把企业协作平台接进 DSH 开发者;也适合想直接用飞书项目官方 MCP 服务器的人。安装前应当通读 server.js、connectors.js、index.js、meego-launch.js 与 LICENSE(MIT),因为插件以当前 DSH 进程权限执行 CLI,包括在缺 CLI 时执行 npm i -g、在缺登录时发起设备码授权,这些动作都作用于本机全局环境和账号。若只想给模型可读面,把 CHATOPS_TOOL_EFFECT 设为 read 即可。该插件在社区目录站 SkillHub 展示,该站是独立站点,与 DeepSeek / 幻方无官方从属关系。
结语¶
dsh-chatops-mcp 的价值在于:三套平台,一条插件搞定;钉钉、飞书吃本机 CLI 登录态,飞书项目吃官方 MCP 服务器;工具面不写死,跟着 CLI 升级。对想省掉应用密钥与重复实现的开发者,这是一条成本很低的接入路径。
- 社区目录页:https://www.skillhub.cn/plugins/li-shaozhe/dsh-chatops-mcp
- GitHub:https://github.com/li-shaozhe/dsh-chatops-mcp
- npm:
dsh-chatops-mcp(1.7.1,MIT)
说明:本文事实均核对自插件 README、package.json 与 npm registry;星标数与社区目录站上的其他字段因抓取受限未单独复核,未在正文中填写。