A side-by-side look at the Charlotte and Nullprint MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Charlotte for browser automation work as a local process; choose Nullprint for browser automation as a local process. You can also run both side by side in one mcpServers block.
charlotte_navigate, charlotte_back, charlotte_forward.NULLPRINT_API_KEY, NULLPRINT_DAEMON_URL, NULLPRINT_PORT, NULLPRINT_HOME.profiles_list, profile_start, profile_stop.Rows where the two servers differ are marked.
| Spec | N Nullprint | |
|---|---|---|
| Category | Browser Automation | Browser Automation |
| Quality signal | 68/100 · Great | 53/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | API key required |
| Pricing | Not declared | Not declared |
| Required env vars | None listed | NULLPRINT_API_KEYNULLPRINT_DAEMON_URLNULLPRINT_PORTNULLPRINT_HOME |
| Verified owner | Community listing | Community listing |
| GitHub stars | 181 | 0 |
| Directory activity | 1 views 0 installs 0 upvotes | 0 views 0 installs 0 upvotes |
| Tools | 23 | 17 |
| Full listing | View Charlotte | View Nullprint |
charlotte_navigateLoad a URL in the active page. Returns page representation after navigation. Default minimal detail includes landmarks, headings, and interactive element counts — use charlotte_find to locate specific elements, or pass detail: 'summary' to get the full element list.charlotte_backNavigate back in browser history. Returns page representation after navigation.charlotte_forwardNavigate forward in browser history. Returns page representation after navigation.charlotte_reloadReload the current page. Returns page representation after reload.charlotte_observeGet 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).charlotte_findSearch 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.charlotte_screenshotCapture 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.charlotte_screenshotsList all saved screenshot artifacts. Returns metadata for each saved screenshot including ID, filename, page URL, and timestamp.charlotte_screenshot_getRetrieve a previously saved screenshot artifact by its ID. Returns the image data and metadata.charlotte_screenshot_deleteDelete a saved screenshot artifact by its ID. Removes the file from disk.charlotte_diffCompare current page state to a previous snapshot. Returns structural diff showing added, removed, moved, and changed elements.charlotte_clickClick an interactive element on the page. Returns full page representation after the click.profiles_listList every profile with status (running / idle), exit and ledger metadataprofile_startOpen a browser session for a profile; returns the driving endpointsprofile_stopStop that profile's browser (session or app-launched window)profile_createCreate a profile (fingerprint generated and frozen), optionally with proxy, ledger and start pagesprofile_checkupConsistency check-up, returns `{summary, checks}proxy_checkStateless proxy test: exit IP, country, latencyprofile_deleteSoft delete to the recycle bin (recoverable); refused while runningtrash_listRead-only list of recoverable profiles in the recycle binprofile_restoreRestore from the recycle bin with fingerprint, proxy and logins intactsession_gotoNavigate the session's current pagesession_snapshotAccessibility tree of the current page (find selectors, read state)session_click_selectorClick an element by CSS selectorPaste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": [
"@ticktockbent/charlotte"
]
}
}
}
{
"mcpServers": {
"nullprint": {
"command": "uvx",
"args": [
"nullprint-mcp"
],
"env": {
"NULLPRINT_API_KEY": "YOUR_NULLPRINT_API_KEY_HERE",
"NULLPRINT_DAEMON_URL": "YOUR_NULLPRINT_DAEMON_URL_HERE",
"NULLPRINT_PORT": "YOUR_NULLPRINT_PORT_HERE",
"NULLPRINT_HOME": "YOUR_NULLPRINT_HOME_HERE"
}
}
}
}