MCP server for the Chrome UX Report — real-user Core Web Vitals for any origin or URL
Three tools with complete input schemas and descriptions. Naming follows verb_noun pattern (crux_record, crux_history, crux_compare). Descriptions are detailed (150-250 chars) and explain WHEN to use each tool. All parameters have types and descriptions. However, output schemas are NOT documented, LLMs cannot predict response structure. Error handling returns JSON but lacks recovery guidance. Tool annotations present (READ_ONLY) but no destructive/idempotent hints beyond the shared annotation. Parameters lack enums for form_factor despite known valid values (PHONE, DESKTOP, TABLET, ALL).
Compare Core Web Vitals across several origins — yours against competitors. origins is a comma-separated list, e.g. "https://www.betterpic.io,https://www.aragon.ai,https://www.headshotpro.com". Returns one row per origin with the three Core Web Vitals and whether it passes. Origins with no CrUX record are reported rather than dropped silently.
Weekly Core Web Vitals trend, up to 25 points, for charting or regression checks. Same origin / url / form_factor rules as crux_record. Pass metric to return just one series, e.g. largest_contentful_paint, interaction_to_next_paint, cumulative_layout_shift, first_contentful_paint, experimental_time_to_first_byte.
Current p75 Core Web Vitals for an origin or a single URL. Pass EITHER origin (e.g. https://www.betterpic.io — covers the whole site) OR url (one page). form_factor is PHONE, DESKTOP, TABLET or ALL. Returns each metric's p75 with a good / needs-improvement / poor assessment, plus an overall core_web_vitals_pass. Set raw=true for the untouched API response.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). crux_record returns summarised_record(data) or raw API response, structure unclear without reading client.py.
form_factor parameter accepts free-form strings instead of enum. Valid values (PHONE, DESKTOP, TABLET, ALL) are documented in description but not enforced. LLMs may hallucinate invalid values like 'MOBILE' or 'LAPTOP'.
Error handling returns JSON with 'error' field but provides no recovery guidance. When metric not found in crux_history, response includes available metrics but LLM must parse and retry, no explicit 'try again with' instruction.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
crux_compare accepts comma-separated origins as a single string parameter. No batch validation or per-origin error isolation documented. If one origin fails, unclear whether others are processed or entire call fails.
origin and url parameters are mutually exclusive but this constraint is only documented in prose descriptions, not enforced in schema. LLMs may pass both, causing ambiguous behavior.