A production-ready LangGraph agent that classifies text, extracts entities, analyzes sentiment, and generates summaries with long-term memory support via Redis. Includes both a FastAPI REST API and an MCP server for HackerNews integration.
Three tools with clear action verbs and reasonable descriptions (100-150 chars each). All tools have input schemas with types and descriptions. However, output schemas are undocumented (tools return plain strings, not structured objects), and error handling lacks recovery guidance. Parameter descriptions are adequate but could specify constraints (e.g., 'limit' lacks min/max bounds). No tool annotations (readOnlyHint, idempotentHint) despite all being read-only operations. Naming is clear but generic; descriptions explain WHEN to use tools but lack explicit output structure guidance.
Fetch the full content and details of a specific HackerNews story by its ID. Use this when the user wants to analyze or read a specific story. The returned text can be passed directly to the text analysis agent.
Fetch the top trending stories from HackerNews right now. Use this when the user wants to know what's popular or trending on HackerNews.
Search HackerNews stories by keyword or topic. Use this when the user asks about a specific topic (e.g. 'machine learning', 'startups', 'OpenAI'). Returns the most relevant stories for the query.
Output schemas undocumented. All three tools return plain strings; LLMs cannot parse structured fields or plan downstream calls. No documentation of return format (e.g., 'Returns formatted text with fields: title, url, score, comments').
Parameter 'limit' lacks bounds. No min/max specified; LLMs could pass 0, negative, or absurdly large values (e.g., 10000). Rubric baseline: numeric params must specify range (e.g., 1 - 100).
No tool annotations. All three tools are read-only and idempotent, but lack readOnlyHint and idempotentHint annotations. Agents cannot infer safety properties without explicit hints.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | <=2025-11-25 | v2 |
Error handling lacks recovery guidance. When httpx.get() fails or story not found, responses are bare strings ('No stories found', 'Story not found'). No actionable next steps for LLM (e.g., 'Try a different query' or 'Verify the story ID').
No pagination support. get_top_stories and search_stories accept 'limit' but do not return total_count, next_cursor, or offset. Large result sets could exhaust context; no way to fetch next page.