agent-browser
agent-browser
Ein gehärteter lokaler Browser für KI-Agenten. Null Abhängigkeiten. Steuert das Chrome, das du bereits hast, über das DevTools-Protokoll, extrahiert token-effizientes Markdown und wird nicht trivial als Automatisierung erkannt.
Oberfläche | Installation | Verwendung |
MCP-Server |
| Claude Code, Cursor, Codex, jeder MCP-Client |
CLI |
| Shells, Skripte, CI |
Bibliothek |
| dein eigener Node-Code |
DSH-/Cordis-Plugin | Kompositionszeile | native Tools in einer DSH-Umgebung |
npx -y @truenix/agent-browser markdown https://news.ycombinator.comAlles läuft lokal. Kein Konto, kein API-Schlüssel, kein Remote-Dienst, kein Kontingent.
Warum
Einen Agenten mit rohem HTML zu füttern verschwendet den Großteil seines Kontexts. Gemessen auf echten Seiten:
Seite | HTML | Markdown | Text | Ersparnis |
| 835 kB | 95 kB | 51 kB | 8,8× |
| 34 kB | 6 kB | 4 kB | 5,2× |
Und ein Browser, der sich als Automatisierung zu erkennen gibt, wird blockiert, degradiert oder mit anderen Inhalten bedient – was stillschweigend das korrumpiert, was der Agent daraus geschlossen hat.
Related MCP server: Browser-MCP Navigator
Installieren
Als MCP-Server
claude mcp add browser -- npx -y @truenix/agent-browser mcp{
"mcpServers": {
"browser": {
"command": "npx",
"args": ["-y", "@truenix/agent-browser", "mcp"]
}
}
}Tools: browser_markdown, browser_text, browser_html, browser_links, browser_screenshot, browser_evaluate, browser_accessibility_tree, browser_pdf, browser_probe.
Als Bibliothek
npm install @truenix/agent-browserimport { withBrowser } from '@truenix/agent-browser';
const md = await withBrowser({}, async (session) => {
await session.navigate('https://example.com');
return session.markdown();
});Als DSH-/Cordis-Plugin
Einzeiler (empfohlen – verdrahtet automatisch, wenn du DSH wirklich meinst):
npx -y @truenix/agent-browser install # edits ~/.dsh/profiles/web/cordis.patch.yml + package.json, then pnpm install
# npx -y @truenix/agent-browser install --profile web --dry-run # preview
# npx -y @truenix/agent-browser uninstall # remove againStarte dsh neu – browser_markdown, browser_text, browser_links, browser_evaluate, browser_screenshot, browser_probe erscheinen als native Tools. Kein Handler läuft bei einem einfachen npm install; eine absichtliche install ist erforderlich.
Manuell (falls du die Komposition lieber selbst bearbeitest):
npm i -g @truenix/agent-browser
# or inside the harness checkout: pnpm add @truenix/agent-browserErfordert Node ≥ 18 und eine Chrome/Chromium-Installation. Füge dann zur Host-Komposition hinzu (das Tool-Registry liegt auf dem Host, nicht pro Agent):
# ~/.dsh/profiles/web/cordis.patch.yml — persists for every web session
- insert:
- id: agent-browser
name: '@truenix/agent-browser/cordis'
config:
timeoutMs: 180000 # per-tool call budget; default respects AGENT_BROWSER_BIN / ENDPOINT
# cli: 'npx -y @truenix/agent-browser' # override only if neededKurzform (wenn die Komposition bereits insert umschließt):
- '@truenix/agent-browser/cordis':
timeoutMs: 180000Env-Overrides: AGENT_BROWSER_BIN (Chrome-Binary), AGENT_BROWSER_ENDPOINT (an langlebigen Browser anhängen via --endpoint), oder config.cli.
CLI
agent-browser <command> [options]
markdown <url> Extract the page as Markdown (main content by default)
text <url> Visible text only
html <url> Full serialized DOM after JavaScript runs
links <url> Every anchor as JSON
screenshot <url> PNG/JPEG (-o file, --full)
pdf <url> PDF (-o file)
a11y <url> Filtered accessibility tree
eval <url> <expr> Evaluate JS in the page
probe Browser, GPU and capability report
mcp Run as an MCP server on stdioOptionen: --headful, --no-stealth, --block-images, --gpu/--no-gpu, --width, --height, --viewport WxH, --main, --raw, --full, --endpoint <ws>, --timeout, --json, -o.
--endpoint hängt sich an einen bereits laufenden Browser an, statt einen zu starten – nützlich, um einen einzelnen langlebigen Browser über viele Aufrufe hinweg wiederzuverwenden.
Bot-Erkennung
Führe es selbst aus: npm run test:bot. Letztes Ergebnis:
Detektor | Ergebnis |
31 bestanden, 0 fehlgeschlagen | |
6 grün, 0 rot, | |
|
Normales Headless-Chrome fällt bei vier sannysoft-Zeilen durch (HEADCHR_UA, CHR_MEMORY, WebGL SwiftShader, alte UA) und wird als Bot gemeldet.
Ein nicht erreichbarer Detektor zählt als ÜBERSPRUNG, nie als bestanden, und das Tor erfordert drei erreichbare Bestehen – ein Tag, an dem die Testseiten nicht erreichbar sind, kann also nicht als Erfolg fehlinterpretiert werden.
Die Umgebung zählt mehr als das Patchen
Der identische Code, an zwei Orten gemessen:
diese Workstation | GitHub-Actions-Runner | |
IP | privat | Rechenzentrum |
GPU | echt (NVIDIA) | keine → SwiftShader |
| 31 bestanden, 0 fehlgeschlagen | 30 bestanden, 1 fehlgeschlagen ( |
| 6 grün, 0 rot | 6 grün, 0 rot |
|
|
|
Jedes CDP-Signal bleibt in beiden Fällen sauber – das ist Code, und der Code ist richtig. Was das Urteil kippt, ist die Umgebung: eine Rechenzentrums-ASN plus Software-Rendering löst einen Schwachsignal-Verbund aus, den kein noch so viel Fingerprint-Patching behebt.
Das ist die ehrliche Form des Problems. Den Browser zu härten entfernt die trivialen Hinweise. Wo du ihn ausführst, entscheidet den Rest.
Was die Härtung tut, und warum
Jeder Punkt kam von einem Detektor, der uns sagte, dass wir falsch lagen:
Kein
--enable-automation. Dieses Flag – das Puppeteer und Playwright hinzufügen – setztnavigator.webdriver = true. Rohes CDP setzt es nicht, also bleibt esfalse, ohne dass etwas gepatcht wird.Kein
Runtime.enable. Es ist der lauteste CDP-Hinweis und treibt den klassischen Console/Error.stack-Detektor an.Runtime.evaluatefunktioniert auch ohne.Fenster und Bildschirm bewegen sich zusammen.
--window-sizeohne--ozone-override-screen-sizeergibtouterWidth > screen.width, was physikalisch unmöglich ist – ein stärkeres Signal als normales Headless.Kein Standard-Device-Metrics-Override. Die übliche 1280×720 ist Playwrights Standard-Viewport und Detektoren markieren sie namentlich. Setze
--viewportnur, wenn du es brauchst.Echte GPU, wenn verfügbar, was einen echten
ANGLE (NVIDIA …)-Renderer statt SwiftShader ergibt.UA beim Start gesetzt, nicht nur über CDP.
Emulation.setUserAgentOverrideerreicht keine Web-Worker, also meldet ein Worker weiterhin die Headless-UA, während die Seite die saubere meldet (hasInconsistentWorkerValues).Kein
acceptLanguage-Override. CDP leitetnavigator.languagesdurch Aufteilen dieses Headers ab, also wird"en-US,en;q=0.9"zu["en-US","en;q=0.9"]– ein q-Wert, der legal nicht existieren kann, und eine weitere Seite/Worker-Diskrepanz.--langmacht es korrekt.Client-Hints, abgeleitet aus der Version des Binaries selbst, sodass
Sec-CH-UAnicht mitnavigator.userAgentkollidieren kann.Isolierter Browser-Kontext pro Sitzung, beim Schließen verworfen – sauberer Zustand pro Aufgabe ohne einen zweiten Browserprozess.
Die wiederkehrende Lektion: Konsistenz schlägt Abdeckung. Vier davon sind Fälle, in denen teilweises Spoofing die Erkennung erleichterte, was nur durch das Ausführen echter Detektoren auffiel.
Warum WebGL-Spoofing standardmäßig deaktiviert ist
spoofWebgl existiert und ist sorgfältig implementiert – ein Proxy um natives getParameter, sodass Function.prototype.toString weiterhin [native code] meldet. Es ist deaktiviert, weil Messungen zeigen, dass es nach hinten losgeht. Aus test/webgl-spoof-experiment.mjs:
Arm | Renderer behauptet | maxTexture | Erweiterungen | sannysoft | Urteil |
echte GPU, kein Spoof | NVIDIA | 32768 | 37 | 0 fehlgeschlagen |
|
SwiftShader, ehrlich | SwiftShader | 8192 | 35 | 1 fehlgeschlagen |
|
SwiftShader + Spoof | NVIDIA | 8192 | 35 | 0 fehlgeschlagen |
|
Hardware zu behaupten, die man nicht hat, behebt eine kosmetische Zeile und lässt den Verbund-Detektor fehlschlagen: Das injizierte Skript erreicht keine Web-Worker, also meldet der Worker weiterhin SwiftShader, und MAX_TEXTURE_SIZE bleibt beim Software-Wert, während die Renderer-Zeichenkette eine diskrete GPU behauptet.
Ehrliches SwiftShader besteht. Eine überzeugende Lüge nicht. Gib dem Browser stattdessen eine echte GPU – es ist kostenlos.
Was das NICHT tut
Fingerprint-Ebene-Erkennung ist der gesamte Umfang. Es besiegt nicht, und versucht nicht zu besiegen:
TLS/JA3-JA4 und HTTP/2-Fingerprinting – entschieden, bevor irgendein JavaScript läuft
IP-Reputation – Rechenzentrum vs. Wohn-ASN, oft der eigentliche Blocker
Verhaltensanalyse – Mauspfade, Timing, Verweildauer
Kommerzielle Challenge-Produkte stützen sich auf diese, also bedeutet „das Gate bestehen“ nicht trivial als Automatisierung markiert, niemals unerkennbar. Gedacht für deine eigenen Seiten, Tests, Barrierefreiheitsarbeit und gewöhnliches Agenten-Browsing.
Speicher
Ein Chrome-Stack kostet ungefähr 450 MB. Der Hebel ist Architektur, nicht Flags: einen Browser und viele isolierte Kontexte statt einen Browser pro Aufgabe. Starte einen Browser einmal und richte dann jeden Aufruf mit --endpoint / AGENT_BROWSER_ENDPOINT darauf aus. --block-images hilft bei Textarbeit.
Null Abhängigkeiten
dependencies ist leer, einschließlich des WebSocket-Transports.
Node's globales WebSocket (WHATWG) kann keine Request-Header senden, was jeder authentifizierte oder proxierte CDP-Endpunkt benötigt, und undici ist nicht eigenständig importierbar. Also implementiert src/ws.mjs RFC 6455 direkt über node:http(s) – Handshake, Maskierung, Fortsetzungsfragmente, 64-Bit-Längen, Ping/Pong – was alles ist, was CDP benötigt.
Der Markdown-Konverter durchläuft das DOM mit einem expliziten Stack, hält die JS-Aufruftiefe bei O(1) unabhängig von der Verschachtelung und verwendet natives innerText für Blattknoten. Das macht ihn sowohl rekursionssicher bei tief verschachtelten Dokumenten als auch deutlich schneller auf großen Seiten.
Umgebung
| Pfad zu einem Chrome/Chromium-Binary |
| an diesen CDP-Endpunkt anhängen statt starten |
Anforderungen
Node ≥ 18 und eine Chrome/Chromium-Installation. Kein Build-Schritt.
Danksagungen
Die Härtung dieses Projekts ist fast vollständig aus veröffentlichten Erkennungsforschungen anderer abgeleitet – siehe CREDITS.md. Besonderer Dank an rebrowser-bot-detector, bot.sannysoft.com, deviceandbrowserinfo.com und Camoufox dafür, dass sie gezeigt haben, wie man es richtig macht.
Lizenz
MIT# agent-browser
Ein gehärteter lokaler Browser für KI-Agenten. Null Abhängigkeiten. Steuert das Chrome, das du bereits hast, über das DevTools-Protokoll, extrahiert token-effizientes Markdown und wird nicht trivial als Automatisierung erkannt.
Oberfläche | Installieren | Verwendung für |
MCP-Server |
| Claude Code, Cursor, Codex, jeder MCP-Client |
CLI |
| Shells, Skripte, CI |
Bibliothek |
| dein eigener Node-Code |
DSH-/Cordis-Plugin | Kompositionszeile | native Tools in einer DSH-Umgebung |
npx -y @truenix/agent-browser markdown https://news.ycombinator.comAlles läuft lokal. Kein Konto, kein API-Schlüssel, kein externer Dienst, keine Kontingente.
Warum
Das Füttern eines Agenten mit rohem HTML verschwendet den Großteil seines Kontexts. Gemessen auf echten Seiten:
Seite | HTML | Markdown | Text | Ersparnis |
| 835 kB | 95 kB | 51 kB | 8,8× |
| 34 kB | 6 kB | 4 kB | 5,2× |
Und ein Browser, der sich als Automatisierung zu erkennen gibt, wird blockiert, degradiert oder mit anderen Inhalten bedient – was stillschweigend das korrumpiert, was der Agent daraus geschlossen hat.
Installieren
Als MCP-Server
claude mcp add browser -- npx -y @truenix/agent-browser mcp{
"mcpServers": {
"browser": {
"command": "npx",
"args": ["-y", "@truenix/agent-browser", "mcp"]
}
}
}Tools: browser_markdown, browser_text, browser_html, browser_links, browser_screenshot, browser_evaluate, browser_accessibility_tree, browser_pdf, browser_probe.
Als Bibliothek
npm install @truenix/agent-browserimport { withBrowser } from '@truenix/agent-browser';
const md = await withBrowser({}, async (session) => {
await session.navigate('https://example.com');
return session.markdown();
});Als DSH-/Cordis-Plugin
Einzeiler (empfohlen – verdrahtet automatisch, wenn du DSH wirklich meinst):
npx -y @truenix/agent-browser install # edits ~/.dsh/profiles/web/cordis.patch.yml + package.json, then pnpm install
# npx -y @truenix/agent-browser install --profile web --dry-run # preview
# npx -y @truenix/agent-browser uninstall # remove againStarte dsh neu – browser_markdown, browser_text, browser_links, browser_evaluate, browser_screenshot, browser_probe erscheinen als native Tools. Kein Handler läuft bei einem einfachen npm install; eine absichtliche install ist erforderlich.
Manuell (falls du die Komposition lieber selbst bearbeiten möchtest):
npm i -g @truenix/agent-browser
# or inside the harness checkout: pnpm add @truenix/agent-browserBenötigt Node ≥ 18 und eine Chrome/Chromium-Installation. Füge dann zur Host-Komposition hinzu (das Tool-Registry liegt auf dem Host, nicht pro Agent):
# ~/.dsh/profiles/web/cordis.patch.yml — persists for every web session
- insert:
- id: agent-browser
name: '@truenix/agent-browser/cordis'
config:
timeoutMs: 180000 # per-tool call budget; default respects AGENT_BROWSER_BIN / ENDPOINT
# cli: 'npx -y @truenix/agent-browser' # override only if neededKurzform (wenn die Komposition bereits insert umschließt):
- '@truenix/agent-browser/cordis':
timeoutMs: 180000Env-Overrides: AGENT_BROWSER_BIN (Chrome-Binary), AGENT_BROWSER_ENDPOINT (an langlebigen Browser anhängen via --endpoint), oder config.cli.
CLI
agent-browser <command> [options]
markdown <url> Extract the page as Markdown (main content by default)
text <url> Visible text only
html <url> Full serialized DOM after JavaScript runs
links <url> Every anchor as JSON
screenshot <url> PNG/JPEG (-o file, --full)
pdf <url> PDF (-o file)
a11y <url> Filtered accessibility tree
eval <url> <expr> Evaluate JS in the page
probe Browser, GPU and capability report
mcp Run as an MCP server on stdioOptionen: --headful, --no-stealth, --block-images, --gpu/--no-gpu, --width, --height, --viewport WxH, --main, --raw, --full, --endpoint <ws>, --timeout, --json, -o.
--endpoint hängt sich an einen bereits laufenden Browser an, statt einen zu starten – nützlich, um einen einzelnen langlebigen Browser über viele Aufrufe hinweg wiederzuverwenden.
Bot-Erkennung
Führe es selbst aus: npm run test:bot. Letztes Ergebnis:
Detektor | Ergebnis |
31 bestanden, 0 fehlgeschlagen | |
6 grün, 0 rot, | |
|
Normales Headless-Chrome fällt bei vier sannysoft-Zeilen durch (HEADCHR_UA, CHR_MEMORY, WebGL SwiftShader, alte UA) und wird als Bot gemeldet.
Ein nicht erreichbarer Detektor zählt als ÜBERSPRUNG, nie als bestanden, und das Gate erfordert drei erreichbare Bestehen – ein Tag, an dem die Testseiten nicht erreichbar sind, kann also nicht als Erfolg missverstanden werden.
Umgebung zählt mehr als Patchen
Der identische Code, gemessen an zwei Orten:
diese Workstation | GitHub-Actions-Runner | |
IP | privat | Rechenzentrum |
GPU | echt (NVIDIA) | keine → SwiftShader |
| 31 bestanden, 0 fehlgeschlagen | 30 bestanden, 1 fehlgeschlagen ( |
| 6 grün, 0 rot | 6 grün, 0 rot |
|
|
|
Jedes CDP-Signal bleibt in beiden Fällen sauber – das ist Code, und der Code ist richtig. Was das Urteil kippt, ist die Umgebung: eine Rechenzentrums-ASN plus Software-Rendering löst einen Schwachsignal-Verbund aus, den kein noch so vieles Fingerprint-Patchen behebt.
Das ist die ehrliche Form des Problems. Den Browser zu härten entfernt die trivialen Hinweise. Wo du ihn ausführst, entscheidet den Rest.
Was die Härtung tut, und warum
Jeder Punkt kam von einem Detektor, der uns sagte, dass wir falsch lagen:
Kein
--enable-automation. Dieses Flag – das Puppeteer und Playwright hinzufügen – setztnavigator.webdriver = true. Rohes CDP setzt es nicht, also bleibt esfalse, ohne dass etwas gepatcht wird.Kein
Runtime.enable. Es ist der lauteste CDP-Hinweis und treibt den klassischen Console/Error.stack-Detektor an.Runtime.evaluatefunktioniert auch ohne.Fenster und Bildschirm bewegen sich zusammen.
--window-sizeohne--ozone-override-screen-sizeergibtouterWidth > screen.width, was physikalisch unmöglich ist – ein stärkeres Signal als normales Headless.Kein Standard-Device-Metrics-Override. Die übliche 1280×720 ist Playwrights Standard-Viewport und Detektoren markieren ihn namentlich. Setze
--viewportnur, wenn du es brauchst.Echte GPU, wenn verfügbar, was einen echten
ANGLE (NVIDIA …)-Renderer statt SwiftShader ergibt.UA beim Start gesetzt, nicht nur über CDP.
Emulation.setUserAgentOverrideerreicht keine Web-Worker, also meldet ein Worker weiterhin die Headless-UA, während die Seite die saubere meldet (hasInconsistentWorkerValues).Kein
acceptLanguage-Override. CDP leitetnavigator.languagesdurch Aufteilen dieses Headers ab, also wird"en-US,en;q=0.9"zu["en-US","en;q=0.9"]– ein q-Wert, der legal nicht existieren kann, und eine weitere Seite/Worker-Diskrepanz.--langmacht es korrekt.Client-Hints, die aus der eigenen Version des Binaries abgeleitet werden, sodass
Sec-CH-UAnicht mitnavigator.userAgentkollidieren kann.Isolierter Browser-Kontext pro Sitzung, beim Schließen verworfen – sauberer Zustand pro Aufgabe ohne einen zweiten Browserprozess.
Die wiederkehrende Lektion: Konsistenz schlägt Abdeckung. Vier davon sind Fälle, in denen teilweises Spoofing die Erkennung erleichterte, nur durch echte Detektoren aufgedeckt.
Warum WebGL-Spoofing standardmäßig deaktiviert ist
spoofWebgl existiert und ist sorgfältig implementiert – ein Proxy um natives getParameter, sodass Function.prototype.toString weiterhin [native code] meldet. Es ist deaktiviert, weil Messungen sagen, dass es nach hinten losgeht. Aus test/webgl-spoof-experiment.mjs:
Arm | Renderer behauptet | maxTexture | Erweiterungen | sannysoft | Urteil |
echte GPU, kein Spoof | NVIDIA | 32768 | 37 | 0 fehlgeschlagen |
|
SwiftShader, ehrlich | SwiftShader | 8192 | 35 | 1 fehlgeschlagen |
|
SwiftShader + Spoof | NVIDIA | 8192 | 35 | 0 fehlgeschlagen |
|
Hardware zu behaupten, die du nicht hast, behebt eine kosmetische Zeile und lässt den Verbund-Detektor fehlschlagen: Das injizierte Skript erreicht keine Web-Worker, also meldet der Worker weiterhin SwiftShader, und MAX_TEXTURE_SIZE bleibt beim Softwarewert, während die Renderer-Zeichenkette eine diskrete GPU behauptet.
Ehrliches SwiftShader besteht. Eine überzeugende Lüge nicht. Gib dem Browser stattdessen eine echte GPU – es ist kostenlos.
Was das NICHT tut
Fingerprint-Ebene-Erkennung ist der gesamte Umfang. Es besiegt nicht, und versucht nicht zu besiegen:
TLS/JA3-JA4 und HTTP/2-Fingerprinting – entschieden, bevor irgendein JavaScript läuft
IP-Reputation – Rechenzentrum vs. privat, oft der eigentliche Blocker
Verhaltensanalyse – Mauspfade, Timing, Verweildauer
Kommerzielle Challenge-Produkte stützen sich auf diese, also bedeutet „das Gate bestehen“ nicht trivial als Automatisierung markiert zu werden, nie unerkennbar. Gedacht für deine eigenen Seiten, Tests, Barrierefreiheitsarbeit und gewöhnliches Agenten-Browsing.
Speicher
Ein Chrome-Stack kostet ungefähr 450 MB. Der Hebel ist Architektur, nicht Flags: ein Browser und viele isolierte Kontexte statt ein Browser pro Aufgabe. Starte einen Browser einmal, dann richte jeden Aufruf mit --endpoint / AGENT_BROWSER_ENDPOINT darauf. --block-images hilft bei Textarbeit.
Null Abhängigkeiten
dependencies ist leer, einschließlich des WebSocket-Transports.
Nodes globales WebSocket (WHATWG) kann keine Request-Header senden, was jeder authentifizierte oder proxierte CDP-Endpunkt benötigt, und undici ist nicht eigenständig importierbar. Also implementiert src/ws.mjs RFC 6455 direkt über node:http(s) – Handshake, Maskierung, Fortsetzungsfragmente, 64-Bit-Längen, Ping/Pong – was alles ist, was CDP benötigt.
Der Markdown-Konverter durchläuft das DOM mit einem expliziten Stack, hält die JS-Aufruftiefe bei O(1) unabhängig von der Verschachtelung, und verwendet natives innerText für Blattknoten. Das macht ihn sowohl rekursionssicher auf tief verschachtelten Dokumenten als auch deutlich schneller auf großen Seiten.
Umgebung
| Pfad zu einem Chrome/Chromium-Binary |
| an diesen CDP-Endpunkt anhängen statt starten |
Anforderungen
Node ≥ 18 und eine Chrome/Chromium-Installation. Kein Build-Schritt.
Danksagungen
Die Härtung dieses Projekts ist fast vollständig aus veröffentlichten Erkennungsforschungen anderer abgeleitet – siehe CREDITS.md. Besonderer Dank an rebrowser-bot-detector, bot.sannysoft.com, deviceandbrowserinfo.com und Camoufox dafür, dass sie zeigen, wie man es richtig macht.
Lizenz
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for browser automation with anti-detection. Scout pages, find elements, interact with websites, and monitor network traffic from any AI client that supports the Model Context Protocol.211MIT
- FlicenseBqualityBmaintenanceUltra-fast browser automation server over Chrome DevTools Protocol (CDP), exposed as MCP, enabling AI agents to control a real Chrome browser with low latency and minimal token usage.21
- AlicenseAqualityAmaintenanceA fault-tolerant, stealth-enabled Model Context Protocol (MCP) server for web searching and content fetching. Built for AI Agents (Cursor, Claude Code, OpenCode), it uses a stealth browser engine to fetch pages, dynamically handles SPAs/React, and converts bloat into token-optimized Markdown.23192MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that lets agents drive your real Chrome browser with existing logins and sessions via an outbound-only WebSocket extension. It exposes Playwright-compatible browser tools for navigation, clicking, typing, and snapshots.Apache 2.0
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Headless-browser-as-JSON with memorymarket cache economics. Real Chromium, crypto settlement.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TrueNix/agent-browser'
If you have feedback or need assistance with the MCP directory API, please join our Discord server