extension_storage
Read or write chrome.storage in a running extension.
Quick start
Read chrome.storage.local and set settings.theme to dark
Asked to set a storage key, the agent writes it through the control channel and reads it back.
How the agent uses it
Every call runs in the extension's background (the engine honours no context), so it proves nothing about what a content script or page can read. A set is read back and the answer says whether the stored value matches. Rides the dev session's control channel, on unless extension_dev was called with allowControl:false. Set one key per call: there is no bulk-object set.
Page text in the answer
Part of this tool's answer is text a web page or the extension wrote. The server fences it between <untrusted-data-ID> and </untrusted-data-ID> with a fresh random ID per call, named in untrusted.boundary. A fence is a signal to the model, not a gate: pair it with --no-ship when the agent reads pages you do not trust. See Server flags and telemetry.
Reference
| Group | local, on by default |
| Tier | Act |
| Needs | a dev session, which carries control unless started with allowControl: false |
| Read only | no |
| Destructive | yes |
| Idempotent | no |
| Reaches the open web | no |
Inputs
| Input | Type | Required | Default | What it does |
|---|---|---|---|---|
projectPath | string | yes | Extension project root (needs a live dev session) | |
action | "get" | "set" | yes | get reads a key (or the whole area); set writes a key | |
area | "local" | "sync" | "session" | "managed" | no | "local" | |
key | string | no | Key to get or set | |
value | any | no | Value to set (any JSON value); required for action=set | |
browser | string | no | Session browser; defaults to this project's live session | |
timeout | number | no | Command timeout in ms. When omitted, the default depends on the route: 30000 through the dev session's control channel, 10000 over the Firefox debugger protocol, and 15000 per command over the Chromium debug port. |
When it fails
- The call is refused because no session is live. Start one with
extension_devorextension_startand call again. - The control channel is off. The session was started with
allowControl: false. Start it again without that flag.
Next
- MCP server: install, the two groups and the session gates
- Install in your client
extension_eval: Evaluate an expression in a running extension context.extension_open: Open an extension surface, or replay an event, in a running session.extension_reload: Reload a running extension's background context, or a tab.