judt.ai WebMCP audit

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

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

Shared experience100
Tool selection100
Tool quality98
Trust23
https://judt.ai
Captured view of https://judt.ai

Tools

0 read, 0 write, 4 undeclared
Loading map
sign_up: warning

sign_up

Starts a Judt account for a person. Judt emails them a sign-up link and a 6-digit code. The account exists only once the owner of the address follows the link, or gives you the code to pass to verify_code, which also signs in this browser. If the address already has an account, the email logs them in instead. The answer is the same either way.No behaviour hints declared. Agents should treat it as possibly state-changing.
pagehttps://judt.ai/
implementation
viaimperative
entry pointdocument
registered after562ms
executepresent
api surface
namerequired
emailrequired
annotations
read onlynot declared
untrusted contentnot declared
titleSign up
consequentialtrue
1 finding
warningNaming quality
weight 2
Tool naming makes selection harder than it needs to be: 2 names do not start with a verb (sign_up).
fix
{ name: "sign_up" /* short, unique, verb-based */ }
tool json
{
  "name": "sign_up",
  "description": "Starts a Judt account for a person. Judt emails them a sign-up link and a 6-digit code. The account exists only once the owner of the address follows the link, or gives you the code to pass to verify_code, which also signs in this browser. If the address already has an account, the email logs them in instead. The answer is the same either way.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "name": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200,
        "description": "The person's name, for the new account."
      },
      "email": {
        "type": "string",
        "format": "email",
        "maxLength": 320,
        "description": "The person's email address."
      }
    },
    "required": [
      "name",
      "email"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "consequentialHint": true
  }
}
Showing sign_up

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 and not consequentialHint: 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.

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 3 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

98 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 562ms of navigation.
toolverify_code
passCanonical entry point
weight 3
All 4 tools register on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 4 declared input schemas are structurally valid object schemas.
passSchema quality
weight 4
All 4 tool schemas describe their 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 (sign_up).
toolsign_up
fix
{ name: "sign_up" /* short, unique, verb-based */ }
passStub detection
weight 4
All 4 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
passDescription quality
weight 5
All 4 rated tool descriptions say what the tool does, when to use it, and what it returns.

Trust

23 / 100 · weight 20
failAnnotations present
weight 4
1 of 1 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.)
toolverify_code
verify_code
fix
{
  name: "verify_code",
  // 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.
warningUntrusted content hint
weight 3
1 of 1 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.
toolsend_message
send_message: message, replie, email
fix
{ name: "send_message", annotations: { untrustedContentHint: true } }
passConsequential hint
weight 3
All 1 tool whose name reads like a consequential action declares consequentialHint: true, so an agent can confirm with the person before running them.
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.
warningInjection surface
weight 3
2 of 4 tools carry instruction-shaped text in their own metadata: verify_code description instructs agent how to behave and what to do next.
toolverify_code
verify_code: description instructs agent how to behave and what to do next; send_message: description instructs agent how to behave and what to output
fix
{
  name: "verify_code",
  // 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

100% across 3 intents
I want to sign up on this site.ok
chosesign_upexpected sign upkind matched
arguments
{
  "name": "John Doe",
  "email": "john.doe@example.com"
}
I want to log in on this site.ok
choselog_inexpected log inkind matched
arguments
{
  "email": "john.doe@example.com"
}
I want to verify code on this site.ok
choseverify_codeexpected verify codekind matched
arguments
{
  "email": "john.doe@example.com",
  "code": "123456"
}
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
4
invoked
not invoked; a live audit calls them
run time
11s
finished
Nov 10, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.