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.

C
Warning
74/100

hermes-extension

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

Code Verified⚡ Live Monitored: not connected

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

Is this your MCP?

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.

// key findings
🚨
Code appears obfuscated
3 files are unreadable to a human reviewer. Cannot audit what they do.
🔐
You'll be asked for 1 credential: LIVE_BROWSER_TOKEN
These are read from process.env at runtime. Make sure you trust where they’ll be sent.
// tools this server exposes24 tools

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).

// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
🔐 secretLIVE_BROWSER_TOKENbrowser-mcp.bat --reset-pairing, then restart. Env
// quality suggestions

Tool 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.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 5 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Verified](https://m8ven.ai/badge/mcp/catcaptions/hermes-extension?variant=verified)](https://m8ven.ai/mcp/catcaptions/hermes-extension)
Shows verification status without the grade. Want the grade badge instead? Remove ?variant=verified from the URL.
commit: bfa4e673dce45c861c94af286fb32d18c43ad5ab
code hash: 6e1819eb00a20ae65acc1dea3a07712218686d7995a3ebcbb149815f1c3af147
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

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
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client