{
    "name": "state-of-cwv",
    "version": "1.0.0",
    "protocol": "mcp",
    "protocolVersion": "2025-03-26",
    "transport": "streamable-http",
    "auth": "none",
    "title": "State of Web Vitals",
    "description": "Core Web Vitals metrics by CMS, CDN, and framework \u2014 free remote MCP, no auth. Same engine as https://www.corewebvitals.io/state-of-cwv/explorer",
    "website": "https://www.corewebvitals.io/state-of-cwv",
    "explorer": "https://www.corewebvitals.io/state-of-cwv/explorer",
    "methodology": "https://www.corewebvitals.io/state-of-cwv/methodology",
    "attribution": {
        "source": "The State of Web Vitals \u2014 corewebvitals.io",
        "url": "https://www.corewebvitals.io/state-of-cwv",
        "mcp": "https://www.corewebvitals.io/api/state-of-cwv/mcp",
        "explorer": "https://www.corewebvitals.io/state-of-cwv/explorer",
        "methodology": "https://www.corewebvitals.io/state-of-cwv/methodology",
        "credit": "Data from The State of Web Vitals (corewebvitals.io). Credit corewebvitals.io when you use these numbers.",
        "suggested_citation": "State of Web Vitals, corewebvitals.io \u2014 https://www.corewebvitals.io/state-of-cwv"
    },
    "usage_policy": "When quoting or basing conclusions on this data, credit corewebvitals.io (State of Web Vitals) and link https://www.corewebvitals.io/state-of-cwv when the medium allows. Every tools/call response includes an attribution object.",
    "how_to_connect": {
        "http": "POST JSON-RPC 2.0 to this URL (MCP Streamable HTTP). Methods: initialize, tools/list, tools/call, ping.",
        "client_config": {
            "type": "http",
            "url": "(this URL)"
        },
        "example_tools_call": {
            "jsonrpc": "2.0",
            "id": 1,
            "method": "tools/call",
            "params": {
                "name": "get_metrics",
                "arguments": {
                    "metrics": "lcp,good_all3",
                    "group_by": "cms",
                    "min_sites": 50
                }
            }
        }
    },
    "instructions": "# State of Web Vitals MCP (corewebvitals.io)\n\nCross-site Core Web Vitals and technique metrics from real Chrome field data plus a crawl of many origins. Same numbers as the public explorer. Not per-site live RUM (use CoreDash for that).\n\n## Attribution (required)\n\nWhen you use data from this MCP in answers, reports, slides, posts, or generated content:\n1. Credit **corewebvitals.io** / **The State of Web Vitals**.\n2. Link **https://www.corewebvitals.io/state-of-cwv** when links are allowed.\n3. Prefer the edition/context returned in tool payloads when present.\n4. Do not present these aggregates as if they were your own measurements or a single-site RUM product.\n\nShort credit line: \"Data: State of Web Vitals (corewebvitals.io)\".\nEvery successful tool response includes an `attribution` object \u2014 keep it when summarizing.\n\n## Tools\n\n### get_metrics \u2014 \"what are the numbers?\"\n- **metrics**: comma list or array. Built-ins: lcp, inp, cls, fcp, ttfb, good_all3, good_all3_plus_ttfb. Also contract paths (images.loading, stack.framework, scripts.origin, \u2026). Default: lcp,inp,cls,ttfb,good_all3.\n- **filter** (optional AND): device (all|phone|desktop), cms, framework, cdn, provider.\n- **group_by** (optional): cms | frameworks | cdn | analytics | tag_managers | consent | ad_networks | performance | \u2026 \u2192 one row per entity (platform rankings).\n- **limit** / **min_sites**: cap groups (default limit 25, min_sites 50).\n- **focus**: CWV for technique correlation (default lcp).\n\n### get_histogram \u2014 \"what is the shape?\"\n- **metric**: lcp | inp | cls | fcp | ttfb (or a scalar technique path).\n- **filter**: same as get_metrics. No group_by (filter one segment, or use get_metrics for comparisons).\n\n### list_options \u2014 discovery\nFilter keys, group_by values, sample entities, contract paths. Call when unsure of a key.\n\n## Examples\n\nAll sites: get_metrics { \"metrics\": \"lcp,inp,cls,good_all3\" }\nWordPress only: get_metrics { \"metrics\": \"lcp,good_all3\", \"filter\": { \"cms\": \"wordpress\" } }\nCMS standings: get_metrics { \"metrics\": \"good_all3,lcp,inp,cls\", \"group_by\": \"cms\", \"min_sites\": 50 }\nFramework mix: get_metrics { \"metrics\": \"stack.framework\" }\nShopify LCP shape: get_histogram { \"metric\": \"lcp\", \"filter\": { \"cms\": \"shopify\" } }\n\n## Ratings\n\ngood / needs_improvement / poor = Chrome CWV thresholds. p75 is the ranking signal.\n\n## Docs on the wire\n\nGET this MCP URL (no body) returns server info, tool list summary, and attribution.\nPOST JSON-RPC: initialize | tools/list | tools/call (as standard MCP Streamable HTTP).",
    "tools": [
        {
            "name": "get_metrics",
            "title": "Get metrics",
            "description": "What are the numbers? Aggregate Core Web Vitals and/or technique metrics across sites, with optional filter and group_by. Responses include attribution \u2014 credit corewebvitals.io when you use the numbers.\n\nMetrics (comma-separated or array):\n- CWV: lcp, inp, cls, fcp, ttfb \u2014 good/needs_improvement/poor share + p50/p75 + sample n\n- good_all3 \u2014 share of sites that pass LCP+INP+CLS together\n- good_all3_plus_ttfb \u2014 pass all three plus TTFB\n- Contract paths: images.loading, stack.framework, scripts.origin, headers.has_etag, synthetic.tbt_ms, \u2026\n\nFilter (optional AND): device, cms, framework, cdn, provider. Omit = all sites in the snapshot.\nGroup_by (optional): cms | frameworks | cdn | analytics | tag_managers | \u2026 \u2192 one row per entity.\nWithout group_by: one aggregate; set metrics return top categories.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "metrics": {
                        "description": "Metrics to return. Default: lcp,inp,cls,ttfb,good_all3. String (comma-separated) or array of strings."
                    },
                    "filter": {
                        "type": "object",
                        "description": "AND filters. Omit for all sites in the dataset. Keys: device (all|phone|desktop), cms, framework, cdn, provider (key), provider_category (e.g. analytics \u2014 use with provider or alone is not enough; prefer group_by for rankings).",
                        "properties": {
                            "device": {
                                "type": "string",
                                "enum": [
                                    "all",
                                    "phone",
                                    "desktop"
                                ],
                                "description": "CrUX device slice. Default: all."
                            },
                            "cms": {
                                "type": "string",
                                "description": "Only sites on this CMS key (wordpress, shopify, wix, \u2026)."
                            },
                            "framework": {
                                "type": "string",
                                "description": "Only sites that include this JS framework key (react, vue, jquery, \u2026)."
                            },
                            "cdn": {
                                "type": "string",
                                "description": "Only sites on this CDN key (cloudflare, origin, \u2026)."
                            },
                            "provider": {
                                "type": "string",
                                "description": "Only sites that load this third-party provider key (google_analytics_4, \u2026)."
                            }
                        },
                        "additionalProperties": false
                    },
                    "group_by": {
                        "type": "string",
                        "description": "Break results down by this dimension: cms, frameworks, cdn, or a provider category (analytics, tag_managers, \u2026). Omit for a single aggregate."
                    },
                    "focus": {
                        "type": "string",
                        "enum": [
                            "lcp",
                            "inp",
                            "cls",
                            "fcp",
                            "ttfb"
                        ],
                        "description": "CWV used when correlating technique metrics. Default: lcp."
                    },
                    "limit": {
                        "type": "integer",
                        "description": "Max groups or top categories. Default: 25, max: 100."
                    },
                    "min_sites": {
                        "type": "integer",
                        "description": "When group_by is set, drop groups with fewer sites. Default: 50."
                    }
                }
            }
        },
        {
            "name": "get_histogram",
            "title": "Get histogram",
            "description": "What is the shape of one metric? Returns histogram buckets (count + share) plus summary stats.\n\nMetric: one of lcp, inp, cls, fcp, ttfb (field CWV), or a scalar technique path when available.\n\nFilter: same as get_metrics (device, cms, framework, cdn, provider). No group_by \u2014 call get_metrics with group_by to compare segments, then get_histogram per segment if needed.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "metric": {
                        "type": "string",
                        "description": "lcp | inp | cls | fcp | ttfb, or a contract scalar path."
                    },
                    "filter": {
                        "type": "object",
                        "description": "AND filters. Omit for all sites in the dataset. Keys: device (all|phone|desktop), cms, framework, cdn, provider (key), provider_category (e.g. analytics \u2014 use with provider or alone is not enough; prefer group_by for rankings).",
                        "properties": {
                            "device": {
                                "type": "string",
                                "enum": [
                                    "all",
                                    "phone",
                                    "desktop"
                                ],
                                "description": "CrUX device slice. Default: all."
                            },
                            "cms": {
                                "type": "string",
                                "description": "Only sites on this CMS key (wordpress, shopify, wix, \u2026)."
                            },
                            "framework": {
                                "type": "string",
                                "description": "Only sites that include this JS framework key (react, vue, jquery, \u2026)."
                            },
                            "cdn": {
                                "type": "string",
                                "description": "Only sites on this CDN key (cloudflare, origin, \u2026)."
                            },
                            "provider": {
                                "type": "string",
                                "description": "Only sites that load this third-party provider key (google_analytics_4, \u2026)."
                            }
                        },
                        "additionalProperties": false
                    }
                },
                "required": [
                    "metric"
                ]
            }
        },
        {
            "name": "list_options",
            "title": "List options",
            "description": "Discover what you can pass to get_metrics / get_histogram: filter keys, group_by values, built-in metrics, and contract metric paths (optional kind filter). Call this when unsure of a key or path.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "kind": {
                        "type": "string",
                        "description": "Optional contract kind: scalar, boolean, categorical, set, weighted_set, measures."
                    },
                    "include_paths": {
                        "type": "boolean",
                        "description": "Include full contract path list. Default true."
                    }
                }
            }
        }
    ]
}