A NewsBlur MCP server that provides tools for querying stories, feeds, and managing read/starred status. Integrates with NewsBlur's API and maintains a local cache of feeds and starred stories.
Single tool 'story_query' has a comprehensive description (250+ chars) and well-defined input schema with 9 parameters, each with type and description. Tool annotations (ReadOnlyHint, DestructiveHint, IdempotentHint, OpenWorldHint) are present and correct. However, output schema is not formally documented in the tool definition, the response structure is inferred from the Run function's JSON marshaling. Parameter descriptions are adequate but lack format constraints (e.g., 'month' should specify 1-12 range explicitly in description, not just in parenthetical). No error recovery guidance in description. Naming follows verb_noun pattern correctly.
Query stories with structured filters and/or word search. Returns compact summaries sorted by date descending. Start with nebulous://stories/facets to see available years, tags, and feeds. Pipeline: stories/facets → story_query(filters) → story/{hash} (metadata) → story/{hash}/content (text) → story/{hash}/original (full article). Fan out story/{hash} reads to subagents in parallel.
Output schema not formally documented. Response structure (total, offset, limit, results array with hash/title/authors/feed_id/date/user_tags/permalink) is implicit in the Run function but not declared in tool metadata. LLMs cannot plan downstream calls without knowing what fields to expect.
Parameter constraints not fully specified in descriptions. 'month' parameter says '(1-12, requires year)' but should state this as a formal constraint in the description text. 'limit' defaults to 100 but no maximum is documented, unbounded numeric parameters invite absurd values.
No error recovery guidance in tool description. If store is nil or build fails, the tool returns a text error, but the description does not explain what to do next or when these failures occur. LLMs cannot plan recovery.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Description includes example values ('e.g. zz-nyc, interests, news' for tag parameter). LLMs tend to reuse example values literally rather than adapting to context. Should use enum constraints or remove examples.
Pagination response does not include next_cursor or has_more flag. Clients cannot determine if more results exist beyond the returned offset+limit. For large result sets, this forces agents to guess whether to fetch more pages.