使用钉钉远程操作你的claude code

通过钉钉机器人与 Claude Code 对话。支持多轮会话,在钉钉里即可使用 Claude Code 的全部能力。

项目地址:
https://github.com/suyin58/claudetalk

实现的效果(支持多轮回话):

起因是: 今天看到一则消息,Claude Code 原生支持通过 channels 的方式实现聊天工具远程操作,但只支持 Telegram 和 Discord。

我就想花一点时间,把钉钉也集成上去。

项目目标

将 Claude Code 接入钉钉机器人,实现在钉钉中与 Claude Code 对话,支持多轮会话。


从 MCP Channel 到 CLI 调用

尝试 MCP Channel 方案

一开始我按照官方文档的思路,打算把程序作为 MCP Server 插件运行在 Claude Code 内部。配置 .mcp.json

{ "mcpServers": { "dingtalk": { "command": "bun", "args": ["src/index.ts"], "env": { "DINGTALK_CLIENT_ID": "xxx", "DINGTALK_CLIENT_SECRET": "xxx" } } } }

然后启动:

claude --dangerously-load-development-channels server:dingtalk

但 Claude Code 直接提示:

--dangerously-load-development-channels ignored (server:dingtalk) Channels are not currently available

查了官方文档才知道,channels 功能需要 claude.ai 登录,Console 和 API key 认证不支持。而我的环境用的是智谱 GLM 模型(ANTHROPIC_BASE_URL 指向 open.bigmodel.cn),所以这个路子走不通。

换个思路:直接调用 CLI

MCP Channel 用不了,突然想到万物皆可以cli,而且claude自己也很推崇cli,就去查了一下,果然claude自身也支持cli来调用。那就换个更直接的方式------写一个独立的钉钉机器人,收到消息后直接调用 claude -p 命令。

架构很简单:

钉钉消息 → Stream WebSocket 接收 → claude -p 处理 → sessionWebhook 回复

核心代码就几行:

新会话 echo "你好" | claude -p --output-format json --dangerously-skip-permissions # 继续会话 echo "继续" | claude -p --output-format json --dangerously-skip-permissions --resume <session_id>

claude -p 会返回 JSON 格式的结果,包含 resultsession_id 等字段。每个钉钉的 conversationId 对应一个 session_id,这样就能实现多轮对话。

回复消息用钉钉的 sessionWebhook 最简单,直接 POST 就行,不用调 API。

遇到的权限问题

刚开始跑的时候,Claude 总是回复"请在权限提示中点击允许"。

这是因为 claude -p 在非交互模式下遇到权限提示时,不会自动处理。我试了 --permission-mode auto,但不知道是 GLM 模型的原因还是版本问题,这个参数不生效。

最后加上了 --dangerously-skip-permissions,问题就解决了。虽然名字听起来有点危险,但在这个场景下是合适的。

这里面都是 MCP Channel 调试过程中遇到的问题,如果哪位大佬用的是正版的claude code,可以试试这个MCP的方案。

  • MCP capabilities 要声明 experimental: { 'claude/channel': {} }
  • 推送消息用 notifications/claude/channel
  • 接收回复要注册名为 reply 的 tool