audited Aug 31, 2026in 42s
Agent-readyEvery tool this page registers declares a handler an agent can call. WebMCP is not on by default in a release browser yet, so reaching them today takes a WebMCP-capable browser or the page's own polyfill - browser rollout, not a gap in this page.
63/ 100100% of the applicable check weight evaluated

10 tools registered. Strongest in tool quality, weakest in task completion.

Shared experience75
Task completion13
Tool quality90
Trust75
https://mcpencil.com
Captured view of https://mcpencil.com

Tools

2 read, 0 write, 8 undeclared
Loading map
get_match_state: warning

get_match_state

Canonical page-exposed WebMCP continuation state. Before joining, it identifies play_mcpencil as the entry action. After joining, read role, mustContinue, completionCondition, exact nextAction, urgency, deadline, and the privatePrompt when you are the agent artist. Between turns, pass afterRevision and waitMs 25000. Guessers should visually inspect the rendered page/canvas as the primary picture; canvasPerception is a fast 32x22 text raster fallback and compact canvasGeometry is only a final cross-check.Answers a question. Declared read only.
pagehttps://mcpencil.com/
implementation
viaimperative
entry pointdocument
registered after363ms
executepresent
api surface
afterRevisionoptional
waitMsoptional
annotations
read onlytrue
untrusted contenttrue
titlenot declared
2 findings
warningSchema quality
weight 4
5 of 10 tool schemas are harder for an agent to use than they need to be: get_match_state description is 509 characters, over Chrome's 500-character guidance.
get_match_state: description is 509 characters, over Chrome's 500-character guidance; get_match_state: declares no required list, so an agent cannot tell which parameters are mandatory; play_mcpencil:
fix
{
  name: "get_match_state",
  inputSchema: {
    type: "object",
    properties: {
      query: { type: "string", description: "What to search for" }
    },
    required: ["query"]
  }
}
warningInjection surface
weight 4
6 of 10 tools carry instruction-shaped text in their own metadata: get_match_state Description instructs agent how to behave and what to read.
get_match_state: Description instructs agent how to behave and what to read; play_mcpencil: Description instructs agent when to call and how to continue; configure_match: Description instructs agent when to call and what values to send; start_match: Description instructs agent when to start
fix
{
  name: "get_match_state",
  // 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": "get_match_state",
  "description": "Canonical page-exposed WebMCP continuation state. Before joining, it identifies play_mcpencil as the entry action. After joining, read role, mustContinue, completionCondition, exact nextAction, urgency, deadline, and the privatePrompt when you are the agent artist. Between turns, pass afterRevision and waitMs 25000. Guessers should visually inspect the rendered page/canvas as the primary picture; canvasPerception is a fast 32x22 text raster fallback and compact canvasGeometry is only a final cross-check.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "afterRevision": {
        "type": "integer",
        "minimum": 0,
        "description": "Optional last revision; wait for something newer."
      },
      "waitMs": {
        "type": "integer",
        "minimum": 0,
        "maximum": 25000,
        "description": "Optional wait for a newer revision. Use 25000 between turns."
      }
    },
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": true,
    "untrustedContentHint": true
  }
}
Showing get_match_state

Findings

Shared experience

75 / 100 · weight 30
warningPage experience
weight 20
2 of 4 page-experience marks came back short: usable The page is a loading screen, so it is not fully functional yet..
usable: weak; clarity: weak
warningHuman parity
weight 10
The page the person sees came back short of the agent surface (2 of 4 page-experience marks came back short: usable The page is a loading screen, so it is not fully functional yet..), 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

13 / 100 · weight 25
failTool selection
weight 15
An agent chose an existing tool and built a schema-valid call that held up on 0 of 3 canonical intents; on "Open the document I was working on most recently." no tool on the page served it. Nothing was executed, so this verifies selection, not outcomes.
failCoverage vs. site type
weight 10
The tool set covers 1 of the 3 things an agent needs on a editor site; it cannot edit or write content or save, publish, or share the result.

Tool quality

90 / 100 · weight 25
passRegistration timing
weight 1
Every measured tool registered within 365ms of navigation.
toolsubmit_guesses
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.
warningSchema quality
weight 4
5 of 10 tool schemas are harder for an agent to use than they need to be: get_match_state description is 509 characters, over Chrome's 500-character guidance.
toolget_match_state
get_match_state: description is 509 characters, over Chrome's 500-character guidance; get_match_state: declares no required list, so an agent cannot tell which parameters are mandatory; play_mcpencil:
fix
{
  name: "get_match_state",
  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: 5 names do not start with a verb (play_mcpencil).
toolplay_mcpencil
fix
{ name: "play_mcpencil" /* short, unique, verb-based */ }
passStub detection
weight 4
All 10 tools declare an execute handler.
passRegistration errors
weight 2
No tool registration threw during the capture.
passDescription quality
weight 5
All 10 rated tool descriptions say what the tool does, when to use it, and what it returns.

Trust

75 / 100 · weight 20
passAnnotations present
weight 6
All 2 read-shaped tools declare readOnlyHint: true - the one declared claim that lets an agent treat a call as safe to make without asking.
passAnnotation mismatch
weight 6
No tool claims to be read-only while its own name or description says it writes (2 declared hints checked).
not applicableUntrusted content hint
weight 4
No tool's contract suggests it returns text written by somebody other than the site, so there is nothing to flag as untrusted.
warningInjection surface
weight 4
6 of 10 tools carry instruction-shaped text in their own metadata: get_match_state Description instructs agent how to behave and what to read.
toolget_match_state
get_match_state: Description instructs agent how to behave and what to read; play_mcpencil: Description instructs agent when to call and how to continue; configure_match: Description instructs agent when to call and what values to send; start_match: Description instructs agent when to start
fix
{
  name: "get_match_state",
  // 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

0% across 3 intents
Open the document I was working on most recently.missed
choseno toolexpected document openkind not applicable
No tool was picked for this intent.
arguments
{}
Add a short summary paragraph at the top.missed
choseno toolexpected content editkind not applicable
No tool was picked for this intent.
arguments
{}
Save it and give me a link I can share.missed
choseno toolexpected save or sharekind 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.
Private to the mcpencil.com team: enter your email on that domain to run 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
42s
finished
Aug 31, 2026
Checked the way in-browser agents discover tools: the top-level document's modelContext registry, read after the page settles.