Claude in Chrome: all external (https://) navigation/reading silently blocked mid-session; survives restart, reboot, re-login
Status Open
Maintainer reply None cached
Workaround ✓ Mentioned in thread ↓
Activity 4 comments · opened Aug 4, 2026
Summary
In a single Claude Code session, mcp__claude-in-chrome browser automation worked correctly for many calls (successfully navigating to and reading search.google.com/search-console pages, applying page filters, extracting data), then partway through the session all external (https://) domain access became blocked — both navigate and content-reading calls (get_page_text, computer screenshot) — while file:// navigation continued to succeed. The restriction did not clear after extensive troubleshooting.
Symptoms
navigate→https://search.google.com/...:Navigation to this domain is not allowednavigate→https://example.com(unrelated domain): same error — not Google-specificnavigate→file:///C:/...: succeeds normally ("Navigated to ...")- After the user manually opened a GSC page in the browser,
get_page_texton that already-loaded tab:Permission denied for reading page content on this domain computer(screenshot) on the same tab:Permission denied for this action on this domain
What was ruled out
- Chrome extension "Site access" setting — confirmed set to "On all sites"
- Chrome extension "Allow access to file URLs" — confirmed enabled
- Chrome enterprise policy (
chrome://policy) on the affected profile — confirmed noExtensionSettings/URLBlocklist/ management banner present - App restart — issue persisted
- App logout/login —
list_connected_browsersshowed a genuinely newconnectedAttimestamp after re-login, but the block was identical - Full OS reboot — same result, new
connectedAtconfirmed, block unchanged - New tab / new tab group (fresh
tabGroupIdeach time) — same result every time - Concurrency with another Claude session using the same browser — closing the other session made no difference
- Local
.claude/settings.jsonand.claude/settings.local.json— no domain-specific deny rule found; only broad tool-levelallowentries - Org policy file (
policy-limits.json) — present but contains only unrelated flags (allow_quick_web_setup,enforce_web_search_mcp_isolation), nothing that looks like a browsing kill-switch
Reproduction context
- Platform: Windows 11
- The block appeared to begin shortly after the assistant navigated the same browser tab to a
file://URL to show the user a local HTML file, then navigated back tohttps://. However, re-testingfile://navigation later in the same session succeeded normally whilehttps://remained blocked — so file access does not appear to be the trigger, and the true cause is unknown. - No visible permission prompt, banner, or "per-origin approval card" was observed at any point — the calls simply return the error strings above immediately.
Impact
This makes mcp__claude-in-chrome completely unusable for the rest of the session once triggered, with no user-facing recovery path found (short of contacting support / opening this issue).
Request
- Any pointers on what could cause a mid-session, cross-domain, cross-restart lockout like this would help a lot.
- If there's a way to inspect/reset this state (e.g., a hidden per-session or per-account browsing permission flag), documenting it would prevent others from going through the same multi-hour troubleshooting loop.
4 Comments
Important follow-up: the lockout is session-scoped
The user just confirmed that a different, concurrent Claude Code conversation on the same machine, same account, same Chrome profile, same extension can drive
mcp__claude-in-chromenormally — navigating to and readingsearch.google.compages without any error — while this session remains fully blocked.This narrows the diagnosis considerably:
deviceId)So once a session enters this state, it appears to be permanently poisoned for browser automation, with no in-session recovery — while sibling sessions are unaffected. The practical workaround for users is to abandon the affected session and start a new conversation, which is worth documenting since it's non-obvious (every local-looking symptom points at browser/extension config, sending users down a long and fruitless troubleshooting path — in our case several hours of checking extension site access, file-URL access,
chrome://policy, app restart, app re-login, and a full OS reboot, none of which could possibly have helped).Suggested improvements, in rough priority order:
Navigation to this domain is not allowed (this session's browser access has been revoked; start a new conversation to restore it)instead of a bare domain-denial string that reads like a config problem.Correction to my previous comment: it is both model- and session-dependent
My earlier comment claimed this was "not model-scoped." That was wrong — I had incomplete information. Corrected data from the user, now covering all four cells:
| | Sonnet 5 | Opus 5 |
|---|---|---|
| affected session | blocked | blocked |
| sibling session | blocked | works |
So:
Neither variable alone is sufficient; both are necessary. This invalidates the "purely session-scoped" framing in my previous comment.
Possibly a different (or differently-surfaced) failure mode
Worth flagging for triage: in the sibling session the failure surfaced with different wording. That session reported the browser tool as temporarily not responding, attributing it to a "safety classifier error" and separately to a "model availability issue", and suggested retrying later. My session, by contrast, consistently gets hard, immediate, deterministic denials:
Navigation to this domain is not allowedPermission denied for reading page content on this domainCaveat on provenance: the "safety classifier" / "model availability" phrasing is how the assistant in that session described what it saw, so I can't confirm it as a verbatim tool error string. But if a safety classifier does gate
mcp__claude-in-chrometool calls, and its behavior or availability differs per model, that would explain the whole 2×2 — Sonnet 5 trips it in both sessions, Opus 5 clears it only in a session whose accumulated context (or sticky blocked state) hasn't already poisoned it.Revised suggestions
Navigation to this domain is not allowedreads unambiguously like a URL-allowlist/config problem, which is what sent us through hours of checking extension site access, file-URL access,chrome://policy, app restart, app re-login, and a full OS reboot — none of which were relevant.Much better diagnosis: this is a per-origin allowlist, and it can end up wiped or unfillable
New evidence from the sibling session substantially revises this again. Two distinct behaviors are now visible, which means my earlier "model + session" framing was describing symptoms rather than the mechanism.
The mechanism is per-origin approval
In the sibling session, browser automation is partially working, split by origin:
search.google.com→ allowed, navigates and reads fineanalytics.google.com→ deniedCritically, that session reports that requesting the new origin produces no approval card — it is a hard denial, as if the origin simply is not on an allowlist and there is no way to get it added. Retrying and opening a fresh tab both reproduce it.
In this session, by contrast, every origin is denied, including:
https://search.google.com(which worked earlier in this same session)https://example.comchrome-extension://fcoeoabgfenejglbffodgkkbkcdhcgfn/options.html— even the extension's own options pageSo the two sessions are at different points on the same mechanism: one has a partially-populated allowlist that cannot be extended, the other has an allowlist that appears to have been emptied mid-session.
Suspected trigger in this session:
navigatemanglesfile://URLsThis session worked normally against
search.google.comfor many calls, then broke. The last browser action before the break was an attempt to open a local file.navigateprependshttps://to afile://URL, producing a malformed origin:The resulting tab URL is
https://file///C:/...and the tab title is literallyfile. This reproduces reliably — I hit it twice in this session, hours apart. Everyhttps://origin was denied from that point onward, which is consistent with a bogusfileorigin being written into per-session permission state and corrupting it.I want to be careful about how strongly I claim this: the correlation is suggestive, not proven, since a later
file://navigation also produced the same malformed URL without any further observable change (the session was already fully blocked by then). But the URL mangling is a clear bug on its own merits, independent of whether it is the poisoning trigger:navigateshould either handlefile://URLs correctly or reject them explicitly, not silently rewrite them intohttps://file:///….Why this matters for the user-facing experience
The denial string
Navigation to this domain is not allowedgave no indication that:Every plausible reading of that message points at browser or extension configuration. In this session that cost several hours of checking extension site access ("On all sites"), file-URL access,
chrome://policy, app restart, app logout/login, and a full OS reboot — none of which touch a per-session origin allowlist.Requests
file://→https://file:///…rewrite innavigate.Origin https://example.com is not in this session's approved origins— so users stop diagnosing it as extension config.Resolved question: fresh sessions can acquire new origins; older sessions cannot
Following up on request #4 in my previous comment ("investigate why the approval card fails to appear for a new origin"). We now have the answer, from a three-session comparison on the same machine/account/profile:
| Scenario | Result |
|---|---|
| Recover an already-blocked session | ❌ Impossible — model switch, app restart, re-login, OS reboot all ineffective |
| Previously-working origin in a blocked session | ❌ Also dies (
search.google.comhad worked for many calls, then was denied) || New origin in a fresh Opus 5 session | ✅ Works —
analytics.google.comwas approved and opened successfully || New origin in an older, still-partially-working session | ❌ Denied, and no approval card is offered |
So origin approval is per-origin and per-session, and a session appears to lose the ability to acquire new origins as it ages or after it enters a bad state — while a fresh session grants them normally. Concretely:
analytics.google.comwas unreachable from the older session but approved without incident in a brand-new one, minutes apart.This makes the practical workaround "abandon the session and start a new one," which works reliably but is undiscoverable from the error text.
One more note on the user-facing side
There is no user-configurable allowed-domains list for this extension — the only related control is Chrome's own extension "Site access" setting, which was already set to "On all sites" throughout. So when a session reaches this state there is genuinely nothing the user can inspect or change; the earlier suggestion in this thread to check an extension-level domain allowlist was a dead end, because no such UI exists.
Combined with the denial string
Navigation to this domain is not allowed, which reads exactly like a configuration problem, this is what drives the multi-hour troubleshooting spiral. Surfacing the real mechanism in the error message — and ideally allowing an in-session origin re-request — would resolve nearly all of the pain here, even if the underlying state bug takes longer to fix.Additional data point on the trigger
Also worth noting for repro: one transient occurrence produced a different error before settling back into the permanent denial:
The mention of "waiting on a permission prompt" suggests the approval flow was attempted here but never surfaced a prompt to the user — no card, banner, or dialog appeared in either the app or the browser. Subsequent calls reverted to the hard
Navigation to this domain is not allowed.