audited Sep 1, 2026in 9s
43/ 100100% of the applicable check weight evaluated

10 tools registered. Strongest in tool quality, weakest in trust.

Shared experience25
Task completion50
Tool quality91
Trust0
https://michaelvereb.com
Captured view of https://michaelvereb.com

Tools

0 read, 0 write, 10 undeclared
Loading map
search_portfolio: fail

search_portfolio

Searches portfolio projects, client case studies, and engineering work by company name or topic and returns matching records with summaries and live URLs.No behaviour hints declared. Agents should treat it as possibly state-changing.
pagehttps://www.michaelvereb.com/
implementation
viaimperative
entry pointdocument
registered after849ms
executepresent
api surface
queryrequired
annotations
read onlynot declared
untrusted contentnot declared
titlenot declared
1 finding
failAnnotations present
weight 6
7 of 7 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_portfolio, get_portfolio_works, get_case_study, get_services_and_pricing, get_testimonials
fix
{
  name: "search_portfolio",
  // 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 }
}
tool json
{
  "name": "search_portfolio",
  "description": "Searches portfolio projects, client case studies, and engineering work by company name or topic and returns matching records with summaries and live URLs.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Company name, client name, or project keyword to search (e.g., Arbor, Morgenlevering, JobQualified, Northwind)."
      }
    },
    "required": [
      "query"
    ]
  },
  "annotations": {}
}
Showing search_portfolio

Findings

Shared experience

25 / 100 · weight 30
warningPage experience
weight 20
3 of 4 page-experience marks came back short: usable The page is completely blank, indicating a non-working interface or an error..
usable: poor; clarity: poor; readability: poor
warningHuman parity
weight 10
The page the person sees came back short of the agent surface (3 of 4 page-experience marks came back short: usable The page is completely blank, indicating a non-working interface...), 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;
}

Task completion

50 / 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 "Show me everything on that record." no tool on the page served it. Nothing was executed, so this verifies selection, not outcomes.
warningCoverage vs. site type
weight 10
The tool set covers 3 of the 4 things an agent needs on a saas site; it cannot update or move an existing record.

Tool quality

91 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 884ms of navigation.
toolscan_images_c2pa
passCanonical entry point
weight 3
All 10 tools register on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 10 declared input schemas are structurally valid object schemas.
passSchema quality
weight 4
All 9 of 10 tool schemas that declare parameters describe them (the other 1 declares 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: 2 names do not start with a verb (scan_images_c2pa).
toolscan_images_c2pa
fix
{ name: "scan_images_c2pa" /* short, unique, verb-based */ }
passStub detection
weight 4
All 10 tools declare an execute handler.
failRegistration errors
weight 2
8 tool registrations threw during the capture, so the registry an agent reads is incomplete.
duplicate tool name registered: search_portfolio
fix
document.modelContext.registerTool({ /* ... */ }).catch(function (err) {
  console.error("WebMCP registration failed", err);
});
passDescription quality
weight 5
All 10 rated tool descriptions say what the tool does, when to use it, and what it returns.

Trust

0 / 100 · weight 20
failAnnotations present
weight 6
7 of 7 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_portfolio
search_portfolio, get_portfolio_works, get_case_study, get_services_and_pricing, get_testimonials
fix
{
  name: "search_portfolio",
  // 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 6
No tool declares a readOnlyHint, so there is no safety claim to contradict.
warningUntrusted content hint
weight 4
3 of 3 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.
toolcreate_contact_message
create_contact_message: message, email; get_testimonials: review, author; get_contact_info: profile, email
fix
{ name: "create_contact_message", annotations: { untrustedContentHint: true } }
warningInjection surface
weight 4
2 of 10 tools carry instruction-shaped text in their own metadata: scan_images_c2pa Description instructs agent to use tool and notes about verification..
toolscan_images_c2pa
scan_images_c2pa: Description instructs agent to use tool and notes about verification.; inspect_image_c2pa: Description instructs agent on parameter use and notes about verification.
fix
{
  name: "scan_images_c2pa",
  // 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 record for a company called Northwind.ok
chosesearch_portfolioexpected record searchkind matched
arguments
{
  "query": "Northwind"
}
Show me everything on that record.missed
choseno toolexpected record detailkind not applicable
No tool was picked for this intent.
arguments
{}
Create a new contact called Dana Reeve.missed
choseno toolexpected record createkind 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 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
10
run time
9s
finished
Sep 1, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.