Chrome DevTools MCP server tool surface audit

A95/100composite score
Token footprint
~5,630
Tools
29
Findings
32
Scanned

Engine mcp-surface-lint@0.3.3 · reported as chrome_devtools v1.9.0

The Chrome DevTools MCP server exposes 29 tools whose definitions cost approximately 5,630 tokens in every single conversation, whether or not any of them is ever called. The composite score is 95 out of 100 (grade A), built from 32 scored findings touching 3 of the six rule categories.

The spread runs from 100/100 for naming down to 85/100 for surface. It is catalogued here under Developer Tools, alongside other servers agents reach for in the same kind of work.

Token footprint

Measured against a 200,000-token window, the surface consumes about 3% of it before the conversation starts, and keeps consuming it on every turn. That averages 194 tokens per tool definition, counted with the o200k_base encoding.

Against a category median of 2,797 tokens, this surface runs about 101% above the middle of the pack.

surface85
naming100
descriptions100
schemas88
annotations100
design97

Findings

The findings below are grouped by severity, and each links to the rule that produced it.

30 findings come from `schemas/loose`. Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes. On this surface it fires on `click`, `close_page` and `drag`, among 26 others.

`design/list-no-limit` contributes one finding. A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less. On this surface it fires on `list_pages`.

`surface/tool-budget` accounts for one finding. Tool selection accuracy degrades as the surface grows: more near-neighbours to confuse, more tokens spent before the first user message. Fewer, intent-shaped tools outperform one-tool-per-endpoint surfaces. It applies to the surface as a whole rather than to one tool.

warn 32 findings

Findings that measurably degrade tool selection.

"list_pages" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseclose_page
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseevaluate_script
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosefill_form
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseget_console_message
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseget_network_request
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosehandle_dialog
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looselighthouse_audit
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looselist_console_messages
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looselist_network_requests
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looselist_pages
Bare "type: object" with no properties at /inputSchema — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looselist_pages
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosenavigate_page
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseperformance_analyze_insight
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseperformance_start_trace
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseperformance_stop_trace
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosepress_key
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseresize_page
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseselect_page
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosetake_heapsnapshot
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosetake_screenshot
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosetake_snapshot
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/loosetype_text
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

schemas/looseupload_file
"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

"additionalProperties: true" at /inputSchema — accepts arbitrary keys silently.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

Server exposes 29 tools (warn threshold 20 exceeded). Consider consolidating into fewer intent-shaped tools.

Tool selection accuracy degrades as the surface grows: more near-neighbours to confuse, more tokens spent before the first user message. Fewer, intent-shaped tools outperform one-tool-per-endpoint surfaces.

info 2 findings

Advisory only — these deduct nothing from the score.

Mutating tool "upload_file" has no title — clients show the raw name in confirmation prompts.

readOnlyHint/destructiveHint are machine-readable: clients use them to decide when to ask the user for confirmation. Prose like 'confirm with the user first' is invisible to that machinery.

Enum [accept, dismiss] is shared across 2 tools. If not every combination is valid, the schema cannot express it — encode constraints or document the invalid pairs.

When the same enum is reused across tools but not every combination is valid (e.g. not every product supports every tier), the schema cannot say so — the model finds out via runtime errors. Flag shared enums for a validity review.

handle_dialog/properties/action; navigate_page/properties/handleBeforeUnload

What this surface does well

3 of the six categories come through clean: naming, descriptions and annotations. In practice that means the tool names follow one convention end to end, every tool carries a description long enough to disambiguate it and read and write operations are machine-distinguishable before a client runs them.

Tool inventory

`emulate` is the most expensive definition at 413 tokens — about 7% of the whole surface — against 66 for `list_pages`. Every tool carries a description, ranging from 30 to 318 characters.

All 29 declare annotations, so a client can tell a read from a write before running one. Input schemas average 4 top-level parameters and nest 3 levels deep at their worst, with 1 tool taking no input at all.

All 29 tools as published, heaviest first. Token counts use the o200k_base encoding and are approximate.

Every tool on this surface with its token cost and schema shape.
ToolTokensDescriptionParamsRequiredDepthAnnotations
emulate41345 chars811yes
list_console_messages32872 chars712yes
evaluate_script315133 chars622yes
list_network_requests27377 chars512yes
take_screenshot27341 chars611yes
navigate_page26285 chars711yes
fill_form261318 chars323yes
performance_start_trace245151 chars411yes
get_network_request235246 chars411yes
new_page21474 chars411yes
take_snapshot206302 chars311yes
upload_file19341 chars432yes
lighthouse_audit192173 chars411yes
press_key186166 chars321yes
performance_analyze_insight184144 chars331yes
fill18279 chars431yes
wait_for15759 chars322yes
click15230 chars421yes
drag15036 chars431yes
performance_stop_trace13966 chars211yes
handle_dialog13761 chars321yes
take_heapsnapshot133128 chars221yes
type_text13356 chars321yes
hover13131 chars321yes
get_console_message12692 chars221yes
select_page12149 chars211yes
resize_page11966 chars331yes
close_page10266 chars111yes
list_pages6640 chars000yes

How this compares

Chrome DevTools ranks 5 of 5 scanned Developer Tools servers, 1 point below the category median of 96.

The closest comparisons in this directory are Filesystem, Playwright and Context7, which sit nearest on score and face the same kind of surface-design pressure.

Category
Developer Tools
Rank in category
5
Category median score
96
Category median tokens
2,797
Want this surface fixed, not just measured?

A fix plan turns these findings into an ordered set of changes with the token saving of each one.

Get a fix plan

This page is a static analysis of Chrome DevTools's published tools/list surface on the date shown. It is not a security review, a performance benchmark, or a judgement of the product behind the surface. Read how the score is computed, or browse every audited server.