MCP news server that exposes harvested articles to LLM agents and offers on-demand refreshing & summarisation.
The server defines 2 tools with significant quality gaps. 'summarize_news' has a complete, well-documented schema with a detailed description explaining categories, pagination, and output format. However, 'add-note' lacks proper description and appears to be minimally documented. The server shows database integration and API calls, but missing error handling guidance, security considerations (no permission checks or audit logging), and lacks tool annotations. Both tools are missing idempotence guarantees and error recovery patterns. The average across both tools reflects one solid implementation dragged down by one minimal one.
Add a new note
Returns raw articles so the caller can summarise them (LLM-side). Args: ctx: MCP context providing database connection and logging. category: Category filter - either a single category string or a list of categories. Available categories include: international_news, research, data_science, regional_international_news, business_finance_news, us_local_news, business_tech, tech, policy, linux, science, cybersecurity, startups, business, us_national_news, investigative_journalism, llm_tools Defaults to us_national_news if empty. hours: Number of hours to look back for articles. limit: Maximum number of articles to return. offset: Starting position for pagination (default 0). Returns: A dict with: - articles: list of article dicts (each has id, title, link, published, source, content) - meta: metadata about the query (total_count, limit, offset, has_more)
add-note tool has minimal description ('Add a new note'). Descriptions under 20 characters violate the 10-1024 char baseline and provide insufficient context for LLM tool selection. No explanation of when to use this vs. other tools, what happens to the note, or expected return value.
Neither tool implements error handling patterns. No guidance on recovery (e.g., 'If category is invalid, try list_categories()'). No error classification (retryable vs. user-fixable vs. fatal). Missing pattern: recovery-guide. This forces LLMs to guess what to do on failure.
No permission gates or audit logging. 'add-note' creates data without verifying user authority or logging who created what. No scope declarations (read:notes, write:notes). This violates the permission-gate and audit-trail patterns required for production data modification.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 38 | - | v1 |
No tool annotations. Missing destructiveHint on 'add-note' (WRITE operation), no idempotentHint on 'summarize_news' (read-only). Annotations help LLMs understand operation safety and retry behavior. This is a current (2026-07-28) spec feature that should be present.
Output schema for 'add-note' not documented. Code shows tool accepts name and content but return type is not specified in the schema. Unknown return value makes it impossible for downstream tools to chain off this operation. Violates response-shaper pattern.
'summarize_news' accepts a 'limit' parameter defaulting to 10,000 articles. Code enforces MAX_ARTICLES_PER_RESPONSE=10,000 but no validation or error message if an LLM passes a larger value. The parameter description should state the constraint explicitly: 'Maximum number of articles to return (1-10000, default 10000)' rather than relying on schema bounds alone.
'category' parameter in 'summarize_news' accepts string or array but the parameter description does not clearly state this polymorphism or provide examples of each valid format. An LLM might pass ['tech', 'science'] one time and 'tech' the next without understanding both are valid, wasting reasoning cycles.
Missing idempotency guarantees. 'add-note' creates data on each call with no deduplication or idempotent key. If an agent retries after ambiguous failure, a duplicate note is created. No pattern implementation for idempotent-operation. 'summarize_news' is read-only so naturally idempotent, but this should be explicitly annotated.