🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Windows 桌面自动化 helloHub1212/dsh-windows-mcp

DeepSeek Harnessv0.1.0
helloHub12120 天前有提交已提供中文文档扫描:含敏感能力

给 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-mcp
npm 源 · dsh-windows-mcp 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · market
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功(非静态推断);本次验证针对插件 v0.2.0,当前版本为 v0.1.0
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 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 开关和应用内依赖安装器。

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 作者均无隶属关系。
预览分享卡片长什么样 ↓helloHub1212/dsh-windows-mcp
分享 · DeepSeek Harness Hub
helloHub1212/dsh-windows-mcp

给 DeepSeek Harness 接上 Windows 桌面自动化 —— 让 DSH 的 agent…

这是你的仓库?认领条目

回到顶部