OmniSnap MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OMNISNAP_PORT | No | Port the bridge listens on. Must match the extension. | 8787 |
| OMNISNAP_LOG_LEVEL | No | Log level: silent, error, warn, info, or debug. | info |
| OMNISNAP_STATE_DIR | No | Directory where the pairing token lives. | ~/.omnisnap |
| OMNISNAP_PAIRING_TTL_MS | No | How long a pairing code lasts, in milliseconds. | 120000 |
| OMNISNAP_CALL_TIMEOUT_MS | No | Per-call timeout in milliseconds. | 30000 |
| OMNISNAP_MAX_FRAME_BYTES | No | Maximum size in bytes for any single message from the extension. | 25165824 |
| OMNISNAP_MAX_IMAGE_BYTES | No | Maximum image size in bytes. Past this a capture is refused rather than sent. | 8388608 |
| OMNISNAP_CAPTURE_TIMEOUT_MS | No | Capture timeout in milliseconds. Captures get longer. | 120000 |
| OMNISNAP_MAX_CONCURRENT_CALLS | No | Maximum number of calls in flight at once. | 6 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
OmniSnap reads the user's real, logged-in browser through a paired Chrome extension.
Reach for it when a question is about a page that actually exists: what it looks like now, which selectors a test should use, why it is slow, or what its design system is. It reads pages; it does not drive them, so it will not click or navigate.
Before acting on a page, call annotate_interactive: it returns a numbered screenshot plus a selector for each number, which is far more reliable than inferring a selector from markup. If a tool reports the extension is not paired, relay its instructions to the user verbatim.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| omnisnap_statusA | Reports whether the OmniSnap browser extension is paired with this server, and which tab is active. Call this first when any other OmniSnap tool fails, and to get pairing instructions. |
| list_tabsA | Lists the open browser tabs OmniSnap can act on, with their titles and URLs. Use it to find the right tab before capturing or collecting selectors. |
| capture_pageA | Takes a screenshot of the active tab and returns it as an image the model can see. Captures the full scrollable page by default, including pages that scroll inside a panel. Use it to check layout, verify a fix visually, or see what the user is describing. |
| capture_elementA | Screenshots a single element, given a CSS selector. Cheaper and far easier to reason about than a full page when the question is about one component. |
| annotate_interactiveA | Returns a screenshot with every interactive element outlined and numbered, plus a table mapping each number to its best selector and a stability score. This is the tool to use before acting on a page: look at the image, pick a number, then use that number's selector. Far more reliable than guessing a selector from the DOM. |
| collect_selectorsA | Given a description or a CSS hint, returns every selector that could reach the element, ranked by how likely it is to survive a redeploy and checked against the live page so you know whether it matches one element or several. Prefer the top result. A selector built on a generated class such as css-1x2y3z is scored down because it changes whenever the bundler runs. |
| get_page_objectB | Exports the selectors collected in the browser as a ready page object. The best selector differs per framework: Playwright can match a role and an accessible name, Selenium cannot and falls back to CSS or XPath for the same element, so always pass the framework you are actually writing for. |
| verify_selectorsA | Takes a list of selectors and reports, for each, how many elements it matches on the page now. Use it to find selectors that have rotted after a UI change, before a test run does. |
| get_diagnosticsA | Returns Web Vitals, failed and slow network requests, console errors, storage use and the exact browser environment for the active tab. This is measured in the user's real session, so it reflects their network, their extensions and their data, which a clean automated browser cannot show you. |
| get_design_tokensA | Extracts the design system the page actually uses: palette with contrast audit, type scale, radii, shadows and spacing. Use it to match a new component to an existing product, or to find accessibility problems in the live UI. |
| measure_accessibilityA | Audits the live page for contrast failures, missing accessible names, skipped heading levels and touch targets below the minimum size. Returns the offending elements with selectors. |
| inspect_elementA | Returns the box model, computed typography, colours and spacing for a single element. Use it when a design question needs numbers rather than a picture. |
| scroll_toA | Scrolls the page. Use it to see the rest of a page: annotate_interactive and the screenshots only cover what is on screen, and its "coverage" field says how much of the page that is. Scroll, then capture again. This moves the camera, not the hands: it cannot click, type or navigate. |
| await_user_selectionA | Arms the element picker in the browser and waits for the user to click the elements they mean, then returns them with ranked selectors. Use this instead of guessing when a page has several things that match the description ("the save button", "that broken card"), or when you cannot find what the user is describing. Asking costs one turn; picking the wrong element costs the whole task. |
| read_pageA | Returns the page's text and heading outline. Use this first when the question is what the page says rather than what it looks like: it costs a fortieth of a screenshot and a model reads a paragraph far more reliably than a picture of one. Reach for a capture when the question is visual. |
| propose_actionA | Proposes clicking an element or typing into a field. The extension outlines the element and asks the user to approve; nothing happens unless they do. Use it to reach states that only exist after an interaction: an open menu, a validation error, the next step of a form. That is where most defects are. The user may decline. If they do, do not retry: ask them what they want instead. |
| set_viewportA | Holds the page at a phone, tablet or desktop width, and leaves it there. Every tool afterwards, including the numbered map, the accessibility audit and the measurements, then answers about that width, which is how you find what is wrong at 375px rather than just noticing that something is. Call it with reset to give the page back. Chrome shows a debugging banner while this is held; that is Chrome, not the page. |
| set_color_schemeA | Shows the page as if the user preferred light or dark, without them changing anything. Dark mode is where contrast regressions hide, because it is the theme nobody screenshots. Use "auto" to hand it back. |
| hoverA | Puts the pointer on an element and returns a screenshot of what that reveals: dropdowns, tooltips, hover styling. These states cannot be reached any other way: a synthetic event fires the page handlers but leaves the CSS untouched, so this uses a real pointer move. Nothing is clicked. |
| focus_elementB | Focuses an element and returns a screenshot. Use it to check focus rings, which are the most commonly missing accessibility feature and are invisible in an ordinary capture. |
| watch_pageA | Watches the page for a number of seconds and reports the console errors, failed requests and layout shifts that happen during it. Every other tool here asks a question and gets an answer as of that instant; most of what goes wrong does not wait to be asked. Use it while the user reproduces something, or just after a change, when asking afterwards would find a page that looks fine. |
| capture_matrixA | Captures the full page at phone, tablet and desktop widths and returns them side by side in one image. Use it to check a responsive change in a single look, rather than three captures you have to hold in mind at once. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| write-test | Collects stable selectors from the open page and writes a test against them. |
| file-bug | Turns the live page and its diagnostics into a defect report. |
| audit-accessibility | Checks the live page against WCAG AA and reports what to fix. |
| extract-design-system | Pulls the palette, type scale and spacing out of the live page. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| latest-capture | The most recent screenshot taken in the browser, with its metadata. |
| selector-guide | The ranking OmniSnap applies and why, what makes a selector fragile, and how the right choice differs between Playwright, Selenium and Cypress. Read this before writing tests. |
| diagnostics-guide | What the vitals thresholds mean, and the two mistakes that produce confidently wrong defect reports. Read this before writing one up. |
| bridge-help | Install and pairing steps for the browser extension. |
TDQS
Scored across 22 tools
Tools mostly carve out distinct jobs—visual capture vs. text reading vs. inspection vs. selector discovery—and the descriptions clarify when to use which. There is residual overlap among the screenshot variants (capture_page, capture_element, capture_matrix), selector tools (collect_selectors, await_user_selection, annotate_interactive), and accessibility surfaces (get_design_tokens, measure_accessibility), so an agent could still pause.
All tool names use snake_case and most follow a clear verb_noun or verb_object pattern such as capture_page, verify_selectors, and set_viewport. Minor exceptions like omnisnap_status and the bare hover keep it from being perfectly uniform, but the convention is predictable.
At 22 tools, the surface is heavy for a browser-extension inspection server, though each tool maps to a real capability. Several could be consolidated or grouped, especially the capture variants and selector helpers, making this borderline in the 16–25 tool range.
The set covers status/tabs, visual and text capture, selector discovery and verification, design-token extraction, accessibility auditing, element inspection, and interactive state probing. Minor gaps remain around page navigation, raw DOM/HTML export, and richer interaction such as keypresses or select controls, but most browser-QA workflows are reachable.