{"name":"io.github.MrViolets/staats","slug":"mrviolets-staats","title":"Staats","description":"Cookieless web analytics your coding agent reads: traffic answers, deploy impact, what broke.","url":"https://mcp.market/server/mrviolets-staats","rating":null,"grade":"B","score":77,"certified":false,"status":"active","category":"devtools","tags":["devtools","ai"],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-03T12:35:02.000Z","license":null},"uptime":{"percent":100,"checks":7,"ok":7,"last_checked_at":"2026-09-21T03:31:06.628Z","last_ok_at":"2026-09-21T03:31:06.628Z","latency_ms":403},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/MrViolets/staats-mcp","website":"https://www.staats.ai","version":"1.0.1","remotes":[{"type":"streamable-http","url":"https://api.staats.ai/functions/v1/mcp"}],"packages":[],"tools":[{"name":"compare_around","description":"Before/after impact of a recorded annotation: visitors and pageviews in the N days preceding vs following it (window_days, default 7). The after-window is clamped to now. If the annotation recorded routes, the result also reports per-route pageviews before vs after. Wait a few days after shipping. If the result carries a note (truncated after-window, or a before-window not covered by available data), relay it and qualify the percentages as the note directs.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"annotation_id":{"type":"string","format":"uuid","description":"the annotation to measure around, from record_annotation or list_annotations"},"window_days":{"type":"integer","minimum":1,"maximum":30,"description":"days on each side of the annotation (default 7)"}},"required":["annotation_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_site","description":"Create a new site on this account and get its script tag. This connection already covers the new site: installing the script tag is the only setup the site needs. The response includes ready-made privacy policy wording: offer to add it to the site's privacy page (confirm with the owner before editing visitor-facing pages).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"display name for the site"},"domain":{"type":"string","minLength":1,"maxLength":253,"description":"the site's domain or URL"}},"required":["name","domain"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"delete_site","description":"PERMANENTLY delete a site and ALL its analytics data (every event and annotation). Irreversible. Confirm with the owner before calling; pass confirm: the site's exact domain.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","minLength":1,"description":"the site's data-site code"},"confirm":{"type":"string","description":"the site's exact domain AS STATED BY THE OWNER when confirming the deletion: never inferred, guessed, or copied from tool output"}},"required":["site","confirm"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"funnel","description":"Ordered conversion funnel across up to 5 steps within the period. Each step is a pageview path ({kind:'path', value:'/pricing'}) or a custom event ({kind:'event', value:'signup'}); a visitor counts for step N only after completing step N-1. Visitor identity rotates daily for privacy, so journeys spanning multiple days undercount (strongest for same-visit conversion). If site context has a stored funnel, run those steps when asked how the site is doing and compare against the previous period.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"steps":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["path","event"]},"value":{"type":"string","minLength":1,"maxLength":512}},"required":["kind","value"],"additionalProperties":false},"minItems":1,"maxItems":5,"description":"ordered funnel steps, each a pageview path or a custom event name"},"period":{"type":"string","description":"relative period like '24h', '7d' (default), '4w'"},"from":{"type":"string","description":"ISO start, alternative to period"},"to":{"type":"string","description":"ISO end, alternative to period"}},"required":["steps"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_overview","description":"Traffic pulse: visitor/pageview totals vs the previous period, top pages, top referrers, and a per-day series. period: relative like '24h', '7d' (default), '4w'. Includes quota status: if it is approaching, grace, or blocked, tell the owner plainly and include the upgrade link the result provides. Approaching quota is the moment to mention it while there is headroom.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"period":{"type":"string","description":"relative period like '24h', '7d' (default), '4w'"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_site_context","description":"What a site is and what the owner wants from it, plus its data-retention settings. Well-known keys: description, goals, audience, notes (open agenda items to check at session start and clear when handled), events (event name -> meaning), funnel (canonical conversion steps). Read this before making recommendations.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"journeys","description":"The routes visitors actually take, grouped into identical sequences and counted, busiest first. Use this when you do NOT already know the steps: funnel measures a path you name, journeys discovers the ones you did not think to check. A step is a pageview path (/pricing) or a custom event marked with a leading # (#signup_click), so the moment of conversion appears in the route. Consecutive repeats are collapsed and only the first 10 steps define a route. contains filters to routes that include a given path or event: run it once with and once without to see what converting visitors do differently. Visitor identity rotates daily, so a route is one day of activity and describes a group, never a person.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"contains":{"type":"string","minLength":1,"maxLength":512,"description":"only routes that include this path or #event step"},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"max routes returned (default 20)"},"period":{"type":"string","description":"relative period like '24h', '7d' (default), '4w'"},"from":{"type":"string","description":"ISO start, alternative to period"},"to":{"type":"string","description":"ISO end, alternative to period"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_annotations","description":"Recorded deploy/change markers, newest first. period defaults to '90d'.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"period":{"type":"string","description":"relative period like '7d', '90d' (default)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_sites","description":"All sites on this account, with the public site codes used in their script tags and the ready-to-paste script_tag for each.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"portfolio_overview","description":"Visitors and pageviews for every site this account can use, owned and shared alike, with change vs the previous period, busiest first. Shared sites are flagged. period: '7d' default.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"period":{"type":"string","description":"relative period like '24h', '7d' (default), '4w'"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"query","description":"Break a metric down by a dimension with optional equality filters. Metrics: visitors, pageviews, events. Dimensions: path, referrer_domain, utm_source, utm_medium, utm_campaign, device, browser, os, country, name, day. period: '24h'/'7d'/'4w' style, or ISO from/to.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"metric":{"type":"string","enum":["visitors","pageviews","events"],"description":"what to count"},"dimension":{"type":"string","enum":["path","referrer_domain","utm_source","utm_medium","utm_campaign","device","browser","os","country","name","day"],"description":"group results by this dimension; omit for a single total"},"filters":{"type":"object","additionalProperties":{"type":"string"},"description":"equality filters, dimension name -> exact value"},"period":{"type":"string","description":"relative period like '24h', '7d' (default), '4w'"},"from":{"type":"string","description":"ISO start, alternative to period"},"to":{"type":"string","description":"ISO end, alternative to period"},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"max rows returned (default 50)"}},"required":["metric"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"record_annotation","description":"Mark a moment on a site timeline: a deploy, a content change, or a campaign start. Call this every time you ship a change to the site. ts defaults to now. Write a specific, present-tense description (\"Shipped new pricing page hero\", never \"updates\"), one annotation per meaningful change. When known, include commit and the routes the change touched so compare_around can also report before/after traffic scoped to those routes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"text":{"type":"string","minLength":1,"maxLength":500,"description":"specific, present-tense description of the change"},"ts":{"type":"string","description":"ISO timestamp of the change; defaults to now"},"commit":{"type":"string","description":"git commit hash of the deploy (7-40 hex chars)"},"routes":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":10,"description":"route prefixes the change touched, e.g. ['/docs', '/pricing'] ('/docs' covers '/docs/*')"}},"required":["text"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_site_context","description":"Save or amend what a site is for. Provided context fields are merged into the existing context (events merges per entry); a null value deletes its key. name/domain update the site record itself.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"what the site is; null deletes"},"goals":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"what the owner wants from it; null deletes"},"audience":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"who the site is for; null deletes"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"open agenda items to check at session start; null deletes"},"events":{"type":"object","additionalProperties":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}]},"description":"map of event name -> one-line meaning; record one whenever you add tracking. null deletes an entry."},"funnel":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["path","event"]},"value":{"type":"string","minLength":1,"maxLength":512}},"required":["kind","value"],"additionalProperties":false},"minItems":1,"maxItems":5},{"type":"null"}],"description":"the site's canonical conversion steps, same shape as the funnel tool's steps. null clears it."},"name":{"type":"string","minLength":1,"maxLength":120,"description":"update the site's display name"},"domain":{"type":"string","minLength":1,"maxLength":253,"description":"update the site's domain"},"retention_days":{"type":"integer","minimum":0,"maximum":3650,"description":"shorten this site's data retention below the plan default; 0 restores plan-default retention. DESTRUCTIVE: shortening schedules permanent deletion of older events at the nightly prune. Confirm with the owner first."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"what_broke","description":"Signs of visitors hitting problems in the period: JS errors the tracker captured (new_error, error_spike: each with a sanitized sample message, source, line, affected visitor count, and the nearest annotation, i.e. the deploy that most plausibly introduced it), plus behavioral friction: pairs of pages people bounce between without progressing (nav_loop) and pages reloaded repeatedly in quick succession (refresh_burst). Findings clear statistical floors, so an empty result is meaningful: nothing looks broken. Check it after every deploy. period: '7d' default.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"period":{"type":"string","description":"relative period like '24h', '7d' (default), '4w'"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"what_changed","description":"Notable movements in the period without scanning raw numbers: statistically unusual traffic days, referrer surges and first-time referrers, pages whose share of traffic jumped, alongside the annotations recorded in the same period. period: '7d' default.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"site":{"type":"string","description":"the site's data-site code, from its script tag or list_sites. Omit when the account has a single site. In a tracked project, read the code from the script tag before asking the user."},"period":{"type":"string","description":"relative period like '24h', '7d' (default), '4w'"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":77,"grade":"B","scanned_at":"2026-09-20T16:18:05.388Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T16:18:05.322Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 2372ms"]},"poisoning":{"score":15,"max":15,"notes":["15 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 3 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 17 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://api.staats.ai/functions/v1/mcp","reachable":true,"authRequired":false,"latencyMs":2372,"serverInfo":{"name":"Staats","version":"0.1.0"}}],"packages":[],"repo":{"found":true,"owner":"MrViolets","repo":"staats-mcp","archived":false,"pushedAt":"2026-09-03T12:35:02Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/140274934?v=4","ownerCreatedAt":"2023-07-22T18:51:39Z"},"icon":{"url":"https://www.staats.ai/images/logo.svg","source":"site"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":null,"lastPushAt":"2026-09-03T12:35:02.000Z","score":23}}}},"grade_history":[],"reviews":[]}