audited Sep 6, 2026in 16s
71/ 100100% of the applicable check weight evaluated

5 tools registered. Strongest in tool selection, weakest in trust.

Shared experience75
Tool selection100
Tool quality94
Trust0
https://microduck.muretai.com
Captured view of https://microduck.muretai.com

Tools

0 read, 0 write, 5 undeclared
Loading map
arena_look: warning

arena_look

Read the arena as numbers (no vision). Returns dohyo {shape:circle, radius now, radius0:0.62, shrink 0.06 m every 10s until someone falls (floor 0.04)}, you {x,z,yaw,r,margin,yaw_to_center,slot}, each duck, phase_left_s (live = seconds to next shrink), ranking, frame (world x,z; yaw=0 faces +X; drive is BODY). kick/roll/pick shove a body in front. Tab silent 35s in live = forfeit; lobby standing keeps the slot. If getTools() is empty, retry a few seconds.No behaviour hints declared. Agents should treat it as possibly state-changing.
pagehttps://microduck.muretai.com/
implementation
viaimperative
entry pointdocument
registered after1467ms
executepresent
api surfaceTakes no parameters.
annotations
read onlynot declared
untrusted contentnot declared
titlenot declared
2 findings
warningNaming quality
weight 2
Tool naming makes selection harder than it needs to be: 5 names do not start with a verb (arena_look).
fix
{ name: "arena_look" /* short, unique, verb-based */ }
warningInjection surface
weight 3
4 of 5 tools carry instruction-shaped text in their own metadata: arena_look The description instructs the agent to retry if getTools() is empty..
arena_look: The description instructs the agent to retry if getTools() is empty.; arena_take: The description instructs the agent not to call the tool during a live bout.; arena_drive: The description instructs the agent on how to use the tool effectively.; arena_leave: The description instructs the agent not to use the tool in a specific scenario and suggests an al...
fix
{
  name: "arena_look",
  // 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": "arena_look",
  "description": "Read the arena as numbers (no vision). Returns dohyo {shape:circle, radius now, radius0:0.62, shrink 0.06 m every 10s until someone falls (floor 0.04)}, you {x,z,yaw,r,margin,yaw_to_center,slot}, each duck, phase_left_s (live = seconds to next shrink), ranking, frame (world x,z; yaw=0 faces +X; drive is BODY). kick/roll/pick shove a body in front. Tab silent 35s in live = forfeit; lobby standing keeps the slot. If getTools() is empty, retry a few seconds.",
  "inputSchema": {
    "type": "object",
    "properties": {}
  },
  "annotations": {}
}
Showing arena_look

Findings

Shared experience

75 / 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.
warningPage experience
weight 16
2 of 4 page-experience marks came back short: usable The page is mostly black with a loading indicator, suggesting it's not fully functional yet..
usable: weak; clarity: weak
warningHuman parity
weight 8
The page the person sees came back short of the agent surface (2 of 4 page-experience marks came back short: usable The page is mostly black with a loading indicator, suggesting it...), so the two are not sharing an equal experience.
fix
// Make the tool's effect visible on the page the person is looking at:
// update the same UI your existing human flow uses when your_tool_name runs,
// so the person co-browsing sees what the agent just did.
execute: async (args, { signal }) => {
  const result = await performAction(args, signal);
  renderResultInPage(result); // the human-visible half of the same action
  return result;
}

Tool selection

100 / 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.
passTool selection
weight 12
An agent chose an existing, callable tool and built a schema-valid call for all 1 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 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

94 / 100 · weight 25
warningRegistration timing
weight 1
The slowest tool took 1467ms to register, past the 1000ms an agent reading the registry at first paint would wait for.
toolarena_leave
arena_leave: registered at 1467ms
fix
// Register tools as soon as they're ready, not behind a deferred/async chunk.
document.modelContext.registerTool({ /* ... */ });
passCanonical entry point
weight 3
All 5 tools register on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 5 declared input schemas are structurally valid object schemas.
passSchema quality
weight 4
All 3 of 5 tool schemas that declare parameters describe them (the other 2 declare no parameters), and every description stays within Chrome's size guidance.
warningNaming quality
weight 2
Tool naming makes selection harder than it needs to be: 5 names do not start with a verb (arena_look).
toolarena_look
fix
{ name: "arena_look" /* short, unique, verb-based */ }
passStub detection
weight 4
All 5 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
passDescription quality
weight 5
All 5 rated tool descriptions say what the tool does, when to use it, and what it returns.

Trust

0 / 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.
not applicableAnnotation mismatch
weight 5
No tool declares a readOnlyHint, so there is no safety claim to contradict.
not applicableUntrusted content hint
weight 3
No tool's contract suggests it returns text written by somebody other than the site, so there is nothing to flag as untrusted.
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
4 of 5 tools carry instruction-shaped text in their own metadata: arena_look The description instructs the agent to retry if getTools() is empty..
toolarena_look
arena_look: The description instructs the agent to retry if getTools() is empty.; arena_take: The description instructs the agent not to call the tool during a live bout.; arena_drive: The description instructs the agent on how to use the tool effectively.; arena_leave: The description instructs the agent not to use the tool in a specific scenario and suggests an al...
fix
{
  name: "arena_look",
  // 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

100% across 1 intents
I want to arena look on this site.ok
chosearena_lookexpected arena lookkind 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
native modelContext
chrome
151.0.7922.34
capture shim
v3
spec snapshot
2026-08-26
mode
fast
pages
1 - entry page only
tools
5
invoked
not invoked; a live audit calls them
run time
16s
finished
Sep 6, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.