Introduction¶
When developing agents for DSH (DeepSeek Harness), integrating office collaboration platforms is a common pain point: DingTalk and Feishu each have their own CLIs (dws, lark-cli), and ready-made MCP packages can be found on npm, but integrating them into DSH often requires configuring appId/appSecret separately, or one might get an IM bridge rather than a tool interface. The dsh-chatops-mcp introduced below takes a more cost-effective route: it connects DingTalk, Feishu, and Feishu Project (Meego) as three MCP tool servers into DeepSeek Harness. It reuses the local CLI login state for DingTalk and Feishu, and uses the official server for Feishu Project without needing application secrets. The maintainer is li-shaozhe; the source code is on GitHub, the package is on npm, and the community directory page is SkillHub.
One-Sentence Positioning & Maintainer¶
Plugin Name: li-shaozhe/dsh-chatops-mcp (npm package name dsh-chatops-mcp, current version 1.7.1, license MIT). It solves the problem of “turning the capabilities of internal enterprise IM/R&D platforms into callable tools in DSH without maintaining a set of credentials.”
Three MCP Servers¶
The README starts by giving the correspondence of the three servers:
| MCP serverName | Tool Prefix | Implementation Method | Credential Source |
|---|---|---|---|
dingtalk |
mcp__dingtalk__* |
This package’s server.js dingtalk, wrapping dws CLI |
%USERPROFILE%\.dws already logged in |
feishu |
mcp__feishu__* |
This package’s server.js feishu, wrapping lark-cli |
%USERPROFILE%\.lark-cli already logged in |
meego |
mcp__meego__* |
Official @lark-project/mcp (48 tools), token injected via meego-launch.js |
%USERPROFILE%\.dsh\chatops\meego\.env |
DingTalk and Feishu reuse the local CLI login state, adding zero new application secrets; Feishu Project (Meego) uses the official server directly without implementing the Open API yourself. The reason is straightforward: dws and lark-cli are logged in and auto-renewable; wrapping them adds zero credentials and automatically gains new capabilities when the CLI upgrades.
Tool List Evolves with CLI Upgrades¶
The tool lists for the DingTalk and Feishu surfaces are not hardcoded in the code but are generated by reading the CLI’s own schema:
| CLI | Self-describing command | Scale | Cold start time |
|---|---|---|---|
dws |
dws schema --all --compact --format json |
27 products / 1098 commands | ~4.4 s |
lark-cli |
lark-cli schema |
15 services / 246 commands | ~1.7 s |
Expanding 1300+ tools fully requires approximately 400k tokens of tool definitions, which is unrealistic. Therefore, each surface constantly exposes three meta-tools, and the rest are generated on demand:
dingtalk_catalog/feishu_catalog: A single call lists all commands currently supported by the CLI. It can filter by product/query/effect. New commands appear immediately after a CLI upgrade.dingtalk_schema/feishu_schema: Query the complete flag list, types, and whether required for a single command.dingtalk_cli/feishu_cli: Escape hatch, runs any subcommand with{"argv": ["..."]}as-is.
On top of this, commands matching “product whitelist × effect filter × quantity limit” become independent tools. Tool names are derived from normalized CLI paths (e.g., contact user get-self → contact_user_get-self). The built-in connector defaults to CHATOPS_TOOL_EFFECT=all, showing both read and write tools; to tighten it to read-only, change this item to read. Slots are rotated by product first, then by semantic priority (CHATOPS_TOOL_PRIORITY, default: high-frequency nouns like message/event/todo/task/approval/document/file/node/workspace/item/calendar/user/group/search) and command path length; duplicates between +shortcut command and the corresponding raw API (differing only by -/_) are deduplicated to avoid occupying two slots.
The effect determination rules are: only commands explicitly marked read by the CLI are considered read-only; the rest (including destructive from dws and high-risk-write from Feishu) are all classified as write. destructive high-risk commands will have "destructive": true in the catalog and schema results. Schema results are cached in %USERPROFILE%\.dsh\chatops\cache\<surface>.json (default 8 hours); only the first startup is slow. After the cache expires, it rescans; on failure, it falls back to the old cache and marks it in the catalog.
Connector Panel¶
After installation, a “DingTalk/Feishu Connector” appears in the left sidebar (order 3). Opening it reveals a card wall of connectors; no need to manually edit cordis.patch.yml. Clicking + on the card and following the status prompts completes three steps, finally writing one line of MCP configuration:
| Connector | Missing CLI | Missing Login | Entries Written |
|---|---|---|---|
| DingTalk | npm i -g dingtalk-workspace-cli |
dws auth login --device --no-browser --recommend, parse captcha and link in banner, background process polls until authorization complete |
chatops-conn-dingtalk, serverName dingtalk |
| Feishu | npm i -g @larksuite/cli |
lark-cli auth login --no-wait --json --recommend get device_code + verification_url, click “I have authorized” then --device-code to swap token |
chatops-conn-feishu, serverName feishu |
| Feishu Project | Official server already under global prefix | Fill in MCP user token, write to %USERPROFILE%\.dsh\chatops\meego\.env |
chatops-conn-meego, serverName meego |
Writes go through the host ctx.loader, not file editing:
await loader.create({ id: 'chatops-conn-dingtalk', name: '@deepseek-ai/dsh-mcp-client', config, disabled: false })
await loader.update(entryId, { config, disabled: false }) // if exists
loader.remove(entryId) // disconnect
Regarding persistence, ctx.loader.create/remove only changes Loader’s memory root tree, and Loader.write() is an empty implementation, so the plugin saves its own %USERPROFILE%\.dsh\chatops\connections.json (can be overridden by CHATOPS_CONNECTION_STORE). The first thing in the plugin apply(ctx) is rehydrate(loader), restoring previous connections; it also hooks the app-boot/config-reload hook applyStoredFlags(loader) to prevent the disabled bit from being overwritten by default values in the patch during refresh. The restoration result can be seen via the rehydrate field of GET /chatops-mcp/connectors (restored / resumed / failed / repaired).
Status can be seen directly on the card: badge and name, top-right + (not connected) or green · (connected), bottom CLI Installed / Need CLI / Need Token, N Tools (actual registered count from tools.schemas() mcp__<server>__*), Disabled, and top summary Connected N / Tools N / MCP Rows N. A yellow warning bar appears when exceeding 80 tools because too many tools degrade response quality.
Installation & Enablement¶
The README only specifies that the package on npm is named dsh-chatops-mcp. The plugin takes over the host loading process via a bundle patch (cordis.patch.yml); the left sidebar connector entry appears immediately after installation. The README excerpt provided does not give an independent shell installation command, so I will not add one for the author here. Post-start behavior is traceable: CLI probing is done first (via PATH, npm prefix, and environment variables like CHATOPS_DWS_BIN / CHATOPS_LARK_BIN / CHATOPS_NODE_BIN to find executables), followed by on-demand login and installation, and finally writing configuration and saving to disk.
Typical Usage¶
The reproducible path given in the README is: first click + on the panel to complete one-click connection; after connection, use *_catalog to confirm which commands are currently in the CLI, then use *_schema to get the needed flag list, and finally call the corresponding independent tool or the escape hatch *_cli. On the Feishu Project side, the official server’s native 48 tools are used directly, covering item CRUD, field/view/template/role configuration, WBS drafts, node flow, MQL search, comments, work hours, and attachment uploads, without needing plugin_id / plugin_secret. To run a command not selected by the surface temporarily, use the escape hatch:
{"argv": ["message", "send", "--group", "xxx", "--text", "hi"]}
Applicable Scenarios & Notes¶
Suitable for developers who have already logged into dws or lark-cli locally and want to integrate enterprise collaboration platforms into DSH with minimal credential cost; also suitable for those who want to use the official Feishu Project MCP server directly. Before installation, you should read server.js, connectors.js, index.js, meego-launch.js, and LICENSE (MIT), because the plugin executes the CLI with the current DSH process permissions, including running npm i -g when CLI is missing and initiating device code authorization when login is missing. These actions affect the local global environment and account. If you only want a read-only view for the model, set CHATOPS_TOOL_EFFECT to read. This plugin is displayed on the community directory site SkillHub. That site is an independent site and has no official affiliation with DeepSeek / Hypersphere.
Conclusion¶
The value of dsh-chatops-mcp lies in: three platforms, one plugin; DingTalk and Feishu consume local CLI login state, Feishu Project consumes the official MCP server; the tool surface is not hardcoded, following CLI upgrades. For developers looking to save on app secrets and duplicate implementations, this is a very low-cost integration path.
- Community Directory Page: 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)
Note: All facts in this article are verified against the plugin README, package.json, and npm registry; star counts and other fields on the community directory site were not individually verified due to scraping restrictions and are not listed in the body.