blowsh-mcp
blowsh-mcp
Model Context Protocol Server für JS-fähiges Terminal-Browsing mit Browsh
Was ist blowsh-mcp?
blowsh-mcp ist ein Model Context Protocol (MCP)-Server, der die Leistungsfähigkeit von Browsh – einem vollständig JavaScript-fähigen Terminal-Browser – für beliebige KI-Agenten, IDE-Agenten oder MCP-Clients zugänglich macht. Dieses Projekt ermöglicht es Ihrer KI, jede moderne Webseite abzurufen und zu rendern, auch solche, die JavaScript erfordern, und das Ergebnis als leicht zu parsenden Klartext, HTML oder Markdown zu erhalten.
Mnemotechnik: „blowsh“ = Browsh-betriebener MCP-Server.
Related MCP server: openmcp
Hauptfunktionen
fetch_web-Tool: Einheitliches Werkzeug zur Extraktion von lesbarem Klartext, HTML oder Markdown (nach vollständigem JS-Rendering). Unterstützt CSS-
selector-Extraktion,max_chars-Ausgabebegrenzungen undwait_ms-Polling, bis die JS-Ausführung abgeschlossen ist.search_web-Tool: Entdecken Sie Seiten über eine gerenderte Suchmaschine (DuckDuckGo HTML mit Bing-Fallback) – sortierte Ergebnisse mit URLs und Snippets.
extract_links-Tool: Listet Hyperlinks (Text + absolute URL) von jeder JS-gerenderten Seite auf, um der Navigation zu folgen.
fetch_web_batch-Tool: Ruft bis zu 10 URLs in einem Aufruf ab, mit Fehlerisolierung pro URL.
SSRF-Schutz: Lehnt Anfragen an Loopback-, private, Link-Local- oder reservierte Adressen ab (DNS-aufgelöst) und schützt so den serverseitigen Browser.
KI-optimierte Tool-Dokumentation: Eingaben, Ausgaben und illustrierte Anwendungsfälle, die für eine nahtlose Agenten-Automatisierung entwickelt wurden. Tools werfen strukturierte Fehler mit HTTP-Statuscodes (
isErrorin MCP-Antworten).Robustes Browsh-Management: Startet Browsh einmal, hält es am Laufen, verwendet ein RAM/CPU-schonendes Singleton und fährt beim Beenden sauber herunter.
In-Memory-Render-Cache mit TTL: Wiederholte Abrufe werden sofort bedient, ohne erneutes Rendern.
Entwickelt für PaaS, Cloud, lokale KI-Tools und IDE-Agenten.
Links
Browsh CLI Browser — Die Rendering-Engine.
Firefox — Wird als Backend für Browsh benötigt.
Model Context Protocol (MCP) Specification — Das Agent/Server-Protokoll.
So funktioniert es
KI/Agent sendet eine MCP-Anfrage:
fetch_web(einzelne URL),search_web(Suchanfrage),extract_links(URL) oderfetch_web_batch(bis zu 10 URLs).blowsh-mcp startet Browsh im HTTP-Server-Modus (bei der ersten Verwendung) und verwendet ihn für alle weiteren Aufrufe erneut.
blowsh-mcp fordert die Rohausgabe von Browsh an, unter Verwendung von
X-Browsh-Raw-Mode: PLAIN(für Text),DOM(für HTML), oder es ruft HTML ab und konvertiert es dann in Markdown.Die Seite (nach vollständiger JS-Ausführung) wird als Terminal-Klartext, umfangreiches HTML-DOM oder sauberes Markdown zurückgegeben – KI/Agenten wählen den Ausgabetyp passend zur nachgelagerten Verarbeitung.
Ergebnisse werden im Speicher zwischengespeichert (TTL), sodass wiederholte Abrufe sofort erfolgen; jede Anfrage wird vor dem Erreichen des Browsers auf SSRF geprüft.
Schnellstart (Docker – vorgefertigtes Image)
Das Image wird in der GitHub Container Registry veröffentlicht und bei jedem
main-Push über GitHub Actions automatisch neu erstellt – kein Firefox/Browsh/html2markdown auf dem Host erforderlich:
docker pull ghcr.io/mokhtarabadi/blowsh-mcp:latest
docker run --rm -i ghcr.io/mokhtarabadi/blowsh-mcp:latestDas
-i-Flag ist zwingend erforderlich: Der MCP-Server kommuniziert über stdin/stdout per JSON-RPC. Lassen Sie ihn interaktiv und leiten Sie Anfragen weiter, oder richten Sie Ihren MCP-Client darauf aus (siehe KI-Client-Konfiguration unten).
Beispielverwendung
Von Claude, Cursor oder einem beliebigen MCP-fähigen Agenten:
{
"tool": "search_web",
"params": { "query": "bitcoin price today", "max_results": 5 }
}
// → Ranked results with URLs + snippets → feed top URL to fetch_web
{
"tool": "fetch_web",
"params": { "url": "https://coindesk.com/price/bitcoin/", "type": "plain" }
}
// → Returns readable plain text (live price as text table, etc)
{
"tool": "fetch_web",
"params": { "url": "https://coindesk.com/price/bitcoin/", "type": "markdown", "selector": "main", "wait_ms": 3000 }
}
// → Markdown of <main> only, after JS settles ("# Bitcoin Price\n\n| Time | Price | ...")
{
"tool": "extract_links",
"params": { "url": "https://example.com", "limit": 20 }
}
// → [{"text": "Learn more", "url": "https://iana.org/domains/example"}, ...]
{
"tool": "fetch_web_batch",
"params": { "urls": ["https://a.com", "https://b.com"], "type": "markdown" }
}
// → Per-URL results; a failing page never fails the batchDie KI erhält:
Mit
type: plain: reiner lesbarer Text (Tabellen, Listen, Hauptinhalt; ideal für NLP/Zusammenfassungen oder die Aufnahme in Terminal-Kontexte).Mit
type: html: das vollständige HTML-Markup nach dem gesamten JavaScript. Verwenden Sie es für Element-Parsing, Aufbau von Linkgraphen, komplexe Scrapes usw.Mit
type: markdown: eine saubere Markdown-Version – am besten für LLM-Kontextabschnitte, semantische Pipelines und KI-freundliche Nutzung/Workflows.Fehler sind strukturiert: MCP-Antworten setzen
isError: truemit einerFetchError-Meldung, die den HTTP-Status enthält, sofern verfügbar.
Projektstruktur
src/server.ts— MCP-Server, der Tools bereitstellt.src/browshManager.ts— Startet, überwacht und beendet Browsh.src/tools/fetchWeb.ts— Implementierung des fetchWeb-Tools (plain, html, markdown; selector/max_chars/wait_ms).src/tools/searchWeb.ts— search_web (DuckDuckGo-HTML + Bing-Fallback-Parser).src/tools/extractLinks.ts— extract_links (Hyperlinks aus gerendertem DOM).src/tools/fetchWebBatch.ts— fetch_web_batch (Multi-URL, Fehlerisolierung pro URL).src/tools/html2markdownManager.ts— Wrapper für die html2markdown-CLI.src/ssrf.ts— SSRF-Schutz (blockiert private/loopback/reservierte Ziele).src/cache.ts— In-Memory-TTL-Render-Cache.src/extract.ts— Extraktion des Hauptinhalts, Selector-Helfer, Kürzung.src/errors.ts—FetchError+ Nachrichtenformatierung.README.md— Diese Datei.Dockerfile— Multi-Stage-Container (baut TS, bündelt Firefox, Browsh, html2markdown)..github/workflows/docker-publish.yml— CI/CD: erstellt und veröffentlicht das Image auf ghcr.io beimain/v*..env— Konfigurationsüberschreibungen. Siehe.env.examplefür alle Optionen.
Installation
Voraussetzungen:
Node.js >= 20.18
Firefox installiert und im PATH
Browsh CLI installiert und im PATH
html2markdown CLI installiert und im PATH
Unter Debian/Ubuntu installieren mit:
wget -O /tmp/html2markdown.deb "https://github.com/JohannesKaufmann/html-to-markdown/releases/download/v2.5.2/html2markdown_2.5.2_linux_amd64.deb" sudo apt-get install -y /tmp/html2markdown.deb rm /tmp/html2markdown.debOder verwenden Sie das vorgefertigte Binärpaket für Ihr Betriebssystem von der Releases-Seite.
Bevorzugen Sie Docker? Überspringen Sie die Installation auf dem Host komplett – das Multi-Stage-Image bündelt Firefox, Browsh und html2markdown. Der schnellste Weg ist das veröffentlichte Image (
ghcr.io/mokhtarabadi/blowsh-mcp:latest, siehe Schnellstart); um es selbst zu bauen:docker build -t blowsh-mcp:latest . docker run --rm -i blowsh-mcp:latest
git clone https://github.com/mokhtarabadi/blowsh-mcp.git
cd blowsh-mcp
npm install
npm run buildMCP-Server ausführen
Nach dem Erstellen starten Sie den Server mit:
node dist/server.jsErsetzen Sie dist/server.js durch den korrekten Pfad, falls sich Ihre Build-Ausgabe unterscheidet.
Erstellen Sie bei Bedarf eine .env-Datei für die Konfiguration. Zum Beispiel:
MCP_TRANSPORT=stdio
BROWSH_FIREFOX_PATH=/usr/bin/firefox-esr
HTML2MARKDOWN_PATH=html2markdown
CACHE_TTL_MS=300000
BROWSH_REQUEST_TIMEOUT_MS=30000
ALLOW_PRIVATE_URLS=false
NODE_ENV=productionBROWSH_FIREFOX_PATHermöglicht es Ihnen, die von Browsh während des Headless/HTTP-Betriebs verwendete Firefox-Datei anzupassen.HTML2MARKDOWN_PATHermöglicht es Ihnen, einen benutzerdefinierten Pfad zur html2markdown-Binärdatei anzugeben (Standard:html2markdownim PATH).CACHE_TTL_MS,BROWSH_REQUEST_TIMEOUT_MSundALLOW_PRIVATE_URLSoptimieren den Render-Cache, das Timeout pro Anfrage bzw. den SSRF-Schutz.Browshs HTTP-Port/-Host sind NICHT konfigurierbar.
Projektdokumentation
Datei | Zielgruppe | Zweck |
| Agenten | Betriebsregeln, Leitplanken, Aufgabenlebenszyklus |
| Alle | Designsprache für MCP-Antworten/-Ausgaben |
| Entwickler | Systemübersicht, Komponentenverdrahtung |
| Entwickler | Tool-Eingabe-/Ausgabeschemata und Fehlermodell |
| Entwickler | DateTime-Standard, SOLID-Richtlinien |
| Alle | Versionshistorie (Keep a Changelog) |
| Team | Kanban-Aufgabendateien (Backlog → Archiv) |
Diese README ist der benutzerorientierte Einstiegspunkt; agentenorientierte Regeln stehen in AGENTS.md und sind vor jeder Implementierung Pflichtlektüre.
Tool-API
Name | Parameter | KI-Anwendungsfall/Beschreibung |
fetch_web |
| Ruft eine Seite nach dem JS-Rendering als Text/HTML/Markdown ab. |
search_web |
| Durchsucht das Web (DuckDuckGo-HTML + Bing parallel gerendert) und gibt |
extract_links |
| Gibt alle Hyperlinks ( |
fetch_web_batch |
| Ruft bis zu 10 URLs in einem Aufruf ab (cache-bewusst). Gibt pro URL |
Rückgabewerte
type: plain: terminalartiger, JS-ausgeführter lesbarer Text (oder Fehlerzeichenfolge).type: html: HTML-Markup-Zeichenfolge nach JS (oder Fehlerzeichenfolge). Mitselectornur das HTML des übereinstimmenden Elements.type: markdown: Markdown-Konvertierung des Hauptinhalts oder des ausgewählten Elements (oder Fehlerzeichenfolge). Links, Überschriften, Listen und Seitenstruktur bleiben für KI-freundliche Kontexte erhalten.type: pdf: extrahierter Klartext aus dem PDF-Dokument (über pdftotext, 20-MB-Grenze).Fehler sind strukturiert: eine MCP-Antwort mit
isError: trueund einerFetchError-Meldung, die den HTTP-Status enthält, sofern dieser bekannt ist (niemals eine stille leere Zeichenfolge).
Umgebungsvariablen
Legen Sie diese über .env (automatisch geladen) oder die Umgebung fest:
Variable | Default | Description |
|
| Firefox-Binärdatei, die von Browsh verwendet wird (z. B. |
|
| Pfad zur html2markdown-Binärdatei. |
|
| Zeitüberschreitung pro Render-Anfrage (ms). |
|
| Maximale PDF-Dateigröße in Bytes für |
|
| Anzahl der Anfragen, nach denen der Browserprozess recycelt wird. |
|
| Leerlaufzeit in ms, bevor der Browserprozess beendet wird (10 Min.). |
|
| TTL des Render-Caches im Speicher (ms). |
|
| Setzen Sie |
|
| Transporttyp (nur |
|
| Node-Umgebung. |
KI-gestützte Tool-Auswahl
Beginnen Sie mit
search_web: Um Seiten zu entdecken, führen Sie eine Abfrage aus und wählen Sie die besten Ergebnis-URLs; rufen Sie diese dann ab.Verwenden Sie
fetch_webfür einzelne Seiten:plain, wenn Sie eine schnelle, lesbare Ausgabe für Zusammenfassung/Klassifizierung benötigen;html, um Elemente, Links oder Tabellen zu parsen;markdownfür LLM-freundliche Kontextblöcke. Fügen Sieselector/max_chars/wait_mshinzu, um token-effizient zu bleiben und abgeschlossene, relevante Inhalte zu erhalten.Verwenden Sie
extract_linksvor tiefen Crawls: Folgen Sie der Navigation kostengünstig, anstatt vollständige DOMs abzurufen.Verwenden Sie
fetch_web_batchfür mehrere Quellen: Ein Aufruf statt N Round-Trips; Fehler werden pro URL isoliert.
Fehlerbehandlung:
Tools werfen FetchError und MCP gibt isError: true mit einer umsetzbaren Meldung zurück — ungültige Protokolle, SSRF-Blöcke, nicht übereinstimmende Selektoren, HTTP-Statuscodes und Rendering-Fehler werden nie verschwiegen.
MCP-Protokoll: KI-Client-Konfiguration
Bevor Sie Ihren KI-Client (Claude, Cursor usw.) konfigurieren, müssen Sie
Abhängigkeiten installieren:
npm installDas Projekt erstellen:
npm run buildDen MCP-Server aus dem kompilierten Output starten:
node dist/server.js
Beispielkonfiguration für Claude Desktop oder Cursor:
{
"mcpServers": {
"blowsh": {
"command": "node",
"args": ["dist/server.js"],
"env": {}
}
}
}Beispielkonfiguration für opencode (Projekt opencode.json):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"blowsh": {
"type": "local",
"command": ["docker", "run", "--rm", "-i", "ghcr.io/mokhtarabadi/blowsh-mcp:latest"],
"enabled": true,
"timeout": 120000
}
},
"permission": { "blowsh_*": "allow" }
}Die Docker-Form benötigt keine binären Dateien auf dem Host; das Image enthält Firefox, Browsh und html2markdown. Starten Sie opencode nach dem Speichern neu (die Konfiguration wird beim Start einmalig geladen).
Sauberes Herunterfahren
blowsh-mcp fängt SIGINT/SIGTERM ab und stellt sicher, dass Browsh sauber beendet wird – keine verwaisten Browser.
Sicherheit und Überlegungen
Der Server führt Browsh lokal aus und ruft über HTTP localhost ab.
SSRF-Schutz: Standardmäßig lehnen
fetch_web/search_web/extract_links/fetch_web_batchURLs ab, die auf Loopback-, private, link-lokale oder reservierte IP-Bereiche aufgelöst werden (über DNS geprüft). Setzen SieALLOW_PRIVATE_URLS=true, um dies zu deaktivieren – nicht empfohlen.Keine öffentliche Bereitstellung, es sei denn, der MCP HTTP/streamable Server ist explizit konfiguriert.
Setzen Sie Ports niemals ohne Firewall dem offenen Web aus.
Verwenden Sie Umgebungsvariablen für Geheimnisse/Konfiguration.
Erweitern
Fügen Sie neue Tools in src/tools/ hinzu, exportieren Sie sie in src/server.ts, und dokumentieren.
KI-Clients entdecken Docstrings automatisch.
Fehlerbehebung
Wenn fetchPlain 404 zurückgibt oder JS nicht rendern kann: Überprüfen Sie, ob Firefox und Browsh installiert und im PATH sind.
Wenn Firefox nicht gefunden wird oder nicht startet, setzen Sie
BROWSH_FIREFOX_PATHin.env, um den vollständigen Pfad zu Ihrer Firefox-Installation anzugeben.Browsh-Port/-Host sind festgelegt – es gibt keine Umgebungs- oder CLI-Einstellung, um sie zu ändern.
Führen Sie es für maximale Sicherheit in einem Container aus.
Lizenz
MIT
Autor: Mohammad Reza Mokhtarabadi mmokhtarabadi@gmail.com
Available Tools
1 toolfetch_webFetch Web (plain, html, markdown)A
Fetch a web page and return its content as plain text, HTML, or Markdown. Uses a JS-capable browser for dynamic sites.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The HTTP/HTTPS web URL to fetch | |
| type | Yes | The output type: plain, html, or markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral traits. It discloses the use of a JS-capable browser, which is critical for understanding behavior with dynamic sites. It does not mention rate limits or error handling, but the core behavioral trait is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the main purpose and adding the browser capability as a key differentiator. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 simple parameters, no output schema, and no annotations, the description is sufficient. It covers the purpose, output types, and a notable behavior (JS browser). Minor missing details like response size limits or timeout are not critical for a basic fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters well described. The description adds 'plain text, HTML, or Markdown' but that is a restatement of the enum values. No additional nuance is provided beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (fetch a web page) and the resource (web page content), and specifies three output types (plain, HTML, Markdown). It distinguishes the tool by mentioning JS-capable browser for dynamic sites, which sets it apart from simple fetchers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives or when not to use it. Given no sibling tools are listed, it is minimally adequate but lacks context like 'use for public pages only' or 'prefer for dynamic content'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.0.0- First observed
fetch_web
TDQS
Scored across 1 tool
With only one tool, there is no possibility of ambiguity between tools. The tool's purpose is clear and distinct.
The single tool name 'fetch_web' follows a clear verb_noun pattern. With only one tool, there is no inconsistency to evaluate.
A single tool is borderline for a server. While it serves a specific purpose, it feels thin compared to typical MCP servers that offer multiple related operations.
The tool provides core web fetching functionality with output format options. A minor gap might be the lack of custom headers or request methods, but agents can work around this for most use cases.
Maintenance
Related MCP Connectors
- CrawioOAuthcom.crawio
Web pages as Markdown, text or HTML, plus Google Maps places and reviews, for AI agents.
Unblocking and fresh web data for agents: URL to Markdown, YouTube, Maps, Amazon, jobs. Pay per call
Web scraping for AI agents. Converts URLs to clean, LLM-ready Markdown with anti-bot bypass.
Headless browser primitives for AI agents when sites need real JS rendering.
Related MCP Servers
AlicenseAqualityFmaintenanceA Model Context Protocol server that enables AI agents to fetch live web content with JavaScript rendering, proxy rotation, and anti-bot evasion.979 npm58MIT- AlicenseNot gradedqualityDmaintenanceEnables AI agents to automate web tasks such as browsing, clicking, typing, and taking screenshots via the Model Context Protocol.1MIT

Browseagent MCPofficial
AlicenseAqualityDmaintenanceEnables AI agents to control web browsers through the Model Context Protocol, supporting navigation, clicking, typing, and screenshots.127 npm1MIT- AlicenseAqualityDmaintenanceEnables AI agents to fetch any web page as clean markdown or screenshot it, turning URLs into LLM-ready context.27 npmMIT