Gone. Gone from the registry since 12 Oct.
Read-only live state of your Chrome tabs for AI agents: fields, console errors, network, storage.
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y @golproductions/exnos
MCP client config
{
"mcpServers": {
"exnos": {
"command": "npx",
"args": [
"-y",
"@golproductions/exnos"
]
}
}
}Live browser-state verification for AI coding agents.
Your AI says "done." Exnos is how it knows.
One tool call returns the full state of the Chrome tab you're looking at: every field, every button, every console error, network requests, storage, performance—in milliseconds. Read-only. Local. Free to use. Built by GOL Productions.
By GOL Productions.
AI coding agents edit files and hope for the best. When something breaks:
You: "The button doesn't work"
AI: "Can you check the console for errors?"
You: "It says TypeError something something"
AI: "Can you paste the full error?"
Back and forth. Slow. Frustrating.
You: "The button doesn't work"
AI: [calls exnos_verify]
AI: "Console shows 'TypeError: handleClick is not defined' at line 47.
The handler was renamed to onClick. Fixing now."
Exnos gives your AI eyes. It sees what you see—instantly.
npx @golproductions/exnos@latest setup
That's it. Detects Claude Code, Cursor, and Windsurf—registers with all of them, opens the extension folder, tells you to load it in Chrome. Takes 30 seconds.
1. Connect your agent
{ "mcpServers": { "exnos": { "command": "npx", "args": ["@golproductions/exnos"] } } }
Or for Claude Code:
claude mcp add --scope user exnos -- npx @golproductions/exnos
2. Load the extension
npx @golproductions/exnos@latest path
Open chrome://extensions → Developer mode → Load unpacked → select that folder.
Badge reads ON when connected.
npx fetches the newest server on its own; the Chrome extension does not update itself. After an update, open chrome://extensions and click reload on Exnos. If it still shows the old version, remove it and load the folder printed by npx @golproductions/exnos@latest path.
localhost, 127.0.0.1, *.localhost, and local files.| Category | Data |
|---|---|
| Identity | URL, title, ready state |
| Page text | The page's rendered text, first 3,000 characters (maxText up to 20,000), marked when cut |
| Forms | Every field in view with its live value and a selector (passwords, API keys, tokens, CSRF tokens, card numbers and seed phrases masked) |
| Buttons | Text, disabled state and a selector |
| Checkboxes | Checked state with labels |
| Alerts | Visible error/success/warning UI |
| Console | Errors (with message and stack), warnings, and failed resource loads since page load, counted separately |
| Network | This site's fetch/XHR: URL, status, short response body; the last 30 failed and 20 successful. Other sites' requests only on request. |
| WebSocket | The last 30 sent and received frames |
| Performance | Page load, TTFB, paint timing |
| Focus | Which element has focus |
| Shadow DOM | Pierces web component boundaries |
| Iframes | Same-origin content + cross-origin count |
| Screenshot | Optional PNG, returned as an image |
Only when asked: localStorage, sessionStorage and cookies (includeStorage, with tokens, keys and session values redacted), requests to other sites (thirdParty), and window.__* app state (appGlobals).
| Tool | Purpose |
|---|---|
exnos_verify | Full live state. The main tool. |
exnos_tabs | List the tabs Exnos can read. |
exnos_screenshot | PNG screenshot of visible tab. |
exnos_fetch_tabs | Verify multiple tabs at once. |
exnos_record_start | Record a tab over time: saves what changed every few seconds. |
exnos_record_status | List recordings, including ones from earlier sessions. |
exnos_record_read | Read back a recording: a time range, latest or earliest first. |
exnos_record_stop | Stop one recording, or all of them. |
| Parameter | Description |
|---|---|
tab | Match tab by URL or title substring. Default: active tab. |
selector | CSS selector for deep-dive: text, bounds, computed styles, HTML. |
maxText | Characters of page text, and of selector text and HTML. Default 3,000 / 2,000, maximum 20,000. |
includeHidden | Also list fields, buttons and checkboxes outside the viewport or hidden, including type=hidden inputs. Default: false. Page text always covers the whole page; text hidden with display:none is never included. |
thirdParty | Include requests to other sites. Default: false. |
includeStorage | Include storage and cookies, credentials redacted. Default: false. |
appGlobals | Include window.__* app state. Default: false. |
screenshot | Also capture a PNG of the visible tab, returned as an image. |
Pass selector to get the following for the first match. If nothing matches, selectorFound is false and the rest of the state (errors included) still comes back.
selectorText — inner text contentselectorVisible — actually visible?selectorBounds — {top, left, width, height}selectorHTML — outer HTMLselectorStyles — computed: color, backgroundColor, fontSize, fontWeight, fontFamily, padding, margin, border, zIndex, overflow, transform, transitionexnos_verify is a snapshot. A recording keeps watching: every few seconds Exnos samples the tab and saves what changed, so a bug that comes and goes, or a list that changes all day, can be read back later.
AI: [calls exnos_record_start { tab: "localhost:3000", selector: "#orders", items: "tr", every: 2, duration: 120 }]
... two hours later, from any session ...
AI: [calls exnos_record_read { lastMinutes: 15 }]
Each saved sample holds the URL, title, whether the tab was visible, and what is new since the last sample: console errors and warnings, failed resource loads, this site's requests and failed requests to other sites. With a selector it also holds the text of that part of the page and its items ([text, link, top, left, visible]). Unchanged samples are not saved; a heartbeat every 30 seconds shows the recording went on.
| Parameter | Description |
|---|---|
tab | Match tab by URL or title substring. Default: active tab. Fixed when recording starts. |
selector | Part of the page to watch: up to 20 matching elements, each with up to 1,000 characters of text and 100 items. Without it: URL, title, visibility, errors and requests only. |
items | Repeated items inside the selector (rows, cards). Default: links. |
every | Seconds between samples. Default 2, minimum 1. |
duration | Minutes to record. Default 60, maximum 1440 (24 h). |
includeHidden | Also save items scrolled out of view. Default: false. |
maxMB | Stop at this file size. Default 200. |
name | Short label added to the recording id. |
exnos_record_read parameters:
| Parameter | Description |
|---|---|
id | Recording id. Default: the newest recording. |
lastMinutes | Only samples from the last N minutes. |
from / to | Only samples inside this time range (ISO time). |
limit | How many samples to return. Default 10, maximum 200. |
oldestFirst | Earliest matching samples instead of the latest. Default: false. |
changesOnly | Skip heartbeat lines. Default: true. |
full | Untrimmed text and items. Default: false (300 characters, 40 items per region). |
~/.exnos/recordings/ (<id>.jsonl, one line per saved sample). The AI cannot choose the file path.maxMB, or exnos_record_stop is called. A later session can list, read and stop it. Up to 3 recordings run at a time per session.exnos_verify, checked on every sample: if the tab moves to a site Exnos may not read, the recording stops. Form field values are never recorded, but text typed into editable parts of the page can appear in the watched text. URL parameters with sensitive-looking names are masked.npx @golproductions/exnos@latest setup # configure everything
npx @golproductions/exnos@latest uninstall # remove everything Exnos added (run it in each project where you ran init)
npx @golproductions/exnos@latest path # extension folder path
npx @golproductions/exnos@latest init # write rules to agent config
npx @golproductions/exnos@latest rules # print rule text
┌─────────────┐ MCP/stdio ┌─────────────┐ WebSocket ┌─────────────┐
│ AI Agent │ ◄────────────────► │ MCP Server │ ◄──────────────► │ Extension │
│ │ │ :17872 │ │ │
└─────────────┘ └─────────────┘ └──────┬──────┘
│
Chrome APIs
│
┌──────▼──────┐
│ Your Tab │
└─────────────┘
changed: true/false on repeated calls, over the whole page text, form values, button and checkbox states, alerts and error countsExnos sends nothing to GOL Productions. No account, no telemetry, and no GOL server. Traffic goes from the extension to a local server on 127.0.0.1, which only accepts the Exnos extension and requests from this machine: a web page cannot connect to it.
However: what Exnos returns goes to your AI agent, which forwards it to its model provider. That is why Exnos reads only local pages and the sites you allow, masks passwords and similar fields, and returns storage and cookies only when asked, with credentials redacted. Redaction works by pattern, so it can miss a secret in an unusual place.
Recordings are saved only on this machine, in ~/.exnos/recordings/; they reach the AI only when it reads them back. Delete the folder to delete them.
Allow the sites you are debugging, not your banking tab.
127.0.0.1:17872. The Chrome extension always connects on this port, so keep it free.GET / returns {"exnos":true,"extension":true|false}chrome://) cannot be inspectedFree to use, personal or commercial, under the GOL Free License. Exnos is built by GOL Productions: you may use it and share unmodified copies with the credit, but not publish changed versions, build your own product from it, or sell it. What you make with it is yours. See LICENSE.
Exnos is part of the GOL Productions toolchain.