jjx-js-reverse-mcp
by Junjianxin
README.md
# jjx-js-reverse-mcp
[English README](README.en.md)
统一的 JavaScript 逆向 MCP:全量 Hook / 断点 / 脚本调试 + 浏览器操作链路 + CDP 反检测。
一个进程只连接**一个**浏览器,解决同时挂 `js-reverse-mcp` 与 `chrome-devtools-mcp` 导致开两个窗口的问题。
> **模式由启动参数决定,不是由对话提示词决定。**
> 提示词无法让 MCP「自动识别」ATTACH / LAUNCH;要换模式请改 `mcp.json` 后 Reload,或注册两套 MCP 条目后选用。
## 快速选型
| 你的场景 | 推荐模式 | 关键参数 |
|----------|----------|----------|
| 已用 bat / 手动开浏览器并登录,要保登录态 | **ATTACH** | `--remoteDebuggingPort 9333`(或你的端口) |
| 从零自动化、可重登、不在乎黄条 | **LAUNCH** | `--executablePath` + 建议 `--isolated` |
| 日常逆向、减少 Agent 工具噪声 | 任意模式 + | `--toolProfile slim`(含 AI 反混淆/理解,不含 heap/trace) |
| 只做侦察(读脚本/网络,禁导航关页) | 任意模式 + | `--toolProfile observe` |
| 专注 Hook / 断点 | 任意模式 + | `--toolProfile hook` |
| 需要性能 trace / 堆快照 / 深层 Wasm decompile | 任意模式 + | `--toolProfile full`(默认) |
| 纯调试、关闭 CDP leak guard | 任意模式 + | `--no-stealth` |
---
## 双模式浏览器生命周期
| 模式 | 何时使用 | CLI(互斥) | 退出时 |
|------|----------|-------------|--------|
| **ATTACH** | 浏览器已带 `--remote-debugging-port` 打开,并已访问目标站 | `--browserUrl` / `--remoteDebuggingPort` / `--wsEndpoint` / `--autoConnect` | 只 `disconnect`,**不杀**用户浏览器 |
| **LAUNCH** | 需要 MCP 自己启动 Chrome/CloakBrowser | `--executablePath` / `--channel` | 关闭 MCP 启动的实例 |
- ATTACH 与 LAUNCH 参数**互斥**(不能同时写 `--remoteDebuggingPort` 和 `--executablePath`)。
- ATTACH 失败时**不会**偷偷新开浏览器(避免「以为接管,其实又起了一个」)。
- 运行时可调 `attach_browser` 动态接管;**没有**对称的「动态 launch」工具——真要自启必须用 LAUNCH 启动参数。
工具:`get_browser_mode` / `attach_browser` / `check_browser_health`
### ATTACH:CLI 示例
```bash
# 1) 手动启动(桌面 bat 常用 9333;也可 9222)
"你的chrome.exe路径" ^
--remote-debugging-port=9333 --remote-allow-origins=*
# 2) 在浏览器里打开目标站并登录
# 3) MCP 接管(端口必须一致)
node build/src/index.js --remoteDebuggingPort 9333 --toolProfile slim
# 或
node build/src/index.js --browserUrl http://127.0.0.1:9333 --toolProfile slim
```
### LAUNCH:CLI 示例
```bash
node build/src/index.js ^
--executablePath "你的chrome.exe路径" ^
--isolated ^
--toolProfile slim
```
---
## Cursor `mcp.json`:按场景复制
全局配置路径一般是:`%USERPROFILE%\.cursor\mcp.json`
改完后务必:**Settings → Tools & MCP → Reload** 对应 server。
路径请按本机修改:`你的jjx-js-reverse-mcp路径`、`你的chrome.exe路径`。
### 场景 1 — ATTACH 日常逆向(推荐)
适合:保登录态、少开新窗、配合 `Cloak Browser.bat`。
```json
{
"mcpServers": {
"jjx-js-reverse-mcp": {
"command": "cmd",
"args": [
"/c",
"node",
"你的jjx-js-reverse-mcp路径/build/src/index.js",
"--remoteDebuggingPort",
"9333",
"--toolProfile",
"slim"
]
}
}
}
```
流程:先开 bat → 手动打开目标站 → Reload MCP(若未加载)→ 对话里要求「禁止 new_page / 禁止 launch,先 list_pages」。
### 场景 2 — ATTACH 经典 9222
浏览器用 `--remote-debugging-port=9222` 启动时:
```json
{
"mcpServers": {
"jjx-js-reverse-mcp": {
"command": "cmd",
"args": [
"/c",
"node",
"你的jjx-js-reverse-mcp路径/build/src/index.js",
"--remoteDebuggingPort",
"9222",
"--toolProfile",
"slim"
]
}
}
}
```
### 场景 3 — LAUNCH 自启 Cloak(自动化 / 可重登)
适合:不需要已有登录态;接受可能出现「Chrome 正受到自动测试软件的控制」黄条。
```json
{
"mcpServers": {
"jjx-js-reverse-mcp": {
"command": "cmd",
"args": [
"/c",
"node",
"你的jjx-js-reverse-mcp路径/build/src/index.js",
"--executablePath",
"你的chrome.exe路径",
"--isolated",
"--toolProfile",
"slim"
]
}
}
}
```
- `--isolated`:临时 profile,减少「browser already running / profile 占用」。
- 不要与已占用同一 profile 的 bat 实例抢目录;冲突时先关多余浏览器,或改回 ATTACH。
### 场景 4 — 两套并存(ATTACH + LAUNCH,对话时选用)
不想反复改配置时,注册两个 server,在 Cursor 里启用/选用对应那一个:
```json
{
"mcpServers": {
"jjx-attach": {
"command": "cmd",
"args": [
"/c",
"node",
"你的jjx-js-reverse-mcp路径/build/src/index.js",
"--remoteDebuggingPort",
"9333",
"--toolProfile",
"slim"
]
},
"jjx-launch": {
"command": "cmd",
"args": [
"/c",
"node",
"你的jjx-js-reverse-mcp路径/build/src/index.js",
"--executablePath",
"你的chrome.exe路径",
"--isolated",
"--toolProfile",
"slim"
]
}
}
}
```
注意:两个都启用时,Agent 可能调到「错的」那套;提示词里写明用 `jjx-attach` 或 `jjx-launch`,或只启用其中一个。
### 场景 5 — 工具面更小(observe / hook)
只改 `--toolProfile`,模式参数不变。
**侦察(更少工具、决策更快):**
```text
--toolProfile observe
```
**Hook / 断点为主:**
```text
--toolProfile hook
```
**全量(含 performance / heapsnapshot / 重型 AI / 深层 Wasm):**
```text
--toolProfile full
```
| Profile | 大约用途 | 说明 |
|---------|----------|------|
| `full` | 全能力 | 默认;含 `close_page`、performance trace、heapsnapshot、深层 Wasm |
| `slim` | 日常逆向 | 推荐;含 `deobfuscate_code` / `understand_code` / `analyze_wasm_module`;**不含** `close_page`(防误关登录页)、不含 heap/trace |
| `observe` | 只读侦察 | **不含** `navigate_page` / `new_page` / `close_page` / 点击填表 |
| `hook` | Hook + 调试 | 聚焦注入与断点 |
### 场景 6 — 关闭 Stealth(纯调试)
在 ATTACH 或 LAUNCH 的 `args` 末尾追加:
```text
"--no-stealth"
```
强风控站点逆向一般保持默认 Stealth(勿加该项)。
### 场景 7 — ATTACH 自动探测端口
探测本机 `9222–9225`;找不到则**报错且不 launch**:
```json
{
"mcpServers": {
"jjx-js-reverse-mcp": {
"command": "cmd",
"args": [
"/c",
"node",
"你的jjx-js-reverse-mcp路径/build/src/index.js",
"--autoConnect",
"--toolProfile",
"slim"
]
}
}
}
```
桌面 bat 若固定 **9333**,不在 9222–9225 范围内时请用场景 1 的显式端口,不要依赖 `--autoConnect`。
---
## 提示词与配置的关系
| 你想做的事 | 正确做法 |
|------------|----------|
| 接管 bat 已开浏览器 | `mcp.json` 用 ATTACH + 端口一致;提示词写「禁止 launch / new_page」 |
| MCP 自己开浏览器 | `mcp.json` 改成 LAUNCH 并 Reload(或用 `jjx-launch` 条目) |
| 只改提示词切换模式 | **无效**——服务端不读聊天内容 |
本地可参考话术模版:
- `你的ATTACH模式提示词模版路径`
- `你的LAUNCH模式提示词模版路径`
更多说明:[docs/guides/browser-modes.md](./docs/guides/browser-modes.md)、[docs/guides/anti-detect.md](./docs/guides/anti-detect.md)
---
## CDP 反检测(精简)
默认开启基础 **CDP leak guard**(可用 `--no-stealth` 关闭):
1. **`CdpLeakGuard`**:清理 `cdc_*` / selenium 全局、修补 `navigator.webdriver`、最小 `chrome.*`、Error stack 脱敏;新文档预注入 + 导航后补注
2. **`evaluate_script` / 注入路径**:优先 CDP `Runtime.evaluate`,减少 `__puppeteer_evaluation_script__` 泄漏
3. **已移除**:`StealthScripts2025`(Chrome 131 UA / Canvas / WebGL / Audio 等指纹伪装)——过时且易与真实内核冲突
工具:`enable_cdp_guard` / `inject_stealth`(等同基础 guard)/ `stealth_status`
手动 UA:`set_user_agent`(不改 Client Hints)
> 强风控请用 **CloakBrowser 原生指纹 + 真实登录态 ATTACH**。本 MCP 不做「可过强检测」的全家桶 stealth;协议级方案(如 rebrowser-patches)需单独集成,未内置。
详见 [docs/guides/anti-detect.md](./docs/guides/anti-detect.md)。
---
## 能力概览
- Hook:`create_hook` / `inject_hook`(默认 persist 跨导航)/ `get_hook_data` / `remove_hook`(顺带清页面 store)/ `hook_function` …
- 调试:脚本源码、断点、XHR break、步进、callframe evaluate(`hook_function` 等走 CDP `safeEvaluateIife`)
- 浏览器:导航、snapshot+uid 点击/填表、`fill_form`、网络/控制台、会话态
- 逆向:采集、反混淆、加密检测、Wasm、rebuild、证据导出
- 观测:`performance_*`(含 Insight)、`take_heapsnapshot`、轻量 `page_vitals_audit`——多在 `full`;`performance_start_trace` 的 `reload` **默认 false**
- 采集保会话:已在目标 URL 时 `collect_code` / `collect_wasm` 默认不 `goto`;显式 `forceNavigate=true` 才刷新;MCP 选中页上**不会**强改 UA
- DOM / session:`query_dom`、存取 localStorage 等优先 CDP,减少 puppeteer sourceURL 泄漏
## 稳定性注意(逆向流程)
1. **先 `list_pages` + `select_page`**:未选中页时 collector 会直接报错,**不会**再偷偷连默认 9222。
2. **`collect_code` 只采集一次**:修复了旧版 `returnMode=full` 双次 `collect`;大站优先 `returnMode=summary`。
3. **`inject_hook` 默认 persist**:导航后 hook 仍在;若 hook 了 `JSON.stringify` 等全局,可能干扰后续页内 JSON 序列化——慎用或及时 `remove_hook` / 刷新。
4. **`restore_session_state` 默认不导航**:需跳转时传 `navigateToSavedUrl=true`。
5. **`attach_browser`**:若当前是 LAUNCH 会话,shutdown 会关掉自启浏览器再改连(响应里有 `previousLaunchClosed`)。
6. **`--autoConnect` 只扫 9222–9225**:其他端口请用 `--remoteDebuggingPort`。
---
## 开发
```bash
npm install
npm run build
npm start -- --remoteDebuggingPort 9333 --toolProfile slim
```
压测:
```bash
# LAUNCH + ATTACH 主流程
node scripts/stress-reverse-flow.mjs
# 扫描修复项回归(profile / safeEval / getActivePage / hook persist)
node scripts/stress-fix-regression.mjs
```
要求:Node `^20.19 || ^22.12 || >=23`
## License
Apache-2.0。基于 [chrome-devtools-mcp](https://github.com/ChromeDevTools/chrome-devtools-mcp) 与 [js-reverse-strong-mcp](https://github.com/lwjjike/JSReverser-Strong-MCP) 演进,见 [NOTICE](./NOTICE)。
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues