Daily morning brief + real-time anomaly alerts across Vercel / OpenPanel / HyperDX / Supabase / Product Hunt for indie launches, exposed as MCP tools.
Four tools with basic descriptions and minimal parameter documentation. Tool names follow verb_noun convention (get_*, usage_*), which is good. However, parameter schemas lack type definitions and descriptions, only 'include_summary' has a description. Output schemas are undocumented. Error handling is minimal (get_source returns plain text errors). No input validation guidance. Descriptions are adequate (100-200 chars) but lack actionable context for LLM selection. This is a typical community server with functional but incomplete definitions.
Return only critical / alert / warn metrics. Skips the noise.
Generate the funnel-analytics morning brief — the same markdown report the daily cron writes to your Obsidian vault. Reads Vercel deployments, Product Hunt votes, Supabase advisors, OpenPanel events, HyperDX errors, build-quality-agent review log, and aggregate Anthropic spend across the agent stack. Surfaces anomalies vs the 7-day baseline.
Run a single source by name and return its metrics as markdown.
Return token + dollar usage from this agent's local log. Reads ~/.funnel-analytics-agent/usage.jsonl and reports total runs, cumulative input/output tokens, estimated $ spend at current Anthropic prices.
get_alerts and usage_summary have empty input schemas (no parameters documented).
get_source 'name' parameter lacks type definition and enum constraint. Description mentions valid values ('vercel, producthunt, ...') but no formal enum in schema. LLMs may hallucinate invalid source names.
No output schemas documented for any tool. LLMs cannot predict response structure, forcing them to parse markdown text and guess field names for downstream operations.
Error handling returns plain text (e.g., 'Unknown source: ...' in get_source). No recovery guidance or actionable next steps for LLM.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
get_brief description mentions 'Claude-generated narrative summary' but does not explain when/why to use include_summary=False. Missing dependency hint.