blowsh-mcp
blowsh-mcp
Servidor de Protocolo de Contexto Modelo para navegación de terminal compatible con JS mediante Browsh
¿Qué es blowsh-mcp?
blowsh-mcp es un servidor de Protocolo de Contexto Modelo (MCP) que expone el poder de Browsh —un navegador de terminal totalmente compatible con JavaScript— a cualquier agente de IA, agente de IDE o cliente MCP. Este proyecto permite que tu IA obtenga y renderice cualquier página web moderna, incluidas las que requieren JavaScript, y reciba el resultado como texto plano, HTML o Markdown fácilmente analizable.
Mnemotécnica: “blowsh” = servidor MCP impulsado por Browsh.
Related MCP server: Crawlbase MCP
Características principales
Herramienta fetch_web: herramienta unificada para extraer texto plano legible, HTML o Markdown (tras el renderizado completo de JS). Admite extracción por
selectorCSS, límites de salida conmax_charsy sondeo de estabilización de JS conwait_ms.Herramienta search_web: descubre páginas mediante un motor de búsqueda renderizado (DuckDuckGo HTML con respaldo de Bing): resultados clasificados con URLs y fragmentos.
Herramienta extract_links: lista los hipervínculos (texto + URL absoluta) de cualquier página renderizada con JS para seguimiento de navegación.
Herramienta fetch_web_batch: obtiene hasta 10 URLs en una sola llamada con aislamiento de errores por URL.
Protección SSRF: rechaza solicitudes a direcciones de bucle local, privadas, link-local o reservadas (resueltas por DNS), protegiendo el navegador del lado del servidor.
Documentación de herramientas optimizada para IA: entradas, salidas y casos de uso ilustrados diseñados para una automatización fluida por parte del agente. Las herramientas lanzan errores estructurados con códigos de estado HTTP (
isErroren respuestas MCP).Gestión robusta de Browsh: lanza Browsh una vez, lo mantiene en ejecución, reutiliza un singleton ligero en RAM/CPU y se apaga correctamente al salir.
Caché de renderizado en memoria con TTL: las obtenciones repetidas se sirven al instante sin volver a renderizar.
Diseñado para PaaS, Cloud, herramientas de IA locales y agentes de IDE.
Enlaces
Browsh CLI Browser — El motor de renderizado.
Firefox — Requerido como backend de Browsh.
Model Context Protocol (MCP) Specification — El protocolo agente/servidor.
Cómo funciona
La IA/el agente realiza una solicitud MCP:
fetch_web(URL única),search_web(consulta),extract_links(URL) ofetch_web_batch(hasta 10 URLs).blowsh-mcp lanza Browsh en modo servidor HTTP (en el primer uso) y lo reutiliza para todas las llamadas posteriores.
blowsh-mcp solicita la salida sin procesar a Browsh, usando
X-Browsh-Raw-Mode: PLAIN(para texto),DOM(para HTML), u obtiene HTML y luego lo convierte a Markdown.La página (tras la ejecución completa de JS) se devuelve como texto plano de terminal, DOM HTML enriquecido o Markdown limpio: la IA/el agente elige el tipo de salida según el procesamiento posterior.
Los resultados se guardan en caché en memoria (TTL), por lo que las obtenciones repetidas son instantáneas; cada solicitud se verifica contra SSRF antes de llegar al navegador.
Inicio rápido (Docker — imagen precompilada)
La imagen se publica en GitHub Container Registry y se reconstruye automáticamente en
cada push a main mediante GitHub Actions — no se necesita Firefox/Browsh/html2markdown en el host:
docker pull ghcr.io/mokhtarabadi/blowsh-mcp:latest
docker run --rm -i ghcr.io/mokhtarabadi/blowsh-mcp:latestLa bandera
-ies obligatoria: el servidor MCP habla JSON-RPC a través de stdin/stdout. Manténla interactiva y canaliza las solicitudes, o apunta tu cliente MCP a ella (consulta Configuración de cliente IA más abajo).
Ejemplo de uso
Desde Claude, Cursor o cualquier agente compatible con MCP:
{
"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 batchLa IA recibe:
Con
type: plain: texto legible puro (tablas, listas, contenido principal; ideal para NLP/resúmenes o ingesta de contexto de terminal).Con
type: html: el marcado HTML completo, después de todo el JavaScript. Úsalo para analizar elementos, construir grafos de enlaces, scraping complejo, etc.Con
type: markdown: una versión limpia en Markdown, ideal para fragmentos de contexto de LLM, pipelines semánticos y consumos/flujos de trabajo compatibles con IA.Los errores están estructurados: las respuestas MCP establecen
isError: truecon un mensajeFetchErrorque incluye el estado HTTP cuando está disponible.
Estructura del proyecto
src/server.ts— servidor MCP que expone herramientas.src/browshManager.ts— lanza, supervisa y apaga Browsh.src/tools/fetchWeb.ts— implementación de la herramienta fetchWeb (plain, html, markdown; selector/max_chars/wait_ms).src/tools/searchWeb.ts— search_web (parser de DuckDuckGo HTML + respaldo de Bing).src/tools/extractLinks.ts— extract_links (hipervínculos del DOM renderizado).src/tools/fetchWebBatch.ts— fetch_web_batch (multi-URL, aislamiento de errores por URL).src/tools/html2markdownManager.ts— envoltorio para el CLI de html2markdown.src/ssrf.ts— protección SSRF (bloquea destinos privados/de bucle local/reservados).src/cache.ts— caché de renderizado en memoria con TTL.src/extract.ts— extracción de contenido principal, ayudantes de selector, truncamiento.src/errors.ts—FetchError+ formato de mensaje.README.md— este archivo.Dockerfile— contenedor multi-etapa (compila TS, incluye Firefox, Browsh, html2markdown)..github/workflows/docker-publish.yml— CI/CD: compila y publica la imagen en ghcr.io enmain/v*..env— anulaciones de configuración. Consulta.env.examplepara todas las opciones.
Instalación
Requisitos:
Node.js >= 20.18
Firefox instalado y en PATH
Browsh CLI instalado y en PATH
html2markdown CLI instalado y en PATH
En Debian/Ubuntu, instálalo con:
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.debO usa el binario precompilado para tu sistema operativo desde la página de lanzamientos.
¿Prefieres Docker? Omite por completo las instalaciones en el host: la imagen multi-etapa incluye Firefox, Browsh y html2markdown. El camino más rápido es la imagen publicada (
ghcr.io/mokhtarabadi/blowsh-mcp:latest, consulta Inicio rápido); para compilarla tú mismo: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 buildEjecutar el servidor MCP
Después de compilar, inicia el servidor con:
node dist/server.jsReemplaza dist/server.js con la ruta correcta si el resultado de tu compilación difiere.
Crea un archivo .env según sea necesario para la configuración. Por ejemplo:
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_PATHte permite personalizar el ejecutable de Firefox que usa Browsh durante la operación headless/HTTP.HTML2MARKDOWN_PATHte permite especificar una ruta personalizada al binario html2markdown (por defecto:html2markdownen PATH).CACHE_TTL_MS,BROWSH_REQUEST_TIMEOUT_MSyALLOW_PRIVATE_URLSajustan respectivamente la caché de renderizado, el tiempo de espera por solicitud y la protección SSRF.El puerto/host HTTP de Browsh NO es configurable.
Documentación del proyecto
Archivo | Público | Propósito |
| Agentes | Reglas operativas, salvaguardas, ciclo de vida de tareas |
| Todos | Lenguaje de diseño de respuestas/salidas MCP |
| Desarrolladores | Visión general del sistema, cableado de componentes |
| Desarrolladores | Esquemas de entrada/salida de herramientas y modelo de errores |
| Desarrolladores | Estándar de fecha/hora, directrices SOLID |
| Todos | Historial de versiones (Keep a Changelog) |
| Equipo | Archivos de tareas Kanban (backlog → archive) |
Este README es el punto de entrada orientado al usuario; las reglas orientadas al agente están en AGENTS.md y son de lectura obligatoria antes de cualquier implementación.
API de herramientas
Nombre | Parámetros | Caso de uso/Descripción para IA |
fetch_web |
| Obtiene una página tras el renderizado JS como texto/HTML/Markdown. |
search_web |
| Busca en la web (DuckDuckGo HTML + Bing renderizado de forma concurrente) y devuelve |
extract_links |
| Devuelve todos los hipervínculos ( |
fetch_web_batch |
| Obtiene hasta 10 URLs en una sola llamada (consciente de caché). Devuelve por URL |
Valores devueltos
type: plain: texto legible, ejecutado con JS, estilo terminal (o cadena de error).type: html: cadena de marcado HTML posterior a JS (o cadena de error). Conselector, solo el HTML del elemento coincidente.type: markdown: conversión a Markdown del contenido principal o del elemento seleccionado (o cadena de error). Se conservan enlaces, encabezados, listas y la estructura de la página para un contexto compatible con IA.type: pdf: texto plano extraído del documento PDF (mediante pdftotext, límite de 20 MB).Los errores están estructurados: una respuesta MCP con
isError: truey un mensajeFetchErrorque incluye el estado HTTP cuando es posible conocerlo (nunca una cadena vacía silenciosa).
Variables de entorno
Configúralas mediante .env (se carga automáticamente) o el entorno:
Variable | Predeterminado | Descripción |
|
| Binario de Firefox utilizado por Browsh (p. ej. |
|
| Ruta al binario html2markdown. |
|
| Tiempo de espera de solicitud por renderizado (ms). |
|
| Tamaño máximo de archivo PDF en bytes para |
|
| Número de solicitudes tras el cual se recicla el proceso del navegador. |
|
| Tiempo de inactividad en ms antes de que el proceso del navegador se cierre (10 min). |
|
| TTL de la caché de renderizado en memoria (ms). |
|
| Establezca |
|
| Tipo de transporte (solo |
|
| Entorno de Node. |
Selección de herramientas guiada por IA
Comience con
search_web: Para descubrir páginas, ejecute una consulta y elija las mejores URL de resultados; luego obténgalas.Use
fetch_webpara páginas individuales:plaincuando necesite una salida legible rápida para resumir/clasificar;htmlpara analizar elementos, enlaces o tablas;markdownpara fragmentos de contexto aptos para LLM. Añadaselector/max_chars/wait_mspara mantener la eficiencia de tokens y obtener contenido estable y relevante.Use
extract_linksantes de rastreos profundos: Siga la navegación de forma económica en lugar de obtener DOM completos.Use
fetch_web_batchpara múltiples fuentes: Una sola llamada en lugar de N idas y vueltas; los fallos se aíslan por URL.
Manejo de errores:
Las herramientas lanzan FetchError y MCP devuelve isError: true con un mensaje procesable: los protocolos no válidos, los bloqueos de SSRF, los selectores sin coincidencias, los códigos de estado HTTP y los fallos de renderizado nunca son silenciosos.
Protocolo MCP: Configuración del cliente de IA
Antes de configurar su cliente de IA (Claude, Cursor, etc.), debe
Instale las dependencias:
npm installCompile el proyecto:
npm run buildInicie el servidor MCP desde la salida compilada:
node dist/server.js
Ejemplo de configuración para Claude Desktop o Cursor:
{
"mcpServers": {
"blowsh": {
"command": "node",
"args": ["dist/server.js"],
"env": {}
}
}
}Ejemplo de configuración para opencode (proyecto 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" }
}La modalidad Docker no necesita binarios en el host; la imagen incluye Firefox, Browsh y html2markdown. Reinicie opencode después de guardar (la configuración se carga una vez al inicio).
Apagado ordenado
blowsh-mcp captura SIGINT/SIGTERM y garantiza que Browsh se cierre limpiamente: sin navegadores huérfanos.
Seguridad y consideraciones
El servidor ejecuta Browsh localmente y recupera contenido mediante HTTP localhost.
Protección SSRF: De forma predeterminada,
fetch_web/search_web/extract_links/fetch_web_batchrechazan URL que resuelven a rangos de IP loopback, privados, de enlace local o reservados (verificados mediante DNS). EstablezcaALLOW_PRIVATE_URLS=truepara deshabilitarla; no se recomienda.Sin exposición pública a menos que el servidor MCP HTTP/streamable esté explícitamente configurado.
Nunca exponga puertos a la web abierta sin firewall.
Utilice variables de entorno para secretos/configuración.
Extensión
Añada nuevas herramientas en src/tools/, expórtelas en src/server.ts, y documéntelas.
Los clientes de IA descubrirán automáticamente los docstrings.
Solución de problemas
Si fetchPlain devuelve 404 o no puede renderizar JS: compruebe que Firefox y Browsh están instalados y en el PATH.
Si Firefox no se encuentra o no se puede iniciar, establezca
BROWSH_FIREFOX_PATHen.envpara especificar la ruta completa a su instalación de Firefox.El puerto y el host de Browsh son fijos: no hay ninguna opción de entorno ni de CLI para cambiarlos.
Para máxima seguridad, ejecútelo en un contenedor.
Licencia
MIT
Autor: Mohammad Reza Mokhtarabadi mmokhtarabadi@gmail.com
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA server that enables AI systems to browse, retrieve content from, and interact with web pages through the Model Context Protocol.1

Crawlbase MCPofficial
AlicenseAqualityDmaintenanceA Model Context Protocol server that enables AI agents to fetch live web content with JavaScript rendering, proxy rotation, and anti-bot evasion.93755MIT- 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.12101MIT
Related MCP Connectors
Web scraping for AI agents. Converts URLs to clean, LLM-ready Markdown with anti-bot bypass.
Read a URL as clean markdown, screenshot a website, url to PDF. Web access for agents, no signup.
Read any web page as clean Markdown for AI agents: fetch, search, metadata, links. SSRF-safe.
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/mokhtarabadi/blowsh-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server