Skip to main content
Glama
README.md
# WeChat DevTools MCP

Local MCP server that lets an AI agent drive WeChat DevTools on Windows: the official CLI for project operations, and the official mini program automation SDK for simulator control.

把微信开发者工具接到 AI 的本地 MCP 服务。控制面分两层:

- **官方 CLI**:打开项目、关闭项目、退出 IDE、登录、预览、构建 npm、上传(默认禁用)。
- **官方自动化 SDK**:连接模拟器,做页面跳转、元素查询/点击/输入、截图、`evaluate`、调用 `wx` API、原生弹窗操作。

不使用改包、注入或私有协议。实现只依赖官方 CLI、`miniprogram-automator` 和本地进程管理。

## 环境要求

- Windows,已安装微信开发者工具。默认路径:
  `C:\Program Files (x86)\Tencent\微信web开发者工具`
- Node.js >= 20。
- 开发者工具里开启 **设置 → 安全设置 → 服务端口(CLI/HTTP 调用)**。自动化必需。
- 预览、上传需要开发者工具已登录。
- `touristappid` 只能用于本地模拟器自动化;CLI 的 open/build-npm/preview 需要真实 AppID。

## 安装

```bash
git clone https://github.com/sdjvhbuw/wechat-devtools-mcp.git
cd wechat-devtools-mcp
npm install
npm start
```

MCP 走 stdio,日志只写 stderr,不会污染协议输出。

## 项目结构

```text
src/runtime.js       路径、CLI 调用、IDE 端口检测、残留状态清理
src/session.js       自动化连接生命周期、复用/重启、页面轮询
src/server.js        MCP 工具注册与参数校验
scripts/e2e.js       模拟器自动化回归
scripts/cli-e2e.js   open/close/preview/quit/恢复回归
scripts/smoke.js     最小联调脚本
test-fixtures/       测试用小程序(touristappid)
```

### 环境变量

| 变量                                      | 作用                                          | 默认                                               |
| ----------------------------------------- | --------------------------------------------- | -------------------------------------------------- |
| `WECHAT_DEVTOOLS_DIR`                     | 开发者工具安装目录                            | `C:\Program Files (x86)\Tencent\微信web开发者工具` |
| `WECHAT_DEVTOOLS_PROJECT`                 | 默认小程序项目目录                            | 空                                                 |
| `WECHAT_DEVTOOLS_AUTOMATION_PORT`         | 自动化端口                                    | `9420`                                             |
| `WECHAT_DEVTOOLS_MCP_OUTPUT_DIR`          | 截图输出目录                                  | `<repo>/output`                                    |
| `WECHAT_DEVTOOLS_MCP_ALLOW_UPLOAD`        | 设为 `1` 才允许上传工具                       | 未设置                                             |
| `WECHAT_DEVTOOLS_SKIP_SERVICE_PORT_CHECK` | 设为 `1` 跳过预检查                           | 未设置                                             |
| `WECHAT_DEVTOOLS_NO_STALE_CLEANUP`        | 设为 `1` 禁止清理退出后残留的 `.ide` 端口文件 | 未设置                                             |

CLI 需要 token 时用 `WECHAT_DEVTOOLS_CLI_TOKEN`(不通过工具参数传递)。

## 接入 MCP 客户端

Qoder、Claude Desktop、Cursor、Codex 等客户端都使用同样的 stdio 配置。把路径换成仓库的实际绝对路径:

```json
{
  "mcpServers": {
    "wechat-devtools": {
      "command": "node",
      "args": ["C:/path/to/wechat-devtools-mcp/src/server.js"],
      "env": {
        "WECHAT_DEVTOOLS_PROJECT": "C:/path/to/your-miniprogram",
        "WECHAT_DEVTOOLS_AUTOMATION_PORT": "9420"
      }
    }
  }
}
```

Qoder 写在 `~/.qoder/settings.json`,其他客户端按各自文档放到对应位置。修改后重启客户端或重载 MCP。

## 启动与退出恢复

- 调用 open / login / preview / build-npm / auto_start 前,先确保 IDE 以正常 GUI 方式启动,再交给 CLI,避免 CLI 冷启动时抢在服务端口就绪之前检查。
- 开发者工具退出后可能残留 `Default/.ide` 和 `.ide-status=On`,导致 CLI 一直等待旧端口。检测到端口已关闭且文件超过 15 秒未更新时,会备份为 `.ide.stale-<时间>` 并清理,同时把状态写为 `Off`。
- `wdt_quit` 会等待实际 `.ide` 端口关闭(最多 40 秒),然后清理残留。
- 不想让 MCP 动这些状态文件时设 `WECHAT_DEVTOOLS_NO_STALE_CLEANUP=1`。
- 手动改过安全设置后,可先用 `wdt_status` 看 `ide.portOpen`、`servicePort.configured` 和 `servicePort.ok`(`ok` 表示配置已开启且 IDE 端口当前真的在线)。

