An MCP server that lets an agent query the user's personal timeline from ingested life events (Telegram, Google Takeout, Instagram, Spotify, etc.)
Backstory MCP has well-structured tool definitions with clear naming (verb_noun pattern) and complete input schemas. All 5 tools are READ_ONLY and properly registered via [McpServerTool] attributes. However, descriptions are terse (avg ~80 chars, below the 194-char baseline), parameter descriptions lack detail on constraints and formats, and output schemas are not documented. No error handling guidance, no pagination support despite tools returning potentially large result sets, and no tool annotations (readOnlyHint, etc.). The server is STDIO-only, which is a hard transport limitation.
Fetch full event records by id, including the pointer to the original source record.
List the sources ingested into this vault and how many events each contributed.
Look up a person or place by name and return the matching entity.
Search the user's life timeline with a natural-language query. Returns ranked events with timestamp, source and text.
Return all events in a time range so the agent can summarize what happened.
Output schemas not documented. LLMs cannot plan downstream calls or extract fields without knowing response structure. search_timeline returns {id, time, source, subType, text, score, match}; get_events returns {id, time, source, subType, text, latitude, longitude, raw}; but these are inferred from code, not declared in tool metadata.
Parameter descriptions lack format constraints and validation rules. 'from' and 'to' accept ISO-8601 but do not specify format in description (e.g., 'ISO-8601 format: YYYY-MM-DDTHH:MM:SSZ'). 'limit' has no min/max bounds stated. 'source' enum values ('telegram', 'google_takeout') are mentioned in search_timeline but not formalized as enum constraints.
No pagination support. summarize_period and list_sources iterate over potentially unbounded result sets (limit defaults to 100 and int.MaxValue respectively). Large vaults could return thousands of events, exhausting context windows. No next_cursor, offset, or page_size parameters.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
No error handling guidance. Tools return JSON strings but do not document error cases (e.g., invalid date format, entity not found, database unavailable). lookup_entity returns {found:false} on miss, but other tools have no documented failure modes or recovery hints.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint attributes. All tools are read-only and idempotent, but this is not declared in the tool metadata, forcing LLMs to infer safety from descriptions.