mermail.app WebMCP audit

audited Sep 2, 2026in 14s
94/ 100100% of the applicable check weight evaluated

3 tools registered. Strongest in shared experience, weakest in trust.

Shared experience100
Task completion100
Tool quality90
Trust83
https://mermail.app
Captured view of https://mermail.app

Tools

3 read, 0 write
Loading map
get_status: warning

get_status

Read the public Mermail service health status.Answers a question. Declared read only.
pagehttps://mermail.app/
implementation
viaimperative
entry pointprovideContext
registered after746ms
executepresent
api surfaceTakes no parameters.
annotations
read onlytrue
untrusted contentnot declared
titlenot declared
1 finding
warningDescription quality
weight 5
3 of 3 tool descriptions leave an agent guessing: get_status Omits what comes back, and what it changes..
get_status: weak; get_pricing: weak; start_signup: weak
fix
{
  name: "get_status",
  description: "Describe what this tool does, when to use it, and what it returns."
}
tool json
{
  "name": "get_status",
  "description": "Read the public Mermail service health status.",
  "inputSchema": {
    "type": "object",
    "properties": {},
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": true
  }
}
Showing get_status

Findings

Shared experience

100 / 100 · weight 30
passPage experience
weight 20
The page a person sees holds up next to the agent surface: a working interface, visible actions, readable content, nothing in the way.
passHuman parity
weight 10
The person co-browsing can see and use this page - the same page the agent's tools act on.

Task completion

100 / 100 · weight 25
passTool selection
weight 15
An agent chose an existing, callable tool and built a schema-valid call for all 2 canonical intents, each matching the kind of tool its intent needs. Nothing was executed, so this verifies selection, not outcomes.
not applicableCoverage vs. site type
weight 10
This tool set does not place the site in a category with a known expected tool shape, so there is no coverage baseline to score it against.

Tool quality

90 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 746ms of navigation.
toolget_pricing
passCanonical entry point
weight 3
All 3 tools register on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 3 declared input schemas are structurally valid object schemas.
passSchema quality
weight 4
3 tools declare no parameters, and every description stays within Chrome's size guidance.
passNaming quality
weight 2
All 3 tool names are consistent, verb-led, and within Chrome's size guidance.
passStub detection
weight 4
All 3 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
warningDescription quality
weight 5
3 of 3 tool descriptions leave an agent guessing: get_status Omits what comes back, and what it changes..
toolget_status
get_status: weak; get_pricing: weak; start_signup: weak
fix
{
  name: "get_status",
  description: "Describe what this tool does, when to use it, and what it returns."
}

Trust

83 / 100 · weight 20
passAnnotations present
weight 6
All 2 read-shaped tools declare readOnlyHint: true - the one declared claim that lets an agent treat a call as safe to make without asking.
warningAnnotation mismatch
weight 6
1 tool declares readOnlyHint: true although the name says the call writes (start_signup).
toolstart_signup
start_signup: readOnlyHint=true
fix
// readOnlyHint must match what the tool actually does - drop it (or set false) on a tool that writes.
{ name: "start_signup", annotations: { readOnlyHint: false } }
not applicableUntrusted content hint
weight 4
No tool's contract suggests it returns text written by somebody other than the site, so there is nothing to flag as untrusted.
not applicableInjection surface
weight 4
No tool's metadata carries instruction-shaped text aimed at the agent reading it. This check only ever flags; it never credits a site.

Tool selection

100% across 2 intents
I want to get status on this site.ok
choseget_statusexpected get statuskind matched
arguments
{}
I want to start signup on this site.ok
chosestart_signupexpected start signupkind matched
arguments
{}
model: gemini-2.5-flash

Add the tools this site is missing

Our scanner reads your website and suggests the right WebMCP tools for it.
Reads the site's public pages; takes a few seconds.
The open source webmcp plugin teaches your coding agent to audit a site, implement tools on document.modelContext, and verify them in a real browser. npx @ora-ai/webmcp-verify runs the verification on its own. No signup, no hosted service.
how this was captured
observed via
capture shim (Chromium 148.0.7778.96)
chrome
148.0.7778.96
capture shim
v2
spec snapshot
2026-08-26
mode
fast
pages
1 - entry page only
tools
3
run time
14s
finished
Sep 2, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.