
Threat Research
/Security News
Searchjacked: Hidden Browser Extensions Hijack Searches for 13 Million Users
319 browser extensions installed by 13.4 million users hijack searches, capture queries, and collect referral payments from Yahoo and Bing.
@fy2ne/weavetab
Advanced tools
Local MCP server that attaches to Chrome via CDP and exposes semantic browser control to any AI agent. No extensions. No cloud. Zero screenshots by default.
A local MCP server that attaches to your running Chrome browser via CDP — no extensions, no cloud, no screenshots by default.
Every browser MCP tool out there either:
WeaveTab does none of this. It reads Chrome's accessibility tree — the same semantic map a screen reader uses — and gives your AI agent clean, structured data to act on. Tokens spent on meaning, not pixels.
| Feature | WeaveTab | BrowserMCP | browser-use | Playwright MCP |
|---|---|---|---|---|
| No extension required | ✓ | ✗ | ✓ | ✓ |
| No screenshots by default | ✓ | ✗ | ✗ | ✗ |
| Keeps your real session/cookies | ✓ | ✓ | ✗ | ✗ |
| Zero cloud / fully local | ✓ | ✗ | ✗ | ✗ |
| Prompt injection defense | ✓ | ✗ | ✗ | ✗ |
| Audit log on disk | ✓ | ✗ | ✗ | ✗ |
| Rate limiting built-in | ✓ | ✗ | ✗ | ✗ |
| TypeScript strict, no any | ✓ | – | – | – |
You must start Chrome with the --remote-debugging-port=9222 flag before running WeaveTab.
Windows (PowerShell)
& "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="$env:TEMP\weavetab-chrome"
macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222 \
--user-data-dir=/tmp/weavetab-chrome
Linux
google-chrome --remote-debugging-port=9222 --user-data-dir=/tmp/weavetab-chrome
Tip: Use
--user-data-dirto keep this session separate from your main Chrome profile. If you want WeaveTab to act on your real logged-in session, omit--user-data-dir(Chrome will reuse your profile).
~/.opencode/config.json){
"mcp": {
"weavetab": {
"command": "npx",
"args": ["-y", "@fy2ne/weavetab"]
}
}
}
~/.gemini/settings.json){
"mcpServers": {
"weavetab": {
"command": "npx",
"args": ["-y", "@fy2ne/weavetab"]
}
}
}
~/.claude/claude_desktop_config.json){
"mcpServers": {
"weavetab": {
"command": "npx",
"args": ["-y", "@fy2ne/weavetab"]
}
}
}
.cursor/mcp.json){
"mcpServers": {
"weavetab": {
"command": "npx",
"args": ["-y", "@fy2ne/weavetab"]
}
}
}
WeaveTab stores its config at ~/.weavetab/config.json. It is created automatically on first run with safe defaults.
{
"allow": [],
"block": [],
"safeMode": true,
"screenshot": false,
"maxActionsPerMinute": 20
}
| Field | Type | Default | Description |
|---|---|---|---|
allow | string[] | [] | Glob patterns for allowed domains (e.g. ["*.github.com", "docs.*"]). Empty = allow all (when safeMode is false) |
block | string[] | [] | Glob patterns for blocked domains. Block takes priority over allow. |
safeMode | boolean | true | When true and allow is empty: only read-only tools work (weave_read, weave_tabs, weave_extract) |
screenshot | boolean | false | Must be true to use weave_screenshot |
maxActionsPerMinute | number | 20 | Sliding window rate limit. Protects against runaway agents. |
weave_readReads the current Chrome tab as a semantic action map. No screenshots. Returns a list of interactive elements with IDs, roles, and labels.
Arguments: none
Returns:
{
"url": "https://example.com",
"title": "Example",
"elements": [
{ "id": "btn-1", "role": "button", "label": "Sign in" },
{ "id": "inp-2", "role": "textbox", "label": "Email" },
{ "id": "lnk-3", "role": "link", "label": "Forgot password?" }
]
}
weave_navigateNavigates Chrome to a URL. Blocked in safeMode unless the domain is in allow.
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
url | string | ✓ | Full URL to navigate to |
Returns: { success: true, url: string, title: string }
weave_clickClicks an element by its action map ID from weave_read. Blocked in safeMode.
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
id | string | ✓ | Element ID (e.g. btn-1) |
Returns: { success: true, clicked: string }
weave_typeTypes text into a form field by its action map ID. Blocked in safeMode. The actual text is never written to the audit log — only [REDACTED].
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
id | string | ✓ | Element ID (e.g. inp-2) |
text | string | ✓ | Text to type |
clearFirst | boolean | — | If true, clears the field before typing |
Returns: { success: true }
weave_extractExtracts visible text from the page. Skips hidden elements. Never accesses cookies or storage.
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
selector | string | — | CSS selector to scope extraction (default: body) |
format | "text" | "json" | "list" | ✓ | Output format |
Returns: { format, content, charCount }
weave_tabsLists all open Chrome tabs or switches to one by ID.
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
action | "list" | "switch" | ✓ | What to do |
tabId | string | if switch | Tab ID from list action |
Returns (list): { tabs: [{ id, title, url }] }
Returns (switch): { success: true, title: string }
weave_scrollScrolls the current page.
Arguments:
| Name | Type | Required | Description |
|---|---|---|---|
direction | "up" | "down" | "top" | "bottom" | ✓ | Scroll direction |
amount | number | — | Pixels to scroll (default: 500) |
Returns: { success: true, direction }
weave_screenshotCaptures a PNG screenshot. Disabled by default. Set screenshot: true in ~/.weavetab/config.json to enable.
Arguments: none
Returns: MCP image content (base64 PNG)
WeaveTab was designed from the ground up to be safe to give to an AI agent:
| Protection | How it works |
|---|---|
| Domain allowlist | weave_navigate, weave_click, weave_type, weave_scroll check the current URL against allow/block patterns before any CDP call |
| Hidden element filter | Two-pass defense: AX tree ignored flag + label inspection for zero-width Unicode chars and excessive whitespace (prompt injection attacks) |
| Storage hard-block | document.cookie, localStorage, sessionStorage are overridden via CDP Page.addScriptToEvaluateOnNewDocument to return empty values on every page |
| Root detection | If WeaveTab detects it is running as root/admin, it exits immediately |
| Rate limiter | Sliding window (not a resettable counter). Default: 20 actions/minute. Returns exact retry-after time |
| Local only | Chrome debug port is only accessed via 127.0.0.1. No data leaves your machine. |
| Screenshot opt-in | Screenshots are hard-blocked unless screenshot: true is set in config |
Every tool call is written synchronously to ~/.weavetab/audit.log. The log survives crashes.
Location: ~/.weavetab/audit.log
Format:
[2026-04-26T09:00:00.000Z] weave_read https://github.com → 42 elements
[2026-04-26T09:00:05.000Z] weave_click btn-3 → Sign in
[2026-04-26T09:00:08.000Z] weave_type inp-4 → [REDACTED]
weave_type always logs [REDACTED] instead of the actual text typed.
MIT © fy2ne
FAQs
Local MCP server that attaches to Chrome via CDP and exposes semantic browser control to any AI agent. No extensions. No cloud. Zero screenshots by default.
The npm package @fy2ne/weavetab receives a total of 3 weekly downloads. As such, @fy2ne/weavetab popularity was classified as not popular.
We found that @fy2ne/weavetab demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Threat Research
/Security News
319 browser extensions installed by 13.4 million users hijack searches, capture queries, and collect referral payments from Yahoo and Bing.

Threat Research
Malicious Firefox extensions mimic Phantom, Jupiter, and Bitget wallets to steal recovery phrases and private keys, with one fetching its payload remotely.

Product
Socket Threat Intel now shows which malware campaigns were blocked or detected in your organization, with links to scans and Firewall events.