dsh-chatops-mcp
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
dsh-chatops-mcp
把钉钉、飞书、**飞书项目(Meego)**接成三个 MCP 工具服务器,挂进 DeepSeek Harness。
npm:
dsh-chatops-mcp
MCP serverName | 工具前缀 | 实现方式 | 凭据来源 |
|
| 本包 |
|
|
| 本包 |
|
|
| 官方 |
|
钉钉和飞书复用本机已有 CLI 登录态,零新增应用密钥;飞书项目直接用官方服务器,不自己实现 Open API。
装完左侧栏会多一个「钉钉/飞书连接器」(order 3),点开就是连接器卡片墙 —— 点 + 就写 MCP 配置、缺 CLI 就地装、缺登录走设备码授权。见 安装 与 连接器。
工具面跟着 CLI 升级走
钉钉 / 飞书两条 surface 的工具清单不写死在代码里,而是读 CLI 自己的 schema生成:
CLI | 自描述命令 | 规模 | 冷启动耗时 |
|
| 27 个产品 / 1098 个命令 | ~4.4 s |
|
| 15 个 service / 246 个命令 | ~1.7 s |
1300+ 个工具全量展开约需 40 万 token 的工具定义,不现实。所以每条 surface 恒定暴露三个元工具,其余按需 materialise:
元工具 | 作用 |
| 一次调用列出 CLI 当前支持的所有命令(可按 product / query / effect 过滤)。CLI 升级后新命令立刻出现在这里。 |
| 查单个命令的完整 flag 列表、类型、是否必填 |
| 逃生舱: |
在此之上,符合「产品白名单 × 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 里标注。
Related MCP server: Lark MCP Custom
为什么这样包
飞书项目用官方服务器:@lark-project/mcp(meego-mcp-cli)是本地 stdio ↔ 远端的纯代理 —— 连 https://project.feishu.cn/mcp_server/v1,header 带 X-Mcp-Token: <user_token> 与 X-Meego-MCP-Connection-Type: stdio,只代理 tools/list 与 tools/call。48 个工具覆盖工作项增删改查、字段/视图/模板/角色配置、WBS 草稿、节点流转、MQL 搜索、评论、工时、附件上传,不需要 plugin_id / plugin_secret。
钉钉 / 飞书自己包一层:npm 上的现成包要么只覆盖其中一家且要另配 appId/appSecret(@larksuiteoapi/lark-mcp、dsh-feishu-mcp),要么是 IM 频道/bot 桥而不是工具面(@dingtalk-real-ai/dsh-dingtalk、dsh-connect-dingtalk、@xmanrui/dsh-im),要么只推群机器人 webhook(dsh-dingtalk)。而 dws 与 lark-cli 已登录且能自动续期,包一层 CLI 反而零凭据、随 CLI 升级自动获得新能力。
手写工具(恒在,不依赖 catalog)
功能固定的高频操作保留手写封装,参数名更友好、少一层 schema 查询。
dingtalk(15 个)
工具 | 作用 |
| 当前登录身份(企业、部门、邮箱) |
| 按关键词搜通讯录用户 |
| 按 userId 批量取用户详情 |
| 列部门成员 |
| 发消息到群 / 个人 / openDingtalkId |
| 拉会话消息(需 |
| 列我所在的群 |
| 查日历事件 |
| 建日程(可带参会人) |
| 列待办 |
| 建待办并指派 |
| 我的待审批 |
| 审批实例详情 |
| 列钉盘目录 |
| 逃生舱:任意 dws 子命令 |
feishu(13 个)
工具 | 作用 |
| 当前身份与 token 状态 |
| 搜人 / 按 open_id 解析 |
| 单人详情(省略 id = 自己) |
| 列会话(group / p2p) |
| 拉某个会话的消息 |
| 按关键词搜消息 |
| 发文本 / markdown |
| 日程 agenda |
| 建任务 |
| 我的任务 |
| 读文档内容(支持 wiki URL) |
| 搜云空间文档 |
| 逃生舱:任意 lark-cli 命令 |
meego(48 个,官方实现)
工作项:create_workitem update_field get_workitem_brief search_by_mql search_project_info search_user_info list_workitem_types list_workitem_field_config list_workitem_role_config get_workitem_field_meta get_workitem_op_record get_workitem_man_hour_records list_related_workitem list_workitem_relations list_workitem_comments add_comment list_todo list_project_team list_team_members
流转与节点:transition_state transition_node get_transitable_states get_transition_required get_node_detail update_node update_node_subtask list_node_field_config
视图与图表:create_fixed_view update_fixed_view get_view_detail search_view_by_title list_multi_project_view_workitems create_resource_work_item get_resource_work_item_type_conf list_charts get_chart_detail list_schedule list_deliverables
WBS 与模板:create_wbs_draft edit_wbs_draft publish_wbs_draft reset_wbs_draft list_wbs_draft_rows list_wbs_instance_rows get_wbs_draft_operation_progress list_element_template
文件:upload_file get_download_url
连接器
面板第一个页签是「连接器」—— 卡片墙 + 一键连接,不需要手改 cordis.patch.yml。
一键连接做了什么
点卡片上的 + → 按状态提示走完三步,最后写一行 MCP 配置:
连接器 | 缺 CLI 时 | 缺登录时 | 写入的条目 |
钉钉 |
|
|
|
飞书 |
|
|
|
飞书项目 | —(官方服务器已在全局前缀下) | 填 MCP 用户令牌,写进 |
|
写入走宿主 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) // 断开连接持久化:Loader 只管内存,本包自己记一张表
ctx.loader.create/remove 只改 Loader 自己的根树,而 Loader.write() 是空实现 —— 写完 profile 的 cordis.yml 仍是 []。光靠 ctx.loader,连接一重启就没了。
所以本包自己落一份 JSON:
%USERPROFILE%\.dsh\chatops\connections.json # 可用 CHATOPS_CONNECTION_STORE 覆盖
{
"version": 1,
"entries": {
"chatops-conn-dingtalk": { "name": "@deepseek-ai/dsh-mcp-client", "config": { … }, "disabled": false },
"chatops-custom-foo": { "name": "@deepseek-ai/dsh-mcp-client", "config": { … }, "disabled": true }
}
}写入时机:连接 / 断开 / 启停 / 保存令牌(令牌类会重推 config)。
恢复时机:插件
apply(ctx)里第一件事是rehydrate(loader)—— 行还在就只恢复disabled位,行没了就用存下的 config 重新create。启停位要再压一遍:dsh 在
app-boot/config-reload时会把 patch 重新应用到 include 上,那一轮会用 patch 里的 options 覆盖整份 config,disabled回到默认值。所以插件还挂了ctx.on('app-boot/config-reload', …)→applyStoredFlags(loader):只对已存在的行按 store 压disabled,绝不 create,单行失败吞掉等下次 reload 重试。只管自己的行:内置三条 +
chatops-custom-*,别人插的 mcp-client 行一律不碰。恢复结果在
GET /chatops-mcp/connectors的rehydrate字段里可见(restored/resumed/failed/repaired)。
卡片上能看到什么
徽标(钉 / 飞 / 项)、名称、两行摘要。
右上角
+(未连接)或绿色·(已连接)。底部 chip:
CLI 已装/需装 CLI/需令牌、N 个工具(来自tools.schemas()里mcp__<server>__*的实际注册数)、已停用。顶部汇总:
已连接 N/注册工具 N/MCP 行 N;超过 80 个工具时出现黄色告警条(工具过多会拉低回复质量)。
自定义连接
右上「+ 添加 MCP」默认是整段贴 JSON,直接粘 mcpServers 壳就能一次建多条,和 workbuddy / claude 的 mcp.json 同形:
{
"mcpServers": {
"FeishuProjectMcp": {
"command": "npx",
"args": ["-y", "@lark-project/mcp", "--domain", "https://project.feishu.cn"],
"env": { "MCP_USER_TOKEN": "m-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
},
"lighthouse-ops": {
"type": "streamableHttp",
"url": "https://lightai.cloud.tencent.com/workbuddy/mcp",
"timeout": 30000
}
}
}parseMcpJson 接受四种形状混贴:带 mcpServers 壳的、省略壳的 {"a":{...}}、单条 {"serverName":"a","command":"npx"}、数组 [{...}]。字段映射 type → transport(streamableHttp / http / sse 都归一为 streamable-http,没写就看有没有 url)、timeout → toolCallTimeoutMs、disabled 忽略(新连的一律启用)。一条失败不影响其他条,返回 {ok, total, succeeded, results[]}。
语法校验通过就建连,实际起不起得来由 mcp-client 自己的重连机制兜 —— 假 URL / 假包不会让整批失败,只是那一行的 toolCount 一直是 0。
也可以切到「手动填写」,走两种传输的逐字段表单:
传输 | 必填 | 其余 |
|
|
|
|
|
|
serverName 必须是 [A-Za-z0-9_-]{1,32},且不能与其他 MCP 行重名(重名会在写入前报「serverName「X」已被 Y 占用」)。自定义条目的 entryId 前缀是 chatops-custom-,面板底部表格可启停 / 删除。
serverName 冲突与写工具
内置三条固定用
dingtalk/feishu/meego。若 profile 里已有别的行占了这些名字,连接会在写入前报错,不会把 dsh 搞成启动失败。内置连接器生成的 config 显式写
CHATOPS_TOOL_EFFECT=all,写工具默认可用。只想暴露只读工具时,把那一行的 env 改成read再重连。
面板
除了当 MCP 连接器,本包还带一个面板,三个入口共用同一份组件:
入口 | 座位 | 说明 |
左侧栏图标 |
| 排在「插件」「插件市场」「记忆与人设」之后,标签 |
主区域页面 |
| 点图标切过来 |
设置页 |
| 不占侧栏座位也能进 |
四个页签:
页签 | 内容 |
连接器 | 卡片墙 + 一键连接 + 贴 JSON 添加 MCP |
概览 | 三条连接各一张卡:CLI 路径与版本、登录身份、组织/部门/邮箱、catalog 条数、已 materialise 数量与产品配比;飞书项目额外显示 server 入口、token 来源文件、脱敏 token 提示 |
CLI 目录 | 直接浏览 |
工具预览 | 输入 products / effect / max,预览「按当前配置会 materialise 出哪些工具」,改参数不用重装就能看效果 |
视觉与交互对齐宿主自带面板:
hero 头、分段页签、双栏卡片;左栏宽度
clamp(240px, 32%, 380px),目录行选中时左侧 2.5px 品牌色竖条。搜索输入 180ms 防抖;目录行可键盘聚焦(
role=button+Enter/Space)。静态样式(hover / transition / focus)走
ctx.effect注入一张<style>(data-plugin-css='dsh-chatops-mcp/panel.css'),动态值仍内联;主题 token 全部取@deepseek-ai/dsh-client-ui-theme实际定义的那套,不自造色值。
概览 / CLI 目录 / 工具预览三个页签只读:不发消息、不改日程、不写任何远程状态。连接器页签会写本机 MCP 配置与 CLI 登录态,但不调用任何业务写接口。数据来自同进程内的 Host 路由:
路由 | 说明 |
| 内置连接器目录 + 本机状态 + 自定义连接 + 工具计数 |
| 写一行 mcp-client(body |
| 删掉那一行 |
| 启用 / 停用(body |
| 全局 npm 安装 CLI |
| 开始设备码登录,返回验证链接与授权码 |
| 复查 / 用 |
| 退出 CLI 登录 |
| 写入飞书项目 MCP 用户令牌(已连接时会重推 config) |
| 建自定义连接(逐字段表单) |
| 贴 |
| 删除 / 启停自定义连接 |
| 三条 surface 的完整状态(含 health、catalog 大小、materialised 配比) |
| 强制重探登录态(默认缓存 2 分钟) |
| 查 catalog |
| 单命令的参数详情 |
| 预览动态工具名单 |
| 忽略缓存重读 CLI schema(body |
面板作为 Host 插件 inject 了 webServer / loader / tools 三个服务;loader 拿不到时连接器会明确报「宿主没有提供 loader 服务」,不会静默失败。
安装
包内没有任何本机绝对路径,也没有预置的 mcp-client 行,换机器、换用户名、换 Node 安装位置都能直接用。三条连接由插件自己在上电时 provision(connectors.js 的 seedBuiltins):CLI 已装且已登录才自动建行,否则跳过、等用户在面板点 +。
从 npm 装(推荐)
plugin_manager action=install_bundle target=dsh-chatops-mcp
# 然后重启 DeepSeek Harness从源码装
git clone https://github.com/li-shaozhe/dsh-chatops-mcp.git
plugin_manager action=install_bundle target=/path/to/dsh-chatops-mcp
# 然后重启 DeepSeek Harness(client.js 是浏览器模块代,必须重启才出现左侧栏图标)改源码时用 link 安装,改 js 重装即生效:
plugin_manager action=remove_bundle target=dsh-chatops-mcp
plugin_manager action=install_bundle target=/path/to/dsh-chatops-mcp装完 node_modules/dsh-chatops-mcp 会变成指向源码目录的 junction。
只改 server.js / discovery.js / cli.js / connectors.js / index.js(Host 侧)时,重装后新会话即生效。改 client.js(浏览器侧)必须重启软件。
若 remove_bundle 意外失败(pnpm 解析策略拦截时会留下半拆状态:dsh.profile.bundles 已删但 dependencies 与 junction 还在,install_bundle 会报 already-installed),用下面这条恢复:
plugin_manager action=set_bundle target=dsh-chatops-mcp enabled=true对方的机器上需要什么
依赖 | 必需性 | 装法 | 说明 |
Node.js ≥ 18 | 必需 | 系统安装 | 插件用 |
| 用钉钉才需要 | 面板点「安装 CLI」→ 跑 | 也可手工装 |
| 用飞书才需要 | 面板点「安装 CLI」→ 跑 | 也可手工装 |
| 用飞书项目才需要 | 面板填 token 后点连接,或手工 | 官方服务器;本包通过 |
飞书项目 user token | 用飞书项目才需要 | 面板「飞书项目」卡片里粘贴 | 只写对方自己的 |
钉钉与飞书的登录态各自留在 %USERPROFILE%\.dws / %USERPROFILE%\.lark-cli,不随包分发,也不进 profile 配置 —— 面板的「连接」会走设备码授权让对方自己登。
凭据
serverName | 变量 | 来源 |
| 无 |
|
| 无 |
|
|
| 飞书项目签发的 MCP user token |
飞书项目 token 不进 patch。meego-launch.js 按下面顺序解析,找到后写进 process.env 再 import 官方服务器(它在模块加载期读 token):
环境变量
MCP_USER_TOKEN(或MEEGO_MCP_USER_TOKEN/MCP_TOKEN)%USERPROFILE%\.dsh\chatops\meego\.env(或CHATOPS_MEEGO_ENV_FILE指定的路径)当前工作目录下的
.env
凭据文件格式就是一行:
MCP_USER_TOKEN=m-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx换 token 只改这个文件,重开 dsh 即可,不碰 cordis.patch.yml,也不需要重新安装 bundle。
发版(维护者)
npm publish --registry=https://registry.npmjs.org/ --access public三处硬要求,别踩:
要求 | 说明 |
用手工生成的 Granular Access Token | web-login 自动写进 |
token 四项必须同时对 | 勾 |
首次发布可能只落占位版本 | 第一轮 stdout 形如 |
private 已删,license: MIT、repository / homepage / bugs / engines: node>=18 / keywords 都在 package.json 里;publishConfig 已设 access: public + registry: https://registry.npmjs.org/。
npm view 有缓存延迟,核版本直接取 packument:
node -e "fetch('https://registry.npmjs.org/dsh-chatops-mcp').then(r=>r.json()).then(j=>console.log(j['dist-tags']))"验证包是否真能装(别用命令内 cd,pwsh 里 Set-Location 常不生效,会在当前目录凭空生成 package.json):
npm --prefix /tmp/probe install dsh-chatops-mcp --no-fund --no-audit依赖与运行约束
server.js/discovery.js/cli.js/connectors.js/index.js/meego-launch.js只用 Node 内置模块,无 npm 依赖,Node 18+ 可跑;client.js在浏览器里跑,React 从宿主require('react')取,不另装。手写 JSON-RPC 2.0 over stdio,协议版本协商支持
2025-11-25/2025-06-18/2025-03-26/2024-11-05/2024-10-07。stdout 只输出 JSON-RPC 帧;诊断信息走 stderr,
CHATOPS_DEBUG=1打开。stdin 关闭不会被立即 exit,会等在途 CLI 请求跑完。
MCP 客户端会清洗子进程环境(匹配
KEY|PASSWORD|SECRET|TOKEN与DSH_*),所以两个 CLI 靠用户目录里的登录态鉴权,不靠环境变量。两个 CLI 直接 spawn 原生 exe(
vendor\dws.exe/bin\lark-cli.exe),不走bin\dws.js/scripts\run.js这两个 JS shim。原因是 shim 内部只是spawnSync/execFileSync包一层,不带windowsHide,在无控制台的宿主里会弹黑窗口;而CREATE_NO_WINDOW无法沿进程树继承。顺带更快。catalog 在后台预热;若预热晚于第一次
tools/list,服务端会发notifications/tools/list_changed让客户端重新同步。
可调环境变量
变量 | 默认 | 说明 |
|
| 要 materialise 的产品白名单: |
|
|
|
|
| 每条 surface 动态工具数量上限 |
| 内置高频名词表 | 同一产品内的排序关键词(逗号分隔),越靠前越优先占名额 |
|
| schema 缓存目录 |
|
| 缓存有效期 |
|
|
|
| 自动在全局前缀找 | 覆盖 dws 路径(找不到时回退 |
| 自动在全局前缀找 | 覆盖 lark-cli 路径(找不到时回退 |
|
| 单次 CLI 超时 |
| 全局 | 官方服务器入口 |
|
| 凭据文件路径 |
| 官方默认 | 覆盖 |
|
| 连接表(跨重启恢复用) |
| PATH 里的 | 写进 mcp-client 行 |
| 未设 |
|
内置默认产品集:钉钉 contact calendar chat todo oa drive aisearch doc,飞书 im calendar task contact drive approval wiki docs。
已知边界
1098 / 246 个命令不能全量展开成工具(约 40 万 token),所以未 materialise 的命令必须经
*_catalog发现 +*_schema查参 +*_cli执行。dws api(raw OpenAPI)在 MCP 默认凭证下不可用,需自有 app 凭证;本包不包装它。lark-cli schema的 246 条是 raw API 面,不含+快捷命令;+命令(如im +messages-send)只能经feishu_cli调用。部分 raw API 还需要额外 scope,会返回unauthorized: ... missing_scopes。feishu_drive_search的query上限 30 个字符,超出服务端报99992402。dingtalk_list_messages必带--time(dws 的硬要求),不能只给时间区间。lark-cli whoami不接受--format json,本包只给 dws 追加该 flag。search_by_mql的FROM必须用 project_key 或 simple_name,用显示名报project not found (Code: 3004)。官方
@lark-project/mcp启动时会把 dotenv 的一行提示打到 stdout,MCP 客户端按行解析时会跳过非 JSON 行,不影响工具调用。面板生成的 config 里显式写死
CHATOPS_TOOL_PRODUCTS/CHATOPS_TOOL_EFFECT/CHATOPS_MAX_TOOLS三项,不受宿主进程环境变量影响。要收紧成只读,改那一行 config 的env.CHATOPS_TOOL_EFFECT为read再重连。installCli调的是npm install -g <pkg>,会改本机全局 npm 前缀;不需要时用npm uninstall -g自行回退。装 CLI 有网络与磁盘副作用,面板会在按钮文案里写明包名。连接表里
chatops-conn-meego的 config 不含令牌(令牌只存%USERPROFILE%\.dsh\chatops\meego\.env)。自定义连接如果自己在env里填了密钥,那串值会明文写进connections.json—— 这个文件在用户目录下、权限继承用户,别提交进 git。贴 JSON 建连只做语法校验,不验证连通性:URL 打不通、包名不存在也会建行成功,表现为该行
toolCount恒为 0。要判断是否真连上,看面板卡片上的工具数。
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
One MCP server for all your work accounts: Slack, Teams, Google Chat, Jira, ClickUp, digest, tasks.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceA tool designed to help users connect AI Agents with the Feishu/Lark platform, encapsulating Feishu/Lark Open Platform API interfaces as MCP tools for document processing, conversation management, calendar scheduling and more.26,757 npm-
- AlicenseBqualityDmaintenanceEnables interaction with Feishu (Lark) via MCP for sending messages, managing calendar events, searching documents, and reading/writing bitable records.8Apache 2.0
- AlicenseCqualityDmaintenanceMCP server that enables AI agents to control all DingTalk features (messaging, calendar, tasks, approvals, etc.) via natural language using the DingTalk Workspace CLI.831Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables DeepSeek Harness agents to operate Feishu/Lark through the official OpenAPI MCP subprocess using app credentials, exposing tools for sending IM messages, reading and writing Bitable tables, and managing docs, calendar, and drive files. A web settings panel configures credentials, tests connectivity, and lists discovered tools.93 npmMIT