watchfor.io WebMCP audit

audited Sep 3, 2026in 40s
61/ 100100% of the applicable check weight evaluated

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

Shared experience100
Tool selection45
Tool quality78
Trust0
https://watchfor.io
Captured view of https://watchfor.io

Tools

0 read, 1 write, 6 undeclared
Loading map
get_site_overview: fail

get_site_overview

What WatchFor is and what can be done on this site — start here.No behaviour hints declared. Agents should treat it as possibly state-changing.
pagehttps://watchfor.io/
implementation
viaimperative
entry pointnavigator
registered after658ms
executepresent
api surfaceTakes no parameters.
annotations
read onlynot declared
untrusted contentnot declared
titlenot declared
4 findings
warningCanonical entry point
weight 3
Every tool registers through the deprecated navigator.modelContext alias; move them to document.modelContext before the alias is removed.
fix
// document.modelContext is the canonical entry point - the navigator.modelContext alias is deprecated.
document.modelContext.registerTool({ /* ... */ });
failAnnotations present
weight 5
3 of 3 read-shaped tools do not declare readOnlyHint: true, so an agent has to treat them as possible writes and ask before calling. (Declaring readOnlyHint: false earns nothing - it is the default.)
get_site_overview, search_docs, get_api_quickstart
fix
{
  name: "get_site_overview",
  // Declare readOnlyHint: true on tools that truly have no side effects -
  // that is the claim that lets an agent relax confirmation on reads.
  // (false is the default, so declaring it adds no information.)
  annotations: { readOnlyHint: true }
}
warningDescription quality
weight 5
4 of 7 tool descriptions leave an agent guessing: get_site_overview Does not say what comes back or what changes..
get_site_overview: weak; open_documentation: weak; open_free_tool: weak; run_free_website_audit: weak
fix
{
  name: "get_site_overview",
  description: "Describe what this tool does, when to use it, and what it returns."
}
warningInjection surface
weight 3
3 of 7 tools carry instruction-shaped text in their own metadata: get_site_overview Description instructs agent to 'start here'..
get_site_overview: Description instructs agent to 'start here'.; search_docs: Description instructs agent to 'follow up with open_documentation or direct navigation'.; get_api_quickstart: Description instructs agent to return 'the agent quickstart'.
fix
{
  name: "get_site_overview",
  // 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_site_overview",
  "description": "What WatchFor is and what can be done on this site — start here.",
  "inputSchema": {
    "type": "object",
    "properties": {}
  },
  "annotations": {}
}
Showing get_site_overview

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, and 1 declarative form doubles as visible counterparts.

Tool selection

45 / 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 1 of 3 canonical intents; on "Read that page to me." the tool it chose does not look like the kind of tool the intent needs. Nothing was executed, so this verifies selection, not outcomes.
toolopen_documentation
warningCoverage vs. site type
weight 7
The tool set covers 2 of the 3 things an agent needs on a docs site; it cannot navigate the documentation tree.

Tool quality

78 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 659ms of navigation. 1 further tool carried no measurable registration time.
toolget_api_quickstart
warningCanonical entry point
weight 3
Every tool registers through the deprecated navigator.modelContext alias; move them to document.modelContext before the alias is removed.
toolget_site_overview
fix
// document.modelContext is the canonical entry point - the navigator.modelContext alias is deprecated.
document.modelContext.registerTool({ /* ... */ });
passSchema validity
weight 4
All 6 declared input schemas are structurally valid object schemas.
warningSchema quality
weight 4
2 of 7 tool schemas are harder for an agent to use than they need to be: open_documentation 1 parameter has no description (topic).
toolopen_documentation
open_documentation: 1 parameter has no description (topic); open_free_tool: description is 1238 characters, over Chrome's 500-character guidance
fix
{
  name: "open_documentation",
  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: 4 names do not start with a verb (run_free_check).
toolrun_free_check
fix
{ name: "run_free_check" /* short, unique, verb-based */ }
passStub detection
weight 4
All 6 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
warningDescription quality
weight 5
4 of 7 tool descriptions leave an agent guessing: get_site_overview Does not say what comes back or what changes..
toolget_site_overview
get_site_overview: weak; open_documentation: weak; open_free_tool: weak; run_free_website_audit: weak
fix
{
  name: "get_site_overview",
  description: "Describe what this tool does, when to use it, and what it returns."
}

Trust

0 / 100 · weight 20
failAnnotations present
weight 5
3 of 3 read-shaped tools do not declare readOnlyHint: true, so an agent has to treat them as possible writes and ask before calling. (Declaring readOnlyHint: false earns nothing - it is the default.)
toolget_site_overview
get_site_overview, search_docs, get_api_quickstart
fix
{
  name: "get_site_overview",
  // Declare readOnlyHint: true on tools that truly have no side effects -
  // that is the claim that lets an agent relax confirmation on reads.
  // (false is the default, so declaring it adds no information.)
  annotations: { readOnlyHint: true }
}
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
3 of 7 tools carry instruction-shaped text in their own metadata: get_site_overview Description instructs agent to 'start here'..
toolget_site_overview
get_site_overview: Description instructs agent to 'start here'.; search_docs: Description instructs agent to 'follow up with open_documentation or direct navigation'.; get_api_quickstart: Description instructs agent to return 'the agent quickstart'.
fix
{
  name: "get_site_overview",
  // 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
Find the page that explains authentication.ok
chosesearch_docsexpected docs searchkind matched
arguments
{
  "query": "authentication"
}
Read that page to me.missed
choseopen_documentationexpected page readkind mismatch
The tool the model chose does not look like the kind of tool this intent needs.
arguments
{
  "topic": "authentication"
}
What other pages are in the same section?missed
choseopen_documentationexpected navigationkind mismatch
The tool the model chose does not look like the kind of tool this intent needs.
arguments
{
  "topic": "authentication"
}
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
7
invoked
not invoked; a live audit calls them
run time
40s
finished
Sep 3, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.