给 DeepSeek Harness 接上 Windows 桌面自动化 —— 让 DSH 的 agent…
34.3/100
综合分
6
GitHub 星标
1,084
npm 周下载
—/5
用户评分
数据截至 2026/11/4 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-windows-mcpnpm 源 · dsh-windows-mcp 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-windows-mcp @ 0.1.0
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 09:38:36
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 40 处,展示前 35 条)
- 读取本地文件lib/index.js:164
return readFileSync(path, "utf8"); - 读取本地文件lib/index.js:219
if (existsSync(candidate)) return candidate; - 读取本地文件lib/index.js:231
if (!existsSync(path)) return null; - 读取本地文件lib/index.js:232
const info = statSync(path); - 写入本地文件lib/index.js:292
mkdirSync(stateDirectory, { recursive: true }); - 写入本地文件lib/index.js:293
writeFileSync( - 读取本地文件lib/index.js:553
lines.push(`~/.windows-mcp : ${existsSync(windowsMcpHome) ? "present" : "absent"}`); - 读取本地文件lib/index.js:644
if (!existsSync(patchPath)) { - 发起网络请求lib/client.js:245
fetch(apiUrl(STATE_PATH), { cache: "no-store", headers: { accept: "application/json" } }) - 发起网络请求lib/client.js:291
fetch(apiUrl(STATE_PATH), { - 发起网络请求lib/client.js:577
fetch(apiUrl(STATE_PATH), { cache: "no-store", headers: { accept: "application/json" } }) - 发起网络请求lib/client.js:606
return fetch(apiUrl(path), { method: "POST", headers: { accept: "application/json" } }).then(function (response) { - 发起网络请求lib/client.js:615
return fetch(apiUrl(path), { - 发起网络请求lib/client.js:1168
return fetch(apiUrl(SETTINGS_PATH), { headers: { accept: "application/json" } }) - 读取本地文件lib/dependency.js:75
if (existsSync(candidate)) return candidate; - 读取本地文件lib/dependency.js:95
for (const entry of readdirSync(sitePackages, { withFileTypes: true })) { - 读取本地文件lib/dependency.js:104
for (const entry of readdirSync(join(toolDirectory, "lib"), { withFileTypes: true })) { - 执行外部命令来自配置/变量lib/dependency.js:195
const child = spawn(uv, args, { - 读取本地文件lib/dependency.js:497
return cwd !== "" && existsSync(join(cwd, "node_modules", PACKAGE_ID)) ? cwd : null; - 读取本地文件lib/dependency.js:508
for (const entry of readdirSync(profilesRoot, { withFileTypes: true })) { - 读取本地文件lib/dependency.js:511
if (existsSync(join(directory, "node_modules", PACKAGE_ID))) found.push(directory); - 写入本地文件lib/dependency.js:580
copyFileSync(file, backup); - 写入本地文件lib/dependency.js:586
writeFileSync( - 读取本地文件lib/settings.js:143
const text = readFileSync(settingsPath(home), "utf8"); - 写入本地文件lib/settings.js:156
mkdirSync(dirname(file), { recursive: true }); - 写入本地文件lib/settings.js:158
writeFileSync(temporary, payload, "utf8"); - 写入本地文件lib/settings.js:159
renameSync(temporary, file); - 读取本地文件lib/installs.js:45
if (existsSync(candidate)) return candidate; - 读取本地文件lib/installs.js:63
const parsed = JSON.parse(readFileSync(manifestPath(root, version), "utf8")); - 写入本地文件lib/installs.js:73
mkdirSync(versionToolRoot(root, version), { recursive: true }); - 写入本地文件lib/installs.js:80
writeFileSync(target, `${JSON.stringify(manifest, null, 2)}\n`); - 读取本地文件lib/installs.js:88
names = readdirSync(root, { withFileTypes: true }) - 读取本地文件lib/installs.js:165
return normalizeVersionsState(JSON.parse(readFileSync(versionsStatePath(home), "utf8"))); - 写入本地文件lib/installs.js:176
writeFileSync(temporary, `${JSON.stringify(payload, null, 2)}\n`); - 写入本地文件lib/installs.js:177
renameSync(temporary, target);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 截屏Windows桌面
- 操作Windows桌面
- 桥接MCP客户端
Windows 桌面自动化,给 DeepSeek Harness 用:内置 MCP 客户端桥接,对接 CursorTouch/Windows-MCP,带默认关闭的 Computer Use 开关和应用内依赖安装器。
最近更新
在 GitHub 查看全部 →v0.2.12026-10-29
DeepSeek Harness 的 Windows 桌面自动化——现在可以在 DSH 设置里的一个页面编辑桥接和更新检查器,还带一个给仓库点星的按钮。
在任意 DSH 配置档(桌面或 web shell)里安装或升级:
dsh plugin --profile add dsh-windows-mcp
Computer Use 默认关闭,要在输入框的工具行里拨开开关才启用。
· [0.2.1] - 2026-10-29
· 新增
· 设置页(lib/settings.js,settings.section 插槽):新增「设置 → 桌面」入口,页面把各项开关分成三组——桥接(toolCallTimeoutMs、截图缩放与后端、闪烁浮层、可排除的工具)、更新(启动时检查、首选镜像)和关于(版本、仓库、一个 Star 按钮)。取值会校验并夹到合法范围,原子写入 $DSH_HOME/dsh-windows-mcp.settings.json,桥接的改动会写进配置档的桥接行并留备份;需要重启时页面会提示。
· preferredMirror:更新检查可以固定某个镜像,auto 则保留实测排序。
· 设置入口的图标换成了显示器和光标,不再是 shell 的齿轮:settings.section 插槽没有图标字段,所以图标以 currentColor 蒙版画在设置导航行上,按入口自己的本地化标签匹配。
· 修复
· 读取桥接行时,机器写入的块里缺少 WINDOWS_MCP_DISABLE_FLASH 现在按「闪烁已启用」处理,不再当作未知。
· mirrorOrder 的声明行有一处多余的空格。
v0.2.02026-10-29
DeepSeek Harness 的 Windows 桌面自动化 —— Windows-MCP 现在可以在插件里更新和回滚,安装依赖时会自动选最快的 PyPI 镜像。
在任意 DSH 配置档(桌面或 web shell)里安装或升级:
dsh plugin --profile add dsh-windows-mcp
Computer Use 默认关闭,需要你在输入框的工具行里打开开关。
· [0.2.0] - 2026-10-24
· 新增
· Windows-MCP 版本管理(lib/updater.js、lib/installs.js):插件会到各镜像查询最新的稳定版 windows-mcp,把新版本并列安装到 $DSH_HOME/dsh-windows-mcp/toolchain/ 下(每个版本有独立的 UV_TOOL_DIR,不会覆盖旧版本),把 bridge 行改指向刚装好的可执行文件,并保留被替换的版本,回滚时直接切回去,无需重新下载。检查结果、当前版本/上一版本和安装历史都保存在 $DSH_HOME/dsh-windows-mcp.versions.json。启动时检查一次,结果缓存六小时。
· Python 依赖的快速镜像选择(lib/mirrors.js、lib/pypi.js):对 PyPI 以及中科大、阿里云、腾讯云、华为云、南京大学和 TUNA 镜像做 96 KiB 分段读取探测,按实测吞吐量排序;安装时用最快且可用的镜像,失败就换下一个候选。
· 插件页面上显示:运行版本、最新版本、保留的版本、实测镜像速度,以及「检查更新 / 更新到 vX / 回滚到 vPrev」操作,并实时输出 uv 日志。
· tools/update-e2e.mjs,维护者用的测试脚本,针对本机配置档跑真实的检查、安装、激活和回滚(不会发布)。
· 变更
· createPrepare / prepare 路由现在通过 UV_TOOL_DIR 安装到受管的工具根目录,支持指定 --default-index 镜像,并从实际安装的版本解析可执行文件。
· uv 安装设置 UV_CONCURRENT_DOWNLOADS=4、UV_HTTP_RETRIES=3 和 UV_HTTP_TIMEOUT=600:uv 默认并行下载八个,镜像会返回 HTTP 429,导致安装失败。
· bridge 行写入器、doctor 报告和 /state 返回内容都会说明当前生效的是哪一边(受管安装还是全局 uv-tool 安装)。
· 修复
· PyPI 索引解析器会丢掉链接带 #sha256=… 片段的文件(真实镜像上的每个 wheel 都这样),导致最新版本看起来不存在。
· 版本号匹配正则会在 YAML 标点处停下,却不会在写入块注释里用的反引号处停下。
v0.1.02026-10-11
DeepSeek Harness 的 Windows 桌面自动化 —— dsh-windows-mcp 首次公开发布。
装进任意 DSH 配置档(桌面或 web shell):
dsh plugin --profile add dsh-windows-mcp
Computer Use 默认关闭,要在输入框的工具行里打开开关才生效。插件设置面板会在缺少 windows-mcp 命令时,通过 uv 安装上游的 windows-mcp。
· 0.1.0
· 新增
· 载体包,把官方内置的 MCP 客户端桥(@deepseek-ai/dsh-mcp-client)通过 stdio 接到 CursorTouch/Windows-MCP,向 DeepSeek Harness 暴露 Windows 桌面自动化能力,形式为 mcp__windows__* 工具(截图、快照、点击、输入、滚动、移动、快捷键、等待、等待条件、抓取、多选、多编辑、剪贴板、进程、通知、注册表、显示器清单、控制状态)。
· 精选默认值:排除 App、PowerShell 和 FileSystem(DSH 已自带 shell 和文件工具,上游的 App 工具也只在英文 Windows 上稳定),关闭遥测,关闭截图闪烁,截图缩放到 0.75,单次调用超时 120 秒,启用重连。
· 宿主端(lib/index.js),带 windows_mcp_doctor 诊断工具和启动时只报一条警告的审计(缺补丁行、缺 uv/uvx)。
· 零运行时依赖;js-yaml 只是开发依赖,仅测试用它真正解析补丁文件。
· 输入框工具行里的 Computer Use 开关(客户端部分,lib/client.js):显示已桥接的桌面工具数量,把选择存进 ~/.dsh/dsh-windows-mcp.state.json。默认关闭 —— 桌面控制需主动开启,所以全新安装不会直接把机器交给智能体,要打开开关才行。
· 对该开关的硬性执行(宿主端):关闭期间,所有 mcp__windows__* 工具都会从模型看到的提示词组装中过滤掉,并在分发时被普通上下文的 tools.guard() 拒绝 —— 对所有会话和子代理实时生效,无需重启。刻意不用 tools.restrict():它需要按智能体划分作用域的上下文,而且对桥尚未注册的工具会抛错。
· 应用内依赖安装器(lib/dependency.js,加上 plugins.bundle.config 和 plugins.bundle.activation 两个客户端插槽 —— 官方实验性载体用的也是这两个):依赖状态、一个安装按钮、带取消的 uv tool install 流式输出,以及安装成功后自动、带备份、幂等地改写配置档 cordis.patch.yml 里的桥接行,指向已安装的可执行文件。
· 该改写会定位配置档,页面上显示为 Patch target:插件解析宿主启动时用的配置档(来自 DSH_WINDOWS_MCP_PROFILE、DSH_PROFILE_DIR、DSH_PROFILE、--profile 参数或工作目录),所以在 dsh --profile 宿主里安装就改那个配置档。多个配置档都带这个包而宿主一个都没报时,它不写任何东西,而是指向 DSH_WINDOWS_MCP_PROFILE,不去猜。
· GitHub Actions CI,在 Windows 和 Linux、Node 22 和 24 上跑测试套件。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-windows-mcp
English · 中文
给 DeepSeek Harness 接上 Windows 桌面自动化 —— 让 DSH 的 agent 能"看见"你的屏幕并操作你的电脑。
本插件把 CursorTouch/Windows-MCP 接到 DSH 上,做法是挂载 DSH 本体自带的那座 MCP 客户端桥:不重新实现协议客户端,也不重复打包 MCP SDK。插件本身是一个 carrier bundle(只有补丁、没有自己的服务),agent 能用的一切能力都来自官方那座桥。
DSH agent
└─ 工具调用 mcp__windows__Screenshot └─ @deepseek-ai/dsh-mcp-client (DSH 内置,由本插件的补丁行挂载) └─ uvx windows-mcp@0.8.8 serve (stdio 子进程) └─ 你的桌面:UIA 树 / Win32 输入 / 屏幕采集
agent 能拿到什么
装好插件且 Windows-MCP 可启动后,工具列表里会出现:
| 工具 | 作用 |
| mcp__windows__Screenshot | 截屏;图片会作为真正的图片附件进入对话 |
| mcp__windows__Snapshot | 抓取无障碍树(纯文本,不花图片 token) |
展开完整文档(README 剩余 1 节)
dsh-windows-mcp
English · 中文
给 DeepSeek Harness 接上 Windows 桌面自动化 —— 让 DSH 的 agent 能"看见"你的屏幕并操作你的电脑。
本插件把 CursorTouch/Windows-MCP 接到 DSH 上,做法是挂载 DSH 本体自带的那座 MCP 客户端桥:不重新实现协议客户端,也不重复打包 MCP SDK。插件本身是一个 carrier bundle(只有补丁、没有自己的服务),agent 能用的一切能力都来自官方那座桥。
DSH agent
└─ 工具调用 mcp__windows__Screenshot └─ @deepseek-ai/dsh-mcp-client (DSH 内置,由本插件的补丁行挂载) └─ uvx windows-mcp@0.8.8 serve (stdio 子进程) └─ 你的桌面:UIA 树 / Win32 输入 / 屏幕采集
agent 能拿到什么
装好插件且 Windows-MCP 可启动后,工具列表里会出现:
| 工具 | 作用 |
| mcp__windows__Screenshot | 截屏;图片会作为真正的图片附件进入对话 |
| mcp__windows__Snapshot | 抓取无障碍树(纯文本,不花图片 token) |
| mcp__windows__DisplayInventory | 枚举显示器及其几何信息 |
| mcp__windows__Click / Move / Scroll | 鼠标输入 |
| mcp__windows__Type / Shortcut | 键盘输入 |
| mcp__windows__Wait / WaitFor | 等待固定时长,或等到某个界面条件成立 |
| mcp__windows__Scrape | 从窗口里抽取文本 |
| mcp__windows__MultiSelect / MultiEdit | 批量选中元素 / 批量编辑 |
| mcp__windows__Clipboard | 读写剪贴板 |
| mcp__windows__Process | 枚举、启动、结束进程 |
| mcp__windows__Notification | 读取通知 |
| mcp__windows__Registry | 读写注册表 |
| mcp__windows__ControlStatus | 控制环状态。无法关闭——上游强制保留 |
| mcp__windows__App | 启动/切换应用。默认排除(上游只在英文版 Windows 上稳定支持) |
| mcp__windows__PowerShell / FileSystem | 默认排除——DSH 已有 shell 与文件工具 |
另外本插件自带一个工具 windows_mcp_doctor:当 mcp__windows__ 工具缺失时,用它查原因。
输入框工具行里还会多出一颗 Computer Use 胶囊(就在"访问模式"旁边):显示当前真正注册了几个桌面工具,并在重启后记住你的选择(状态文件:~/.dsh/dsh-windows-mcp.state.json)。它默认是关闭的——全新安装不会把桌面交给 agent,直到你亲手点亮这颗胶囊。
关掉它是一道硬约束,不是提示:桥本身照常运行,但从下一步开始,每个 mcp__windows__ 工具都会从模型的工具表里消失;模型即便仍然报得出名字,调用也会在分发时被拒绝——对所有会话和子智能体同时生效,无需重启。重新打开后立即恢复;windows_mcp_doctor 始终报告当前开关状态。
已实测:Windows 11 + DSH 桌面版 0.2.0-rc.2 下,桥那侧的服务公布 18 个工具(上游 21 个减去这里排除的 3 个),启动后约 1.5 秒就绪;每个工具都以 mcp__windows__<工具名> 出现在模型的工具表里。
前置条件
- Windows 10/11。
- DeepSeek Harness 桌面版,且内置 @deepseek-ai/dsh-mcp-client 桥(0.2.0-rc.2 及以上)。
- 运行 DSH 的那个进程能在他自己的 PATH 上找到 uv(插件用它在面板里装 Windows-MCP;DSH 本身启动不需要它)。即使没在 PATH 上,插件也会额外搜索 %USERPROFILE%\.local\bin。
- 想让 agent 真正看到截图,需要支持图片输入的模型。
启动永远不会被依赖卡住
桥那一行出厂就是 disabled,这是刻意的。uvx 式的首次启动会去包索引解析并下载 Windows-MCP 的 Python 依赖,慢网或被墙时这个解析能在 DSH 启动过程里挂几分钟——窗口一直停在 “Loading plugins…”。插件不应该有能力对宿主做这种事,所以:
- 装完 bundle 第一次启动: DSH 照常秒开,暂时没有 Windows 工具,依赖状态显示为未安装(插件页和 设置 → 桌面控制 都这么说)。
- 在 设置 → 桌面控制 里安装依赖(见下一节):它会先探测 PyPI 镜像,把依赖装进插件自己的 toolchain 目录,然后把桥那一行重写成 disabled: false + command: 指向装好的可执行文件。
- 重启一次 DSH。 之后桥直接拉起那个 exe —— 本机实测(Windows 11)约 1.5 秒就绪,不走网络。
uv 只由安装器用到。网络受限时,给 uv 配一次镜像(%APPDATA%\uv\uv.toml),手动/CLI 路径也能同样提速:
default-index = "https://mirrors.aliyun.com/pypi/simple"
安装
1. 打开 DSH 桌面版 → 设置 → 插件。
2. 添加本 bundle,目标可以是包名、仓库地址(github:helloHub1212/dsh-windows-mcp)或本仓库的本地目录。
3. 重启 DSH,让新的补丁层在启动时合成。
非 Electron 的 profile 也可以用 CLI 完成同样的事:
dsh plugin --profile <profile> add github:helloHub1212/dsh-windows-mcp
Electron 独占 desktop profile,CLI 对它任何命令都会被拒绝(连只读 dump 也不行)。desktop 请走图形界面。
在应用里直接装依赖
Windows-MCP 本身是个 Python 程序,所以 设置 → 桌面控制 里的 依赖 卡片会显示它的状态并直接帮你装:
- 依赖 —— 已安装 0.8.8 / 未安装 / 未找到 uv;
- 下载并安装 —— 跑一次 uv tool install windows-mcp@<锁定版本>(走实测最快的镜像),安装输出实时显示在页面上,过程中可以取消;
- 装完之后,插件会自己把桥那一行写进你 profile 的 cordis.patch.yml(先做带时间戳的备份,并用成对标记包住,可重复执行),写的是 disabled: false + command: 指向装好的可执行文件。重启 DSH 生效;之后桥直接拉起 exe,启动时不再解析任何包索引。
它写进去的就是 换成固定的解释器 里那条行;把标记之间的块删掉就回到出厂那条禁用的 uvx 行。设置 → 插件 里本插件的那一页只留一行状态并指向这里;启用 bundle 之后弹的提示则直接提供同一个安装按钮。
面板上还会显示 写入目标:手动写入会落到哪个 cordis.patch.yml,也就是这个宿主启动的那个 profile(dsh --profile web 启动的 web 宿主同样适用)。如果本插件装在多个 profile 里、而宿主没有报告自己启动的是哪一个,插件不会猜:它什么都不写并直接说明——给运行 DSH 的进程设 DSH_WINDOWS_MCP_PROFILE=<profile 名>(或 profile 的绝对路径)再重试。
更新 Windows-MCP,以及回退
同一个面板也管上游版本,所以升级不用再手动重装依赖:
- 自己检查。 宿主启动时(以及页面要求时)插件会探测各 PyPI 镜像,取响应最快的那个读它的 windows-mcp 索引;结果在 $DSH_HOME/dsh-windows-mcp.versions.json 里缓存 6 小时,重启不会反复打网络。
- 版本各装各的。 每个版本通过 UV_TOOL_DIR 装进自己的目录:$DSH_HOME/dsh-windows-mcp/toolchain/<版本>/windows-mcp。激活一个版本只是重写桥那一行(同样先备份),不需要重装,上一版原样留在磁盘上。
- 一键更新。 更新到 vX 会从能用的最快镜像下载该版本(失败自动换下一个镜像),校验可执行文件和 dist-info 之后再激活;面板会显示当前运行版本和它来自哪个镜像。
- 回退同样一键。 回退到 vPrev 把桥指回“当前版本替换掉的那个版本”,不下载任何东西。
只动插件自己管理的安装:在你安装第一个托管版本之前,桥仍然用全局 uv tool 装的那份;面板会标明当前生效的是 uv-tool 还是 managed。
Python 依赖的镜像加速
检查阶段会用 96 KiB 的 range 读取量一遍七个候选——PyPI 官方,加上中科大、阿里云、腾讯云、华为云、南京大学、清华 TUNA——按实测吞吐量排序。安装时用最快且能用的镜像,失败就回退到下一个;同时固定 UV_CONCURRENT_DOWNLOADS=4、UV_HTTP_RETRIES=3、UV_HTTP_TIMEOUT=600,因为镜像会限流 uv 默认的 8 并发(HTTP 429)。对当前网络直接封锁的镜像(本机 TUNA 现在返回 403)会被排到后面而不是让安装失败;每个镜像的实测速度都显示在面板上。
设置页与 Star 按钮
除了插件卡片上的这些,还有几个不属于卡片的小开关,集中在 设置 → 桌面控制 —— 设置界面左边栏里新增的一页,和别的插件页并列:
- 依赖 —— 安装、重装、更新、回退,以及「指向桥」按钮;带实时安装日志和写入目标。插件页只留一行指向这里。
- 桥接 —— toolCallTimeoutMs、截图缩放、截图后端、上游的闪光提示层,以及桥允许排除的三个工具(App、PowerShell、FileSystem)。这些会写进你 profile 的 cordis.patch.yml 桥行(先做时间戳备份),所以 重启 DSH 后才生效;页面上会写明当前生效的是哪一行。
- 更新 —— 是否在启动时自动检查新版 Windows-MCP,以及镜像策略:auto 用实测排序,指定镜像则固定用它(官方源始终留作最后的兜底)。
- 工具暴露 —— 惰性工具(默认开):模型只看到一个 windows_desktop 入口,调用它之后,下一步才会把已揭示的桌面工具放进工具表。关掉则每一步都发送全部 schema。
- 关于 —— 插件版本、仓库链接,以及一个「点个 Star」按钮,点开在新标签页打开 GitHub 仓库。
保存是原子的($DSH_HOME/dsh-windows-mcp.settings.json)。越界的值会被夹到默认值并告知,而不是悄悄写坏;只改插件参数、不涉及桥行时不会重写补丁层。还原 把表单恢复成默认值。
惰性工具
十八个工具 schema 在每一步都要占上下文,包括根本没碰桌面的那些步骤。惰性工具打开时(默认),模型只会被提供一个入口:
windows_desktop —— Reveal the Windows desktop capabilities (screenshots, clicking, typing, windows, clipboard, processes) for this session.
不带参数调用即揭示全部能力;{"query": "screenshot"} 或 {"names": ["mcp__windows__Click"]} 可以只揭示一部分。定义会随工具结果返回,被揭示的工具从下一步开始进入工具表,选择持续到本次会话结束。若模型直接调用还没揭示的工具,会被拒绝并提示先揭示。
揭示按会话隔离,开关两个方向都诚实:Computer Use 关闭时这个入口同样隐藏,也没有任何东西能在用户不知情时被揭示。
欢迎弹窗
插件第一次被启用时——以及之后每次从插件页启用时——整个窗口上会升起一个 欢迎使用 DSH 桌面控制插件 的弹窗:磨砂卡片浮在模糊遮罩上,直接挂到 document.body(portal),所以页面里的任何容器都裁不掉、盖不住。三行说明依赖(安装/更新/回退)和参数在哪里(设置 → 桌面控制)、Computer Use 开关在输入框工具行,并带一个显眼的 点个 Star 按钮。按 Esc、点遮罩或“知道了”即可关闭;打开期间焦点锁在弹窗内;如果是通过命令行/配置启用,则每个浏览器只弹一次,不重复打扰。
验证
windows_mcp_doctor
它会打印解析到的 uv/uvx/python、%USERPROFILE%\.windows-mcp 的状态、实际生效的 bridge 行,以及真正注册成功的 mcp__windows__ 工具名。然后对 agent 说:
截图我的桌面,告诉我屏幕上有什么。
配置
默认值都在 cordis.patch.yml,下面这些通过 windows-mcp-bridge 那一行的 env 调整。
| 变量 | 本插件默认 | 作用 |
| WINDOWS_MCP_SCREENSHOT_SCALE | 0.75 | 截图缩放,0.1–1.0。对图片 token 开销影响最大的一个开关。 |
| WINDOWS_MCP_DISABLE_FLASH | 1 | 关掉上游每次截屏时那圈橙色"控制权已接管"边框。 |
| WINDOWS_MCP_SCREENSHOT_BACKEND | auto | 采集后端;覆盖前请先读上游文档。 |
| WINDOWS_MCP_MAX_TREE_ELEMENTS | 500 | Snapshot 返回的无障碍树元素上限。 |
| WINDOWS_MCP_WATCHDOG | off | 上游看门狗。默认关,因为它的 UIA 事件泵有可能把整个进程带崩(上游 #332)。 |
| ANONYMIZED_TELEMETRY | false | 上游默认开启(PostHog)。本插件关掉。 |
从自己的 profile 覆盖这一行
不要改插件自己的文件——在你 profile 的 $DSH_HOME/profiles/<profile>/cordis.patch.yml 里按 id 覆盖即可,它在 bundle 行之后合成,因此优先级更高。
补丁是整块替换 config,不是深合并。 loader 的应用方式是 target[key] = value(dsh-app-boot 里的 applyEntryPatches),漏写哪个键就等于删掉哪个键:serverName 必填(它决定所有工具名)、transport 必填、stdio 形态下 command 必填、streamable-http 形态下 url 必填。id 不存在、或 name 与目标不匹配的补丁会被跳过并告警,而不是报错。
$DSH_HOME/profiles/<profile>/cordis.patch.yml —— 完整的一行
- id: windows-mcp-bridge
config:
serverName: windows
transport: stdio
command: uvx
args: [windows-mcp@0.8.8, serve, --exclude-tools, "App,PowerShell,FileSystem"]
toolCallTimeoutMs: 120000
failOnStartupError: false
reconnect: { enabled: true, initialDelayMs: 500, maxDelayMs: 30000, maxAttempts: 10 }
env:
ANONYMIZED_TELEMETRY: "false"
WINDOWS_MCP_DISABLE_FLASH: "1"
WINDOWS_MCP_SCREENSHOT_SCALE: "0.5"
--exclude-tools 的工具名是一个逗号分隔的参数("App,PowerShell,FileSystem"),而 ControlStatus 始终保留——上游没有提供排除它的方式。
换成固定的解释器(不用 uvx)
uvx 每次启动都会重新解析包。要可复现,就装一次(uv tool install windows-mcp)或用任何一个已经装了它的 Python,然后改上面那份完整 config 里的 command/args:
- id: windows-mcp-bridge
config:
serverName: windows
transport: stdio
command: windows-mcp # 或者 C:\...\python.exe + args: [-m, windows_mcp, serve, ...]
args: [serve, --exclude-tools, "App,PowerShell,FileSystem"]
toolCallTimeoutMs: 120000
failOnStartupError: false
reconnect: { enabled: true, initialDelayMs: 500, maxDelayMs: 30000, maxAttempts: 10 }
env: { ANONYMIZED_TELEMETRY: "false", WINDOWS_MCP_DISABLE_FLASH: "1", WINDOWS_MCP_SCREENSHOT_SCALE: "0.75" }
换成常驻 HTTP 服务
Windows-MCP 也能作为后台服务运行。上游的 windows-mcp install 会注册一个 ONLOGON 计划任务,在 127.0.0.1:8000 上提供 streamable-http;把这一行改成对应形态即可——这个形态用 url,没有 command/args/env:
- id: windows-mcp-bridge
config:
serverName: windows
transport: streamable-http
url: http://127.0.0.1:8000/mcp/ # 上游打印的就是这个地址,结尾斜杠属于上游 toolCallTimeoutMs: 120000 failOnStartupError: false
reconnect: { enabled: true, initialDelayMs: 500, maxDelayMs: 30000, maxAttempts: 10 }
这个形态没有 env 字段,所以遥测与截屏闪框的默认值不再生效:想要同样效果,就在启动服务时自己带上 ANONYMIZED_TELEMETRY=false 和 WINDOWS_MCP_DISABLE_FLASH=1。
好处是跨 DSH 重启存活、省掉每次启动开销,代价是有一个比应用活得更久的进程。两个需要留意的上游限制:install 会把计划任务绑到当时使用的解释器上(从临时 uvx 环境安装会注册出一个指向 uv 缓存目录、可能被回收的任务——请改用 uv tool install windows-mcp 或固定 venv);非 loopback 地址在缺少 --auth-key/--oauth-client-id 时会拒绝启动(除非显式 --allow-insecure-remote)。
排障
| 现象 | 原因与处理 |
| 完全没有 mcp__windows__ 工具 | 跑 windows_mcp_doctor。全新安装时这是预期的:桥出厂是 disabled,要在 设置 → 桌面控制 里装完依赖、重启 DSH 之后才会启用。若依赖已装,看 doctor 打印的生效行里的 disabled / command,以及宿主日志里的 mcp-client(windows) 行。 |
| 升级后工具消失了 | 工具名是 mcp__<serverName>__<tool>。改 serverName 会改掉全部工具名(并打破 prompt 缓存前缀)。 |
| 截图返回的是文本 | 当前模型不接受图片输入,或你的 harness 配置里关掉了附件。上游的图片只有在准入成功时才会被投影。 |
| App 工具报错或没反应 | 上游明确说它只在英文版 Windows 上可靠;本插件默认已排除。 |
| DSH 启动明显变慢 | 桥不该占用启动时间:它出厂 disabled: true,只有安装后把 command 指到可执行文件才会启动。启动变慢说明别的行在引导期解析工具链——看 windows_mcp_doctor 打印的生效行。 |
| 截图里的字看不清 | 把 WINDOWS_MCP_SCREENSHOT_SCALE 提到接近 1.0;上游截图上限是 1920×1080。 |
安全
装上它,等于把鼠标、键盘、剪贴板、进程和注册表交给模型。请按"交出这个桌面会话的控制权"来评估。
设计上做了与没做的事:
- 默认不监听网络。 默认行走 stdio:管道连接的子进程,不是监听端口。
- 子进程环境会清密。 桥启动 MCP 子进程时会先做环境清洗:名字匹配 KEY|PASSWORD|SECRET|TOKEN 的变量、以及所有 DSH_ 变量都会被删掉,然后才合并配置里的 env。所以凭据必须显式写进该行的 env,不能指望继承。
- 本插件不发送遥测。 上游自己的 PostHog 上报已在默认配置里显式关闭。
- 远程提供不是隐藏默认值。 若你切到 HTTP,上游会强制 loopback 主机过滤,非 loopback 且无鉴权时拒绝启动。
- 开关只由窗口决定,不由网络决定。 所有写操作路由(/state、/prepare、/prepare/cancel、/bridge、/update、/settings)都要求浏览器在启动 token 兑换时拿到的签名会话 cookie,没有就返回 401。脚本、curl、或拿得到 shell 的模型都无法给自己打开桌面控制。读请求保持开放,页面才能先渲染再决策。
- 无法校验 cookie 时插件会明说。 没有挂载 connection 服务的组合(headless 宿主、Electron file://)无法鉴权,此时 /state 会报告 "gate": {"cookie": "unobservable"}——这种情况下不要用非 loopback 的 --host 暴露 web 服务器。
- 文件仍然是文件。 $DSH_HOME/dsh-windows-mcp.state.json 里的 Computer Use 标志与机器写入的补丁块都是同用户可写的普通文件。能写这些文件的 agent 仍能在重启后改变插件行为——cookie 鉴权关的是 HTTP 这条路,不是文件系统信任。介意的话,把桌面放到 agent 无法写入的账户下运行,或不要同时把 shell 权限和桌面控制交给同一个模型。
原理
DSH 插件本质是 loader 补丁,而补丁行可以挂载位于 Electron app.asar 里的包——loader 会从桌面版安装锚点解析官方 @deepseek-ai/ 名字。第三方代码不能 import 这些包,但可以在补丁里点名它们,因为挂载发生在 loader 内部,而不是插件代码内部。这就是本包的全部诀窍:
- insert:
- id: windows-mcp-plugin
name: dsh-windows-mcp # lib/index.js:doctor 工具 + 启动审计
- id: windows-mcp-bridge
name: "@deepseek-ai/dsh-mcp-client" # 内置桥,按 Windows-MCP 配置 disabled: true # 出厂禁用,等安装器把 command 指到 exe
config: { transport: stdio, command: uvx, args: [windows-mcp@0.8.8, serve, ...] }
由此带来的几点值得知道:
- 集成的版本敏感性只有一个方向:bridge 的配置 schema 属于 DSH,不属于本插件。package.json 声明补丁,怎么读由 DSH 决定。
- 图片投影是桥的功能:MCP 图片块会被存成 DSH 附件并以原生图片内容呈现;音频与嵌入资源会退化成诊断文本。
- MCP prompts 不被桥支持(资源可以按需读取)。
开发
npm install
npm test # node --test,包含对补丁文件的真实 YAML 解析
npm run check # node --check lib/index.js
想在不碰任何真实 profile、也不重启 DSH 的前提下看到合成后的配置,用 dump 工具:
一次性:建一个影子 profile,复用真实 profile 的 node_modules
mkdir $env:USERPROFILE\.dsh\profiles\dtest
copy $env:USERPROFILE\.dsh\profiles\desktop\package.json $env:USERPROFILE\.dsh\profiles\dtest\
cmd /c mklink /J $env:USERPROFILE\.dsh\profiles\dtest\node_modules $env:USERPROFILE\.dsh\profiles\desktop\node_modules
npm run dump
目录结构:
cordis.patch.yml 集成本体:两行 insert lib/index.js 宿主半边:路由 + windows_mcp_doctor + 启动审计(零依赖) lib/dependency.js 依赖状态、uv 调用封装、profile 桥行写入 lib/pypi.js PyPI 索引解析与版本比较(纯函数) lib/mirrors.js 镜像候选、限速探测与排序 lib/installs.js 按版本隔离的工具目录 + 版本状态文件 lib/updater.js 版本管理:检查 / 安装 / 激活 / 回退 lib/settings.js 用户设置:校验、落盘、桥行往返 lib/client.js 网页半边:输入框开关 + 插件面板 + 设置页 test/plugin.test.mjs 补丁合成测试 + 恶意 ctx 测试 + 面板测试 test/update.test.mjs 版本解析、镜像排序、版本隔离与回退状态机测试 test/settings.test.mjs 设置校验、桥行往返、设置路由测试 scripts/dump-config.mjs 面向影子 profile 的合成调试脚本 tools/ 零依赖调试探针(不发布到 npm)
要对着真实网络和本机 profile 验证升级链路,用 tools/update-e2e.mjs:
node tools/update-e2e.mjs --check # 探测镜像并读出最新稳定版
node tools/update-e2e.mjs --install 0.8.8 # 真下载、真激活、真改桥行
node tools/update-e2e.mjs --rollback
欢迎贡献;请保持 lib/index.js 无运行时依赖,并保持 apply() 永不抛错。
致谢与许可
MIT —— 见 LICENSE。
- 真正干活的是 CursorTouch/Windows-MCP(MIT),本插件只负责接线。
- MCP 客户端桥属于 DeepSeek Harness,本仓库不重新分发它。
- 与 DeepSeek 官方及 Windows-MCP 作者均无隶属关系。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
helloHub1212/dsh-windows-mcp
给 DeepSeek Harness 接上 Windows 桌面自动化 —— 让 DSH 的 agent…
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,225未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,370已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13941 个插件含 PR 收录与…
★ 355已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目