seopress.org WebMCP audit

audited Nov 10, 2026in 16s
72/ 100100% of the applicable check weight evaluated

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

Shared experience87
Tool selection100
Tool quality83
Trust0
https://seopress.org
Captured view of https://seopress.org

Tools

0 read, 0 write, 2 undeclared
Loading map
search_site: fail

search_site

Full-text search of SEOPress.No behaviour hints declared. Agents should treat it as possibly state-changing.
pagehttps://www.seopress.org/
implementation
viaimperative
entry pointprovideContext
registered after491ms
executepresent
api surface
queryrequired
annotations
read onlynot declared
untrusted contentnot declared
titlenot declared
3 findings
failCanonical entry point
weight 3
Every tool uses the removed provideContext API; register each tool with document.modelContext.registerTool().
fix
// document.modelContext is the canonical entry point - the navigator.modelContext alias is deprecated.
document.modelContext.registerTool({ /* ... */ });
failAnnotations present
weight 4
2 of 2 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.)
search_site, fetch_as_markdown
fix
{
  name: "search_site",
  // 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
1 of 2 tool descriptions leave an agent guessing: search_site Does not say what comes back from the search..
search_site: weak
fix
{
  name: "search_site",
  description: "Describe what this tool does, when to use it, and what it returns."
}
tool json
{
  "name": "search_site",
  "description": "Full-text search of SEOPress.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "The search query."
      }
    },
    "required": [
      "query"
    ]
  },
  "annotations": {}
}
Showing search_site

Findings

Shared experience

87 / 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 and not consequentialHint: true.
passPage experience
weight 16
1 of 4 page-experience marks came back short: obstruction A cookie consent banner partially covers the main content of the page..
obstruction: weak
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

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 and not consequentialHint: true.
passTool selection
weight 12
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 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

83 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 491ms of navigation.
toolfetch_as_markdown
failCanonical entry point
weight 3
Every tool uses the removed provideContext API; register each tool with document.modelContext.registerTool().
toolsearch_site
fix
// document.modelContext is the canonical entry point - the navigator.modelContext alias is deprecated.
document.modelContext.registerTool({ /* ... */ });
passSchema validity
weight 4
All 2 declared input schemas are structurally valid object schemas.
passSchema quality
weight 4
All 2 tool schemas describe their parameters, and every description stays within Chrome's size guidance.
passNaming quality
weight 2
All 2 tool names are consistent, verb-led, and within Chrome's size guidance.
passStub detection
weight 4
All 2 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
warningDescription quality
weight 5
1 of 2 tool descriptions leave an agent guessing: search_site Does not say what comes back from the search..
toolsearch_site
search_site: weak
fix
{
  name: "search_site",
  description: "Describe what this tool does, when to use it, and what it returns."
}

Trust

0 / 100 · weight 20
failAnnotations present
weight 4
2 of 2 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.)
toolsearch_site
search_site, fetch_as_markdown
fix
{
  name: "search_site",
  // 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 4
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 applicableConsequential hint
weight 3
No tool name reads like a consequential action (a purchase, a booking, a payment, a transfer, a deletion), so there is no consequentialHint to expect.
not applicableHint vs. observed
weight 3
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 and not consequentialHint: true.
not applicableInjection surface
weight 3
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 search site on this site.ok
chosesearch_siteexpected search sitekind matched
arguments
{
  "query": "site"
}
I want to fetch as markdown on this site.ok
chosefetch_as_markdownexpected fetch as markdownkind matched
arguments
{
  "url": "https://www.seopress.org/"
}
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-11-10
mode
fast
pages
1 - entry page only
tools
2
invoked
not invoked; a live audit calls them
run time
16s
finished
Nov 10, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.