CLI + MCP server to ingest and query browser history (Safari/Chrome/Firefox) with automatic labeling.
Five tools with complete input schemas and descriptions, but quality is uneven. Tool names follow verb_noun convention (ingest_history, query_history, ask_history, stats_history, backfill_occurrences). Descriptions are present but brief (avg 95 chars, below 194-char baseline). Parameters have types and descriptions, but lack enums for constrained inputs (e.g., 'browser' accepts 'safari|chrome|firefox|edge|brave|all' but no enum constraint). Output schemas are not documented, responses return dicts with generic 'ok'/'rows'/'stats' keys but no field-level documentation. Error handling is absent; no guidance on retryability or recovery. ask_history uses heuristic NLP parsing without explaining limitations or fallback behavior.
Interpret a natural language question and return matched visits.
Backfill visit_occurrences for existing visits (useful after upgrading).
Ingest browser visits into the local store (browser=safari|chrome|firefox|edge|brave|all, dedupe_scope global|source).
Query visits with filters (category ai/github_project/personal_site, search substring, since like 7d).
Return totals, oldest/newest visit, and category counts. `since` like 7d/30d/YYYY-MM-DD.
No output schemas documented. Tools return dicts with generic keys ('ok', 'rows', 'stats', 'filters', 'results') but LLMs cannot infer field types, nested structure, or what to extract for downstream calls. E.g., query_history returns {'rows': [...]} but row structure is undocumented.
Constrained parameters lack enum declarations. 'browser' param accepts 'safari|chrome|firefox|edge|brave|all' but is defined as free-form string. 'category' accepts 'ai|github_project|personal_site|docs|news|social|shopping|video|other' but no enum. LLMs will hallucinate invalid values.
ask_history uses heuristic NLP parsing (_interpret_question) with no error handling or fallback. If question doesn't match keywords, returns empty filters. No documentation of limitations or guidance on when to use ask_history vs query_history.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
No error handling or recovery guidance. Tools return bare dicts on success but no documented error responses. If ingest fails, what does the LLM see? If query returns empty, is that a failure or valid result? No actionable error messages.
Descriptions are brief (50 - 70 chars) and lack context on WHEN to use each tool. E.g., backfill_occurrences says 'Backfill visit_occurrences for existing visits (useful after upgrading)' but doesn't explain what visit_occurrences are or when backfill is necessary. LLMs cannot determine tool selection.