Charlotte
Charlotte
La web, legible.
Tu agente de IA consume ~50.000 caracteres del árbol de accesibilidad solo para mirar la portada de Hacker News. Charlotte lo hace en 364.
Charlotte es un servidor MCP que ofrece a los agentes de IA un acceso estructurado y eficiente en tokens a la web. En lugar de volcar el árbol de accesibilidad completo en cada llamada, Charlotte devuelve solo lo que el agente necesita: un resumen compacto de la página al llegar, consultas específicas para elementos concretos y el detalle completo solo cuando se solicita explícitamente. En páginas con mucho contenido, esa orientación es hasta ~140x más pequeña que una instantánea completa del árbol de accesibilidad de Playwright MCP; en páginas trivialmente pequeñas, ambos tienen un tamaño aproximadamente similar.
¿Por qué Charlotte?
La mayoría de los servidores MCP de navegador vuelcan el árbol de accesibilidad completo en cada llamada: un bloque de texto plano que puede superar el millón de caracteres en páginas con mucho contenido. Los agentes pagan por todo ello, lo necesiten o no.
Charlotte descompone cada página en una representación estructurada y tipada: puntos de referencia, encabezados, elementos interactivos, formularios, resúmenes de contenido — y permite a los agentes controlar cuánto reciben con tres niveles de detalle. Cuando un agente navega a una nueva página, recibe una orientación compacta (364 caracteres para Hacker News) en lugar del volcado completo de elementos (~50.000 caracteres). Cuando necesita detalles, los pide.
Puntos de referencia
Medido en Charlotte v0.8.0 contra Playwright MCP v0.0.79, por caracteres devueltos por llamada de herramienta en sitios web reales (npx tsx benchmarks/run-benchmarks.ts --suite comparison), 2026-08-08. Esta sección es un resumen: la página canónica de puntos de referencia (incluido el coste por tarea y la deriva de versiones) está en charlotte.mintlify.site/benchmarks; metodología, instrumentos y resultados brutos: benchmarks/.
Coste de orientación (lo que paga un agente por "ver" una página al llegar):
Un navigate de Charlotte devuelve una orientación utilizable por defecto: puntos de referencia, encabezados y recuentos de elementos interactivos agrupados por región de la página. Para obtener lo equivalente con Playwright MCP, un agente llama a browser_snapshot, que devuelve el árbol de accesibilidad completo. (El browser_navigate de Playwright por sí solo devuelve solo una confirmación breve, no el contenido de la página, por lo que no es una comparación equivalente.)
Sitio |
|
| Más pequeño por |
example.com | 415 | 465 | 1.1x |
formulario httpbin | 619 | 1,847 | 3.0x |
repositorio de GitHub | 3,778 | 38,983 | 10x |
Wikipedia (artículo de IA) | 22,134 | 1,137,928 | 51x |
Hacker News | 364 | 50,706 | 139x |
La ventaja escala con la complejidad de la página: en páginas con mucho contenido, la orientación estructurada es ~10–140x más pequeña que la instantánea completa, mientras que en una página trivialmente pequeña como example.com ambas están dentro de ~20% la una de la otra (y en una página tan pequeña, la representación estructurada puede ser la más grande de las dos — simplemente no hay nada que resumir). El valor de Charlotte se muestra precisamente donde el volcado plano de Playwright duele más. Cuando un agente necesita más que la orientación, llama a observe o find para obtener exactamente la parte que quiere, en lugar de pagar por todo el árbol por adelantado.
Sobrecarga de definición de herramientas (coste invisible por llamada de API):
Perfil | Herramientas | Tokens de definición/llamada | Ahorro vs. completo |
completo | 43 | 8,500 | — |
navegación (por defecto) | 23 | 4,372 | ~49% |
núcleo | 7 | 2,186 | ~75% |
Las definiciones de herramientas se envían en cada ida y vuelta de API. Con el perfil browse por defecto, Charlotte lleva ~49% menos sobrecarga de definición que cargar las 43 herramientas; el perfil mínimo core la reduce en ~75%. Consulta el informe de puntos de referencia de perfiles para ver los resultados completos.
La diferencia en el flujo de trabajo: Un agente de Playwright que lee la instantánea completa recibe ~50.000 caracteres cada vez que mira Hacker News, ya sea leyendo titulares o buscando un botón de inicio de sesión. Un agente de Charlotte recibe 364 caracteres al llegar, llama a find({ type: "link", text: "login" }) para obtener exactamente lo que necesita y nunca paga por el resto.
Related MCP server: stealth-agent-browser-mcp
Cómo funciona
Charlotte mantiene una sesión persistente de Chromium sin interfaz gráfica y actúa como una capa de traducción entre la web visual y el razonamiento nativo de texto del agente. Cada página se descompone en una representación estructurada:
┌─────────────┐ MCP Protocol ┌──────────────────┐
│ AI Agent │<────────────────────>│ Charlotte │
└─────────────┘ │ │
│ ┌────────────┐ │
│ │ Renderer │ │
│ │ Pipeline │ │
│ └─────┬──────┘ │
│ │ │
│ ┌─────▼──────┐ │
│ │ Headless │ │
│ │ Chromium │ │
│ └────────────┘ │
└──────────────────┘Los agentes reciben puntos de referencia, encabezados, elementos interactivos con metadatos tipados, cuadros delimitadores, estructuras de formularios y resúmenes de contenido, todo derivado de lo que el navegador ya sabe sobre cada página.
Características
Navegación — navigate, back, forward, reload
Observación — observe (3 niveles de detalle, vista de árbol estructural), find (búsqueda espacial y semántica, modo selector CSS, output_file para conjuntos de resultados grandes), screenshot (con gestión persistente de artefactos), screenshots, screenshot_get, screenshot_delete, diff (comparación estructural contra instantáneas)
Interacción (consciente de iframes) — click, click_at (basado en coordenadas), type (con soporte de escritura lenta), select, toggle, submit, scroll, hover, drag, key (única/secuencia con selección de elemento), wait_for (sondeo de condiciones asíncronas), upload (entrada de archivos), fill_form (relleno de formularios por lotes), dialog (aceptar/descartar diálogos JS)
Monitorización — console (todos los niveles de gravedad, filtrado, marcas de tiempo), requests (historial HTTP completo, filtrado por método/estado/tipo de recurso)
Gestión de sesión — tabs, tab_open, tab_switch, tab_close, viewport (preajustes genéricos o dispositivos con nombre como "iPhone 15" con emulación de DPR, táctil y agente de usuario), network (limitación de ancho de banda, bloqueo de URL), set_cookies, get_cookies, clear_cookies, set_headers, configure
Modo de desarrollo — dev_serve (servidor estático + observación de archivos con recarga automática), dev_inject (inyección de CSS/JS), dev_audit (a11y, rendimiento, SEO, contraste, enlaces rotos)
Utilidades — evaluate (ejecución de JS arbitrario en el contexto de la página)
Perfiles de herramientas
Charlotte incluye 43 herramientas (42 registradas + la meta-herramienta charlotte_tools), pero la mayoría de los flujos de trabajo solo necesitan un subconjunto. Los perfiles de inicio controlan qué herramientas se cargan en el contexto del agente, reduciendo la sobrecarga de definición hasta en ~75%.
charlotte --profile browse # 23 tools (default) — navigate, observe, interact, tabs
charlotte --profile core # 7 tools — navigate, observe, find, click, type, submit
charlotte --profile full # 43 tools — everything
charlotte --profile interact # 31 tools — full interaction + dialog + evaluate
charlotte --profile develop # 34 tools — interact + dev_serve, dev_inject, dev_audit
charlotte --profile audit # 14 tools — navigation + observation + dev_audit + viewportLos agentes pueden activar más herramientas a mitad de sesión sin reiniciar:
charlotte_tools enable dev_mode → activates dev_serve, dev_audit, dev_inject
charlotte_tools disable dev_mode → deactivates them
charlotte_tools list → see what's loadedAutoalojamiento (Charlotte Remoto)
Ejecuta Charlotte como un servidor MCP remoto y conéctalo a claude.ai — un solo comando:
docker run --cap-add SYS_ADMIN --shm-size 2g -p 3737:3737 ghcr.io/ticktockbent/charlotteImprime una URL de conector pública y un token de operador. En claude.ai: Configuración → Conectores → Añadir conector personalizado — pega la URL, deja los campos de ID de cliente OAuth/Secreto en blanco e introduce el token en la página de consentimiento de Charlotte cuando aparezca. Eso es todo; ya estás navegando.
La URL de demostración y el token son efímeros (ambos rotan al reiniciar). Para ejecutarlo de verdad — dominio estable, tu propio túnel o proxy inverso, docker compose: Autoalojamiento. Modelo de confianza y protecciones de red: Seguridad. Internals del contenedor y sandbox: Docker.
Inicio rápido
Requisitos previos
Node.js >= 20
npm
Instalación
Charlotte está listado en el Registro MCP como io.github.TickTockBent/charlotte y publicado en npm como @ticktockbent/charlotte:
npm install -g @ticktockbent/charlotteLas imágenes de Docker están disponibles en Docker Hub y en GitHub Container Registry:
# Alpine (default, smaller)
docker pull ticktockbent/charlotte:alpine
# Debian (if you need glibc compatibility)
docker pull ticktockbent/charlotte:debian
# Or from GHCR
docker pull ghcr.io/ticktockbent/charlotte:latestO instala desde el código fuente:
git clone https://github.com/ticktockbent/charlotte.git
cd charlotte
npm install
npm run buildEjecutar
Charlotte se comunica a través de stdio usando el protocolo MCP:
# If installed globally (default browse profile)
charlotte
# With a specific profile
charlotte --profile core
# If installed from source
npm startConfiguración del cliente MCP
Claude Code
Crea .mcp.json en la raíz de tu proyecto:
{
"mcpServers": {
"charlotte": {
"type": "stdio",
"command": "npx",
"args": ["@ticktockbent/charlotte"],
"env": {}
}
}
}Claude Desktop
Añade a claude_desktop_config.json:
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": ["@ticktockbent/charlotte"]
}
}
}Cursor
Añade a .cursor/mcp.json:
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": ["@ticktockbent/charlotte"]
}
}
}Windsurf
Añade a ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": ["@ticktockbent/charlotte"]
}
}
}VS Code (Copilot)
Añade a .vscode/mcp.json:
{
"servers": {
"charlotte": {
"type": "stdio",
"command": "npx",
"args": ["@ticktockbent/charlotte"]
}
}
}Cline
Añade a la configuración de MCP de Cline (a través de la barra lateral de Cline > Servidores MCP > Configurar):
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": ["@ticktockbent/charlotte"]
}
}
}Amp
Añade a ~/.amp/settings.json:
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": ["@ticktockbent/charlotte"]
}
}
}Consulta docs-internal/mcp-setup.md para la guía de configuración completa, incluido el modo de desarrollo, clientes MCP genéricos, pasos de verificación y solución de problemas.
Configuración
Charlotte resuelve la configuración de cuatro fuentes, con la precedencia más alta primero: argumentos de CLI → variables de entorno → archivo de configuración → valores predeterminados integrados. Consulta docs/configuration.md para la referencia completa.
Archivo de configuración
Pasa un archivo de configuración JSON con --config, o coloca un charlotte.config.json en el directorio de trabajo y Charlotte lo carga automáticamente:
charlotte --config charlotte.config.json{
"browser": { "headless": true, "noSandbox": false },
"tools": { "profile": "browse" },
"rendering": { "includeIframes": false, "iframeDepth": 3 },
"output": { "dir": "./charlotte-output" },
"limits": {
"maxInteractiveElements": 2000,
"maxFullContentChars": 200000,
"maxResponseBytes": 1000000,
"maxEvaluateBytes": 256000
}
}Cada sección es opcional; un {} vacío es válido. El archivo se valida con zod: claves desconocidas, tipos incorrectos o valores de enumeración no válidos producen un error de inicio claro en stderr y Charlotte sale con un código distinto de cero. Cuatro ajustes también tienen variables de entorno: CHARLOTTE_NO_SANDBOX, CHARLOTTE_OUTPUT_DIR, CHARLOTTE_CDP_ENDPOINT y CHARLOTTE_INIT_SCRIPT. Los scripts que deben ejecutarse en cada documento nuevo antes del JS de la página van en browser.initScripts o --init-script <ruta> (repetible); consulta Scripts de inicio.
El sandbox de Chromium está activado por defecto
Cambio de comportamiento en v0.7.0: Las versiones anteriores incluían
--no-sandboxen cada lanzamiento de Chromium. A partir de v0.7.0, el sandbox de Chromium está habilitado por defecto — la principal defensa entre una página no confiable y la cuenta con la que se ejecuta Charlotte. Debes optar por desactivarlo explícitamente donde el sandbox del kernel no esté disponible.
charlotte --no-sandbox # CLI flag
CHARLOTTE_NO_SANDBOX=1 charlotte # environment variable
# or "browser": { "noSandbox": true } in the config fileNota de migración (Docker / metal desnudo): Los contenedores normalmente no pueden configurar el sandbox del kernel, por lo que los Dockerfiles proporcionados establecen CHARLOTTE_NO_SANDBOX=1 por ti, y docker-compose.yml ahora mantiene el filtro seccomp predeterminado de Docker (ya no ejecuta seccomp=unconfined). Si ejecutas Charlotte en metal desnudo como root, Chromium se niega a iniciarse con el sandbox habilitado — ejecútalo como un usuario no root (recomendado) o pasa --no-sandbox. Las configuraciones existentes que antes dependían del --no-sandbox implícito y se ejecutan en un entorno donde el sandbox no puede inicializarse ahora deben establecer CHARLOTTE_NO_SANDBOX=1 (o el indicador/equivalente de configuración) para seguir funcionando.
Ejecutar Charlotte Remoto (modo HTTP) a través de la red plantea preguntas adicionales sobre límites de confianza y protecciones de red más allá del sandbox — consulta Seguridad.
Límites de tamaño de salida
Las claves limits.* limitan cuánto puede devolver una sola respuesta de herramienta para que una página patológica (100k enlaces, un feed de desplazamiento infinito, un cuerpo de documento gigante) no pueda desbordar la ventana de contexto del agente. Cuando una respuesta de página supera maxResponseBytes, se degrada a un resumen compacto y sugiere escribir el resultado completo en disco mediante output_file; los resultados de charlotte_evaluate se limitan de forma independiente con maxEvaluateBytes. Las respuestas truncadas llevan un marcador truncation. Consulta docs/configuration.md para las claves y los valores predeterminados.
Recuperación de fallos
Un fallo de Chromium ya no bloquea el servidor. La siguiente llamada a una herramienta relanza automáticamente el navegador, limpia la pestaña muerta y las cachés de sesión CDP, y abre una nueva pestaña en blanco — de modo que un agente puede seguir trabajando después de un fallo del renderizador sin reiniciar el servidor MCP.
Ejemplos de uso
Una vez conectado, un agente puede usar las herramientas de Charlotte:
Navegar por un sitio web
navigate({ url: "https://example.com" })
// → 612 chars: landmarks, headings, interactive element counts
find({ type: "link", text: "More information" })
// → just the matching element with its ID
click({ element_id: "lnk-a3f1c2" })Rellenar un formulario
navigate({ url: "https://httpbin.org/forms/post" })
find({ type: "text_input" })
type({ element_id: "inp-c7e29b", text: "hello@example.com" })
select({ element_id: "sel-e8a3f5", value: "option-2" })
submit({ form_id: "frm-b1d4e7" })Bucle de retroalimentación para desarrollo local
dev_serve({ path: "./my-site", watch: true })
observe({ detail: "full" })
dev_audit({ checks: ["a11y", "contrast"] })
dev_inject({ css: "body { font-size: 18px; }" })Representación de la página
Charlotte devuelve representaciones estructuradas con tres niveles de detalle que permiten a los agentes controlar cuánto contexto consumen:
Mínimo (predeterminado para navigate)
Hitos (landmarks), encabezados y recuentos de elementos interactivos agrupados por región de la página. Diseñado para la orientación — «¿qué hay en esta página?» — sin enumerar cada elemento.
{
"url": "https://news.ycombinator.com",
"title": "Hacker News",
"viewport": { "width": 1280, "height": 720 },
"structure": {
"headings": [{ "level": 1, "text": "Hacker News", "id": "hdg-a1b2c3" }]
},
"interactive_summary": {
"total": 93,
"by_landmark": {
"(page root)": { "link": 91, "text_input": 1, "button": 1 }
}
}
}Resumen (predeterminado para observe)
Lista completa de elementos interactivos con metadatos tipados, estructuras de formularios y resúmenes de contenido.
{
"url": "https://example.com/dashboard",
"title": "Dashboard",
"viewport": { "width": 1280, "height": 720 },
"structure": {
"landmarks": [
{ "id": "rgn-b2c1d0", "role": "banner", "label": "Site header", "bounds": { "x": 0, "y": 0, "w": 1280, "h": 64 } },
{ "id": "rgn-d4e5f6", "role": "main", "label": "Content", "bounds": { "x": 240, "y": 64, "w": 1040, "h": 656 } }
],
"headings": [{ "level": 1, "text": "Dashboard", "id": "hdg-1a2b3c" }],
"content_summary": "main: 2 headings, 5 links, 1 form"
},
"interactive": [
{
"id": "btn-a3f1c2",
"type": "button",
"label": "Create Project",
"bounds": { "x": 960, "y": 80, "w": 160, "h": 40 },
"state": {}
}
],
"forms": []
}Completo
Todo lo del resumen, más todo el contenido de texto visible en la página.
Niveles de detalle
Nivel | Tokens | Caso de uso |
| ~50-200 | Orientación tras la navegación. ¿Qué regiones existen? ¿Cuántos elementos interactivos hay? |
| ~500-5000 | Trabajo con la página. Lista completa de elementos, estructuras de formularios, resúmenes de contenido. |
| variable | Lectura del contenido de la página. Todo el texto visible incluido. |
Las herramientas de navegación usan minimal por defecto. La herramienta observe usa summary por defecto. Ambas aceptan un parámetro opcional detail para anularlo.
IDs de elementos
Los IDs de elementos son estables ante mutaciones menores del DOM. Se generan aplicando un hash a una clave compuesta por el tipo de elemento, el rol ARIA, el nombre accesible y la firma de la ruta DOM:
btn-a3f1c2 (button) inp-c7e29b (text input)
lnk-d4b910 (link) sel-e8a3f5 (select)
chk-f1a204 (checkbox) frm-b1d4e7 (form)
rgn-e0d2a8 (landmark) hdg-0f4063 (heading)
dom-b2c3d9 (DOM element, from CSS selector queries)Cambio de formato de ID en v0.7.0: los hashes de IDs de elementos ahora son de 6 caracteres hexadecimales (p. ej.
btn-a3f1c2), frente a los 4 de versiones anteriores. Esto reduce drásticamente las colisiones de hash entre elementos en páginas grandes. Los agentes que hayan codificado o hecho coincidencia de patrones con IDs de 4 caracteres deberían volver afindlos elementos en lugar de reutilizar IDs en caché tras la actualización.
Los IDs sobreviven a cambios no relacionados del DOM y a la reordenación de elementos dentro del mismo contenedor. Cuando un agente navega con detalle mínimo (sin IDs de elementos individuales), usa find para localizar elementos por texto, tipo o proximidad espacial; los elementos devueltos incluyen IDs listos para la interacción.
Desarrollo
# Run in watch mode
npm run dev
# Run all tests
npm test
# Run only unit tests
npm run test:unit
# Run only integration tests
npm run test:integration
# Type check
npx tsc --noEmitEstructura del proyecto
src/
browser/ # Puppeteer lifecycle, tab management, CDP sessions
renderer/ # Accessibility tree extraction, layout, content, element IDs
state/ # Snapshot store, structural differ
tools/ # MCP tool definitions (navigation, observation, interaction, session, dev-mode)
dev/ # Static server, file watcher, auditor
types/ # TypeScript interfaces
utils/ # Logger, hash, wait utilities
tests/
unit/ # Fast tests with mocks
integration/ # Full Puppeteer tests against fixture HTML
fixtures/pages/ # Test HTML filesArquitectura
El Renderer Pipeline es el núcleo: llama a los extractores en orden y ensambla una PageRepresentation:
Extracción del árbol de accesibilidad (CDP
Accessibility.getFullAXTree)Extracción del diseño (CDP
DOM.getBoxModel)Extracción de hitos, encabezados, elementos interactivos y contenido
Generación de IDs de elementos (basada en hash, estable entre re-renderizados)
Todas las herramientas pasan por renderActivePage(), que gestiona instantáneas, eventos de recarga, detección de diálogos y el formato de las respuestas.
Sandbox
Charlotte incluye un sitio web de prueba en tests/sandbox/ que ejercita todas las herramientas sin tocar la internet pública. Sírvelo localmente con:
dev_serve({ path: "tests/sandbox" })Cinco páginas cubren navegación, formularios, elementos interactivos, ventanas emergentes, contenido retardado, contenedores de desplazamiento y más. Consulta docs-internal/sandbox.md para la referencia completa de páginas y una lista de ejercicios herramienta por herramienta.
Problemas conocidos
Shadow DOM — El shadow DOM abierto funciona de forma transparente. El árbol de accesibilidad de Chromium atraviesa los límites del shadow DOM abierto, por lo que los componentes web (p. ej., <relative-time> y <tool-tip> de GitHub) renderizan su contenido en la representación de Charlotte sin tratamiento especial. Las raíces shadow cerradas son opacas para el árbol de accesibilidad y no se capturarán.
Hoja de ruta
Sesión y configuración
Hoja de ruta de funciones
Grabación de vídeo — Graba las interacciones como vídeo, capturando la secuencia completa de navegación y manipulación dirigida por el agente para depuración, documentación y revisión.
Consulta docs-internal/playwright-mcp-gap-analysis.md para el análisis completo de brechas frente a Playwright MCP, incluidos los elementos de menor prioridad (herramientas de visión, pruebas/verificación, trazado, transporte, seguridad) y las áreas donde Charlotte tiene ventajas.
Especificación completa
Consulta docs-internal/CHARLOTTE_SPEC.md para la especificación completa, incluidos todos los parámetros de las herramientas, el formato de representación de la página, la estrategia de identidad de los elementos y los detalles de arquitectura.
Licencia
Comunidad
Abre un informe de error para defectos reproducibles, regresiones o problemas específicos de clientes MCP.
Abre una solicitud de función para mejoras de flujo de trabajo o nuevas capacidades.
Abre una solicitud de herramienta si quieres proponer una nueva herramienta, superficie de parámetros o ubicación de perfil.
Explora los problemas abiertos para encontrar trabajo actual y discusiones.
Consulta el filtro de buenos primeros problemas planificado, ya que los mantenedores etiquetan tareas aptas para principiantes.
Contribuciones
Consulta CONTRIBUTING.md para las directrices.
Parte de un conjunto creciente de servidores MCP con nombres literarios. Ver más en github.com/TickTockBent.
Available Tools
23 toolscharlotte_backA
Navigate back in browser history. Returns page representation after navigation.
Inputs: detail.
charlotte_clickA
Click an interactive element on the page. Returns full page representation after the click.
Inputs: element_id (required), modifiers, click_type.
charlotte_click_atA
Click at specific page coordinates. Use when target elements are not in the accessibility tree (custom widgets, canvas, non-semantic interactive divs). Dispatches real CDP-level mouse events. Returns full page representation after the click.
Inputs: x (required), y (required), modifiers, click_type.
charlotte_diffA
Compare current page state to a previous snapshot. Returns structural diff showing added, removed, moved, and changed elements.
Inputs: scope, snapshot_id.
charlotte_findA
Search for elements matching criteria. Filters interactive elements by text, role, type, or spatial proximity. Use the selector parameter to find DOM elements by CSS selector — this reaches elements not in the accessibility tree (custom widgets, non-semantic divs). Selector results return Charlotte element IDs usable with click, hover, drag, etc.
Inputs: near, role, text, type, +3 more.
charlotte_forwardA
Navigate forward in browser history. Returns page representation after navigation.
Inputs: detail.
charlotte_observeA
Get current page state without performing any action. Use detail levels to control verbosity: "minimal" for landmarks, headings, and interactive element counts by landmark (use charlotte_find to get specific elements with actionable IDs, or observe({ detail: "summary" }) to see all elements), "summary" (default) for content summaries and full element list, "full" for all text content. Use view: "tree" for a compact structural outline (cheapest orientation tool), or view: "tree-labeled" to include labels on interactive elements (still much cheaper than minimal JSON, and shows which button/link/input is which).
Inputs: view, detail, selector, output_file, +1 more.
charlotte_reloadA
Reload the current page. Returns page representation after reload.
Inputs: hard, detail.
charlotte_screenshotA
Capture a visual screenshot. Fallback for when structured representation isn't sufficient (complex visualizations, canvas elements, images). Use save: true to persist as a file artifact that can be referenced later.
Inputs: save, format, quality, selector, +2 more.
charlotte_screenshot_deleteA
Delete a saved screenshot artifact by its ID. Removes the file from disk.
Inputs: id (required).
charlotte_screenshot_getA
Retrieve a previously saved screenshot artifact by its ID. Returns the image data and metadata.
Inputs: id (required).
charlotte_screenshotsA
List all saved screenshot artifacts. Returns metadata for each saved screenshot including ID, filename, page URL, and timestamp.
Inputs: no named parameters.
charlotte_scrollA
Scroll the page or a specific container. Returns full page representation after scrolling.
Inputs: direction (required), amount, element_id.
charlotte_selectA
Select an option in a select/dropdown element. Returns full page representation after selection.
Inputs: value (required), element_id (required).
charlotte_submitB
Submit a form. Can submit by form ID or by clicking its submit button. Returns full page representation after submission.
Inputs: form_id (required).
charlotte_tab_closeA
Close a browser tab by its ID. If the closed tab was active, switches to the first remaining tab.
Inputs: tab_id (required).
charlotte_tab_openA
Open a new browser tab. Optionally navigate to a URL. The new tab becomes the active tab.
Inputs: url.
charlotte_tabsA
List all open browser tabs with their URLs, titles, and active status.
Inputs: no named parameters.
charlotte_tab_switchA
Switch to a different browser tab by its tab ID. Returns the page representation of the activated tab.
Inputs: tab_id (required).
charlotte_toggleA
Toggle a checkbox or switch element. Returns full page representation after toggle.
Inputs: element_id (required).
charlotte_toolsA
Manage Charlotte tool visibility. Lists available tool groups and their status. Use 'enable' or 'disable' to control which tools are loaded. Disabled tools don't appear in the tool list — enable a group to access its tools. Groups: 'interaction' for form filling, clicking, and drag-and-drop. 'session' for cookie/auth management, tab switching, viewport, and network. 'dev_mode' for local development serving and audits. 'evaluate' for JavaScript execution. 'monitoring' for console and network request logs. 'dialog' for JavaScript dialog handling.
Inputs: group, action.
charlotte_typeA
Type text into an input element. Returns full page representation after typing.
Inputs: text (required), element_id (required), slowly, clear_first, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 23 tools
Each tool has a clearly distinct purpose: navigation, tab management, interaction, observation, and screenshot management are all separated. Even similar tools like charlotte_click and charlotte_click_at are explicitly differentiated by target type (element vs coordinates).
All tools share the 'charlotte_' prefix and use snake_case, but there is a mix of simple verbs (navigate, click, type) and compound verb_noun forms (tab_open, screenshot_get). This is mostly consistent but not perfectly uniform.
With 23 tools, the server is on the heavier side but still within a manageable range for a comprehensive browser automation tool. The count is justified by the breadth of features, though it approaches the threshold where it might feel overwhelming.
Core browser automation workflows are well covered: navigation, tab management, element interaction, observation, and screenshot handling. However, the description of charlotte_tools mentions groups for dialogs, drag-and-drop, and session management, but these tools are not present in the exposed set, leaving minor gaps.
Maintenance
Related MCP Connectors
Turn any public website into an MCP server for agents to search, read and navigate.
Web search API and MCP server for developers building AI agents.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for web scraping and browser automation, enabling AI agents to extract clean, token-efficient content from web pages.1MIT
- AlicenseAqualityDmaintenanceAn MCP server providing AI agents with a stealth Chromium browser that uses hybrid accessibility-object-model and set-of-mark vision for token-lean snapshots and reliable action via ref ids.1397 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceAn MCP server that gives AI agents controlled access to the web, offering unified tools for fetching pages as Markdown, searching across multiple providers, and extracting structured data via CSS selectors.Apache 2.0
- AlicenseNot gradedqualityAmaintenanceGives AI agents token-efficient browser access by returning compact, structured page summaries, targeted element queries, and on-demand detail instead of full accessibility-tree dumps. Supports navigation, interaction, monitoring, and session management through MCP tool profiles.4 npmMIT