clerk.com WebMCP audit

audited Oct 21, 2026in 11s
76/ 100Incomplete audit · 54% of the applicable check weight evaluated

One tool registered. Strongest in trust, weakest in shared experience.

Shared experience50
Tool selection66
Tool quality97
Trust100
https://clerk.com
Captured view of https://clerk.com

Tools

1 read, 0 write
Loading map
search_docs: warning

search_docs

Search the Clerk documentation. Returns the best-matching pages and sections, each with a title, heading, snippet, and URL.Answers a question. Declared read only.
pagehttps://clerk.com/
implementation
viaimperative
entry pointdocument
registered after1077ms
executepresent
api surface
queryrequired
sdkoptional
annotations
read onlytrue
untrusted contentnot declared
titlenot declared
2 findings
warningRegistration timing
weight 1
The slowest tool took 1077ms to register, past the 1000ms an agent reading the registry at first paint would wait for.
search_docs: registered at 1077ms
fix
// Register tools as soon as they're ready, not behind a deferred/async chunk.
document.modelContext.registerTool({ /* ... */ });
warningHuman parity
weight 8
1 tool runs 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.
search_docs
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 search_docs 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": "search_docs",
  "description": "Search the Clerk documentation. Returns the best-matching pages and sections, each with a title, heading, snippet, and URL.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "What to search for, e.g. \"protect a route\" or \"useUser\"."
      },
      "sdk": {
        "type": "string",
        "enum": [
          "nextjs",
          "react",
          "expo",
          "tanstack-react-start",
          "react-router",
          "expressjs",
          "android",
          "astro",
          "chrome-extension",
          "electron",
          "fastify",
          "go",
          "ios",
          "js-frontend",
          "nuxt",
          "ruby",
          "vue"
        ],
        "description": "Ranks this SDK's pages first and links to its variant of each page. Defaults to the SDK the user selected in the docs."
      }
    },
    "required": [
      "query"
    ]
  },
  "annotations": {
    "readOnlyHint": true
  }
}
Showing search_docs

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
1 tool runs 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.
toolsearch_docs
search_docs
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 search_docs 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

66 / 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.
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

97 / 100 · weight 25
warningRegistration timing
weight 1
The slowest tool took 1077ms to register, past the 1000ms an agent reading the registry at first paint would wait for.
toolsearch_docs
search_docs: registered at 1077ms
fix
// Register tools as soon as they're ready, not behind a deferred/async chunk.
document.modelContext.registerTool({ /* ... */ });
passCanonical entry point
weight 3
The one registered tool registers on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 1 declared input schema is a structurally valid object schema.
passSchema quality
weight 4
All 1 tool schema describe their parameters, and every description stays within Chrome's size guidance.
passNaming quality
weight 2
All 1 tool name is consistent, verb-led, and within Chrome's size guidance.
passStub detection
weight 4
The one registered tool declares 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

100 / 100 · weight 20
passAnnotations present
weight 4
All 1 read-shaped tool declares readOnlyHint: true - the one declared claim that lets an agent treat a call as safe to make without asking.
passAnnotation mismatch
weight 4
No tool claims to be read-only while its own name or description says it writes (1 declared hint checked).
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 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
1
invoked
not invoked; a live audit calls them
run time
11s
finished
Oct 21, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.