Skip to main content
Glama
README.md
# JS Reverse MCP

基于 Chrome DevTools Protocol (CDP) 的 MCP 服务器,让 AI 编码助手(Claude、Cursor、Windsurf 等)能够直接控制浏览器进行 JavaScript 调试、逆向分析、网页抓取和 API 调试。

> 基于 [google-deepmind/chrome-devtools-mcp](https://github.com/google-deepmind/chrome-devtools-mcp) v0.10.2,添加了逆向工程相关工具增强。

## 功能特点

- **JS 调试**: 断点、单步执行、调用栈、作用域变量检查
- **脚本分析**: 搜索/获取所有加载的 JS 脚本源码,精确定位压缩文件中的位置
- **函数 Hook**: Hook 任意函数(包括 webpack/rollup 模块内部函数),记录调用和返回值
- **反混淆**: 基于 AST(Babel)的 `deobfuscate`——作用域安全的变量重命名、常量折叠、死代码/不可达代码消除、字符串/数字规范化
- **加密检测**: 自动识别 CryptoJS、WebCrypto 等加密库,Hook 加密调用
- **网络分析**: 请求拦截/修改/Mock、XHR 断点、WebSocket 监控、请求调用栈追踪
- **网页抓取**: CSS 选择器提取、表格/链接/结构化数据/元数据提取
- **API 调试**: 在浏览器上下文中发送 HTTP 请求,管理多账号 Token,Firebase 登录
- **Protobuf**: 编解码 Protobuf 消息,解析 gRPC-Connect API 响应
- **DOM 调试**: DOM 断点、表单监控、输入框变化追踪
- **全局变量**: 监控全局变量变化,快照对比找出差异
- **代码覆盖率**: 分析 JS 代码执行覆盖率,识别未使用的代码

## 系统要求

- [Node.js](https://nodejs.org/) v20.19 或更新版本(推荐 v22)
- [Chrome](https://www.google.com/chrome/) 稳定版

## 安装

```bash
git clone https://github.com/1600822305/js-reverse-mcp.git
cd js-reverse-mcp
npm install
npm run build
```

## MCP 客户端配置

### 方式一:自动启动 Chrome(推荐新手)

```json
{
  "mcpServers": {
    "js-reverse": {
      "command": "node",
      "args": ["/你的路径/js-reverse-mcp/build/src/index.js"]
    }
  }
}
```

### 方式二:连接已运行的 Chrome(推荐逆向场景)

**第一步**:以调试模式启动 Chrome(需先关闭所有 Chrome 窗口)

**Windows**

```bash
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%TEMP%\chrome-debug"
```

**macOS**

```bash
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug
```

**第二步**:配置 MCP 连接

```json
{
  "mcpServers": {
    "js-reverse": {
      "command": "node",
      "args": [
        "/你的路径/js-reverse-mcp/build/src/index.js",
        "--browser-url=http://127.0.0.1:9222"
      ]
    }
  }
}
```

### 方式三:WebSocket 连接(支持自定义 Header)

```json
{
  "mcpServers": {
    "js-reverse": {
      "command": "node",
      "args": [
        "/你的路径/js-reverse-mcp/build/src/index.js",
        "--ws-endpoint=ws://127.0.0.1:9222/devtools/browser/<id>",
        "--ws-headers={\"Authorization\":\"Bearer token\"}"
      ]
    }
  }
}
```

### Claude Code

```bash
claude mcp add js-reverse node /你的路径/js-reverse-mcp/build/src/index.js
```

### Cursor / Windsurf

进入 MCP 设置,添加上述 JSON 配置。

---

## 完整工具列表

### 脚本分析

| 工具                | 描述                                                   |
| ------------------- | ------------------------------------------------------ |
| `list_scripts`      | 列出页面中所有加载的 JS 脚本(含 URL、sourceMap 信息) |
| `get_script_source` | 获取脚本源码,支持行范围或字符偏移(适用于压缩文件)   |
| `find_in_script`    | 在脚本中查找文本,返回精确行号和列号及上下文           |
| `search_in_sources` | 在所有已加载脚本中搜索字符串或正则表达式               |

### 断点管理

| 工具                     | 描述                                                 |
| ------------------------ | ---------------------------------------------------- |
| `set_breakpoint`         | 在指定 URL 和行号设置断点,支持条件断点              |
| `set_breakpoint_on_text` | 通过搜索代码文本自动定位并设置断点(适用于压缩代码) |
| `remove_breakpoint`      | 移除断点                                             |
| `list_breakpoints`       | 列出所有活动断点                                     |

### 调试控制

| 工具                    | 描述                             |
| ----------------------- | -------------------------------- |
| `get_paused_info`       | 获取暂停状态、调用栈和作用域变量 |
| `resume`                | 恢复执行                         |
| `pause`                 | 暂停执行                         |
| `step_over`             | 单步跳过(不进入函数体)         |
| `step_into`             | 单步进入函数                     |
| `step_out`              | 单步跳出当前函数                 |
| `evaluate_on_callframe` | 在暂停的调用帧上下文中求值表达式 |

### 函数 Hook 与追踪

| 工具              | 描述                                                                                         |
| ----------------- | -------------------------------------------------------------------------------------------- |
| `hook_function`   | Hook 全局函数或对象方法(如 `fetch`、`XMLHttpRequest.prototype.open`),记录调用参数和返回值 |
| `unhook_function` | 移除函数 Hook                                                                                |
| `list_hooks`      | 列出所有活动的 Hook                                                                          |
| `trace_function`  | 追踪任意函数调用(包括 webpack/rollup 打包的模块内部函数),使用条件断点实现,不暂停执行     |

### 网络调试

| 工具                         | 描述                                                                                                                         |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `list_network_requests`      | 列出页面所有网络请求(基于 DevTools 面板)                                                                                   |
| `break_on_xhr`               | 设置 XHR/Fetch URL 断点                                                                                                      |
| `remove_xhr_breakpoint`      | 移除 XHR 断点                                                                                                                |
| `search_network`             | 在 CDP 抓包仓库中按 URL/方法/状态/资源类型检索,支持跨请求/响应体全文搜索(导航后仍保留)                                    |
| `get_response_body`          | 按数字 id 获取抓到的完整响应体(二进制返回 base64)                                                                          |
| `export_har`                 | 将抓到的网络流量导出为 HAR 1.2 文件(可含响应体)                                                                            |
| `replay_request`             | 在页面上下文用 `fetch()` 重放抓到的请求(带 Cookie),可覆盖 URL/方法/头/体                                                  |
| `add_network_rule`           | 新增拦截规则(替代旧 `intercept_requests`):单一 Fetch 派发器,多规则共存,支持 Request/Response 两个阶段,可改写真实响应体 |
| `list_network_rules`         | 列出活动拦截规则及命中统计                                                                                                   |
| `remove_network_rule`        | 按 id 移除拦截规则(移除最后一条后自动关闭 Fetch 拦截)                                                                      |
| `monitor_websocket`          | 通过 CDP 原生事件捕获 WebSocket 帧(含导航前/二进制帧,不可被页面探测)                                                      |
| `stop_websocket_monitor`     | 停止 WebSocket 捕获(已抓数据保留)                                                                                          |
| `list_websocket_connections` | 列出追踪的 WebSocket 连接及收发计数                                                                                          |
| `list_websocket_messages`    | 列出抓到的 WebSocket 帧,可按连接/方向/URL/内容过滤(二进制显示为 base64)                                                   |
| `monitor_eventsource`        | 通过 CDP 捕获 Server-Sent Events (EventSource) 消息                                                                          |
| `stop_eventsource_monitor`   | 停止 SSE 捕获                                                                                                                |
| `list_eventsource_messages`  | 列出抓到的 SSE 消息,可按 URL/内容过滤                                                                                       |
| `set_network_conditions`     | 模拟网络条件(离线/限速/延迟)并可覆盖 User-Agent(CDP Network 域)                                                          |
| `set_extra_headers`          | 为后续所有请求设置额外 HTTP 头(传空对象清除)                                                                               |
| `clear_network_conditions`   | 重置网络模拟、UA 覆盖与额外头                                                                                                |

### API 调试与 Token 管理

| 工具                 | 描述                                                                        |
| -------------------- | --------------------------------------------------------------------------- |
| `api_request`        | 在浏览器上下文中发送 HTTP 请求(共享 Cookie 和 Origin),支持自动注入 Token |
| `save_token`         | 保存认证 Token(支持 Firebase/JWT/API Key/Bearer 等类型)                   |
| `list_tokens`        | 列出所有已保存的 Token                                                      |
| `set_active_token`   | 设置当前活动 Token                                                          |
| `delete_token`       | 删除已保存的 Token                                                          |

### Protobuf / gRPC

| 工具              | 描述                                                                                        |
| ----------------- | ------------------------------------------------------------------------------------------- |
| `encode_protobuf` | 将字段编码为 Protobuf 二进制(无需 .proto 文件)                                            |
| `decode_protobuf` | 解码 Protobuf 二进制:传入 `data`(Hex/Base64)或 `url`(自动请求并解析 gRPC-Connect 响应) |

### 网页抓取

| 工具                | 描述                                                                                                                                                                                                                                                                                                                                                                  |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `extract`           | 统一抽取工具,用 `type` 选择模式:elements(CSS 选择器取文本/属性/innerHTML)/ structured(字段 Schema,可跨 `containerSelector` 取列表,字段可取属性或 innerHTML)/ links(链接,支持 URL 正则过滤)/ table(表格行列)/ textBlocks(按标题层级分块)。`auto`(默认)有 `fields` 走 structured 否则 elements;可先 `clickSelector`+`waitForSelector`/`waitMs` 再抽取 |
| `extract_metadata`  | 提取页面元数据(JSON-LD、Open Graph、Twitter Card、标准 meta)                                                                                                                                                                                                                                                                                                        |
| `extract_form_data` | 提取表单结构和当前值(含隐藏字段;默认返回所有表单、密码打码)                                                                                                                                                                                                                                                                                                        |

### 加密检测与分析

| 工具                     | 描述                                                                                                 |
| ------------------------ | ---------------------------------------------------------------------------------------------------- |
| `detect_encryption`      | 检测加密库/算法/编码:`scope` 可选 page(运行时全局,默认)/scripts(扫描所有脚本源码中的加密函数)/both |
| `analyze_encoded_string` | 分析字符串的编码类型(Base64/Hex/JWT/URL 编码等)并解码                                              |
| `hook_crypto_functions`  | 自动 Hook CryptoJS、JSEncrypt、Web Crypto API 等常见加密库                                           |

### 反混淆

| 工具              | 描述                                                                                                  |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| `beautify_script` | 美化压缩/混淆的 JavaScript 代码                                                                       |
| `deobfuscate`     | 基于 AST(Babel)的反混淆:作用域安全的变量重命名、常量折叠、死代码/不可达代码消除、字符串/数字规范化 |

### 代码覆盖率

| 工具                | 描述                                               |
| ------------------- | -------------------------------------------------- |
| `start_js_coverage` | 开始收集 JavaScript 代码覆盖率(若已在收集会提示) |
| `stop_js_coverage`  | 停止收集并生成报告,可按覆盖率阈值过滤             |

### 全局变量监控

| 工具               | 描述                                           |
| ------------------ | ---------------------------------------------- |
| `list_globals`     | 列出页面上所有自定义全局变量(排除浏览器内置) |
| `watch_global`     | 监控全局变量变化,记录修改时的调用栈           |
| `unwatch_global`   | 停止监控全局变量                               |
| `list_watchers`    | 列出所有活动的变量监控器                       |
| `snapshot_globals` | 创建全局变量快照                               |
| `diff_globals`     | 对比快照找出新增/修改的全局变量                |

### DOM 断点与表单

| 工具                          | 描述                             |
| ----------------------------- | -------------------------------- |
| `break_on_subtree_modified`   | DOM 子树修改时触发断点           |
| `break_on_attribute_modified` | 元素属性修改时触发断点           |
| `break_on_node_removed`       | 元素被删除时触发断点             |
| `remove_dom_breakpoint`       | 移除 DOM 断点                    |
| `monitor_form_submit`         | 监控表单提交,捕获所有字段值     |
| `stop_form_monitor`           | 停止表单监控                     |
| `monitor_input_changes`       | 实时监控输入框变化(包括密码框) |
| `stop_input_monitor`          | 停止输入监控                     |

### 检查工具

| 工具             | 描述                                       |
| ---------------- | ------------------------------------------ |
| `inspect_object` | 深度检查 JavaScript 对象结构、原型链和方法 |
| `get_storage`    | 获取 Cookie、localStorage、sessionStorage  |
| `monitor_events` | 监控元素或 window 上的 DOM 事件            |
| `stop_monitor`   | 停止事件监控                               |

### 页面导航

| 工具            | 描述                               |
| --------------- | ---------------------------------- |
| `list_pages`    | 列出浏览器中所有打开的页面         |
| `select_page`   | 选择一个页面作为调试上下文         |
| `new_page`      | 创建新页面并导航到 URL             |
| `navigate_page` | 导航当前页面(支持前进/后退/刷新) |

### 页面交互

| 工具                    | 描述                            |
| ----------------------- | ------------------------------- |
| `take_screenshot`       | 截取页面截图(支持全页面/元素) |
| `take_snapshot`         | 获取页面无障碍树快照            |
| `evaluate_script`       | 在页面中执行 JavaScript         |
| `list_console_messages` | 获取控制台消息                  |

---

## 使用示例

### 逆向加密参数

```
1. list_pages → 选择目标页面
2. search_in_sources "encrypt" → 找到加密函数位置
3. set_breakpoint_on_text "encryptData(" → 在加密函数入口设断点
4. 触发页面操作 → 断点命中
5. get_paused_info → 查看参数和调用栈
6. evaluate_on_callframe "arguments[0]" → 查看明文数据
```

### Hook 所有网络请求

```
hook_function "fetch" → 记录所有 fetch 调用的 URL、参数和响应
hook_function "XMLHttpRequest.prototype.open" → 同时监控 XHR
```

### 分析 Protobuf API

```
1. list_network_requests → 找到 content-type: application/proto 的请求
2. decode_protobuf url="https://..." → 直接请求并解码响应
```

### 代码覆盖率分析

```
1. start_js_coverage
2. 与页面交互,触发业务流程
3. stop_js_coverage minCoverage=30 → 只显示覆盖率低于30%的脚本(找死代码)
```

### 反混淆流程

```
1. list_scripts → 找到混淆脚本的 scriptId
2. deobfuscate scriptId="..." → AST 反混淆(变量重命名 + 常量折叠 + 死代码消除 + 字符串/数字规范化)
3. deobfuscate scriptId="..." aggressive=true → 更激进地重命名短名/_0x 前缀名
4. (仅需美化时)beautify_script scriptId="..." → 纯格式化
```

---

## CLI 配置选项

| 选项                      | 描述                                              | 默认值   |
| ------------------------- | ------------------------------------------------- | -------- |
| `--browser-url, -u`       | 连接到已运行的 Chrome(HTTP URL)                 | —        |
| `--ws-endpoint, -w`       | 连接到已运行的 Chrome(WebSocket URL)            | —        |
| `--ws-headers`            | WebSocket 连接的自定义 Header(JSON 格式)        | —        |
| `--headless`              | 无头模式运行                                      | `false`  |
| `--executable-path, -e`   | 自定义 Chrome 可执行文件路径                      | —        |
| `--isolated`              | 使用临时用户数据目录,关闭后自动清理              | `false`  |
| `--channel`               | Chrome 通道:`stable` / `canary` / `beta` / `dev` | `stable` |
| `--viewport`              | 初始视口大小,如 `1280x720`                       | —        |
| `--proxy-server`          | Chrome 代理服务器配置                             | —        |
| `--accept-insecure-certs` | 忽略 SSL 证书错误(自签名/过期证书)              | `false`  |
| `--log-file`              | 调试日志输出路径                                  | —        |
| `--no-category-network`   | 禁用所有网络相关工具                              | —        |
| `--chrome-arg`            | 传递额外参数给 Chrome(可多次指定)               | —        |

---

## 安全提示

此工具将浏览器内容完整暴露给 MCP 客户端,允许检查、调试和修改浏览器中的任何数据(包括 Cookie、Token、请求内容)。请勿在含有敏感信息的页面上使用,并确保 MCP 客户端来源可信。

## 许可证

Apache-2.0 — Copyright 2025 Google LLC