audited Sep 6, 2026in 12s
92/ 100100% of the applicable check weight evaluated

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

Shared experience100
Tool selection100
Tool quality91
Trust70
https://nightstand-diary.vercel.app
Captured view of https://nightstand-diary.vercel.app

Tools

5 read, 14 write
Loading map
log_entries: warning

log_entries

Log one or more entries in the person's health diary. Accepts several at once: if someone mentions a symptom and a medication in the same sentence, log them in a single call rather than calling this tool twice. Only records what the person said — it does not interpret, diagnose or suggest dosages.Takes an action on the site.
pagehttps://nightstand-diary.vercel.app/
implementation
viaimperative
entry pointdocument
registered after176ms
executepresent
api surface
entriesrequired
annotations
read onlyfalse
untrusted contentnot declared
titlenot declared
3 findings
warningSchema quality
weight 4
8 of 19 tool schemas are harder for an agent to use than they need to be: log_entries 1 parameter has no description (entries).
log_entries: 1 parameter has no description (entries); edit_entry: 1 parameter has no description (payload); delete_entry: 1 parameter has no description (id); add_medication: 2 parameters have no des
fix
{
  name: "log_entries",
  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: 7 names do not start with a verb (log_entries).
fix
{ name: "log_entries" /* short, unique, verb-based */ }
warningInjection surface
weight 3
6 of 19 tools carry instruction-shaped text in their own metadata: log_entries Description instructs agent how to use tool, and what not to do.
log_entries: Description instructs agent how to use tool, and what not to do; get_today: Description instructs agent what not to do; add_medication: Description instructs agent what not to do; get_summary: Description instructs agent what not to do
fix
{
  name: "log_entries",
  // 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 json
{
  "name": "log_entries",
  "description": "Log one or more entries in the person's health diary. Accepts several at once: if someone mentions a symptom and a medication in the same sentence, log them in a single call rather than calling this tool twice. Only records what the person said — it does not interpret, diagnose or suggest dosages.",
  "inputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "entries": {
        "minItems": 1,
        "maxItems": 20,
        "type": "array",
        "items": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "symptom"
                },
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80
                },
                "severity": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10
                },
                "location": {
                  "type": "string",
                  "maxLength": 80
                }
              },
              "required": [
                "kind",
                "name",
                "severity"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "dose"
                },
                "medId": {
                  "type": "string",
                  "minLength": 1
                },
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80
                },
                "amount": {
                  "type": "string",
                  "maxLength": 40
                }
              },
              "required": [
                "kind",
                "name",
                "amount"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "sleep"
                },
                "hours": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 24
                },
                "quality": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 10
                }
              },
              "required": [
                "kind",
                "hours",
                "quality"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "note"
                },
                "text": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 1000
                }
              },
              "required": [
                "kind",
                "text"
              ],
              "additionalProperties": false
            }
          ]
        }
      }
    },
    "required": [
      "entries"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false
  }
}
Showing log_entries

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

91 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 177ms of navigation.
toolset_accessibility
passCanonical entry point
weight 3
All 19 tools register on the canonical document.modelContext entry point.
passSchema validity
weight 4
All 19 declared input schemas are structurally valid object schemas.
warningSchema quality
weight 4
8 of 19 tool schemas are harder for an agent to use than they need to be: log_entries 1 parameter has no description (entries).
toollog_entries
log_entries: 1 parameter has no description (entries); edit_entry: 1 parameter has no description (payload); delete_entry: 1 parameter has no description (id); add_medication: 2 parameters have no des
fix
{
  name: "log_entries",
  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: 7 names do not start with a verb (log_entries).
toollog_entries
fix
{ name: "log_entries" /* short, unique, verb-based */ }
passStub detection
weight 4
All 19 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
passDescription quality
weight 5
All 19 rated tool descriptions say what the tool does, when to use it, and what it returns.

Trust

70 / 100 · weight 20
warningAnnotations present
weight 5
1 of 6 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.)
toolexport_vault
export_vault
fix
{
  name: "export_vault",
  // 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 }
}
passAnnotation mismatch
weight 5
No tool claims to be read-only while its own name or description says it writes (19 declared hints 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 applicableHint vs. observed
weight 4
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.
warningInjection surface
weight 3
6 of 19 tools carry instruction-shaped text in their own metadata: log_entries Description instructs agent how to use tool, and what not to do.
toollog_entries
log_entries: Description instructs agent how to use tool, and what not to do; get_today: Description instructs agent what not to do; add_medication: Description instructs agent what not to do; get_summary: Description instructs agent what not to do
fix
{
  name: "log_entries",
  // 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 log entries on this site.ok
choselog_entriesexpected log entrieskind matched
arguments
{
  "entries": [
    {
      "kind": "symptom",
      "name": "",
      "severity": 0
    }
  ]
}
I want to get today on this site.ok
choseget_todayexpected get todaykind matched
arguments
{}
I want to list entries on this site.ok
choselist_entriesexpected list entrieskind matched
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
native modelContext
chrome
151.0.7922.34
capture shim
v3
spec snapshot
2026-08-26
mode
fast
pages
1 - entry page only
tools
19
invoked
not invoked; a live audit calls them
run time
12s
finished
Sep 6, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.