{
  "markdown": "<div align=\"center\">\n\n<img src=\"docs/public/favicon.png\" width=\"96\" alt=\"@jshookmcp/jshook\" />\n\n# @jshookmcp/jshook\n\n[![License: AGPLv3](https://img.shields.io/badge/License-AGPLv3-red.svg)](LICENSE)\n[![Node.js 22.22.2+](https://img.shields.io/badge/node-22.22.2%2B%20%7C%7C%2024.15%2B-brightgreen.svg)](https://nodejs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6.svg)](https://www.typescriptlang.org/)\n[![MCP](https://img.shields.io/badge/MCP-current-8A2BE2.svg)](https://modelcontextprotocol.io/)\n[![pnpm](https://img.shields.io/badge/pnpm-10.x-F69220.svg)](https://pnpm.io/)\n\n**A search-first, profile-aware reverse-engineering workspace for AI agents.**\n\n**Hook the page, capture the network, deobfuscate the bundle, disassemble the WASM, instrument the process — and let one MCP server keep the whole attack surface in reach without drowning the model in schemas.**\n\nEnglish · [中文](./README.zh.md)\n\n<p align=\"center\">\n  <a href=\"https://github.com/vmoranv/jshookmcp/stargazers\">\n    <img src=\"https://img.shields.io/github/stars/vmoranv/jshookmcp?style=for-the-badge\" alt=\"Stars\" />\n  </a>\n  <a href=\"https://github.com/vmoranv/jshookmcp/network/members\">\n    <img src=\"https://img.shields.io/github/forks/vmoranv/jshookmcp?style=for-the-badge\" alt=\"Forks\" />\n  </a>\n  <a href=\"https://github.com/vmoranv/jshookmcp/releases\">\n    <img src=\"https://img.shields.io/github/v/tag/vmoranv/jshookmcp?style=for-the-badge&sort=semver\" alt=\"Latest Release\" />\n  </a>\n  <a href=\"LICENSE\">\n    <img src=\"https://img.shields.io/badge/license-AGPLv3-red?style=for-the-badge\" alt=\"License\" />\n  </a>\n</p>\n\n<p align=\"center\">\n  <!-- npm badge: re-add once @jshookmcp/jshook is published -->\n  <a href=\"https://nodejs.org/\">\n    <img src=\"https://img.shields.io/badge/node-22.22.2%2B-brightgreen?style=for-the-badge&logo=node.js\" alt=\"Node.js 22.22.2+\" />\n  </a>\n  <a href=\"https://www.typescriptlang.org/\">\n    <img src=\"https://img.shields.io/badge/TypeScript-strict-3178C6?style=for-the-badge&logo=typescript&logoColor=white\" alt=\"TypeScript strict\" />\n  </a>\n  <a href=\"https://modelcontextprotocol.io/\">\n    <img src=\"https://img.shields.io/badge/MCP-current-8A2BE2?style=for-the-badge\" alt=\"MCP current\" />\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"#what-makes-jshook-different\">What's different</a> ·\n  <a href=\"#capability-overview\">Capabilities</a> ·\n  <a href=\"#use-cases\">Use cases</a> ·\n  <a href=\"#highlights\">Highlights</a> ·\n  <a href=\"#transport-and-deployment\">Transport</a> ·\n  <a href=\"#registry-snapshot\">Registry</a> ·\n  <a href=\"#architecture\">Architecture</a> ·\n  <a href=\"#build-from-source\">Build</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://vmoranv.github.io/jshookmcp/\">Documentation</a> ·\n  <a href=\"https://vmoranv.github.io/jshookmcp/guide/getting-started.html\">Getting Started</a> ·\n  <a href=\"https://vmoranv.github.io/jshookmcp/guide/configuration.html\">Configuration</a> ·\n  <a href=\"https://vmoranv.github.io/jshookmcp/reference/\">Tool Reference</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.swiftproxy.net/?code=R6KSMPQZ5\">\n    <img src=\"docs/public/swiftproxy_sponsor.png\" alt=\"Sponsored by Swiftproxy\" width=\"640\" />\n  </a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.swiftproxy.net/?code=R6KSMPQZ5\">\n    <b>Sponsored by Swiftproxy</b>\n  </a> — Premium Residential Proxies for Web Automation · 10% off code: <code>PROXY90</code>\n</p>\n\n---\n\n</div>\n\n## What makes jshook different\n\nMost MCP servers for JS analysis expose a handful of hand-rolled tools or wrap a single browser engine. jshook is closer to an **operating system for front-end reverse engineering** — 34 self-discovered domains, a search-first meta-tool that keeps token cost under control, and runtime recovery that survives broken pages and dropped sessions:\n\n- **Search-first, profile-aware.** The `search` profile loads about 3K tokens of tool metadata; the `full` profile exposes all 723 tools at around 40K tokens. Agents move between them as the task grows — `search` → `workflow` → `full` — instead of drowning in schemas from the first turn.\n- **Runtime recovery and session isolation.** Streamable HTTP sessions restore activated domains, browser attach state, and coverage state after reconnects; per-client browser-side state stays isolated so two agents cannot trample each other's CDP sessions.\n- **Full-stack browser automation.** Chromium and Camoufox via CDP with anti-detection, an explicit-input CAPTCHA solver (no built-in page/feature probing), a self-signed HTTPS interception CA on demand, and HTTP/2 frame building.\n- **Real reverse engineering, not string searches.** WASM disassembly via Binaryen, Frida/Ghidra/IDA bridges, native FFI scanning, hardware breakpoints, PE introspection, GraphQL/Burp Suite proxy bridges, and AST transforms — not a single regex call wrapped as a tool.\n- **Dynamic extensibility.** Hot-reload plugins, declarative workflows, and auto-discovery keep the server growing without a redeploy.\n\n---\n\n## Capability overview\n\nA scan of what's in the box. Each row links to the detailed [Capability overview](#capability-overview) below.\n\n| Area | Highlights |\n| --- | --- |\n| **Tool profiles** | `search` (~3K tokens, BM25 + hybrid vector ranking) · `workflow` (composite scripts) · `full` (all 723 tools) |\n| **Browser automation** | Chromium and Camoufox · CDP attach to existing targets · anti-detection presets · explicit-input CAPTCHA solver · popup, download, permission, and protocol interceptors |\n| **Network interception** | HTTP/1.1 + HTTP/2 frame building · MITM proxy with auto-generated CA · WebSocket capture · GraphQL introspection helpers · Burp Suite bridge |\n| **JS hooks and analysis** | LLM-powered deobfuscation · crypto routine detection · AST comprehension · source-map reconstruction · script/scriptlet extraction and replay |\n| **WASM reverse engineering** | Binaryen disassembly · module inspection · import/export analysis · cross-reference graphs · runtime instrumentation |\n| **Process and memory forensics** | Native FFI scanning · hardware breakpoints · PE introspection · live process attach · memory read/write with region guards |\n| **Binary instrumentation** | Frida bridge · Ghidra and IDA bridges · syscall hooking · BoringSSL inspector · BoringSSL/Mojo IPC analysis |\n| **Native runtime** | Native emulator for foreign-architecture samples · platform introspection · Mojo IPC · Dart Inspector · ADB bridge for on-device traffic |\n| **Encoding and transform** | URL/Base64/Hex/JWT/Protobuf encoders · AST transforms · streaming decode pipelines |\n| **Coordination** | Background task queue with progress, cancellation, and async modes · multi-agent coordination · coverage reports |\n| **Schema-first meta tools** | `describe_tool` · `call_tool` with argument validation · `coverage_report` · `search_tools` |\n| **Pluggable extension registry** | Hot-reload plugins · declarative workflows · auto-discovered domains |\n\n---\n\n## Use cases\n\n| Scenario | What you do | Domains involved |\n| --- | --- | --- |\n| Skim a minified bundle | `search_tools` → `deobfuscate` → `format` → `extract-endpoints` | `transform`, `core` |\n| Reverse a CAPTCHA challenge | Drive a Camoufox page → screenshot → solve with explicit input → replay | `browser`, `canvas` |\n| Capture and replay an OAuth flow | `proxy_start` (auto CA) → `network_capture` → `graph_dump` → replay | `proxy`, `network`, `graphql` |\n| Reverse a WASM crypto routine | `wasm_load` → `wasm_disassemble` → `binary-instrument.hook` → memory trace | `wasm`, `binary-instrument`, `memory` |\n| Recover a dropped browser session | Reconnect Streamable HTTP → restore activated domains and browser state | `browser`, `coordination` |\n| Audit a Node process for credentials | `process.list` → `memory.scan` for sensitive patterns → export | `process`, `memory`, `encoding` |\n| Build a custom workflow | `workflow.register` with YAML steps → `workflow.run` | `workflow`, `extension-registry` |\n| Hook a function in a live process | Frida script → `binary-instrument.attach` → breakpoint → log calls | `binary-instrument`, `syscall-hook` |\n\n---\n\n## Quick start\n\nNo global install needed — add to your MCP client config and you're ready.\n\n**Claude Desktop / Cursor (`claude_desktop_config.json`):**\n\n```json\n{\n  \"mcpServers\": {\n    \"jshook\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@jshookmcp/jshook@latest\"],\n      \"env\": {\n        \"MCP_TOOL_PROFILE\": \"search\",\n        \"npm_config_omit\": \"optional\"\n      }\n    }\n  }\n}\n```\n\n*(Windows: use `npx.cmd` absolute path if `npx` is not found.)*\n\nThis lightweight configuration skips optional ONNX, Z3, Binaryen, Camoufox, and Playwright\npackages. Remove `npm_config_omit` when those full-profile runtimes are required.\n\n### Share one daemon across multiple agents\n\nThe default stdio configuration starts one full jshook process per MCP host. To share the\nembedding model, browser runtime, and caches, start one local Streamable HTTP daemon:\n\n```bash\npnpm build\npnpm daemon\n```\n\nVector search defaults to off for per-client stdio processes and on (lazy-loaded) for the shared\nHTTP daemon. Set `SEARCH_VECTOR_ENABLED=false` when lexical search is sufficient.\n\nThen point every MCP client at `http://127.0.0.1:3000/mcp` using its HTTP/URL server\nconfiguration. Each client receives its own MCP session and response route while heavyweight\nruntime resources remain in one process. Keep the default loopback bind; set `MCP_AUTH_TOKEN`\nbefore exposing the endpoint beyond localhost.\n\n### Promote a profile as the task grows\n\n```jsonc\n{\n  \"env\": {\n    \"MCP_TOOL_PROFILE\": \"search\"     // start here, ~3K tokens of metadata\n  }\n}\n```\n\nSwitch `MCP_TOOL_PROFILE` to `workflow` once you start chaining composite scripts, or to `full`\nwhen you need every tool. `coverage_report` shows the active set on demand.\n\n---\n\n## Highlights\n\n- **Profile ladder.** Start in `search` (~3K tokens of metadata); promote to `workflow` when chaining composite scripts; escalate to `full` only when every tool is actually needed. `coverage_report` shows what's active on demand.\n- **Meta tools.** `describe_tool` returns the JSON Schema; `call_tool` validates arguments before invocation; every tool ships with `readOnlyHint` / `destructiveHint` / `idempotentHint` / `openWorldHint`.\n- **Browser automation.** Chromium and Camoufox via CDP, attach to existing targets, anti-detection presets, popup/download/permission interceptors, explicit-input CAPTCHA solver, JS/CSS injection at three document phases, persisted coverage across reconnects.\n- **Network interception.** Auto-generated HTTPS interception CA, HTTP/1.1 + HTTP/2 frame building, WebSocket capture, GraphQL helpers, Burp Suite bridge — all on the same MCP tool surface.\n- **Reverse engineering.** Binaryen WASM disassembly, Frida/Ghidra/IDA bridges, hardware breakpoints, native FFI scanning, PE introspection, syscall hooking, AST transforms, source-map reconstruction.\n- **Session recovery.** Streamable HTTP transport restores activated domains, browser attach state, and coverage state after reconnects; browser-side state is isolated per client.\n- **Plugins and workflows.** Drop a directory, get a domain. Write a YAML pipeline, run it as one tool. The registry self-discovers.\n\n---\n\n## Transport and deployment\n\nThe server supports two transports out of the box.\n\n| Transport | When to use | Notes |\n| --- | --- | --- |\n| **stdio** | Default for Claude Desktop, Cursor, and other single-host clients | One full process per MCP host; lightweight profile recommended |\n| **Streamable HTTP** | Multiple agents sharing the embedding model, browser runtime, and caches | Loopback bind by default; set `MCP_AUTH_TOKEN` before exposing externally |\n\nBoth transports expose the same tool surface. `coverage_report` shows which domains are\nactivated in each session — long-running sessions restore browser attach state, coverage state,\nand tool activations across reconnects.\n\nFor production deployments see the [Security and Production guide](https://vmoranv.github.io/jshookmcp/operations/security-and-production.html).\n\n---\n\n## Recent runtime notes\n\n- HTTP transport now multiplexes independent MCP sessions and restores runtime state after reconnects.\n- `proxy_start` auto-generates a local HTTPS interception CA when needed.\n- Browser CAPTCHA solving is now explicit-input driven: pass `taskKind`, `siteKey`, `imageBase64`, `callbackName`, and `responseSelector` as needed. Built-in widget/page signature probing is intentionally not used.\n\n---\n\n## Registry snapshot\n\nThe built-in surface below is generated from the runtime registry and checked in CI.\n\n<!-- metadata-sync:start -->\n- Package version: `0.3.5`\n- Built-in tools: `723`\n- Domains: `adb-bridge`, `binary-instrument`, `boringssl-inspector`, `browser`, `canvas`, `coordination`, `core`, `cross-domain`, `dart-inspector`, `debugger`, `encoding`, `exploit-dev`, `extension-registry`, `graphql`, `instrumentation`, `maintenance`, `memory`, `mojo-ipc`, `native-bridge`, `native-emulator`, `network`, `platform`, `process`, `protocol-analysis`, `proxy`, `sourcemap`, `streaming`, `syscall-hook`, `tasks`, `trace`, `transform`, `v8-inspector`, `wasm`, `webgpu`, `workflow`\n- Note: this snapshot is generated from the runtime registry; do not edit the counts by hand.\n<!-- metadata-sync:end -->\n\n> **[View the complete Tool Reference ↗](https://vmoranv.github.io/jshookmcp/reference/)**\n\n---\n\n## Architecture\n\n- **Runtime registry** — domains auto-discovered via `manifest.ts`; add a domain by creating one file.\n- **Lazy initialization** — handlers instantiated on first call, not at startup.\n- **BM25 + vector search** — `search_tools` meta-tool with hybrid ranking and adaptive weights.\n- **MCP `ToolAnnotations`** — every tool carries `readOnlyHint` / `destructiveHint` / `idempotentHint` / `openWorldHint`.\n- **Profile ladder** — `search` (~3K tokens) → `workflow` (composite scripts) → `full` (all 723 tools).\n- **Transport symmetry** — stdio and Streamable HTTP expose the same surface; sessions are isolated per client.\n\nSee the [Architecture guide](https://vmoranv.github.io/jshookmcp/guide/best-practices.html) and [Configuration reference](https://vmoranv.github.io/jshookmcp/guide/configuration.html) for the canonical details.\n\n---\n\n## Build from source\n\nRequirements: Node.js 22.12+, pnpm 10.x.\n\n```bash\npnpm install\npnpm build\npnpm start           # run the built server from dist/\npnpm dev             # run from source under tsx watch\npnpm check           # metadata check + lint + format check + typecheck + unit tests\npnpm test            # Vitest unit suites\npnpm test:e2e        # end-to-end browser/tooling suites\npnpm daemon          # run the Streamable HTTP daemon after build\n```\n\nNative helpers are bundled via `pnpm build`; on first run the server may download optional\nruntimes (ONNX, Z3, Binaryen, Camoufox, Playwright) depending on the profile.\n\n---\n\n## Project stats\n\n<div align=\"center\">\n\n<a href=\"https://www.star-history.com/?repos=vmoranv%2Fjshookmcp&type=date&legend=top-left\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/image?repos=vmoranv/jshookmcp&type=date&legend=top-left\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/image?repos=vmoranv/jshookmcp&type=date&legend=top-left\" />\n    <img alt=\"Star History Chart\" src=\"https://api.star-history.com/image?repos=vmoranv/jshookmcp&type=date&legend=top-left\" />\n  </picture>\n</a>\n\n![Activity](https://repobeats.axiom.co/api/embed/83c000c790b1c665ff2686d2d02605412a0b8805.svg 'Repobeats analytics image')\n\n</div>\n\n---\n\n## License\n\n[AGPLv3](./LICENSE).\n",
  "bytes": 15641,
  "sha": "8fa9e4f22e580d3cfaea8dd22bf5e91491700a6a4f41c906d54b41b432925247",
  "repo_slug": "vmoranv/jshookmcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_vmoranv_jshookmcp_f415f836/readme"
}