example-servers/puppeteer
[ tools: 7 ][ checks: 12 ][ latency: 4ms ]
82/100(B)
npx -y @modelcontextprotocol/server-puppeteer
check breakdown
✓Tools exposed — Server exposed 7 tools.
• puppeteer_navigate
• puppeteer_screenshot
• puppeteer_click
• puppeteer_fill
• puppeteer_select
• puppeteer_hover
• puppeteer_evaluate
✓Input schemas valid — All tools have a valid JSON-Schema input definition.
!Input schema quality — 7 schema-quality issue(s) across 7 tool(s).
puppeteer_navigate: inputSchema.additionalProperties is not set to false (extra args pass through silently)
puppeteer_screenshot: inputSchema.additionalProperties is not set to false (extra args pass through silently)
puppeteer_click: inputSchema.additionalProperties is not set to false (extra args pass through silently)
puppeteer_fill: inputSchema.additionalProperties is not set to false (extra args pass through silently)
puppeteer_select: inputSchema.additionalProperties is not set to false (extra args pass through silently)
puppeteer_hover: inputSchema.additionalProperties is not set to false (extra args pass through silently)
puppeteer_evaluate: inputSchema.additionalProperties is not set to false (extra args pass through silently)
→ Declare `required` for every schema that has properties, so agents know which params are mandatory.
→ Give every property a `description` and a concrete `type` (avoid bare `{}` placeholders).
→ Set `additionalProperties: false` on the top-level inputSchema so models can't silently pass extra, unvalidated arguments.
!Output schemas — No tools declare an outputSchema.
→ Optional: declare outputSchema for tools with structured results so agents can validate/parse output reliably.
✓Duplicate tool names — All tool names are unique.
✓Tool naming — All tool names use spec-legal characters.
!Descriptions — 2 description issue(s) found.
puppeteer_navigate: description very short ("Navigate to a URL")
puppeteer_fill: description very short ("Fill out an input field")
→ Descriptions are the model's only guide to when/how to call a tool — treat them as prompt engineering.
→ Describe every tool and every parameter, including units, formats, and constraints.
→ Each tool's description should say something the name doesn't, and should be unique to that tool.
!Tool annotations — Annotation coverage 0% (0/35 hint fields set).
• puppeteer_navigate: no annotations at all
• puppeteer_screenshot: no annotations at all
• puppeteer_click: no annotations at all
• puppeteer_fill: no annotations at all
• puppeteer_select: no annotations at all
• puppeteer_hover: no annotations at all
• puppeteer_evaluate: no annotations at all
→ Add annotations: title, readOnlyHint, destructiveHint, idempotentHint, openWorldHint.
→ These let clients gate risky calls and give agents/users a friendly display name — optional but valuable.
!Tool titles — 7 of 7 tool(s) have no title.
• puppeteer_navigate: no top-level title (or annotations.title)
• puppeteer_screenshot: no top-level title (or annotations.title)
• puppeteer_click: no top-level title (or annotations.title)
• puppeteer_fill: no top-level title (or annotations.title)
• puppeteer_select: no top-level title (or annotations.title)
• puppeteer_hover: no top-level title (or annotations.title)
• puppeteer_evaluate: no top-level title (or annotations.title)
→ Declare a top-level `title` on each tool — it gives clients a friendly display name distinct from the machine-readable `name`.
→ `annotations.title` (the older location) is also accepted, but the top-level `title` field is now the spec-preferred place for it.
!Server instructions — No top-level instructions declared.
→ Declare instructions to guide agents on when/how to use this server.
→ Return a non-empty `instructions` string in your InitializeResult — most SDKs let you set this alongside serverInfo.
✓Handshake + list latency — tools/list responded in 4ms.
!Resources — 1 resource-quality issue(s) across 1 resource(s) and 0 template(s).
console://logs: no description or title
→ Give every resource a name, a valid uri, a description or title, and a mimeType.
→ Give every resource template a name, a description or title, a uriTemplate with at least one {variable} placeholder, and a mimeType.
→ mimeType is advisory but helps agents decide how to handle the resource content.
add the badge
Paste into your README:
[](https://scoremcp.dev/servers/server-puppeteer)