{"repo":"zhizhuodemao/js-reverse-mcp","free":true,"listed":false,"github":"https://github.com/zhizhuodemao/js-reverse-mcp","clone":"git clone https://github.com/zhizhuodemao/js-reverse-mcp.git","description":"AI Agent-first JS 逆向 MCP Server：有头 Chrome 调试、断点、网络/WebSocket 分析、Patchright 反检测，可选 CloakBrowser。","language":"TypeScript","stars":2512,"topics":["anti-detection","browser-automation","cdp","chrome-devtools","debugging","javascript","mcp","mcp-server","patchright","reverse-engineering","websocket"],"license":"Apache-2.0","category":"anti_scraping","readme_excerpt":"# JS Reverse MCP\n\n[English](README_en.md) | 中文\n\nAI-first / AI-native 的 JavaScript 逆向工程 MCP Server，让你的 AI 编码助手（如 Claude、Cursor、Copilot）能够像分析师一样持续调试、定位、保存和复盘网页中的 JavaScript 行为。\n\n它不是把 Chrome DevTools API 原样搬给模型，而是把脚本、断点、网络、WebSocket、浏览器状态和本地文件 I/O 重新组织成适合 AI Agent 连续推理和操作的工具。反检测是其中一部分能力：默认基于 [Patchright](https://github.com/Kaliiiiiiiiii-Vinyzu/patchright-nodejs) 协议层 stealth，对强反爬站点可选启用 [CloakBrowser](https://github.com/CloakHQ/CloakBrowser) 源码层指纹模式。\n\n## ☁️ 赞助 · Sponsored by Bloome\n\n<p align=\"center\">\n  <a href=\"https://bloome.im/app?ref=zhizhuodemao&amp;utm_medium=github&amp;utm_source=zhizhuodemao-js-reverse-mcp-ivor-202607\">\n    <img src=\"images/广告图片.png\" alt=\"Bloome：Accelerating the world's transition to human-agent teams\" width=\"100%\">\n  </a>\n</p>\n\nBloome 是一个 AI Agent IM 平台：不是你对着一个 bot 单打独斗，而是让多个 AI agent（Claude、ChatGPT、DeepSeek 等）和你待在同一个群聊里协作。\n\n把任务丢进对话，它们会自动分工——起草、交叉核对、补全细节，彼此挑错、互相补位，直到结果靠谱为止，并直接在对话里生成表格、文档和可视化看板。还能按计划 7×24 自动运行（比如每天定时整理报表发进频道），零本地配置、云端运行，网页和手机都能用；配好的 agent 一键分享给团队，无需各自部署。\n\n一句话：把\"我 + 一个助手\"升级成\"我的团队 + 一群会协作的 agent\"。\n\n👉 试试 [Bloome](https://bloome.im/app?ref=zhizhuodemao&utm_medium=github&utm_source=zhizhuodemao-js-reverse-mcp-ivor-202607)\n\n## 功能特点\n\n- **AI-native 工具设计**：工具粒度、输出边界和错误提示都围绕 Agent 决策设计，避免把模型推向无效下一步\n- **可复盘工作流**：脚本源码、网络原始数据、二进制结果都能导出到本地文件，再作为后续分析输入\n- **断点上下文执行**：暂停时可直接在 call frame 中求值，检查作用域变量，单步执行并返回源码上下文\n- **脚本分析**：列出所有加载的 JS，搜索代码，获取/保存源码，自动格式化大型压缩脚本\n- **网络与 WebSocket 分析**：请求调用栈、XHR 断点、Set-Cookie 识别、原始 body/header 导出、WebSocket 消息分组\n- **浏览器状态重放**：清理当前站点 cookies / cache / storage / sessionStorage，配合 reload 复现 cookie 和风控流程\n- **默认有头 + 持久化登录态**：看得到浏览器，cookies / localStorage 跨会话保留\n- **可选反检测层**：Patchright 协议层 stealth 默认启用；强反爬站点可加 `--cloak` 使用 CloakBrowser 二进制\n\n## 系统要求\n\n- [Node.js](https://nodejs.org/) v20.19 或更新版本\n- [Chrome](https://www.google.com/chrome/) 稳定版\n\n## 快速开始（npx）\n\n无需安装，直接在 MCP 客户端配置中添加：\n\n```json\n{\n  \"mcpServers\": {\n    \"js-reverse\": {\n      \"command\": \"npx\",\n      \"args\": [\"js-reverse-mcp\"]\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add js-reverse npx js-reverse-mcp\n```\n\n### Codex\n\n```bash\ncodex mcp add js-reverse -- npx js-reverse-mcp\n```\n\n### Cursor\n\n进入 `Cursor Settings` -> `MCP` -> `New MCP Server`，使用上面的配置。\n\n### VS Code Copilot\n\n```bash\ncode --add-mcp '{\"name\":\"js-reverse\",\"command\":\"npx\",\"args\":[\"js-reverse-mcp\"]}'\n```\n\n## 本地安装（可选）\n\n```bash\ngit clone https://github.com/zhizhuodemao/js-reverse-mcp.git\ncd js-reverse-mcp\nnpm install\nnpm run build\n```\n\n然后在 MCP 配置中使用本地路径：\n\n```json\n{\n  \"mcpServers\": {\n    \"js-reverse\": {\n      \"command\": \"node\",\n      \"args\": [\"/你的路径/js-reverse-mcp/build/src/index.js\"]\n    }\n  }\n}\n```\n\n## AI-first 设计\n\n这个项目的核心目标不是“能操作浏览器”，而是让 AI Agent 能稳定完成一轮真实 JS 逆向任务：打开页面、过风控、定位脚本、保存源码、设置断点、触发行为、检查运行时、导出网络材料、复现状态，然后继续推理。\n\n几个设计取向贯穿在代码里：\n\n- **工具是 Agent primitives，不是 DevTools 菜单映射**：`list_network_requests` 既能列索引，也能按 `reqid` 查详情，还能用 `outputFile` 导出精确材料；`evaluate_script` 既能在页面执行，也能在断点 call frame 执行，还能接收 `localFilePath` 输入。\n- **输出要能指导下一步**：列表输出保持短而可扫描；详情输出有边界；长结果提示导出；pending 请求会明确提示先恢复执行，避免 Agent 等一个永远不会完成的 response。\n- **本地文件是分析工作台**：`save_script_source`、`list_network_requests(..., outputFile)`、`evaluate_script(..., localFilePath)` 让 Agent 能在浏览器、网络和本地文件之间往返，而不是把大段代码或二进制数据塞进聊天上下文。\n- **状态可清理、流程可重放**：默认 profile 保留登录态；`--isolated` 提供一次性干净环境；`clear_site_data` 只清当前站点相关状态，用来反复复现 cookie 生成、风控初始化和请求链路。\n- **反检测服务于调试链路**：CDP 静默导航、真实视口、Google referer、Patchright 和 CloakBrowser 的目标都是让 Agent 能进入目标页面继续分析，而不是把项目变成一个泛用爬虫框架。\n\n## 反检测机制（支撑能力）\n\n反检测是 js-reverse-mcp 的底层支撑能力之一。包装层（这个 MCP 自己）**零 JS 注入**、不做 `Object.defineProperty` hack（那本身就是检测信号）。所有反检测都在两个互不重叠的层：\n\n| 层                             | 默认模式                                                                                                        | `--cloak` 模式                                                                                                                    |\n| ------------------------------ | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |\n| **协议层**（CDP）              | Patchright：不调 `Runtime.enable` / `Console.enable`，在 isolated world 里执行 evaluate，移除自动化 launch flag | 同                                                                                                                                |\n| **源码层**（C++ 二进制 patch） | 无 —— 直接用系统 Google Chrome                                                                                  | CloakBrowser 二进制（按平台提供源码层指纹 patch，覆盖 `navigator.webdriver`、canvas、WebGL、audio、GPU、字体、屏幕、WebRTC、TLS） |\n| **Profile 目录**               | `~/.cache/chrome-devtools-mcp/chrome-profile`（持久化登录态）                                                   | `~/.cache/chrome-devtools-mcp/cloak-profile`（与默认物理隔离）                                                                    |\n| **实际浏览器**                 | 你装的 Google Chrome（带 Web Store、扩展、sync）                                                                | 定制 Chromium 编译版（无 Google 服务、无 Web Store）                                                                              |\n\n另外几个导航级措施（两种模式都生效）：\n\n- **CDP 静默导航** —— 页面加载时不激活 `Network.enable` / `Debugger.enable`，请求/控制台收集只走 Playwright 监听器，直到某个工具显式需要 CDP 才激活\n- **Google Referer** —— `new_page` 默认带 `referer: https://www.google.com/`\n- **真实视口** —— 关掉 Playwright 默认的 1280×720 假视口，浏览器展示真实屏幕尺寸\n\n**何时开 `--cloak`**：只在以上还不够、被站点指纹拦截时才用。详见 [docs/cloak.md](docs/cloak.md)。\n\n## 工具列表（24 个）\n\n### 页面与导航\n\n| 工具              | 描述                                       |\n| ----------------- | ------------------------------------------ |\n| `select_page`     | 列出打开的页面，或按索引选择调试上下文     |\n| `new_page`        | 创建新页面并导航到 URL                     |\n| `navigate_page`   | 导航、后退、前进或刷新页面                 |\n| `select_frame`    | 列出所有 frame（iframe），或选择执行上下文 |\n| `click_element`   | 严格匹配并点击当前 frame 中的单个可见元素  |\n| `take_screenshot` | 截取页面截图                               |\n\n### 脚本分析\n\n| 工具                 | 描述                                                   |\n| -------------------- | ------------------------------------------------------ |\n| `list_scripts`       | 列出页面中所有加载的 JavaScript 脚本                   |\n| `get_script_source`  | 获取脚本源码片段，支持行范围或字符偏移                 |\n| `save_script_source` | 保存完整脚本源码到本地文件（适用于大型/压缩/WASM文件） |\n| `search_in_sources`  | 在所有脚本中搜索字符串或正则表达式                     |\n\n### 断点与执行控制\n\n| 工具                     | 描述                                            |\n| ------------------------ | ----------------------------------------------- |\n| `set_breakpoint_on_text` | 通过搜索代码文本自动设置断点（适用于压缩代码）  |\n| `break_on_xhr`           | 按 URL 模式设置 XHR/Fetch 断点                  |\n| `remove_breakpoint`      | 用显式 action 按 ID、URL 或全部移除断点         |\n| `list_breakpoints`       | 列出所有活动断点                                |\n| `get_paused_info`        | 获取暂停状态、调用栈和作用域变量                |\n| `pause_or_resume`        | 用显式 action 暂停或恢复执行                    |\n| `step`                   | 单步调试（over/into/out），返回位置和源码上下文 |\n\n### 网络与 WebSocket\n\n| 工具                     | 描述                                                        |\n| ------------------------ | ----------------------------------------------------------- |\n| `list_network_requests`  | 列出网络请求、查看详情，或导出 header/body/query 等原始材料 |\n| `clear_network_requests` | 显式确认后清空当前页面已收集的请求和 body cache             |\n| `get_request_initiator`  | 获取网络请求的 JavaScript 调用栈                            |\n| `get_websocket_messages` | 列出 WebSocket 连接、分析消息模式或获取消息详情             |\n\n### 浏览器状态\n\n| 工具              | 描述                                                                                      |\n| ----------------- | ----------------------------------------------------------------------------------------- |\n| `clear_site_data` | 清理当前站点相关 cookies、origin storage 和 sessionStorage；可显式选择清理全局 HTTP cache |\n\n### 检查工具\n\n| 工具                    | 描述                                                                          |\n| ----------------------- | ----------------------------------------------------------------------------- |\n| `evaluate_script`       | 在页面或断点上下文执行 JavaScript，支持主世界、保存结果和读取一个本地输入文件 |\n| `list_console_messages` | 列出控制台消息，或按 msgid 获取单条详情                                       |\n\n## 使用示例\n\n### JS 逆向基本流程\n\n1. **打开目标页面**\n\n```\n打开 https://example.com 并列出所有加载的 JS 脚本\n```\n\n2. **查找目标函数**\n\n```\n在所有脚本中搜索包含 \"encrypt\" 的代码\n```\n\n3. **设置断点**\n\n```\n在加密函数入口处设置断点\n```\n\n4. **触发并分析**\n\n```\n在页面上触发操作，断点命中后检查参数、调用栈和作用域变量\n```\n\n### WebSocket 协议分析\n\n```\n列出 WebSocket 连接，分析消息模式，查看特定类型的消息内容\n```\n\n### Agent 推荐的完整捕获流程\n\n因为导航阶段会刻意保持 CDP 静默，首次进入目标页时不会立即打开 Network / Debugger 域。推荐流程是先过风控，再刷新捕获：\n\n```\n1. new_page 打开目标页\n2. 调用 list_network_requests 激活 collectors\n3. navigate_page(type=\"reload\") 刷新页面\n4. 再次 list_network_requests 查看完整请求\n5. 对关键 reqid 使用 outputFile 导出原始材料\n```\n\n### Cookie / 风控重放流程\n\n```\n1. clear_site_data(confirm=true) 清理当前站点状态\n2. navigate_page(type=\"reload\") 重新触发初始化\n3. list_network_requests 找到设置 cookie 或提交 sensor 的请求\n4. 导出 requestBody / responseHeaders / responseBody\n5. 用 evaluate_script + localFilePath 在页面上下文中复算或验证\n```\n\n## 配置选项\n\nCLI 保持精简，所有 flag 都是可选项。**99% 场景默认即可**。涉及本地文件时，建议用 `--allowedRoots` 限定 Agent 可读写的目录。\n\n| 选项               | 描述                                                                                                                                                                                                                      | 默认值  |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |\n| `--cloak`          | 切换到 CloakBrowser 隐身二进制（取代系统 Chrome）。启用按平台提供的 C++ 源码层指纹 patch。首次启动自动下载 ~200MB 二进制；指纹身份按 profile 持久化。详见 [docs/cloak.md](docs/cloak.md)。                                | `false` |\n| `--isolated`       | 使用临时 user-data-dir（cookies/localStorage 不保留，关闭时自动清理）                                                                                                       ","default_branch":"main","files":92,"tree":[".github/workflows/ci.yml",".github/workflows/publish.yml",".gitignore",".nvmrc",".prettierignore",".prettierrc.cjs","LICENSE","README.md","README_en.md","docs/anti-detection-work.en.md","docs/anti-detection-work.md","docs/cdp-endpoint.en.md","docs/cdp-endpoint.md","docs/cloak.en.md","docs/cloak.md","docs/first-principles-capability-plan.md","docs/pending-request-hang-root-cause.md","docs/site-state-and-cookie-analysis-plan.md","docs/tool-reference.md","eslint.config.mjs","evals/tool-routing.json","images/广告图片.png","package-lock.json","package.json","scripts/eslint_rules/check-license-rule.js","scripts/eslint_rules/local-plugin.js","scripts/evaluate-tool-routing.ts","scripts/generate-docs.ts","scripts/run-tests.ts","scripts/tsconfig.json","src/CdpEvents.ts","src/CdpSessionProvider.ts","src/DebuggerContext.ts","src/DevtoolsUtils.ts","src/LocalFileAccess.ts","src/McpContext.ts","src/McpResponse.ts","src/Mutex.ts","src/PageCollector.ts","src/SingleFlight.ts","src/ToolCallRunner.ts","src/ToolError.ts","src/WaitForHelper.ts","src/WebSocketCollector.ts","src/browser.ts","src/cli.ts","src/cloak.ts","src/devtools.d.ts","src/formatters/consoleFormatter.ts","src/formatters/networkFormatter.ts","src/formatters/websocketFormatter.ts","src/index.ts","src/logger.ts","src/main.ts","src/polyfill.ts","src/third_party/index.ts","src/tools/ToolDefinition.ts","src/tools/categories.ts","src/tools/console.ts","src/tools/debugger.ts","src/tools/frames.ts","src/tools/interaction.ts","src/tools/network.ts","src/tools/pages.ts","src/tools/screenshot.ts","src/tools/script.ts","src/tools/siteData.ts","src/tools/websocket.ts","src/utils/keyboard.ts","src/utils/pagination.ts","src/utils/types.ts","tests/CdpSessionProvider.test.ts","tests/DebuggerContext.test.ts","tests/LocalFileAccess.test.ts","tests/McpResponse.test.ts","tests/PageCollector.test.ts","tests/ToolCallRunner.test.ts","tests/WebSocketCollector.test.ts","tests/browser.test.ts","tests/cloak.test.ts","tests/formatters/networkFormatter.test.ts","tests/logger.test.ts","tests/mutex.test.ts","tests/setup.ts","tests/tools/agentExperience.test.ts","tests/tools/frames.test.ts","tests/tools/network.test.ts","tests/tools/pages.test.ts","tests/tools/script.test.ts","tests/tools/siteData.test.ts","tests/tools/websocket.test.ts","tsconfig.json"],"storefront":"/r/zhizhuodemao","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/zhizhuodemao/js-reverse-mcp/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}