通过外接 USB HID 硬件做电脑控制:用一句话描述目标,视觉模型在裁剪后的窗口截图里定位,树莓派 Pico 2 驱动真实鼠标和键盘完成动作。7 个工具。Windows 支持窗口枚举、按窗口裁剪与自动抬窗;macOS 需 pyobjc 且不支持这两项;Linux 不支持。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-clawtouch
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:tinqiao-oss/clawtouch-mcp#path:/adapters/dsh/plugin
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
English | 简体中文
dsh-clawtouch
告诉它点什么,它就用真鼠标点下去。 一个 DeepSeek Harness 插件, 让 agent 拥有一套物理 USB HID 键鼠 —— 用人话指挥,而不是给坐标。
computer_click({ target: "那个蓝色的发送按钮" })
它会截取当前窗口、让视觉模型指出目标在哪、把图上坐标换算回屏幕坐标, 然后通过一块真实的 USB 硬件把鼠标移过去、按下去。
⚠️ 先看这里:三个前置条件,缺一不可
这个插件不是纯软件方案。它的全部意义就在于输入是物理的 —— 所以下面第一条没得商量。
1. 一块烧好 ClawTouch HID 固件的硬件 (必须)
插件自己不产生任何输入事件。它把指令交给 clawtouch-mcp,后者通过 USB 串口
发给一块单片机,由那块硬件输出标准 USB HID 报告。目标机看到的是一套真实
插上的键鼠,走的是和任何外设完全相同的驱动通路。
两种来源,协议完全一致,插件不区分:
| 来源 | 说明 |
|---|---|
| 成品 ClawTouch 设备 | 开箱即用。咨询/订购 → clawtouch.cn |
| 自己烧一块 | 树莓派官方 Pico 2 (约 ¥55) + 开源固件 clawtouch-hid。按那个仓库的说明把固件拖进 BOOTSEL 盘即可 |
能不能不用硬件? 目前不能:插件的每一次点击和按键都经这块板子发出, 没有它就只能看、按不了任何东西。不过「看得准不准」可以先验:配置里开
dryRun: true,只定位、报告坐标,什么都不按,不插板子也能用。 (mock: true只用来测试插件和clawtouch-mcp之间的连线,同样什么都不按, 每条结果都会写明。)
2. Python 端 clawtouch-mcp (必须)
pip install 'clawtouch-mcp[screenshot,window]>=0.5.1'
两个 extra 都要,不能只写 [screenshot] —— 后者只有 mss + Pillow,
不含 pyobjc。macOS 上少了它,窗口列表功能直接不可用。
3. 视觉模型的 API key (必须,除非只做硬件自检)
export DASHSCOPE_API_KEY=sk-...
默认用阿里云百炼的 qwen-vl-max。换别的模型见下面「配置」。
安装
pip install 'clawtouch-mcp[screenshot,window]>=0.5.1'
dsh plugin --profile <你的 profile> add dsh-clawtouch
export DASHSCOPE_API_KEY=sk-...
@deepseek-ai/dsh-tools 由宿主提供,插件刻意不声明这个 peer 依赖:
dsh 还在发 rc 版本,而 semver 规定预发布版本只被带相同预发布标识的范围匹配,
没有任何范围能匹配得上正在用的那个版本 —— 声明了反而会让 npm install 失败。
叫 agent 之前,先自己验一遍
分三层,缺前置条件也能验前面几层。 强烈建议按顺序走完再让 agent 上手, 否则出问题时你分不清是硬件、截图、密钥还是坐标算错了。
# 第 1 层 —— 不需要硬件、不需要密钥:它能看见你的窗口吗?
node probe.js --windows
# 第 2 层 —— 需要硬件,不需要密钥:光标落点准不准?
node probe.js --move-test
# 第 3 层 —— 需要硬件 + 密钥:整条链路
node probe.js "计算器的等号键" --window 计算器
node probe.js "计算器的等号键" --window 计算器 --click
第 2 层是最值钱的一层:它把光标驱动到每个校准 marker 自己的屏幕位置, 报告实际偏差多少像素。这一层不花任何 API 费用,而且一旦这里不对, 问题一定在视觉层之下 —— 不用再往上查。
多显示器:clawtouch-mcp 默认只按主显示器钳制坐标,副屏上的窗口够不到。
把整个虚拟桌面尺寸告诉它:
node probe.js --windows --screen 7680x1440
⚠️ 副屏摆在主屏左边或上边时坐标是负的,而 --screen 只有尺寸没有原点 ——
再大的 WxH 也够不到。把副屏挪到右边或下边即可。
工具
| 工具 | 作用 |
|---|---|
computer_click |
用一句话描述目标,点它 |
computer_click_sequence |
看一次,连点多个目标 (省往返) |
computer_find |
只定位不点击 |
computer_windows |
列出窗口,拿到准确标题 |
computer_type |
打字 (可先点目标再打) |
computer_key |
按键与组合键 |
computer_scroll |
滚动 |
平台支持:这是一张表,不是一句承诺
| Windows | macOS | Linux | |
|---|---|---|---|
| 窗口列表 + 矩形 | ✅ | ✅ (需 pyobjc) | ❌ |
| 把截图裁到单个窗口 | ✅ | ✅ | 只能手给 region |
| 自动把后台窗口抬到前面 | ✅ | ❌ | ❌ |
| 遮挡测量 (被别的窗口盖住多少) | ✅ | ❌ | ❌ |
| 模态守卫 (窗口是否根本不收输入) | ✅ | ❌ | ❌ |
后三项在 macOS 上不是坏了,是刻意没有。测不出来的东西,返回里就不会有 那个字段 —— 绝不会填一个看起来正常的值。字段缺失表示「没测」,不表示 「测过没问题」。
Linux 没有窗口列表,只能截整个桌面 —— 实测在多显示器下定位准确率是 0/6, 所以当作不支持。
安全
- 键盘输入进的是当前有焦点的窗口。 先点输入框,或者给
computer_type传target让它替你点。 - 退出类组合键默认被拦截:macOS 上 Cmd+Q / Cmd+W;Windows 与 Linux 桌面上
Alt+F4 / Ctrl+W / Ctrl+F4。一次真实的 HID 按键落在拥有焦点的任何窗口上 ——
如果那是 agent 自己的窗口(包括浏览器里的 dsh 网页,Ctrl+W 就关掉它),会话当场
结束。确实要放开就在配置里
allowQuitCombos: true。 - 切换窗口的组合键也默认被拦截:Windows 与 Linux 桌面上 Alt+Tab、Alt+Esc、
Ctrl+Esc、Ctrl+Alt+Del 和所有 Win/Super 键组合;macOS 上 Cmd+Tab、Cmd+空格、
Cmd+`、Cmd+H、Cmd+M、Cmd+Option+Esc、Ctrl+方向键、Ctrl+F2/F3(Cmd+C 这类普通
应用快捷键不受影响)。真实按键跟着焦点走,焦点一离开任务窗口,之后的每一个键都会
落到别处 —— 实测中 agent 按了一次 Alt+Tab,整场再没回来。要操作别的窗口:Windows
上给
computer_click传window,它会点标题栏把窗口抬到前面;其他平台点那个窗口 露出来的部分。被控的不是运行 dsh 的这台机器时,才在配置里allowFocusSwitchCombos: true。 - 两道拦截都按
clawtouch-mcp的解析方式读组合键:key: "alt+tab"就是 Alt+Tab, 首尾空白按 Python 的规则去掉,数字键按数字读。 - 打字走美式键盘布局,一个字符按一个键。 中文、emoji、弯引号在这个布局上
没有对应的键,
computer_type遇到这类文字会在点击和打字之前整段拒绝,不会 打到一半才停。开着中文输入法时,打出的字母可能变成候选词、标点变成全角, 打完要核对。 dryRun: true只定位、报告坐标,什么都不按 —— 连把后台窗口抬到前面的那一下 标题栏点击也不点,所以被挡住的窗口会直接拒绝。新机器上先用它跑一遍,不插板子 也能用。- 抬窗口是点它的标题栏,不是抢焦点 API。 而且点完会重新读一次窗口状态 —— 确认不了就如实报告,不假装成功。
- 这等于把一台机器的真实键鼠交给 agent,和一个人坐在键盘前是一回事。
协议
MIT。详见 LICENSE。
链接
同类插件
Tencent/WeKnora#dsh-weknora★ 33572
把 WeKnora 知识库接入 dsh 的四个只读工具:列出知识库、混合检索原文片段、按顺序还原单篇文档,以及直接取用 WeKnora 自己带引用的 RAG 或 ReAct agent 回答(含可续聊的 session id)。
superdesigndev/treg★ 5130
给 Agent 的工具目录:按「要做的事」检索约 2,600 个外部接口(SEO 与 SERP、外链、社交、人物与公司信息补全、广告库、抓取),查看参数与单次调用价格后直接调用,凭据由服务端注入。附带技能,MCP 行在未设置 TREG_TOKEN 前保持禁用。
TencentCloudBase/CloudBase-AI-Toolkit#dsh-plugin★ 1136
把腾讯云 CloudBase 后端接入 DeepSeek Harness——在对话里搭好并部署全栈应用,查询结果渲染为表格卡片(分页、排序、导出 CSV),部署后可预览真实域名,并提供 CloudBase MCP 工具集(`mcp__cloudbase__*`),登录走 device-code 流程。
gitroomhq/postiz-agent#dsh-postiz★ 514
通过 MCP 将 DeepSeek Harness 连接到 Postiz:列出已连接的社交媒体渠道、获取各平台发帖规则,并向 X、LinkedIn、Instagram、Facebook、Threads、TikTok、YouTube、Reddit、Bluesky、Mastodon、Discord、Slack、Telegram 等平台排期、存草稿或发布帖子;附带 postiz 工作流技能。
EthanYoQ/Invoice-Downloader#dsh-invoice-downloader★ 508
面向 DeepSeek Harness 的本地 IMAP 发票下载、OCR 识别、归档与 Excel 报销汇总。
anysearch-team/anysearch-dsh★ 459
基于 AnySearch 的实时网页与垂直搜索插件,为 DeepSeek Harness 提供搜索工具。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。