crawlio-browser 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +10 -0
- package/LICENSE +21 -0
- package/README.md +508 -0
- package/bin/crawlio-browser.js +5 -0
- package/dist/mcp-server/chunk-JSBRDJBE.js +30 -0
- package/dist/mcp-server/index.d.ts +2 -0
- package/dist/mcp-server/index.js +5878 -0
- package/dist/mcp-server/init-TRQTWLAB.js +492 -0
- package/package.json +65 -0
- package/skills/browser-automation/SKILL.md +245 -0
- package/skills/browser-automation/reference.md +259 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "crawlio-browser",
|
|
3
|
+
"description": "AI skills for browser automation — screenshots, clicks, network capture, framework detection via Chrome",
|
|
4
|
+
"version": "1.3.0",
|
|
5
|
+
"author": { "name": "Crawlio" },
|
|
6
|
+
"homepage": "https://crawlio.app/agent",
|
|
7
|
+
"repository": "https://github.com/Crawlio-app/crawlio-browser-mcp",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"keywords": ["browser-automation", "chrome", "cdp", "mcp", "agent-skills", "screenshots"]
|
|
10
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Crawlio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
# Crawlio Agent
|
|
2
|
+
|
|
3
|
+
MCP server that gives AI full control of a live Chrome browser via CDP. 89 browser tools + framework-aware intelligence — captures what static crawlers can't see.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/crawlio-browser)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
## When to use Crawlio Agent
|
|
9
|
+
|
|
10
|
+
Use Crawlio Agent when your AI needs to interact with a **real browser** — SPAs, authenticated pages, dynamic content, JS-rendered frameworks. Unlike headless browser tools, Crawlio Agent connects to **your actual Chrome** via a lightweight extension, giving the AI access to your logged-in sessions, cookies, and full browser state.
|
|
11
|
+
|
|
12
|
+
**Crawlio Agent vs Playwright MCP:** Playwright MCP launches a headless browser. Crawlio Agent connects to your existing Chrome — no separate browser process, no login flows, full access to your tabs and sessions.
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
1. Install the [Chrome Extension](https://crawlio.app/agent)
|
|
17
|
+
2. Run setup:
|
|
18
|
+
```bash
|
|
19
|
+
npx crawlio-browser setup
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
That's it. Auto-detects and configures Claude Code, Cursor, VS Code, Codex,
|
|
23
|
+
Claude Desktop, and 9 more MCP clients. Starts a persistent background server.
|
|
24
|
+
|
|
25
|
+
### Manual setup (any client)
|
|
26
|
+
|
|
27
|
+
If you prefer manual configuration or use `add-mcp`:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Start the server
|
|
31
|
+
npx crawlio-browser --portal
|
|
32
|
+
|
|
33
|
+
# Configure your client (auto-detects 14 clients)
|
|
34
|
+
npx add-mcp http://127.0.0.1:3001/mcp --name crawlio-browser -g
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Add Crawlio skills (optional)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npx crawlio-browser setup --plugin
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Installs slash commands for Claude Code: `/crawlio:crawl-site`, `/crawlio:audit-site`,
|
|
44
|
+
`/crawlio:observe`, `/crawlio:finding`, `/crawlio:extract-and-export`
|
|
45
|
+
|
|
46
|
+
<details>
|
|
47
|
+
<summary><b>Per-client manual config</b></summary>
|
|
48
|
+
|
|
49
|
+
**Claude Desktop** — add to `claude_desktop_config.json`:
|
|
50
|
+
```json
|
|
51
|
+
{ "mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Claude Code (Portal Mode)** — start `npx crawlio-browser --portal`, then add to `.mcp.json`:
|
|
55
|
+
```json
|
|
56
|
+
{ "mcpServers": { "crawlio-browser": { "type": "http", "url": "http://127.0.0.1:3001/mcp" } } }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Claude Code (stdio):**
|
|
60
|
+
```bash
|
|
61
|
+
claude mcp add crawlio-browser -- npx -y crawlio-browser
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Cursor** — add to `.cursor/mcp.json`:
|
|
65
|
+
```json
|
|
66
|
+
{ "mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Windsurf** — add to Windsurf Settings > MCP:
|
|
70
|
+
```json
|
|
71
|
+
{ "mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Cline (VS Code)** — add to `settings.json`:
|
|
75
|
+
```json
|
|
76
|
+
{ "cline.mcpServers": { "crawlio-browser": { "command": "npx", "args": ["-y", "crawlio-browser"] } } }
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**ChatGPT Desktop** — Settings > Integrations > MCP:
|
|
80
|
+
URL: `http://127.0.0.1:3001/mcp` | Type: Streamable HTTP
|
|
81
|
+
|
|
82
|
+
</details>
|
|
83
|
+
|
|
84
|
+
## How It Works
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
AI Client (stdio) ──► MCP Server (Node.js) ──► Chrome Extension (MV3)
|
|
88
|
+
crawlio-browser WebSocket → CDP
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The MCP server communicates with the Chrome extension via WebSocket. The extension controls the browser through Chrome DevTools Protocol — the same protocol used by Chrome DevTools and Playwright.
|
|
92
|
+
|
|
93
|
+
## Architecture: JIT Context Runtime
|
|
94
|
+
|
|
95
|
+
The execution runtime is built on four pillars that separate it from stateless cloud sandboxes:
|
|
96
|
+
|
|
97
|
+
- **Attention Dilution Cure** — 3 tools (`search`, `execute`, `connect_tab`) instead of 89. The agent discovers capabilities on demand through `search`, keeping the context window clean and tool selection accurate.
|
|
98
|
+
- **Polymorphic Context** — Before code executes, the runtime probes the browser for framework signatures and injects a shape-shifting `smart` object with framework-native accessors (React, Vue, Next.js, Shopify, etc. — 17 namespaces across 4 tiers).
|
|
99
|
+
- **Deterministic Execution** — Every `smart.click()` runs an actionability check (visibility, dimensions, enabled state, overlay detection) with progressive backoff, then enforces a post-action settle delay (500ms/300ms/1000ms).
|
|
100
|
+
- **Agentic REPL** — The runtime maintains a persistent connection to the browser. When a script fails, the browser state is preserved — the agent reads the structured error and iterates against the same live session.
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
execute call lifecycle:
|
|
104
|
+
search → discover capabilities
|
|
105
|
+
detect → probe DOM for active frameworks
|
|
106
|
+
inject → build polymorphic smart object
|
|
107
|
+
run → execute with actionability checks + settle delays
|
|
108
|
+
return → result or structured error (browser state preserved)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
[Read the full architecture guide →](https://docs.crawlio.app/browser-agent/jit-context-runtime)
|
|
112
|
+
|
|
113
|
+
## Two Modes
|
|
114
|
+
|
|
115
|
+
### Full Mode (89 tools)
|
|
116
|
+
|
|
117
|
+
The default. Every tool is exposed directly to the LLM — navigate, click, type, screenshot, capture network, detect frameworks, and more. Mutative tools (`browser_click`, `browser_type`, `browser_navigate`, `browser_select_option`) include **auto-settling**: Playwright-inspired actionability checks, progressive backoff, and post-action DOM stability waiting.
|
|
118
|
+
|
|
119
|
+
### Code Mode (3 tools)
|
|
120
|
+
|
|
121
|
+
For token-constrained environments. Collapses 89 tools into 3 high-level tools with ~95% schema token reduction:
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"mcpServers": {
|
|
126
|
+
"crawlio-browser": {
|
|
127
|
+
"command": "npx",
|
|
128
|
+
"args": ["-y", "crawlio-browser", "--code-mode"]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
| Tool | Description |
|
|
135
|
+
|------|-------------|
|
|
136
|
+
| `search` | Discover available commands by keyword |
|
|
137
|
+
| `execute` | Run async JS with `bridge`, `crawlio`, `smart`, and `sleep` in scope |
|
|
138
|
+
| `connect_tab` | Connect to a browser tab |
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
// Navigate and screenshot
|
|
142
|
+
await bridge.send({ type: 'browser_navigate', url: 'https://example.com' }, 30000);
|
|
143
|
+
await sleep(2000);
|
|
144
|
+
const screenshot = await bridge.send({ type: 'take_screenshot' }, 10000);
|
|
145
|
+
return screenshot;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Smart Object
|
|
149
|
+
|
|
150
|
+
In Code Mode, the `smart` object provides framework-aware helpers with auto-waiting and actionability checks.
|
|
151
|
+
|
|
152
|
+
### Core Methods
|
|
153
|
+
|
|
154
|
+
| Method | Description |
|
|
155
|
+
|--------|-------------|
|
|
156
|
+
| `smart.evaluate(expression)` | Execute JS in the page via CDP |
|
|
157
|
+
| `smart.click(selector, opts?)` | Auto-waiting click with 500ms settle |
|
|
158
|
+
| `smart.type(selector, text, opts?)` | Auto-waiting type with 300ms settle |
|
|
159
|
+
| `smart.navigate(url, opts?)` | Navigate with 1000ms settle |
|
|
160
|
+
| `smart.waitFor(selector, timeout?)` | Poll until element is actionable |
|
|
161
|
+
| `smart.snapshot()` | Accessibility tree snapshot |
|
|
162
|
+
|
|
163
|
+
### Framework Namespaces
|
|
164
|
+
|
|
165
|
+
When a framework is detected, the smart object exposes framework-specific helpers:
|
|
166
|
+
|
|
167
|
+
<details>
|
|
168
|
+
<summary><b>React</b> — <code>smart.react</code></summary>
|
|
169
|
+
|
|
170
|
+
| Method | Returns |
|
|
171
|
+
|--------|---------|
|
|
172
|
+
| `getVersion()` | Version string and bundle type |
|
|
173
|
+
| `getRootCount()` | Number of React root components |
|
|
174
|
+
| `hasProfiler()` | Whether profiler is available |
|
|
175
|
+
| `isHookInstalled()` | Whether DevTools hook is installed |
|
|
176
|
+
|
|
177
|
+
</details>
|
|
178
|
+
|
|
179
|
+
<details>
|
|
180
|
+
<summary><b>Vue.js</b> — <code>smart.vue</code></summary>
|
|
181
|
+
|
|
182
|
+
| Method | Returns |
|
|
183
|
+
|--------|---------|
|
|
184
|
+
| `getVersion()` | Vue version string |
|
|
185
|
+
| `getAppCount()` | Number of Vue app instances |
|
|
186
|
+
| `getConfig()` | App config object |
|
|
187
|
+
| `isDevMode()` | Whether DevTools is enabled |
|
|
188
|
+
|
|
189
|
+
</details>
|
|
190
|
+
|
|
191
|
+
<details>
|
|
192
|
+
<summary><b>Angular</b> — <code>smart.angular</code></summary>
|
|
193
|
+
|
|
194
|
+
| Method | Returns |
|
|
195
|
+
|--------|---------|
|
|
196
|
+
| `getVersion()` | ng-version attribute value |
|
|
197
|
+
| `isDebugMode()` | Whether debug APIs available |
|
|
198
|
+
| `isIvy()` | Whether Ivy compiler is active |
|
|
199
|
+
| `getRootCount()` | Number of Angular root elements |
|
|
200
|
+
| `getState()` | Full state object |
|
|
201
|
+
|
|
202
|
+
</details>
|
|
203
|
+
|
|
204
|
+
<details>
|
|
205
|
+
<summary><b>Svelte</b> — <code>smart.svelte</code></summary>
|
|
206
|
+
|
|
207
|
+
| Method | Returns |
|
|
208
|
+
|--------|---------|
|
|
209
|
+
| `getVersion()` | Svelte version string |
|
|
210
|
+
| `getMeta()` | Svelte metadata object |
|
|
211
|
+
| `isDetected()` | Whether Svelte is detected |
|
|
212
|
+
|
|
213
|
+
</details>
|
|
214
|
+
|
|
215
|
+
<details>
|
|
216
|
+
<summary><b>Redux</b> — <code>smart.redux</code></summary>
|
|
217
|
+
|
|
218
|
+
| Method | Returns |
|
|
219
|
+
|--------|---------|
|
|
220
|
+
| `isInstalled()` | Whether Redux DevTools is installed |
|
|
221
|
+
| `getStoreState()` | Full store state |
|
|
222
|
+
|
|
223
|
+
</details>
|
|
224
|
+
|
|
225
|
+
<details>
|
|
226
|
+
<summary><b>Alpine.js</b> — <code>smart.alpine</code></summary>
|
|
227
|
+
|
|
228
|
+
| Method | Returns |
|
|
229
|
+
|--------|---------|
|
|
230
|
+
| `getVersion()` | Alpine version string |
|
|
231
|
+
| `getStoreKeys()` | Store object keys |
|
|
232
|
+
| `getComponentCount()` | Count of `[x-data]` components |
|
|
233
|
+
|
|
234
|
+
</details>
|
|
235
|
+
|
|
236
|
+
<details>
|
|
237
|
+
<summary><b>Next.js</b> — <code>smart.nextjs</code></summary>
|
|
238
|
+
|
|
239
|
+
| Method | Returns |
|
|
240
|
+
|--------|---------|
|
|
241
|
+
| `getData()` | `__NEXT_DATA__` object |
|
|
242
|
+
| `getRouter()` | Router state (pathname, query, asPath) |
|
|
243
|
+
| `getSSRMode()` | SSR mode (hybrid, app-router, static) |
|
|
244
|
+
| `getRouteManifest()` | Current page data |
|
|
245
|
+
|
|
246
|
+
</details>
|
|
247
|
+
|
|
248
|
+
<details>
|
|
249
|
+
<summary><b>Nuxt</b> — <code>smart.nuxt</code></summary>
|
|
250
|
+
|
|
251
|
+
| Method | Returns |
|
|
252
|
+
|--------|---------|
|
|
253
|
+
| `getData()` | `__NUXT__` object |
|
|
254
|
+
| `getConfig()` | App config |
|
|
255
|
+
| `isSSR()` | Whether server-rendered |
|
|
256
|
+
|
|
257
|
+
</details>
|
|
258
|
+
|
|
259
|
+
<details>
|
|
260
|
+
<summary><b>Remix</b> — <code>smart.remix</code></summary>
|
|
261
|
+
|
|
262
|
+
| Method | Returns |
|
|
263
|
+
|--------|---------|
|
|
264
|
+
| `getContext()` | `__remixContext` object |
|
|
265
|
+
| `getRouteData()` | Loader data from state |
|
|
266
|
+
|
|
267
|
+
</details>
|
|
268
|
+
|
|
269
|
+
<details>
|
|
270
|
+
<summary><b>Shopify</b> — <code>smart.shopify</code></summary>
|
|
271
|
+
|
|
272
|
+
| Method | Returns |
|
|
273
|
+
|--------|---------|
|
|
274
|
+
| `getShop()` | Shop metadata (theme, locale, currency) |
|
|
275
|
+
| `getCart()` | Shopping cart object |
|
|
276
|
+
|
|
277
|
+
</details>
|
|
278
|
+
|
|
279
|
+
<details>
|
|
280
|
+
<summary><b>WordPress</b> — <code>smart.wordpress</code></summary>
|
|
281
|
+
|
|
282
|
+
| Method | Returns |
|
|
283
|
+
|--------|---------|
|
|
284
|
+
| `isWP()` | Whether WordPress is present |
|
|
285
|
+
| `getRestUrl()` | REST API endpoint |
|
|
286
|
+
| `getPlugins()` | List of active plugins |
|
|
287
|
+
|
|
288
|
+
</details>
|
|
289
|
+
|
|
290
|
+
<details>
|
|
291
|
+
<summary><b>More frameworks</b> — Gatsby, WooCommerce, Laravel, Django, Drupal, jQuery</summary>
|
|
292
|
+
|
|
293
|
+
| Namespace | Methods |
|
|
294
|
+
|-----------|---------|
|
|
295
|
+
| `smart.gatsby` | `getData()`, `getPageData()` |
|
|
296
|
+
| `smart.woocommerce` | `getParams()` |
|
|
297
|
+
| `smart.laravel` | `getCSRF()` |
|
|
298
|
+
| `smart.django` | `getCSRF()` |
|
|
299
|
+
| `smart.drupal` | `getSettings()` |
|
|
300
|
+
| `smart.jquery` | `getVersion()` |
|
|
301
|
+
|
|
302
|
+
</details>
|
|
303
|
+
|
|
304
|
+
## Auto-Settling
|
|
305
|
+
|
|
306
|
+
Mutative tools (`browser_click`, `browser_type`, `browser_navigate`, `browser_select_option`) use Playwright-inspired actionability checks:
|
|
307
|
+
|
|
308
|
+
1. **Pre-flight**: Polls element visibility, stability, and enabled state before acting
|
|
309
|
+
2. **Action**: Dispatches the CDP command
|
|
310
|
+
3. **Post-settle**: Waits for DOM mutations to quiesce with progressive backoff `[0, 20, 100, 100, 500]ms`
|
|
311
|
+
|
|
312
|
+
This means the AI doesn't need to manually add `sleep()` or `waitFor()` calls between actions — the tools handle SPA rendering delays automatically.
|
|
313
|
+
|
|
314
|
+
## Framework Detection
|
|
315
|
+
|
|
316
|
+
Detects **64 technologies** across 4 tiers using globals, DOM markers, meta tags, HTTP headers, and script URLs:
|
|
317
|
+
|
|
318
|
+
| Tier | Frameworks | Signal Strength |
|
|
319
|
+
|------|-----------|----------------|
|
|
320
|
+
| **Meta-frameworks** | Next.js, Nuxt, SvelteKit, Remix, Gatsby | Unique globals + parent detection |
|
|
321
|
+
| **Core** | React, Vue.js, Angular, Svelte, Astro, Qwik, SolidJS, Lit, Preact | Globals + DOM markers |
|
|
322
|
+
| **CMS & Platforms** | WordPress, Shopify, Webflow, Squarespace, Wix, Drupal, Magento, Ghost, Bubble | Meta tags + globals |
|
|
323
|
+
| **Libraries & Tools** | jQuery, Bootstrap, Tailwind CSS, Alpine.js, HTMX, Turbo, Stencil, Redux, Ember.js, Backbone.js | DOM + globals |
|
|
324
|
+
|
|
325
|
+
Multi-framework detection returns a **primary** framework (meta-framework takes priority) plus a `subFrameworks` array for the full stack.
|
|
326
|
+
|
|
327
|
+
## Tools Reference
|
|
328
|
+
|
|
329
|
+
### Connection & Status
|
|
330
|
+
|
|
331
|
+
| Tool | Description |
|
|
332
|
+
|------|-------------|
|
|
333
|
+
| `connect_tab` | Connect to a browser tab by URL, tab ID, or active tab |
|
|
334
|
+
| `disconnect_tab` | Disconnect from the current tab |
|
|
335
|
+
| `list_tabs` | List all open tabs with IDs and URLs |
|
|
336
|
+
| `get_connection_status` | Check CDP connection state |
|
|
337
|
+
| `reconnect_tab` | Force reconnect to fix stale connections |
|
|
338
|
+
| `get_capabilities` | List all tools and their availability |
|
|
339
|
+
|
|
340
|
+
### Page Capture
|
|
341
|
+
|
|
342
|
+
| Tool | Description |
|
|
343
|
+
|------|-------------|
|
|
344
|
+
| `capture_page` | Full capture: framework + network + console + DOM |
|
|
345
|
+
| `detect_framework` | Detect JS framework and version |
|
|
346
|
+
| `start_network_capture` | Start recording network requests |
|
|
347
|
+
| `stop_network_capture` | Stop recording and return captured requests |
|
|
348
|
+
| `get_console_logs` | Get console logs (errors, warnings, info) |
|
|
349
|
+
| `get_cookies` | Get cookies (sensitive values redacted) |
|
|
350
|
+
| `get_dom_snapshot` | Simplified DOM tree with shadow DOM and iframe support |
|
|
351
|
+
| `take_screenshot` | Screenshot as base64 PNG |
|
|
352
|
+
| `get_response_body` | Get response body for a captured network request |
|
|
353
|
+
|
|
354
|
+
### Navigation & Interaction
|
|
355
|
+
|
|
356
|
+
| Tool | Description |
|
|
357
|
+
|------|-------------|
|
|
358
|
+
| `browser_navigate` | Navigate to a URL (auto-settle) |
|
|
359
|
+
| `browser_click` | Click element by CSS selector (auto-settle, left/right/middle, modifiers) |
|
|
360
|
+
| `browser_double_click` | Double-click element |
|
|
361
|
+
| `browser_type` | Type text into element (auto-settle) |
|
|
362
|
+
| `browser_press_key` | Press keyboard key (Enter, Tab, Escape, shortcuts) |
|
|
363
|
+
| `browser_hover` | Hover over element |
|
|
364
|
+
| `browser_select_option` | Select `<option>` by value (auto-settle) |
|
|
365
|
+
| `browser_scroll` | Scroll page or element |
|
|
366
|
+
| `browser_drag` | Drag from one element to another |
|
|
367
|
+
| `browser_file_upload` | Upload files to `<input type="file">` |
|
|
368
|
+
| `browser_wait` | Wait N milliseconds |
|
|
369
|
+
| `browser_wait_for` | Wait for element state (visible, hidden, attached, detached) |
|
|
370
|
+
|
|
371
|
+
### Network
|
|
372
|
+
|
|
373
|
+
| Tool | Description |
|
|
374
|
+
|------|-------------|
|
|
375
|
+
| `browser_intercept` | Block, modify headers, or mock responses for URL patterns |
|
|
376
|
+
| `emulate_network` | Throttle network (offline, 3G, 4G, WiFi presets) |
|
|
377
|
+
| `set_cache_disabled` | Disable/enable browser cache |
|
|
378
|
+
| `set_extra_headers` | Add custom headers to all requests |
|
|
379
|
+
| `get_websocket_connections` | List active WebSocket connections |
|
|
380
|
+
| `get_websocket_messages` | Get WebSocket message history |
|
|
381
|
+
|
|
382
|
+
### Frames & Tabs
|
|
383
|
+
|
|
384
|
+
| Tool | Description |
|
|
385
|
+
|------|-------------|
|
|
386
|
+
| `get_frame_tree` | Get frame hierarchy (main + iframes) |
|
|
387
|
+
| `switch_to_frame` | Switch execution context to iframe |
|
|
388
|
+
| `switch_to_main_frame` | Switch back to main frame |
|
|
389
|
+
| `create_tab` | Create new tab with URL |
|
|
390
|
+
| `close_tab` | Close tab by ID |
|
|
391
|
+
| `switch_tab` | Focus a tab by ID |
|
|
392
|
+
|
|
393
|
+
### Cookies & Storage
|
|
394
|
+
|
|
395
|
+
| Tool | Description |
|
|
396
|
+
|------|-------------|
|
|
397
|
+
| `set_cookie` | Set cookie (supports httpOnly via CDP) |
|
|
398
|
+
| `delete_cookies` | Delete cookies by name/domain/path |
|
|
399
|
+
| `get_storage` | Read localStorage or sessionStorage |
|
|
400
|
+
| `set_storage` | Write storage item |
|
|
401
|
+
| `clear_storage` | Clear all storage items |
|
|
402
|
+
| `get_databases` | List IndexedDB databases |
|
|
403
|
+
| `query_object_store` | Query IndexedDB object store |
|
|
404
|
+
| `clear_database` | Clear or delete IndexedDB database |
|
|
405
|
+
|
|
406
|
+
### Dialogs
|
|
407
|
+
|
|
408
|
+
| Tool | Description |
|
|
409
|
+
|------|-------------|
|
|
410
|
+
| `get_dialog` | Get pending JS dialog (alert/confirm/prompt) |
|
|
411
|
+
| `handle_dialog` | Accept or dismiss dialog |
|
|
412
|
+
|
|
413
|
+
### Emulation
|
|
414
|
+
|
|
415
|
+
| Tool | Description |
|
|
416
|
+
|------|-------------|
|
|
417
|
+
| `set_viewport` | Set viewport dimensions |
|
|
418
|
+
| `set_user_agent` | Override User-Agent string |
|
|
419
|
+
| `emulate_device` | Emulate device (iPhone, iPad, Pixel, Galaxy, Desktop) |
|
|
420
|
+
| `set_geolocation` | Override geolocation coordinates |
|
|
421
|
+
| `set_stealth_mode` | Anti-detection mode (opt-in, patches webdriver fingerprint) |
|
|
422
|
+
|
|
423
|
+
### Security
|
|
424
|
+
|
|
425
|
+
| Tool | Description |
|
|
426
|
+
|------|-------------|
|
|
427
|
+
| `get_security_state` | TLS certificate details, protocol, cipher |
|
|
428
|
+
| `ignore_certificate_errors` | Ignore cert errors for staging environments |
|
|
429
|
+
|
|
430
|
+
### Service Workers
|
|
431
|
+
|
|
432
|
+
| Tool | Description |
|
|
433
|
+
|------|-------------|
|
|
434
|
+
| `list_service_workers` | List all service worker registrations |
|
|
435
|
+
| `stop_service_worker` | Stop/unregister a service worker |
|
|
436
|
+
| `bypass_service_worker` | Bypass service workers for network requests |
|
|
437
|
+
|
|
438
|
+
### DOM Manipulation
|
|
439
|
+
|
|
440
|
+
| Tool | Description |
|
|
441
|
+
|------|-------------|
|
|
442
|
+
| `set_outer_html` | Replace element's HTML |
|
|
443
|
+
| `set_attribute` | Set element attribute |
|
|
444
|
+
| `remove_attribute` | Remove element attribute |
|
|
445
|
+
| `remove_node` | Remove element from DOM |
|
|
446
|
+
|
|
447
|
+
### CSS & JS Coverage
|
|
448
|
+
|
|
449
|
+
| Tool | Description |
|
|
450
|
+
|------|-------------|
|
|
451
|
+
| `start_css_coverage` / `stop_css_coverage` | Track which CSS rules are used |
|
|
452
|
+
| `start_js_coverage` / `stop_js_coverage` | Track which JS code is executed |
|
|
453
|
+
| `get_computed_style` | Get resolved CSS properties for element |
|
|
454
|
+
| `force_pseudo_state` | Force :hover, :focus, :active states |
|
|
455
|
+
|
|
456
|
+
### Performance & Memory
|
|
457
|
+
|
|
458
|
+
| Tool | Description |
|
|
459
|
+
|------|-------------|
|
|
460
|
+
| `get_performance_metrics` | Chrome metrics + Web Vitals (LCP, CLS, FID) |
|
|
461
|
+
| `get_dom_counters` | Count DOM nodes, documents, event listeners |
|
|
462
|
+
| `force_gc` | Force garbage collection |
|
|
463
|
+
| `take_heap_snapshot` | V8 heap snapshot summary |
|
|
464
|
+
|
|
465
|
+
### PDF & Accessibility
|
|
466
|
+
|
|
467
|
+
| Tool | Description |
|
|
468
|
+
|------|-------------|
|
|
469
|
+
| `print_to_pdf` | Generate PDF (custom paper, margins, orientation) |
|
|
470
|
+
| `get_accessibility_tree` | Accessibility tree for screen-reader audit |
|
|
471
|
+
|
|
472
|
+
### Targets & Contexts
|
|
473
|
+
|
|
474
|
+
| Tool | Description |
|
|
475
|
+
|------|-------------|
|
|
476
|
+
| `get_targets` | List all Chrome targets (pages, workers, extensions) |
|
|
477
|
+
| `attach_to_target` | Attach CDP session to any target |
|
|
478
|
+
| `create_browser_context` | Create isolated (incognito-like) context |
|
|
479
|
+
|
|
480
|
+
### Visual Debug
|
|
481
|
+
|
|
482
|
+
| Tool | Description |
|
|
483
|
+
|------|-------------|
|
|
484
|
+
| `highlight_element` | Highlight element with colored overlay |
|
|
485
|
+
| `show_layout_shifts` | Visualize CLS regions |
|
|
486
|
+
| `show_paint_rects` | Visualize paint/repaint areas |
|
|
487
|
+
|
|
488
|
+
### Crawlio App Integration
|
|
489
|
+
|
|
490
|
+
> Optional — requires [Crawlio.app](https://crawlio.app) running locally.
|
|
491
|
+
|
|
492
|
+
| Tool | Description |
|
|
493
|
+
|------|-------------|
|
|
494
|
+
| `extract_site` | Start a Crawlio crawl of the active tab's URL |
|
|
495
|
+
| `get_crawl_status` | Get crawl progress and status |
|
|
496
|
+
| `get_enrichment` | Get browser enrichment data |
|
|
497
|
+
| `get_crawled_urls` | Get crawled URLs with status and pagination |
|
|
498
|
+
| `enrich_url` | Navigate + capture + submit enrichment in one call |
|
|
499
|
+
|
|
500
|
+
## Requirements
|
|
501
|
+
|
|
502
|
+
- **Node.js** >= 18
|
|
503
|
+
- **Chrome** (or Chromium) with the [Crawlio Agent extension](https://crawlio.app/agent) installed
|
|
504
|
+
- **Crawlio.app** (optional) — for site crawling and enrichment
|
|
505
|
+
|
|
506
|
+
## License
|
|
507
|
+
|
|
508
|
+
MIT
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
8
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
19
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
20
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
21
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
22
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
23
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
24
|
+
mod
|
|
25
|
+
));
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
__commonJS,
|
|
29
|
+
__toESM
|
|
30
|
+
};
|