chrome-faithful
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@chrome-faithfulOpen Gmail in my personal profile and check for new emails"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Chrome Faithful
Faithful control of your real, logged-in Chrome profiles.
An MCP server + MV3 Chrome extension + authenticated localhost bridge that lets
AI agents drive the Chrome that already holds your logins, extensions, and
history. No copied profiles, no debug profile, no --remote-debugging-port,
no Edge, no global mouse/keyboard automation.
English · 简体中文
Why this exists
Browser-control tools optimize for different jobs:
Approach | What you get | What you lose |
Chrome DevTools MCP (Google) | Excellent DevTools, performance, and CDP workflows; Chrome 144+ can | Chrome must already be running, and when several profiles are active Chrome chooses the default profile rather than accepting an exact profile name |
Playwright / Puppeteer MCP servers | Deterministic, isolated browsers that are ideal for CI and repeatable tests | Existing logins, extensions, history, and two-factor sessions are not present unless separately provisioned |
Extension-based MCPs (BrowserMCP, real-browser-mcp) | Control of an existing logged-in browser | A strong fit for live sessions; multi-profile setups may require separate server instances and ports, and normally expect Chrome to be running |
Chrome Faithful focuses on exact-profile, multi-profile control with a fail-closed local bridge:
Exact multi-profile routing. Every profile registers with its exact
profileName; duplicate registrations are rejected, so concurrent agents cannot interleave inside one profile.Launches a closed profile. If the target profile — or all of Chrome — is closed, it starts the exact profile with ordinary Chrome and waits for the exact extension registration before reporting success. No
--user-data-dirhacks.Security depth. The bridge binds only
127.0.0.1and requires a generated 256-bit secret. Bootstrap uses one-use tokens; sessions use scoped grants. Configuration is closed-schema and must live outside the source tree. Installers are transactional with SHA-256-verified, DPAPI-encrypted backups (Windows).File upload the honest way. Files are injected as page
File/DataTransferobjects — notDOM.setFileInputFiles, not an OS file chooser.Media export without leaking URLs.
chrome_page_assetstreams page-exposed media using the tab's user agent, referer, and matching profile cookies; signed URLs, cookies, and headers never appear in MCP arguments or results.Durable virtual-list capture. Scroll capture with asset parity, fail-closed manifests, exclusive cross-process locks, and resume that rewinds the tab through serialized wheel events — built for infinite-scroll feeds.
Works minimized. Locator waits/actions and screenshots use CDP focus emulation, so virtualized controls keep rendering even when the Chrome window is minimized or obscured.
Raw CDP when you need it, with an explicit trust boundary.
chrome_cdpevent reads redact Network headers, query strings, and post data; the bounded request/response projection actions reject sensitive selected fields. Itssendaction is deliberately unrestricted raw CDP and must be exposed only to a fully trusted MCP client: it can read authenticated page content, cookies, storage, tokens, URLs, and headers.Structured verification handling. Multi-signal challenge detection that distinguishes resolved / pending-render / active challenge states, click-first solving for the common "click once and it passes" cases, and an honest handoff when a challenge needs a human — see Verification handling.
Codex-compatible JS API.
src/agent-browser.mjsimplements Codex'sagent.browserssurface (tabs, locators, CUA, Playwright-style selectors, clipboard, dialogs, downloads) so JavaScript agents can use the same runtime.
Related MCP server: BrowserGenie MCP Server
Architecture
┌─────────────┐ stdio ┌──────────────────────┐ ws://127.0.0.1 ┌─────────────────────────┐
│ MCP client │ ─────────► │ src/mcp-server.mjs │ ──────────────────► │ src/bridge-server.mjs │
│ (Claude, │ │ MCP tools (38) │ (Bearer secret) │ authenticated localhost │
│ Codex, …) │ └──────────────────────┘ │ multi-profile router │
└─────────────┘ └───────────┬─────────────┘
│ chrome.debugger
┌───────────────▼──────────────┐
│ MV3 extension in EACH exact │
│ profile (offscreen doc owns │
│ the WebSocket) │
└──────────────────────────────┘extension/— MV3 extension loaded once per controllable profile. Useschrome.debugger; an offscreen document owns the persistent WebSocket so MV3 service-worker suspension never drops the connection.src/bridge-server.mjs— authenticated, localhost-only, multi-profile router with resilient failover.src/chrome-profile-launcher.mjs— exact local Profile discovery and ordinary Chrome startup with bounded extension-registration confirmation.src/mcp-server.mjs— the MCP tool surface (38 tools).src/agent-browser.mjs— JavaScriptagent.browserscompatibility adapter.src/verification/— challenge detection, hold state machine, handoff, overlay dismissal, humanized input, and the solve pipeline (checkbox / slider / click-first generic / capture-for-backend).src/file-injection.mjs,src/page-asset.mjs,src/scroll-capture.mjs,src/scroll-asset-capture.mjs,src/network-request.mjs,src/network-response.mjs— the feature modules.scripts/— Windows installers, acceptance harnesses, live-test harness, and codex parity tooling.
Safety model
A caller must select one exact
metadata.profileName.Duplicate live registrations for one profile name are rejected.
The bridge binds only
127.0.0.1and requires a generated secret.There is no fallback to a generic profile, port 9222, Edge, or UI automation.
If the target is disconnected, callers use
chrome_profile_catalog/chrome_profile_start; a process start succeeds only after the exact extensionprofileNameregisters.A live self-test must pass tabs and
Runtime.evaluatebefore browser work.Profile and tab failures are returned to the calling agent with no user-side console inspection required.
chrome_cdp with action=send is outside the safe-projection boundary. It is
equivalent to granting the MCP client DevTools access to the selected logged-in
profile. Do not enable this server for untrusted clients or shared MCP hosts.
See SECURITY.md for the full model and reporting policy.
The extension's broad capabilities are intentional and visible: debugger
provides DevTools-equivalent control; history, downloads, and clipboard
permissions back their corresponding tools. Host access is limited to
http://127.0.0.1/* for the local bridge. For deterministic, disposable CI
browsers, use Playwright or Puppeteer instead.
DSH first-class integration
Chrome Faithful ships a first-party DeepSeek Harness bundle in
packages/dsh-plugin-chrome-faithful/. It uses DSH's host-provided MCP client
instead of duplicating the browser tools, so DSH gets the same exact-profile
routing and security behavior as every other client.
Supported baseline: @deepseek-ai/dsh 0.1.0-rc.6 and Node.js >=22.12.0.
DSH remains an RC, so every newer RC requires a composition recheck.
After the core and bundle packages are published, install into the intended profile:
dsh plugin --profile web add @bpc-oss/dsh-plugin-chrome-faithful@0.4.0The model sees stable names such as
mcp__chrome_faithful__chrome_profiles. The bundle embeds no secret and passes
AGENTOS_CHROME_CONFIG only when explicitly set. Initial configuration or
resolution failures stop activation instead of leaving a silent zero-tool
plugin. See the DSH bundle README
for packaging, trust-boundary, and private-acceptance details.
Local vision for text-only models
chrome_visual_extract captures the requested exact-profile tab only when
called, runs a local backend, and returns text JSON containing screenshot
dimensions/SHA-256 plus OCR text, confidence, and normalized coordinates. It
does not return or save the PNG. This makes the result useful to DSH models
even though DSH 0.1.0-rc.6 drops MCP image content.
The default backend is the shipped PP-OCRv5 mobile adapter. Chrome Faithful does not bundle or install Python, PaddleOCR, PaddlePaddle, OpenCV, NumPy, or model weights. Install those optional components yourself and configure both absolute local model directories so PaddleOCR cannot fall back to downloading weights:
CHROME_FAITHFUL_PYTHON=C:\Python311\python.exe
CHROME_FAITHFUL_PPOCR_DET_MODEL_DIR=C:\Models\PP-OCRv5_mobile_det
CHROME_FAITHFUL_PPOCR_REC_MODEL_DIR=C:\Models\PP-OCRv5_mobile_recLive quality acceptance of the direct production MCP path detected 7/7 blocks,
reached 99.43% raw and 100% non-whitespace character accuracy, and returned
0.9754 mean / 0.9379 minimum confidence with valid coordinates, reading order,
and identical output across three 3.00--3.25 second calls on the accepted AMD
Ryzen 9 9950X3D host. DSH model consumption of chrome_visual_extract output
was not evaluated, and the optional VLM was not approved. See the
acceptance report.
CHROME_FAITHFUL_OCR_BACKEND may instead be a shell-free
cli:["executable","arg"] specification or an exact
http://127.0.0.1:<port>/... / http://[::1]:<port>/... endpoint.
CHROME_FAITHFUL_VLM_BACKEND uses the same formats and is disabled by default;
it can point to a user-operated SmolVLM2, Moondream, or compatible local
adapter. Remote URLs, redirects, automatic downloads, and cloud fallback are
rejected. Normalized OCR coordinates are hints for existing chrome_cua
calls, not authorization to click.
Quick start (Windows)
Prerequisites: Node.js >= 22.12, Chrome, PowerShell (only the installers and the
.cmd launcher are Windows-specific; the extension, bridge, and MCP server are
platform-neutral).
npm ci --ignore-scriptsLoad the extension in every Chrome profile you want agents to control:
chrome://extensions→ enable Developer mode → Load unpacked → selectextension/. Note the 32-character extension ID and the loaded absolute path.Create the bridge config outside the source tree, at
%LOCALAPPDATA%\AgentOS\agentos-chrome-cdp\config.json, usingconfig/local.example.jsonas the non-secret schema reference. The secret must be a generated 256-bit value, e.g.:[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Max 256 }))The schema is closed:
host(must be127.0.0.1),port,secret,commandTimeoutMs,profileAliases— plus optional bridge/launcher overrides. The server refuses a config that lives inside the source tree.Start the bridge:
npm run bridge.Register the MCP server with your client, pointing
nodeat the absolute path ofsrc/mcp-server.mjs(or usebin\invoke-chrome-cdp.cmd, which auto-starts the bridge). The in-repo.mcp.jsonuses paths relative to the repo root — that form works for Codex project configs; other clients generally want an absolute path.Verify: call
chrome_profiles, thenchrome_selftest, then open a tab withchrome_tabs/ navigate withchrome_tabs.
For multi-profile client wiring, secret rotation, DPAPI-encrypted backups, and transactional rollback, the PowerShell installers automate it:
.\scripts\Install-AgentOsChromeExtension.ps1 -Target <absolute-loaded-extension-path>
.\scripts\Install-AgentOsChromeCdp.ps1 -Clients @('CodeBuddy') -ExtensionId $ExtensionId -ExtensionPath $ExtensionPath -ChromeProfileDirectories $ProfileDirs -ChromeUserDataDir $ChromeUserDataRun them without -Apply first — the default is a dry-run preview.
MCP tools
Group | Tools |
Profiles & sessions |
|
Tabs & navigation |
|
Interaction |
|
Raw CDP & network |
|
Capture & evidence |
|
Assets & content |
|
Verification |
|
Utilities |
|
Notable behaviors: locator calls wait up to 30 s for visibility and are
serialized per profile+tab; fill uses replacement semantics; chrome_locator
accepts a zero-based index (-1 = last) for multi-match selectors;
screenshots accept an optional document-coordinate clip and absolute
savePath and still return the PNG.
Verification handling
Because Chrome Faithful drives your real profile, most bot checks never trigger. When a platform still presents a human-verification challenge, the verification module gives agents a structured loop instead of blind retries.
Detection (chrome_verification_detect) classifies three real-world
states:
State | What it means | Action |
| A token is already populated (e.g. invisible challenge completed) | Not a blocker — proceed |
active provider iframe (reCAPTCHA v2/v3, hCaptcha, Turnstile, GeeTest, vaptcha) | A visible challenge widget is present | Solve it |
| A widget container exists but its challenge iframe never rendered — typically a network/provider handshake stall | Reload-and-retry guidance or human handoff |
Static markers (the ubiquitous reCAPTCHA badge) are explicitly excluded, so a page that merely loads reCAPTCHA is never reported as a challenge.
Solving (chrome_verification_solve) picks the strategy by type:
Checkbox / token wait — reCAPTCHA v2 / hCaptcha / Turnstile: click the visible challenge control (provider iframe center preferred) and poll the hidden response token until populated.
Humanized slider drag — GeeTest / slider: locate the handle, compute the target (track end or a backend gap offset), drag with a seeded bezier trajectory (monotonic x, jitter, ease-in-out delays), then verify acceptance. A gap behind the handle fails closed instead of dragging backwards.
Click-first generic — text-signal / unknown challenges: click the obvious "Verify you are human" / "验证" / "继续" button (or challenge checkbox) once, wait briefly for a token, and only then escalate.
Capture for backend — image-select / audio challenges: save the challenge image region and/or audio URL and submit them to an external OCR/ASR backend.
Hold state machine (chrome_verification_status /
chrome_verification_resume) — per-profile
idle → challenge_detected → waiting_for_human → cleared with an auditable,
bounded transition log. chrome_verification_solve clears the hold on success,
hands off on failure, and rolls the hold back if the solver itself crashes.
Humanized input — seeded bezier trajectories with jitter, monotonic-x
slider drags, and ease-in-out timing (src/verification/input.mjs),
deterministic and testable.
Recognition backends are external and optional. Enable one via the
AGENTOS_VERIFICATION_BACKEND environment variable, e.g.
cli:python scripts/verification/captcha-backend-adapter.py (a reference JSON
adapter for the Python faster-whisper / OCR / opencv stack; it prefers the
Agent OS captcha connector when importable and falls back to standalone
faster-whisper / ddddocr / tesseract / opencv otherwise) or an HTTP endpoint.
Without a backend, detection, hold/resume, handoff, overlay dismissal, and
humanized interaction all still work. Enabling a backend sends the configured
process or endpoint a local capture path and/or a challenge audio URL plus the
requested action; an HTTP endpoint may therefore transfer challenge data or
credentials outside this project. Configure only an endpoint you trust and
are authorized to use.
Design: docs/superpowers/specs/2026-08-14-verification-handling-design.md
Live testing
scripts/verification/live-tests/ contains reproducible harnesses that drive
real Chrome profiles through the compliant bridge channel (task tabs only;
they are closed after each run):
live-verification-test.mjs [url] [profileName]— generic detect → solve → re-detect loop against any URL.live-cf-test.mjs [profileName]— Cloudflare Turnstile with the official test sitekeys (1x00000000000000000000AAalways-pass,3x00000000000000000000FFforced interactive) plus a click-to-pass simulation fixture. Serve fixtures withpython -m http.server 18999 --directory scripts/verification/live-tests.cf-diagnostic-probe.mjs [profileName]— dumps widget markup / iframe /window.turnstilestate for the "widget rendered but challenge iframe missing" stall.final-regression.mjs [profileName]— badge-only pages must not be detected; click-to-pass must still solve.
JavaScript integration
import { startBridge, createAgent } from "./src/index.mjs";
const bridge = await startBridge();
const agent = createAgent(bridge.router);
const targets = await agent.browsers.list();
const browser = await agent.browsers.get(targets[0].id);
const tab = await browser.tabs.new();
await tab.goto("https://example.com/");Codex compatibility
src/agent-browser.mjs implements the Codex agent.browsers surface. Parity
is pinned mechanically: compat/ holds a repository-authored functional
surface contract, its adapter-map SHA-256, and the adapter map. It does not
redistribute bundled product documentation. npm run check:parity and
test/codex-parity-contract.test.mjs fail if any contract member is missing,
stubbed, or extra. See compat/README.md and
docs/CODEX_PARITY.md.
The internal identifiers agentos-chrome-cdp, AGENTOS_CHROME_CONFIG, and the
existing AgentOS configuration path are retained for upgrade compatibility;
the public display name is Chrome Faithful.
Testing
npm run check # static gates (structure, JSON validity, generic boundary)
npm test # mock/unit tests, incl. security contract tests
npm run check:parity # Codex agent.browsers parity contract
npm run build:extensionInstaller transaction tests (Windows): pwsh -NoProfile -File test/installer-transactions.test.ps1.
Static checks and mock tests are necessary but not sufficient. Release
acceptance additionally requires two concurrently connected real profiles,
per-profile selftest, background tab navigation, locator click/fill, raw CDP,
screenshot, history, clipboard round-trip with restoration, dry page-File
injection, reconnect, and proof that only acceptance-owned tabs were closed —
driven by scripts/live-acceptance.mjs,
scripts/differential-acceptance.mjs, and the live-test harness above.
Documentation
SECURITY.md — safety model and vulnerability reporting
CONTRIBUTING.md — development workflow
docs/CODEX_PARITY.md — Codex parity design
packages/dsh-plugin-chrome-faithful/ — first-party DSH bundle
docs/superpowers/specs/ — design specs (profile launch, resilient bridge ownership, verification handling)
skills/control-chrome-cdp/SKILL.md — agent-facing operating skill
THIRD_PARTY_NOTICES.md — bundled third-party code
Status
Experimental. Windows-first: the installers, DPAPI backups, and .cmd launcher
are Windows-only; the extension, bridge, and MCP server are platform-neutral
Node.js and should run anywhere Chrome does, but only Windows is exercised
today. The bridge controls your real logged-in profiles — review the safety
model, use exact profiles, and never paste your bridge secret.
License
MIT. Bundled runtime code and development-only verification tools retain their own MIT, Apache-2.0, or ISC terms — see THIRD_PARTY_NOTICES.md.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceAn MCP server that enables AI agents to control a real Google Chrome instance using specific user profiles, cookies, and extensions. It provides 18 tools for browser navigation, element interaction, and page inspection via the Chrome DevTools Protocol.
- AlicenseBqualityBmaintenanceAn MCP server that provides AI models with full browser automation capabilities through Chrome. It enables navigation, interaction, screenshots, and complete DevTools access by bridging AI clients with a companion Chrome extension.9992Apache 2.0
- -license-quality-maintenanceMCP server that connects AI agents to a real Chrome browser via a WebSocket extension bridge, enabling over 40 browser control tools without debug mode or profile isolation.
- FlicenseBqualityDmaintenanceAn MCP server that enables AI agents to control a real Chrome browser with full login state through 37 structured automation tools, connecting via the Playwriter extension without needing a remote debugging port.30161
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Live browser debugging for AI assistants — DOM, console, network via MCP.
A paid remote MCP for AI agent browser MCP session, built to return verdicts, receipts, usage logs,
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/bpc-oss/chrome-faithful'
If you have feedback or need assistance with the MCP directory API, please join our Discord server