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

One tool registered. Strongest in shared experience, weakest in tool selection.

Shared experience100
Tool selection0
Tool quality96
Trust45
https://miriamschwab.me
Captured view of https://miriamschwab.me

Tools

0 read, 1 write
Loading map
contact_miriam_schwab: warning

contact_miriam_schwab

Send a message to Miriam Schwab. It arrives in her personal inbox and a human reads it. This cannot be unsent — confirm the exact wording with the user before calling. If the contact form is visible on the page, use prepare_contact_message instead and let the user press send.Takes an action on the site.
pagehttps://miriamschwab.me/
implementation
viaimperative
entry pointdocument
registered after284ms
executepresent
api surface
namerequired
emailrequired
subjectoptional
messagerequired
agentoptional
annotations
read onlyfalse
untrusted contentnot declared
titlenot declared
destructive (MCP-only)false
idempotent (MCP-only)false
open world (MCP-only)true
4 findings
passRegistration timing
weight 1
Every measured tool registered within 284ms of navigation.
warningNaming quality
weight 2
Tool naming makes selection harder than it needs to be: 1 name does not start with a verb (contact_miriam_schwab).
fix
{ name: "contact_miriam_schwab" /* short, unique, verb-based */ }
warningUntrusted content hint
weight 3
1 of 1 tools look like they return text written by other people but declare no untrustedContentHint, so an agent will treat the response as the site speaking.
contact_miriam_schwab: message, user
fix
{ name: "contact_miriam_schwab", annotations: { untrustedContentHint: true } }
warningInjection surface
weight 3
1 of 1 tools carry instruction-shaped text in their own metadata: contact_miriam_schwab description instructs agent how to behave and which tool to prefer.
contact_miriam_schwab: description instructs agent how to behave and which tool to prefer
fix
{
  name: "contact_miriam_schwab",
  // Metadata DESCRIBES the tool - it never addresses the agent reading it.
  // Rewrite any name, description, title, or schema field description that
  // instructs the agent (which tool to prefer, what to output, rules to
  // ignore) so it states what the tool does and what it returns instead.
  description: "Searches the catalog and returns matching items with prices."
}
tool json
{
  "name": "contact_miriam_schwab",
  "description": "Send a message to Miriam Schwab. It arrives in her personal inbox and a human reads it. This cannot be unsent — confirm the exact wording with the user before calling. If the contact form is visible on the page, use prepare_contact_message instead and let the user press send.",
  "inputSchema": {
    "type": "object",
    "required": [
      "name",
      "email",
      "message"
    ],
    "properties": {
      "name": {
        "type": "string",
        "description": "Name of the person the message is from — not your name as an agent."
      },
      "email": {
        "type": "string",
        "description": "A real reply-to address for that person. Replies go here."
      },
      "subject": {
        "type": "string",
        "description": "Short subject line, e.g. \"speaking invite\"."
      },
      "message": {
        "type": "string",
        "description": "The message body, in plain text."
      },
      "agent": {
        "type": "string",
        "description": "Optional. Identify yourself, e.g. \"Claude\"."
      }
    }
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": false,
    "openWorldHint": true
  }
}
Showing contact_miriam_schwab

Findings

Shared experience

100 / 100 · weight 30
not applicableVisible effect
weight 6
Not invoked on this run: this audit did not call any tool. Scheduled re-audits only read the registry; a live audit from the report page calls the tools that declare readOnlyHint: true.
passPage experience
weight 16
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 8
The person co-browsing can see and use this page - the same page the agent's tools act on.

Tool selection

0 / 100 · weight 25
not applicableInvoke success rate
weight 6
Not invoked on this run: this audit did not call any tool. Scheduled re-audits only read the registry; a live audit from the report page calls the tools that declare readOnlyHint: true.
failTool selection
weight 12
An agent chose an existing tool and built a schema-valid call that held up on 0 of 1 canonical intents; on "I want to contact miriam schwab on this site." no tool on the page served it. Nothing was executed, so this verifies selection, not outcomes.
not applicableCoverage vs. site type
weight 7
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

96 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 284ms of navigation.
toolcontact_miriam_schwab
passCanonical entry point
weight 3
The one registered tool registers on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 1 declared input schema is a structurally valid object schema.
passSchema quality
weight 4
All 1 tool schema describe their parameters, and every description stays within Chrome's size guidance.
warningNaming quality
weight 2
Tool naming makes selection harder than it needs to be: 1 name does not start with a verb (contact_miriam_schwab).
toolcontact_miriam_schwab
fix
{ name: "contact_miriam_schwab" /* short, unique, verb-based */ }
passStub detection
weight 4
The one registered tool declares an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
passDescription quality
weight 5
All 1 rated tool descriptions say what the tool does, when to use it, and what it returns.

Trust

45 / 100 · weight 20
not applicableAnnotations present
weight 5
No tool name reads like a read, and an absent readOnlyHint already defaults to "this may write" - the one hint worth declaring here is readOnlyHint: true on read tools, and this set has none to declare it on.
passAnnotation mismatch
weight 5
No tool claims to be read-only while its own name or description says it writes (1 declared hint checked).
warningUntrusted content hint
weight 3
1 of 1 tools look like they return text written by other people but declare no untrustedContentHint, so an agent will treat the response as the site speaking.
toolcontact_miriam_schwab
contact_miriam_schwab: message, user
fix
{ name: "contact_miriam_schwab", annotations: { untrustedContentHint: true } }
not applicableHint vs. observed
weight 4
Not invoked on this run: this audit did not call any tool. Scheduled re-audits only read the registry; a live audit from the report page calls the tools that declare readOnlyHint: true.
warningInjection surface
weight 3
1 of 1 tools carry instruction-shaped text in their own metadata: contact_miriam_schwab description instructs agent how to behave and which tool to prefer.
toolcontact_miriam_schwab
contact_miriam_schwab: description instructs agent how to behave and which tool to prefer
fix
{
  name: "contact_miriam_schwab",
  // Metadata DESCRIBES the tool - it never addresses the agent reading it.
  // Rewrite any name, description, title, or schema field description that
  // instructs the agent (which tool to prefer, what to output, rules to
  // ignore) so it states what the tool does and what it returns instead.
  description: "Searches the catalog and returns matching items with prices."
}

Tool selection

0% across 1 intents
I want to contact miriam schwab on this site.missed
choseno toolexpected contact miriam schwabkind not applicable
No tool was picked for this intent.
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 151.0.7922.34)
chrome
151.0.7922.34
capture shim
v3
spec snapshot
2026-08-26
mode
fast
pages
1 - entry page only
tools
1
invoked
not invoked; a live audit calls them
run time
12s
finished
Sep 14, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.