get_top_hackernews_stories
Fetch the top stories from Hacker News, allowing users to access up to 30 trending articles in real-time for quick updates and insights.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| count | No |
Implementation Reference
- src/index.ts:207-257 (handler)The handler function for the 'get_top_stories' tool, which fetches top Hacker News stories from the API, retrieves details for each, formats timestamps, and returns them as JSON.private async getTopStories(args: { count?: number; include_text?: boolean }) { const count = Math.min(args?.count || 30, 100); const includeText = args?.include_text || false; try { // Get top story IDs const response = await this.axiosInstance.get<number[]>('/topstories.json'); const storyIds = response.data.slice(0, count); // Fetch story details const stories = await Promise.all( storyIds.map(async (id) => { const story = await fetchItem(this.axiosInstance, id); if (story && story.type === 'story') { return { id: story.id, title: story.title, url: story.url, by: story.by, score: story.score, time: typeof story.time === 'number' ? new Date(story.time * 1000).toISOString() : story.time ? new Date(Date.parse(story.time)).toISOString() : undefined, descendants: story.descendants, ...(includeText && story.text ? { text: story.text } : {}), }; } return null; }), ); const validStories = stories.filter(Boolean); return { content: [ { type: 'text', text: JSON.stringify(validStories, null, 2), }, ], }; } catch (error) { throw new McpError( ErrorCode.InternalError, `Failed to fetch top stories: ${error instanceof Error ? error.message : 'Unknown error'}`, ); } }
- src/index.ts:64-82 (schema)Input schema definition for the 'get_top_stories' tool, specifying parameters for count and include_text.name: 'get_top_stories', description: 'Get the latest top stories from Hacker News', inputSchema: { type: 'object', properties: { count: { type: 'number', description: 'Number of stories to fetch (1-100)', minimum: 1, maximum: 100, default: 30, }, include_text: { type: 'boolean', description: 'Whether to include story text content', default: false, }, }, },
- src/index.ts:62-83 (registration)Registration of the 'get_top_stories' tool in the MCP ListToolsRequestSchema handler.tools: [ { name: 'get_top_stories', description: 'Get the latest top stories from Hacker News', inputSchema: { type: 'object', properties: { count: { type: 'number', description: 'Number of stories to fetch (1-100)', minimum: 1, maximum: 100, default: 30, }, include_text: { type: 'boolean', description: 'Whether to include story text content', default: false, }, }, }, },
- src/index.ts:176-178 (registration)Tool dispatch registration in the CallToolRequestSchema switch statement, calling the getTopStories handler.case 'get_top_stories': return await this.getTopStories(request.params.arguments ?? {}); case 'get_story_details':
- src/utils.ts:21-29 (helper)Helper function fetchItem used by the handler to retrieve individual story details from the Hacker News API.export async function fetchItem(axiosInstance: AxiosInstance, id: number): Promise<Story | null> { try { const response = await axiosInstance.get<Story>(`/item/${id}.json`); return response.data; } catch (error) { console.error(`Error fetching item ${id}:`, error); return null; } }