A Hacker News MCP server that provides tools to fetch top stories, user information, and story details from Hacker News
Three tools with basic verb-noun naming (get_*) and minimal descriptions. All tools have input schemas with type definitions and parameter descriptions, meeting baseline requirements. However, descriptions are extremely terse (10-30 chars), falling well below the 194-char production baseline and the 50-200 char LLM-optimized range. No output schemas documented. Error handling is generic (ValueError wrapping). No parameter constraints (enums, ranges, patterns). Missing guidance on when to use each tool vs. alternatives. No idempotency hints or chaining metadata in responses.
Get story information from story_id
Get top stories from HackerNews. This method returns story_id.
Get user information from user_id
Descriptions critically short (10-30 chars vs. 194-char baseline). 'Get user information from user_id' and 'Get story information from story_id' lack context for LLM tool selection. No explanation of when to call each tool, what data is returned, or dependencies.
Output schemas not documented. Callers cannot predict response structure (e.g., does get_story return {content, content_type} or {story, metadata}?). LLMs must infer structure from examples, increasing hallucination risk.
No parameter constraints. 'limit' in get_top_stories has no min/max bounds, LLM could pass 10000, causing API overload. No enum for story_id type validation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
Error handling is generic (ValueError wrapping). No recovery guidance. If get_story fails with 'Failed to fetch story 123', LLM has no hint whether to retry, check the ID, or call a different tool.
Response fields inconsistent across tools. get_top_stories returns {stories: [...]}, get_user_info returns {user: {...}}, get_story returns {content: {...}, content_type: ...}. Inconsistent naming forces LLM to reason about field mappings.