## 工具

### 环境与 CLI

- `wdt_status`:工具路径、服务端口开关、自动化连接、端口占用。
- `wdt_open` / `wdt_close_project` / `wdt_quit`:打开、关闭项目、退出 IDE。`wdt_quit` 会等待 IDE 端口关闭(最多 40 秒)。
- `wdt_login` / `wdt_is_login`:触发扫码登录 / 检查登录状态。
- `wdt_preview`:生成预览二维码(terminal/image/base64)。image/base64 未给路径时自动写入 output。
- `wdt_build_npm`:构建 npm;失败时返回 `ok=false` 和可读 `hint`。
- `wdt_upload`:上传版本。默认禁用,需环境变量 + `confirm=true`。

### 自动化

- `wdt_auto_start`:启动并连接自动化端口。默认复用已有连接;`restart=true` 强制重启。总预算默认 45 秒。
- `wdt_auto_connect` / `wdt_disconnect`:连接已有端口 / 断开。
- `wdt_current_page`:当前页面与页面栈。
- `wdt_navigate`:navigateTo / redirectTo / reLaunch / switchTab / navigateBack;默认按 `app.json` 校验页面,动态页面可传 `validate=false`。
- `wdt_query`:按 CSS 选择器查询元素摘要。
- `wdt_element`:tap、input、text、attribute、wxml、trigger、scrollTo、scrollWidth/Height、swipeTo、slideTo、callMethod 等动作。`slideTo` 会补发 change 事件。
- `wdt_wait`:等待选择器或毫秒数(最长 60 秒)。
- `wdt_page_data`:读取/修改页面 data,或调用页面方法(SDK 调用失败时自动用 evaluate 回退)。
- `wdt_screenshot`:模拟器截图,返回 PNG 路径。
- `wdt_evaluate`:执行表达式/语句/函数;表达式自动包成函数,可用 `$args` 访问参数。
- `wdt_wx_method`:调用 `wx` API。
- `wdt_native`:goHome、确认/取消弹窗、授权、分享等原生动作。
- `wdt_system_info`:`systemInfo()`。

## 联调

```bash
node scripts/smoke.js "C:/path/to/your-miniprogram"
```

脚本会依次执行:状态检查 → 启动自动化 → 当前页面 → 查询 `view` → 截图 → 断开。任何一步失败都会返回 CLI 输出,便于定位服务端口或登录问题。

回归测试:

```bash
npm run test:e2e   # 55 项:输入/点击/滑动/滚动/跳转/求值/错误路径
npm run test:cli   # open/close/preview/build/quit/恢复
```

`test:cli` 会退出并重新拉起 IDE,运行前保存好未提交的工作。open/preview 需要真实 AppID,用环境变量提供你自己的小程序项目;未提供时相关用例标记为 SKIP:

```bash
# PowerShell
$env:WECHAT_DEVTOOLS_TEST_USER_PROJECT="C:/path/to/your-miniprogram"
npm run test:cli
```

测试用小程序在 `test-fixtures/miniprogram`,只用于模拟器自动化。

## 安全边界

- `wdt_upload` 默认不可用,避免 AI 误发布;需要显式设置环境变量并传 `confirm=true`。
- `wdt_quit`、`wdt_close_project`、`wdt_upload` 标记为 destructive;调用前应确认。
- `wdt_evaluate` 和 `wdt_wx_method` 属于本地任意执行能力,只在可信项目中使用。
- MCP 只监听 stdio,不开放网络端口;请不要把 `wdt_evaluate` 暴露给不可信输入。
- 本项目只操作微信开发者工具及其模拟器,不控制微信客户端本身。
- `miniprogram-automator` 的 `jimp`/`phin` 链仍有 5 个 moderate 上游告警;critical/high 已通过 npm overrides 处理。详见 [SECURITY.md](SECURITY.md)。

## 已知限制

- 仅支持 Windows。
- 只覆盖“项目 + 模拟器”两层;IDE 自身的菜单、设置面板等界面级操作未实现。
- `wdt_preview` / `wdt_upload` 需要开发者工具已登录;`touristappid` 不能用于 CLI 的 open/build/preview。
- 微信开发者工具升级后,CLI 参数或自动化协议可能变化;请先跑 `npm run test:e2e`。

## 版本管理

版本号遵循 SemVer,变更记录见 [CHANGELOG.md](CHANGELOG.md)。发布前建议:

```bash
npm run check
npm run format:check
npm run test:e2e
```

## License

[MIT](LICENSE)