MCP server for Measure.events — privacy-first web analytics for AI agents
Server has 6 well-named tools with consistent verb_noun patterns (list_, get_, track_). All tools have descriptions (194-character baseline met). All input parameters have type definitions and descriptions. However, output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal (generic error wrapping only). Parameter descriptions lack explicit constraints (e.g., 'day', '7d', '30d', '90d' are described as enum but lack rationale). No mention of API limits, rate limits, or pagination guidance. Security: API key is correctly injected via environment variable (no credential leakage in params). The 'track_event' tool lacks 'url' in required params even though it's essential context, should be required or have a sensible default.
Get pageview counts for a site over a time period. Returns total pageviews and a daily time series.
Get traffic sources (referrers) for a site. Shows where visitors are coming from.
Get a natural-language summary of a site's analytics. AI-friendly overview of traffic trends, top content, and referrers.
Get the most viewed pages on a site. Shows which content is performing best.
List all sites tracked in your Measure.events account. Returns site IDs, domains, and tracking keys.
Track a custom event on a site. Use for conversions, signups, button clicks, or any custom metric.
Output schemas are not documented. LLMs cannot predict response structure (e.g., what fields does list_sites return? What is the format of pageviews time series?). Without documented schemas, agents must guess field names for downstream tool calls or parsing.
Parameter 'url' in track_event is optional but semantically critical. Without a URL, tracking is incomplete. Either make it required or provide a clear default behavior (e.g., 'if omitted, uses current page URL from agent context').
Error handling is minimal. When API calls fail (auth, rate limit, not found), the handler returns generic 'Error: <message>' strings. No classification (retryable vs user-fixable), no recovery guidance, no actionable context for LLM.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 68 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
No pagination guidance or limits documented. If a user has thousands of sites or pages, list_sites and get_top_pages could return huge lists, exhausting context. Tool descriptions should state 'Returns up to N items; call with pagination params' (if supported) or 'Results are capped at N items.'
Period parameter descriptions list enum values as plain text ('day', '7d', '30d', or '90d') but do not explain why these specific periods exist or what happens if a user requests an unsupported period. Enums prevent hallucination, but context about intent would strengthen descriptions.
No explicit documentation of response field naming conventions. E.g., list_sites returns 'tracking keys', is that 'site_key', 'trackingKey', 'key'? track_event requires 'site_key' as input. Naming must match so agents can chain calls without extra parsing.