hermes-extension (catcaptions/hermes-extension) is an MCP server listed on the M8ven Trust Index. It scores 74 out of 100, grade C. It declares 24 tools. No publisher has claimed this listing.
Hermes Extension — browser side panel for Hermes Agent where the agent sees and drives your real tabs via MCP. No build step, local-first, vanilla JS.
Warning. Serious findings were identified. Review the full report before connecting. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
catcaptions
Source: github_repo_search
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
browser_attach_status%s Call this FIRST whenever the user mentions an open browser, a tab, or a logged-in page. If nothing is attached yet but the bridge is up, this AUTO-ATTACHES the user's currently focused tab — do NOT ask them to use the sidepanel. To pick a different tab, call browser_tabs(action='list') then brows…
browser_attach%s Attach the debugger so other live_browser tools can drive a tab. - No args: attach the user's currently focused tab. - tabId: attach that tab (from browser_tabs list). - url / title: attach the first tab whose url/title contains the substring. NEVER ask the user to click Attach in the sidepanel —…
browser_navigate%s Navigate the attached tab to url, wait for the load (wait='load') or only domcontentloaded, and return {url, title}. Auto-attaches the focused tab if nothing is attached yet.
browser_snapshot%s Capture the accessibility tree of the attached tab as compact text with element refs ([eN] — clickable/typeable elements only). The default caps at 80 items (full=True -> 400). ALWAYS re-snapshot after navigation or a DOM mutation; old refs fail with STALE_REF (that is the contract). Returns the …
browser_find%s Find elements by text or CSS selector without a full snapshot. Returns up to max_results matches with refs ([eN]) — cheaper than browser_snapshot when you only need one element.
browser_click%s Click an element. target = a snapshot ref ('e5'), a unique CSS selector, or viewport coordinates '350,120' (canvas, charts, maps). double_click=True for a double click. Stale refs fail with STALE_REF — re-snapshot and retry.
browser_drag%s Drag from `source` to `target`: slider thumbs (range sliders, volume, price filters), custom drag-and-drop UIs (sortable lists, kanban cards, map panning). Each endpoint = a snapshot ref ('e5'), a unique CSS selector, or viewport coordinates '350,120'. Holds the mouse at source, moves in `steps` …
browser_type%s Type text into an element (appends; use browser_fill to replace). submit=True presses Enter after typing. SECURITY: typing into a password field requires confirm='user_approved' — otherwise ask the user to type credentials themselves.
browser_fill%s Replace an element's value (clear + type; React/Vue-safe native setter). SECURITY: password fields require confirm='user_approved'.
browser_press%s Press a keyboard key: a single character ('a', '3'), a name — enter, tab, escape, backspace, delete, space, up/down/left/right, home, end, pageup, pagedown — or a combo with ctrl/shift/alt/meta held ('ctrl+a', 'shift+tab', 'alt+f').
browser_hover%s Hover an element (moves the mouse to its center).
browser_scroll%s Scroll, three ways: - page: direction up/down/left/right by amount px (direction defaults to 'down' when omitted); - target only: scroll that element into view; - target + direction: mouse-wheel scroll INSIDE the element's nearest scrollable container (dropdown lists, modal bodies, side panels). …
browser_select%s Select option(s) of a <select> element by value or label (React/Vue-safe native setter + change event). values = list of strings.
browser_check%s Check a checkbox/radio (no-op if already checked).
browser_uncheck%s Uncheck a checkbox (no-op if already unchecked).
browser_back%s Go back one history entry; returns {url, title}.
browser_forward%s Go forward one history entry; returns {url, title}.
browser_evaluate%s Evaluate JavaScript in the attached tab and return the JSON value. Use ONLY when snapshot/click/type can't do the job — this runs with the user's real session; never touch credentials or payments.
browser_wait%s Wait for: 'load' (document complete), 'visible' (target ref/selector has a box), 'text' (body contains text), 'text_gone' (body no longer contains text), or 'idle' (load + 0.5s settle). Raises on timeout.
browser_screenshot%s Screenshot the attached tab — scope: 'viewport' (visible area), 'full' (whole page), 'element' (needs target ref/selector). Saves to disk and returns the path (@image:/MEDIA: lines render inline in Hermes). Prefer browser_snapshot for reading content; screenshots are for visuals (canvas, charts, …
browser_tabs%s Manage REAL browser tabs. YOU attach tabs — never ask the user to click Attach in the sidepanel.
browser_upload_file%s Set files on a file-input element (ref from browser_snapshot, or a CSS selector). paths = absolute local filesystem paths the browser can read. Uses CDP DOM.setFileInputFiles — the browser-protocol path that bypasses the page-JS FileList read-only restriction (browser_evaluate cannot assign input…
browser_console%s Buffered console messages of the attached tab (newest last, capped at 200). level = 'error', 'warning', or 'info' (minimum severity to show); since_seq = seq of the last message you saw (0 = everything buffered).
browser_network%s Buffered network responses of the attached tab (newest last, capped at 200): {url, status, mime}. filter = substring URLs must contain; since_seq = seq of the last entry you saw (0 = everything buffered).
LIVE_BROWSER_TOKENbrowser-mcp.bat --reset-pairing, then restart. EnvTool annotations
No tools have read-only/destructive annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
24/24 tools missing one or more hints — browser_attach_status (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); browser_attach (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); browser_navigate (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +21 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tool test coverage
Only 3/24 tools referenced in tests (13%)
Write tests that reference each tool by name so every tool has at least one test.
Readable source code
3 files are minified or bundled, which is usually build output rather than concealment
Ship unminified, readable source.
Secrets not logged
1 secret value sent to print
Redact or omit secret values from log output.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/catcaptions/hermes-extension)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check