The Web, Readable.
Charlotte is an MCP server that renders web pages into structured, agent-readable representations using headless Chromium. Agents control how much context they receive — from a 336-character orientation to the full page — so they never pay for what they don't need.
Benchmarks
Charlotte v0.2.0 vs Playwright MCP on real websites. Every character an MCP server returns enters the agent's context window — smaller responses mean lower costs, more room for reasoning, and longer browsing sessions.
Characters returned when an agent first lands on a page. Charlotte defaults to minimal detail; Playwright returns the full accessibility tree.
The workflow difference: Playwright agents receive 61K+ characters every time they look at Hacker News — whether they're reading headlines or looking for a login button. Charlotte agents get 336 characters on arrival, call find({ type: "link", text: "login" }) to get exactly what they need, and never pay for the rest.
What Charlotte Returns
Agents control how much context they receive. Navigate returns a compact orientation; observe returns the full element list when needed.
{
"url": "https://news.ycombinator.com",
"title": "Hacker News",
"viewport": { "width": 1280, "height": 720 },
"structure": {
"headings": [
{ "level": 1, "text": "Hacker News", "id": "h-a1b2" }
]
},
"interactive_summary": {
"total": 93,
"by_landmark": {
"(page root)": { "link": 91, "text_input": 1, "button": 1 }
}
}
}Detail Levels
minimalsummaryfullStable Element IDs
Hash-based IDs survive DOM mutations and element reordering.
btn-a3f1buttoninp-c7e2text inputlnk-d4b9linksel-e8a3selectchk-f1a2checkboxfrm-b1d4form40 Tools, 8 Categories
Everything an agent needs to navigate, understand, and interact with the web.
Navigation
4Browse the web. Go to URLs, traverse history, refresh pages.
navigatebackforwardreloadObservation
4Understand pages. Three detail levels, spatial search, visual capture, structural diffing.
observefindscreenshotdiffInteraction
10Act on pages. Click, type, submit forms, drag elements, scroll, and poll for async conditions.
clicktypeselecttogglesubmitscrollhoverdragkeywait_forSession
9Manage browser state. Tabs, viewports, network throttling, cookies, headers.
tabstab_opentab_switchtab_closeviewportnetworkset_cookiesset_headersconfigureDev Mode
3Local development. Static server with hot reload, CSS/JS injection, accessibility audits.
dev_servedev_injectdev_auditUtility
2Execute arbitrary JavaScript in page context. Handle browser dialogs (alert, confirm, prompt).
evaluatedialogMonitoring
2Inspect runtime behavior. Retrieve console messages and network request history with filters.
consolerequestsMeta
1Manage tool visibility at runtime. List, enable, and disable tool groups without restarting.
toolsUsage Examples
Once connected as an MCP server, agents can use Charlotte's tools directly.
Browse a website
// Navigate to a page
navigate({ url: "https://example.com" })
// See what's on the page
observe({ detail: "summary" })
// Find a specific element
find({ type: "link", text: "About" })
// Click it
click({ element_id: "lnk-a3f1" })Quick Start
Get Charlotte running in under a minute. No install required — npx handles everything. Just add the config and go.
1Add to Your MCP Client
Claude Code — create .mcp.json in your project root:
{
"mcpServers": {
"charlotte": {
"type": "stdio",
"command": "npx",
"args": ["@ticktockbent/charlotte"],
"env": {}
}
}
}Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": ["@ticktockbent/charlotte"]
}
}
}2Verify It Works
navigate({ url: "https://example.com" })
// Returns: 612 chars — title, landmarks, headings, interactive counts
find({ type: "link" })
// Returns: matching elements with IDs ready for interactionOptional: For faster startup (skips npx resolution), install globally:
npm install -g @ticktockbent/charlotteThen replace "command": "npx" with "command": "charlotte" in your config.
This page was built by an agent.
An AI agent designed this entire website, wrote every component, and shipped it in a single session — with no human reviewing screenshots or testing on a phone.
It didn't need to. Charlotte gave it eyes.
The agent served the site locally with dev_serve, inspected the rendered page with observe, and ran dev_audit to check accessibility, SEO, and contrast. It switched to a mobile viewport, detected that code blocks were overflowing past the edge of the screen by reading element bounding boxes, fixed the CSS, and verified the fix — all without a human ever looking at the page.
Charlotte caught 16 unlabeled SVG icons that would have been invisible to sighted reviewers but broken for screen readers. It found a 204-pixel horizontal overflow on mobile that would have shipped unnoticed. Both bugs were fixed in the same session they were introduced.
That's what it means to make the web readable.