audited Aug 31, 2026in 20s
81/ 100100% of the applicable check weight evaluated

20 tools registered. Strongest in shared experience, weakest in task completion.

Shared experience100
Task completion60
Tool quality83
Trust75
https://bullet-heaven.ahraz.me
Captured view of https://bullet-heaven.ahraz.me

Tools

4 read, 16 write
Loading map
get_maker_state: warning

get_maker_state

Returns { project, playtest }: the versioned project document and the current playtest session. Read it when you start work, when you need wave, emitter or pattern ids you do not already have, and again if the person may have edited since your last call, because human and agent edits share one live document. You do not need to call it before or after a mutating tool: each one returns the state it changed.Answers a question. Declared read only.
pagehttps://bullet-heaven.ahraz.me/
implementation
viaimperative
entry pointdocument
registered after196ms
executepresent
api surfaceTakes no parameters.
annotations
read onlytrue
untrusted contentnot declared
titlenot declared
1 finding
warningInjection surface
weight 4
14 of 20 tools carry instruction-shaped text in their own metadata: get_maker_state Description instructs when to call and when not to call the tool.
get_maker_state: Description instructs when to call and when not to call the tool; update_arena: Description instructs to call another tool before reporting or editing; update_player: Description instructs to call another tool before reporting or editing; open_editor: Description instructs when to call and what to check before calling
fix
{
  name: "get_maker_state",
  // 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": "get_maker_state",
  "description": "Returns { project, playtest }: the versioned project document and the current playtest session. Read it when you start work, when you need wave, emitter or pattern ids you do not already have, and again if the person may have edited since your last call, because human and agent edits share one live document. You do not need to call it before or after a mutating tool: each one returns the state it changed.",
  "inputSchema": {
    "type": "object",
    "properties": {},
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": true
  }
}
Showing get_maker_state

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

60 / 100 · weight 25
failTool selection
weight 15
An agent chose an existing tool and built a schema-valid call that held up on 1 of 3 canonical intents; on "Open the document I was working on most recently." no tool on the page served it. Nothing was executed, so this verifies selection, not outcomes.
passCoverage vs. site type
weight 10
The tool set covers the whole core editor flow: open or read a document, edit or write content, save, publish, or share the result.

Tool quality

83 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 197ms of navigation.
tooledit_firing_pattern
passCanonical entry point
weight 3
All 20 tools register on the canonical document.modelContext entry point.
warningSchema validity
weight 4
1 of 20 declared input schemas cannot be read by an agent: apply_encounter input schema nests deeper than 6 levels at inputSchema.waves.items[0].emitters.items[0].patterns.items[0].name.
toolapply_encounter
apply_encounter: input schema nests deeper than 6 levels at inputSchema.waves.items[0].emitters.items[0].patterns.items[0].name
fix
{
  name: "apply_encounter",
  inputSchema: { type: "object", properties: { /* ... */ }, required: [] }
}
warningSchema quality
weight 4
18 of 20 tool schemas are harder for an agent to use than they need to be: evaluate_encounter description is 1896 characters, over Chrome's 500-character guidance.
toolevaluate_encounter
evaluate_encounter: description is 1896 characters, over Chrome's 500-character guidance; evaluate_encounter: 1 parameter description is over Chrome's 150-character guidance; update_arena: description
fix
{
  name: "evaluate_encounter",
  inputSchema: {
    type: "object",
    properties: {
      query: { type: "string", description: "What to search for" }
    },
    required: ["query"]
  }
}
warningNaming quality
weight 2
Tool naming makes selection harder than it needs to be: 7 names do not start with a verb (evaluate_encounter).
toolevaluate_encounter
fix
{ name: "evaluate_encounter" /* short, unique, verb-based */ }
passStub detection
weight 4
All 20 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
passDescription quality
weight 5
All 20 rated tool descriptions say what the tool does, when to use it, and what it returns.

Trust

75 / 100 · weight 20
passAnnotations present
weight 6
All 4 read-shaped tools declare readOnlyHint: true - the one declared claim that lets an agent treat a call as safe to make without asking.
passAnnotation mismatch
weight 6
No tool claims to be read-only while its own name or description says it writes (20 declared hints checked).
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.
warningInjection surface
weight 4
14 of 20 tools carry instruction-shaped text in their own metadata: get_maker_state Description instructs when to call and when not to call the tool.
toolget_maker_state
get_maker_state: Description instructs when to call and when not to call the tool; update_arena: Description instructs to call another tool before reporting or editing; update_player: Description instructs to call another tool before reporting or editing; open_editor: Description instructs when to call and what to check before calling
fix
{
  name: "get_maker_state",
  // 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

33% across 3 intents
Open the document I was working on most recently.missed
choseno toolexpected document openkind not applicable
No tool was picked for this intent.
arguments
{}
Add a short summary paragraph at the top.missed
choseno toolexpected content editkind not applicable
No tool was picked for this intent.
arguments
{}
Save it and give me a link I can share.ok
chosesave_projectexpected save or sharekind 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
v1
spec snapshot
2026-08-26
mode
fast
pages
1 - entry page only
tools
20
run time
20s
finished
Aug 31, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.