lab.houbi.ch WebMCP audit

audited Oct 27, 2026in 8s
65/ 100Incomplete audit · 56% of the applicable check weight evaluated

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

Shared experience50
Tool selection25
Tool quality97
Trust98
https://lab.houbi.ch
Captured view of https://lab.houbi.ch

Tools

27 read, 0 write
Loading map
check_ai_crawler_access: warning

check_ai_crawler_access

Return a read-only RFC 9309 robots.txt access report for AI and search crawlers. Accepts robots.txt text or a public robots.txt URL plus an optional path. Includes merged matching groups, octet-normalized longest-match decisions, per-crawler evidence, transport status, crawler-registry provenance and policy snippets.Answers a question. Declared read only.
pagehttps://lab.houbi.ch/
implementation
viaimperative
entry pointdocument
registered after199ms
executepresent
api surface
contentoptional
crawlersoptional
pathoptional
urloptional
annotations
read onlytrue
untrusted contenttrue
titleAI Crawler robots.txt Checker
1 finding
warningHuman parity
weight 8
27 tools run through the JavaScript API and the page itself was not graded on this run, so parity could not be confirmed. A visible effect in your existing UI when a tool runs closes the gap.
check_ai_crawler_access, validate_llms_txt, validate_a2a_agent_card, validate_webmcp_tool, check_mx_records
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 check_ai_crawler_access 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 json
{
  "name": "check_ai_crawler_access",
  "description": "Return a read-only RFC 9309 robots.txt access report for AI and search crawlers. Accepts robots.txt text or a public robots.txt URL plus an optional path. Includes merged matching groups, octet-normalized longest-match decisions, per-crawler evidence, transport status, crawler-registry provenance and policy snippets.",
  "inputSchema": {
    "additionalProperties": false,
    "anyOf": [
      {
        "required": [
          "url"
        ]
      },
      {
        "required": [
          "content"
        ]
      }
    ],
    "properties": {
      "content": {
        "description": "Pasted robots.txt content to validate locally, e.g. 'User-agent: GPTBot'.",
        "type": "string"
      },
      "crawlers": {
        "description": "Crawler tokens to evaluate as an array, e.g. ['GPTBot','Google-Extended'].",
        "items": {
          "type": "string"
        },
        "type": "array"
      },
      "path": {
        "description": "Path to evaluate against robots.txt rules, e.g. '/' or '/tools/'.",
        "type": "string"
      },
      "url": {
        "description": "Robots.txt URL or bare domain to fetch, e.g. 'https://example.com/robots.txt'.",
        "format": "uri",
        "type": "string"
      }
    },
    "required": [],
    "type": "object"
  },
  "annotations": {
    "readOnlyHint": true,
    "untrustedContentHint": true
  }
}
Showing check_ai_crawler_access

Findings

Shared experience

50 / 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.
not measuredPage experience
weight 16
The page-experience model hop returned no usable result, so the page was not graded.
warningHuman parity
weight 8
27 tools run through the JavaScript API and the page itself was not graded on this run, so parity could not be confirmed. A visible effect in your existing UI when a tool runs closes the gap.
toolcheck_ai_crawler_access
check_ai_crawler_access, validate_llms_txt, validate_a2a_agent_card, validate_webmcp_tool, check_mx_records
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 check_ai_crawler_access 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

25 / 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.
not measuredTool selection
weight 12
The tool-selection model hop returned no usable result.
failCoverage vs. site type
weight 7
The tool set covers 1 of the 4 things an agent needs on a saas site; it cannot search or browse the catalog or create a record or start a job or update or move an existing record.

Tool quality

97 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 201ms of navigation.
tooldecode_edid_data
passCanonical entry point
weight 3
All 27 tools register on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 27 declared input schemas are structurally valid object schemas.
warningSchema quality
weight 4
3 of 27 tool schemas are harder for an agent to use than they need to be: validate_llms_txt 1 parameter description is over Chrome's 150-character guidance.
toolvalidate_llms_txt
validate_llms_txt: 1 parameter description is over Chrome's 150-character guidance; validate_webmcp_tool: 1 parameter description is over Chrome's 150-character guidance; check_dns_records: 2 paramete
fix
{
  name: "validate_llms_txt",
  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: 2 names do not start with a verb (decode_ssl_certificate).
tooldecode_ssl_certificate
fix
{ name: "decode_ssl_certificate" /* short, unique, verb-based */ }
passStub detection
weight 4
All 27 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
not measuredDescription quality
weight 5
The description-quality model hop returned no usable result, so descriptions were not rated.

Trust

98 / 100 · weight 20
passAnnotations present
weight 4
All 24 read-shaped tools declare readOnlyHint: true - the one declared claim that lets an agent treat a call as safe to make without asking.
warningAnnotation mismatch
weight 4
1 tool declares readOnlyHint: true although the name says the call writes (generate_tlsa_record).
toolgenerate_tlsa_record
generate_tlsa_record: readOnlyHint=true
fix
// readOnlyHint must match what the tool actually does - drop it (or set false) on a tool that writes,
// and never pair readOnlyHint: true with consequentialHint: true. If the write is significant or
// hard to undo (a purchase, a booking, a payment), declare consequentialHint: true so the agent
// confirms with the person first.
{ name: "generate_tlsa_record", annotations: { readOnlyHint: false } }
passUntrusted content hint
weight 3
All 1 tool that looks like it returns third-party text declares untrustedContentHint.
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 measuredInjection surface
weight 3
The injection-surface model hop returned no usable result, so tool contracts were not reviewed for injection surface.

Tool selection

The tool-selection model hop returned no usable result.

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-10-16
mode
fast
pages
1 - entry page only
tools
27
invoked
not invoked; a live audit calls them
run time
8s
finished
Oct 27, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.