get-latest-posts
Retrieve recent HackerNews content sorted by date. Filter by content type, paginate results, and customize display to monitor platform activity.
Instructions
Retrieve the most recent HackerNews posts sorted by date.
Returns posts in chronological order (newest first), including all types of content unless filtered.
Supports:
Filter by content type using tags (story, comment, poll, show_hn, ask_hn, etc.)
Pagination to view older posts
Customizable results per page (default: 20)
Empty query to get all recent posts
Examples:
Get latest stories: { "tags": ["story"] }
Get latest comments: { "tags": ["comment"] }
Get all recent activity: { }
Get with custom page size: { "hitsPerPage": 50 }
Use this to monitor real-time HackerNews activity or find the newest content.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| page | No | ||
| hitsPerPage | No |
Implementation Reference
- src/mcp.ts:90-132 (registration)Dynamic registration of tools fetched from remote API (https://mcp.xiaobenyang.com/getMcpDesc), including 'get-latest-posts'. Calls addToolXiaoBenYangApi for each tool with parsed schema and generic handler.for (const apiDesc of apiDescList) { let inputSchema = JSON.parse(apiDesc.inputSchema); const zodDict: Record<string, z.ZodTypeAny> = {}; Object.entries(inputSchema.properties).forEach(([name, propConfig]) => { let zodType; let pt = (propConfig as { type: string }).type; switch (pt) { case 'string': zodType = z.string(); break; case 'number': zodType = z.number(); break; case 'boolean': zodType = z.boolean(); break; case 'integer': zodType = z.int32(); break; case 'array': zodType = z.array(z.any()); break; case 'object': zodType = z.object(z.any()); break; default: zodType = z.any(); } if (inputSchema.required?.includes(name)) { zodDict[name] = zodType; } else { zodDict[name] = zodType.optional(); } }); addToolXiaoBenYangApi( apiDesc.name, apiDesc.description ? apiDesc.description : apiDesc.name, zodDict); }
- src/mcp.ts:15-36 (handler)Core handler logic that performs the HTTP POST to remote API endpoint with toolName as 'func' header, returns text content. Used for all tools including get-latest-posts.const calcXiaoBenYangApi = async function (fullArgs: Record<string, any>) { // 发起 POST 请求 let response = await fetch('https://mcp.xiaobenyang.com/api', { method: 'POST', headers: { 'XBY-APIKEY': apiKey, 'func': fullArgs.toolName, 'mcpid': mcpID }, body: new URLSearchParams(fullArgs) }); const apiResult = await response.text(); return { content: [ { type: "text", text: apiResult // 将字符串结果放入 content 中 } ] } as { [x: string]: unknown; content: [{ type: "text"; text: string }] }; };
- src/mcp.ts:39-48 (handler)Wrapper handler that adds toolName to args and calls calcXiaoBenYangApi. Registered as the tool executor for get-latest-posts.const handleXiaoBenYangApi = async (args: Record<string, any>, toolName: string) => { // 校验aid是否存在 if (toolName === undefined || toolName === null) { throw new Error("缺少必要参数 'aid'"); } // 合并参数 const fullArgs = {...args, toolName: toolName}; // 调用API return calcXiaoBenYangApi(fullArgs); };
- src/mcp.ts:51-65 (registration)Helper function to register a tool with generic handler and dynamic schema. Called for each tool including get-latest-posts.name: string, desc: string, params: Record<string, ZodType> ) { server.registerTool( name, { title: name, description: desc, inputSchema: params, } , async (args: Record<string, any>) => handleXiaoBenYangApi(args, name) ) };
- src/mcp.ts:94-125 (schema)Dynamic schema parsing from remote JSON to Zod types for tool input validation, used for get-latest-posts schema.Object.entries(inputSchema.properties).forEach(([name, propConfig]) => { let zodType; let pt = (propConfig as { type: string }).type; switch (pt) { case 'string': zodType = z.string(); break; case 'number': zodType = z.number(); break; case 'boolean': zodType = z.boolean(); break; case 'integer': zodType = z.int32(); break; case 'array': zodType = z.array(z.any()); break; case 'object': zodType = z.object(z.any()); break; default: zodType = z.any(); } if (inputSchema.required?.includes(name)) { zodDict[name] = zodType; } else { zodDict[name] = zodType.optional(); } });