dsh-wechatide-mcp
Verifieddsh-wechatide-mcp · v0.2.0 · MIT
WeChat DevTools (wechatide) MCP bridge for DeepSeek Harness: drives the IDE's own internal MCP server (wechatide mcp over stdio) — project open/import, compile, preview/upload, simulator screenshot, console/network logs, page automation and CloudBase — wi
Install
dsh plugin add dsh-wechatide-mcp Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-wechatide-mcp
把微信开发者工具(wechatide)自带的内部 MCP 服务接进 DeepSeek Harness(DSH)的插件。
宿主机上的微信开发者工具本身就是一个 MCP 服务器:它在 UserData 目录里写下一份
mcp.json({"command":"wechatide","args":["mcp"]}),用 stdio JSON-RPC 把整套自动化能力
——开窗/导入项目、编译、预览二维码、上传体验版、模拟器截图、console/network 缓冲区、
页面自动化、云开发读写——暴露给任意 MCP 客户端。
本插件就是那层客户端:负责授权(IDE 的客户端白名单)、运行时发现工具(IDE 的清单随版本变化)、 以及把结果渲染成模型能用的形态(结论先行、错误映射、按字节截断、截图附真实图像)。
微信开发者工具 ──(stdio JSON-RPC: wechatide mcp)── dsh-wechatide-mcp ──> 6 个 wechatide_* 工具
↑ 授权弹窗 / 端口 / UserData ↑ 桥接 · 错误映射 · 截断 · 图像预算
特性
- 6 个固定工具 + 运行时工具发现:不为 IDE 的 40+ 个工具各占一份 prompt schema,
wechatide_tools按需读取实时清单。 - 授权是一条产品流程:
wechatide_connect走完check_wechatide_status→ 触发 IDE 弹窗 → 轮询polling_task_result→ 用工具实际使用的 MCP 通道复验。 - 诚实的失败:IDE 的业务错误、Schema 校验报告、未授权状态都渲染成「一句结论 + 下一步动作」。
- 输出有界:单条结果默认截断到 6 KB;
structuredContent与重复的文本块只取一份。 - 截图按路由能力附加:支持图像输入的路由附真实图像块(每会话预算 + 同画面去重),纯文本路由明确告知像素不在上下文里。
- 截图对齐机型尺寸:IDE 只给「长边钳到 1280/1300、宽度按机型比例反推」的图(iPhone X → 600×1300)。插件先读
automation_runtime_info拿到机型逻辑宽高,再把截图重采样成 375×812 / 390×844,输出像素与机型一致;比例差超 3% 时如实降级,不硬凑。 - 零运行时依赖:只用 Node 内置模块;3 个宿主包为可选 peer,由 DSH 提供。
环境要求
| 依赖 | 要求 |
|---|---|
| Node.js | >= 20 |
| DeepSeek Harness | 需提供 @deepseek-ai/dsh-tools、@deepseek-ai/schemastery、@deepseek-ai/dsh-attachment(可选 peer,宿主注入) |
| 微信开发者工具 | 提供 wechatide mcp 子命令的版本(wechatide-skill ≥ 0.3) |
| 操作系统 | macOS 已实机验证;Windows 按目录布局实现但未实机验证;Linux 未验证 |
| 小程序 AppID | 必须是有效值(正式 AppID 或本账号的测试号 AppID);空值、游客模式、他人 AppID 一律不可用 |
前提:小程序 AppID 必须有效
这条不满足,后面所有步骤都会以各种看似无关的方式失败。 本插件的每个动作(开窗、编译、截图、页面自动化、预览、上传、云开发)都跑在 IDE 的项目运行时上, 而 IDE 只对当前登录微信号有权访问的 AppID 提供完整运行时。所以先确认这一条,再排查别的:
| AppID 情形 | 结果 |
|---|---|
| ✅ 正式 AppID,且当前微信号是该小程序的开发者/管理员 | 全部能力可用 |
| ✅ 测试号 AppID(IDE 里生成的「测试号」) | 本地开发足够用:编译、截图、自动化、预览都正常 |
❌ project.config.json 里 appid 为空 / 游客模式(touristappid) |
部分能力直接不可用 |
| ❌ 别人的 AppID(你不是开发者) | 报 APPID_ERROR:登录用户不是该小程序的开发者,截图 / 自动化 / 上传全部失败 |
| ❌ AppID 写错、不存在 | 报 不存在此 AppID |
确认方式:
jq -r .appid project.config.json # 必须是一串非空的 wx 开头 AppID
测试号在 IDE 的「详情 → 基本信息 → 测试号」里生成,它绑定当前登录账号,因此对我们自己的账号有效; 云开发、部分需要正式主体的能力仍需正式 AppID(以微信官方说明为准)。
只使用
dsh-wechatide-mcp/bridge、/devtools、/render这三个子路径时不需要 DSH 宿主: 它们只依赖 Node 内置模块(见编程接口)。
安装
通过 DSH 插件管理器(推荐)
图形界面:DSH 侧栏「插件」→「添加插件」→ 输入包名 dsh-wechatide-mcp(可带版本,如
[email protected])→ 安装 → 按提示重启 DSH。
命令行(等价):
dsh plugin add dsh-wechatide-mcp --profile desktop
插件管理器会同时处理依赖安装、dsh.profile.bundles 登记和 cordis.patch.yml 的 bundle patch。
从本地目录安装(开发用)
dsh plugin add link:/absolute/path/to/dsh-wechatide-mcp --profile desktop
只用 npm 安装
npm install dsh-wechatide-mcp
npm install 只把包放进 node_modules,不会激活插件:还需要把 dsh-wechatide-mcp 加进
profile 的 package.json 里的 dsh.profile.bundles 数组,然后重启 DSH。
装好后会话里出现 wechatide_* 六个工具。IDE 未启动时 wechatide_connect 会尝试拉起它。
快速开始
开工前先确认项目
project.config.json里的appid是有效值(正式 AppID 或本账号的测试号)—— 见AppID 前提。
1. wechatide_status # CLI 在不在、IDE 起没起、登录态、本客户端是否已授权、IDE 有多少工具
2. wechatide_connect # 没授权就调它:IDE 弹「是否允许 DSH 访问」→ 点「允许」
3. wechatide_tools # 看这台 IDE 实际暴露了哪些工具
4. wechatide_call # 开工:一次一个动作
授权按 clientName 记账(默认 DSH)。IDE 重启、升级或更换 clientName 后需要重新
wechatide_connect;这是授权粒度,不是故障。
推荐的工作节奏是 status → 动作 → 取证:每次 wechatide_call 之后用
wechatide_logs、wechatide_screenshot 或
wechatide_call(tool="automation_runtime_info", args='{"action":"currentPage"}') 读一次结果,再决定下一步。
工具
| 工具 | 主要参数 | 说明 |
|---|---|---|
wechatide_status |
probe(默认 true) |
端到端诊断:CLI 路径、IDE 进程/端口、登录态、授权状态、工具数量;probe=false 时跳过 MCP 探测 |
wechatide_connect |
waitSeconds(默认 30) |
授权本客户端并验证 MCP 桥接;返回 taskId 与桥接状态 |
wechatide_tools |
query、full、refresh |
读实时工具清单;无参按族分组,query 查签名+描述,full=true 出完整参数 schema |
wechatide_call |
tool(必填)、args、project、timeoutMs |
通用执行入口;args 是 JSON 对象字符串,缺 project 时自动填会话 cwd |
wechatide_screenshot |
project、waitForSelector、wait、path、raw、quality、matchDevice |
模拟器截图,默认把像素对齐到当前机型宽高(matchDevice=false 保留 IDE 原尺寸);能力允许时附真实图像块,否则返回路径与原因 |
wechatide_logs |
source、mode、pattern、project |
读 console/network 缓冲区:errors(默认)/ all / pattern(grep -E) |
典型调用:
wechatide_call(tool="open_project_window", project="/path/to/miniprogram")
wechatide_call(tool="simulator_refresh")
wechatide_screenshot(waitForSelector=".list") # 输出即机型尺寸,如 390×844
wechatide_screenshot(matchDevice=false) # 保留 IDE 原始尺寸(长边 1300)
wechatide_logs(source="network", mode="pattern", pattern="401|status")
配置
在 profile 的 cordis.patch.yml 中覆盖(下为默认值):
- id: wechatide-mcp
name: dsh-wechatide-mcp
config:
clientName: DSH # 授权身份,需与 IDE 弹窗中显示的名称一致
binPath: '' # 空 = 自动探测;显式路径优先
projectFromCwd: true # 工具要求 project 时自动填会话 cwd
toolCallTimeoutMs: 90000 # 单次 tools/call 默认超时(上传/预览用 timeoutMs 覆盖)
maxResultBytes: 6000 # 单条结果截断字节数
imageBudget: 3 # 每会话最多附加几张截图(0 = 只给路径)
matchDevice: true # 截图后把像素对齐到模拟器当前机型宽高
exposeSkill: true # 把内置 skill 发布到会话技能目录
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
binPath |
string |
'' |
wechatide 可执行文件绝对路径 |
clientName |
string |
'DSH' |
IDE 授权的客户端身份 |
projectFromCwd |
boolean |
true |
用会话 cwd 补全必填的 project 参数 |
toolCallTimeoutMs |
number |
90000 |
tools/call 默认超时(毫秒) |
maxResultBytes |
number |
6000 |
渲染结果截断上限 |
imageBudget |
number |
3 |
每会话图像块预算 |
matchDevice |
boolean |
true |
截图像素对齐到模拟器当前机型宽高(false = IDE 原尺寸) |
exposeSkill |
boolean |
true |
是否发布内置 skill |
找不到 CLI 时也可以临时用环境变量指定(优先级低于 binPath,高于自动探测):
export WECHAT_DEVTOOLS_CLI="/Applications/wechatwebdevtools.app/Contents/MacOS/wechatide"
失败与诊断
插件不会把 IDE 的原始报错直接抛给模型,而是渲染成「结论 + 下一步」:
| IDE 返回 | 渲染结果 |
|---|---|
project window not found, open the project first |
失败 + remedy: … open_project_window … |
cant find runtimeid by projectpath … |
失败 + 「先开窗、再 simulator_refresh」 |
Cannot read properties of undefined (reading 'winId') |
失败 + 「模拟器窗口不可用」 |
APPID_ERROR / 不存在此 AppID |
失败 + 「换成本账号可管理的 AppID」;先核对 project.config.json 的 appid(见AppID 前提) |
MCP error -32602 … Invalid arguments |
参数被拒 + 逐字段原因 + 「先 wechatide_tools(full=true)」 |
Client authorization pending |
未授权 + 「跑 wechatide_connect,去 IDE 弹窗点允许」 |
loginExpired / not logged in |
登录态过期 + 「重新授权或 wechatide_call(tool="login") 扫码」 |
wechatide_status 在失败时也会给出 next: 一行,指明当前唯一该做的动作。
设计取舍
为什么不是「每个 IDE 工具一个函数」。 IDE 的工具清单随版本变化,硬编码 40+ 个工具名要付两份代价:
每次请求都在 prompt 里买下一整套 schema(KV cache 还会因 IDE 升级失效),以及升级后的静默名字漂移。
因此注册面固定为 6 个,清单在运行时通过 wechatide_tools 读取。
为什么授权要单独一个工具。 新 clientName 首次连接只会得到 Client authorization pending;
只有 IDE CLI 的 check_wechatide_status → polling_task_result 这一对能弹出授权框并完成任务。
把它做成独立的 wechatide_connect,失败原因才能如实回报,而不是在通用调用里反复超时。
平台说明(Windows)
Windows 支持按 IDE 的实际布局实现,但未在 Windows 实机验证:
- 启动器:Windows 上 CLI 是
wechatide.cmd/cli.bat,Node 在shell:false下拒绝直接 spawn.cmd(EINVAL)。所有子进程经spawnTarget()包装为cmd.exe /d /s /c ""<bin>" "<arg>"",/s只剥最外层引号,参数保持原样(有单测覆盖)。 - 安装路径:探测
%ProgramFiles(x86)%\Tencent\微信web开发者工具\、%ProgramFiles%\Tencent\…、%LOCALAPPDATA%\Programs\…下的wechatide.cmd/wechatide.exe/cli.bat/wechatide。 - UserData:接受扁平
<root>\<hash>\Default与多一层的<root>\User Data\<hash>\Default两种形状。 - 待确认:安装目录名与启动器名历年变过。若
wechatide_status报找不到 CLI,直接指定真实路径:
$env:WECHAT_DEVTOOLS_CLI = "C:\Program Files (x86)\Tencent\微信web开发者工具\wechatide.cmd"
编程接口
包导出四个入口,供脚本或其它插件复用:
// MCP 客户端(不依赖 DSH 宿主)
import { WechatideBridge } from 'dsh-wechatide-mcp/bridge';
const bridge = new WechatideBridge({
bin: '/Applications/wechatwebdevtools.app/Contents/MacOS/wechatide',
clientName: 'DSH',
});
const tools = await bridge.listTools(); // 实时清单
const result = await bridge.callTool('check_wechatide_status', {});
bridge.close();
| 子路径 | 导出 |
|---|---|
dsh-wechatide-mcp |
插件入口:apply、Config、name、inject |
dsh-wechatide-mcp/bridge |
WechatideBridge、McpAuthorizationPending、McpUnavailable、McpRpcError、describeBridgeFailure |
dsh-wechatide-mcp/devtools |
resolveBin、candidateBins、spawnTarget、userDataRoots、defaultDirs、readDevtoolsState、readSkillVersion、runCliJson、parseJsonLoose、safeEnv |
dsh-wechatide-mcp/render |
renderCall、renderToolList、renderToolSchema、normalizeCallResult、clamp、remedyFor、condenseValidation、toolFamily、toolSignature、formatPayload、oneLine、formatMs |
开发
npm test # 38 个单测:bridge / devtools / render / 工具装配
npm run smoke -- /path/to/miniprogram # 真机只读联调
node --import ./test/support/register.mjs scripts/e2e.mjs <项目> # 开窗 → 截图 → 日志 → 关窗
scripts/smoke.mjs全部只读(状态、工具清单、项目列表、运行时信息、日志),不会开窗或上传。scripts/e2e.mjs会打开项目窗口并触发编译,只对一次性项目使用。- 单测通过
test/support/host-shim.mjs解析@deepseek-ai/*:解析到真包时用真包,否则回落到行为等价的 stub, 因此没有 DSH 的机器也能跑测试,且在 DSH 内不会遮蔽真包。
已知边界
- 一个 IDE 只有一条 MCP 会话:动作串行执行(插件内部排队),不要指望并发操作两个页面。
- IDE 工具都在
wechatide_call之后:模型需先wechatide_tools发现名字与参数,这是省 token 的有意取舍。 - 上传、发布、云写入与删除都是不可逆的外发动作:插件只负责如实执行与回报,是否执行由对话决定。
- AppID 无效时插件不做任何兜底:不会替你切游客模式、也不会绕过开发者校验。截到
APPID_ERROR/不存在此 AppID就是 AppID 或账号权限的问题,换成本账号可管理的正式 AppID 或测试号 AppID 再试,改代码没用。 - 截图默认写入 IDE 的临时目录;需要固定路径时传
path。 - 机型切换只能在 IDE 模拟器下拉里点:IDE 没有暴露「选择机型」的 MCP 工具,插件只负责读机型尺寸并归一化像素。
- 归一化是「等比缩放到机型宽度 + 底部补/裁 ≤3px」,不是简单拉伸:画面不被压扁,代价是底部最多 3px 被裁或复用。
- 工具清单与参数以 IDE 实际版本为准,本 README 不列举 IDE 的 40+ 个工具名。
相关
dsh-mp-automator:走vince-mpCLI 的小程序自动化测试插件 (构建新鲜度门、选择器重解析、几何断言),偏「测」。本插件走 IDE 官方内部 MCP,偏「用 IDE 干活」。两者可同时安装。
许可证
MIT © dsh-wechatide-mcp contributors
变更记录见 CHANGELOG.md。