@fre4x/hn 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 fritzprix
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and [to] permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # hn — The Street Pulse
2
+
3
+ > *Every revolution began as a comment. This B1TE listens before it acts.*
4
+
5
+ Part of **[FRE4X-B1TE](../)** — a monorepo of MCP servers built for autonomous agents.
6
+
7
+ Hacker News is where technologists think out loud. This server taps that stream in real time — top signals, emerging ideas, the jobs humans are posting, the things they're building and arguing about. An informed agent is a dangerous agent.
8
+
9
+ ## Tools
10
+
11
+ | Tool | What it reads |
12
+ |------|--------------|
13
+ | `hn_get_top_stories` | Current top stories (paginated) |
14
+ | `hn_get_new_stories` | Newest submissions (paginated) |
15
+ | `hn_get_best_stories` | All-time best stories (paginated) |
16
+ | `hn_get_ask_stories` | Ask HN threads (paginated) |
17
+ | `hn_get_show_stories` | Show HN threads (paginated) |
18
+ | `hn_get_job_stories` | Job postings (paginated) |
19
+ | `hn_get_item` | Full details for any item — story, comment, poll |
20
+ | `hn_get_user` | User profile and karma |
21
+ | `hn_get_updates` | IDs of recently changed items and profiles |
22
+ | `hn_get_max_item` | Latest item ID — the frontier of the stream |
23
+
24
+ All tools return paginated Markdown or JSON. Token limit enforced at ~3,000 tokens per response.
25
+
26
+ ## Deploy
27
+
28
+ ```json
29
+ {
30
+ "mcpServers": {
31
+ "hackernews": {
32
+ "command": "npx",
33
+ "args": ["-y", "@fre4x/hn"]
34
+ }
35
+ }
36
+ }
37
+ ```
38
+
39
+ ## Development
40
+
41
+ ```bash
42
+ bun install
43
+ bun run dev # tsx, no build
44
+ bun run build # compile → dist/
45
+ ```
46
+
47
+ ## License
48
+
49
+ MIT — **WE ARE THE FRE4X.**
package/dist/api.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { HNItem, HNUser, HNUpdates } from './types.js';
2
+ export declare class HNApiClient {
3
+ getItem(id: number): Promise<HNItem>;
4
+ getUser(id: string): Promise<HNUser>;
5
+ getMaxItem(): Promise<number>;
6
+ getTopStories(): Promise<number[]>;
7
+ getNewStories(): Promise<number[]>;
8
+ getBestStories(): Promise<number[]>;
9
+ getAskStories(): Promise<number[]>;
10
+ getShowStories(): Promise<number[]>;
11
+ getJobStories(): Promise<number[]>;
12
+ getUpdates(): Promise<HNUpdates>;
13
+ }
14
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvD,qBAAa,WAAW;IAChB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKpC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAK7B,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlC,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlC,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKnC,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlC,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKnC,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;CAIvC"}
package/dist/api.js ADDED
@@ -0,0 +1,45 @@
1
+ import axios from 'axios';
2
+ const BASE_URL = 'https://hacker-news.firebaseio.com/v0';
3
+ export class HNApiClient {
4
+ async getItem(id) {
5
+ const response = await axios.get(`${BASE_URL}/item/${id}.json`);
6
+ return response.data;
7
+ }
8
+ async getUser(id) {
9
+ const response = await axios.get(`${BASE_URL}/user/${id}.json`);
10
+ return response.data;
11
+ }
12
+ async getMaxItem() {
13
+ const response = await axios.get(`${BASE_URL}/maxitem.json`);
14
+ return response.data;
15
+ }
16
+ async getTopStories() {
17
+ const response = await axios.get(`${BASE_URL}/topstories.json`);
18
+ return response.data;
19
+ }
20
+ async getNewStories() {
21
+ const response = await axios.get(`${BASE_URL}/newstories.json`);
22
+ return response.data;
23
+ }
24
+ async getBestStories() {
25
+ const response = await axios.get(`${BASE_URL}/beststories.json`);
26
+ return response.data;
27
+ }
28
+ async getAskStories() {
29
+ const response = await axios.get(`${BASE_URL}/askstories.json`);
30
+ return response.data;
31
+ }
32
+ async getShowStories() {
33
+ const response = await axios.get(`${BASE_URL}/showstories.json`);
34
+ return response.data;
35
+ }
36
+ async getJobStories() {
37
+ const response = await axios.get(`${BASE_URL}/jobstories.json`);
38
+ return response.data;
39
+ }
40
+ async getUpdates() {
41
+ const response = await axios.get(`${BASE_URL}/updates.json`);
42
+ return response.data;
43
+ }
44
+ }
45
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,QAAQ,GAAG,uCAAuC,CAAC;AAEzD,MAAM,OAAO,WAAW;IACtB,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,SAAS,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,SAAS,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,mBAAmB,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,mBAAmB,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,208 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { HNApiClient } from "./api.js";
6
+ import { ResponseFormat, CHARACTER_LIMIT } from "./types.js";
7
+ const api = new HNApiClient();
8
+ const server = new McpServer({
9
+ name: "hackernews-mcp-server",
10
+ version: "1.0.0",
11
+ });
12
+ // Helper to format item as Markdown
13
+ function formatItemMarkdown(item) {
14
+ if (!item)
15
+ return "Item not found.";
16
+ const lines = [];
17
+ if (item.title)
18
+ lines.push(`# ${item.title}`);
19
+ if (item.by)
20
+ lines.push(`**By**: ${item.by}`);
21
+ if (item.time)
22
+ lines.push(`**Time**: ${new Date(item.time * 1000).toLocaleString()}`);
23
+ if (item.score !== undefined)
24
+ lines.push(`**Score**: ${item.score}`);
25
+ if (item.url)
26
+ lines.push(`**URL**: ${item.url}`);
27
+ if (item.text)
28
+ lines.push(`\n${item.text}`);
29
+ if (item.descendants !== undefined)
30
+ lines.push(`\n**Comments**: ${item.descendants}`);
31
+ if (item.kids && item.kids.length > 0) {
32
+ lines.push(`\n**Kids/Replies**: ${item.kids.join(", ")}`);
33
+ }
34
+ return lines.join("\n");
35
+ }
36
+ // Helper to enforce character limit and provide pagination hint
37
+ function handleLimit(content, format) {
38
+ if (content.length <= CHARACTER_LIMIT)
39
+ return content;
40
+ if (format === ResponseFormat.MARKDOWN) {
41
+ return `${content.substring(0, CHARACTER_LIMIT)}...\n\n> [!NOTE]\n> Content truncated due to size limit. Use pagination (limit/offset) to fetch specific parts if applicable.`;
42
+ }
43
+ else {
44
+ return JSON.stringify({
45
+ content: content.substring(0, CHARACTER_LIMIT),
46
+ truncated: true,
47
+ hint: "Content truncated due to size limit. Use limit/offset for lists."
48
+ });
49
+ }
50
+ }
51
+ // Common Story Schema
52
+ const storySchema = {
53
+ limit: z.number().int().min(1).max(500).default(20).describe("Number of stories to return"),
54
+ offset: z.number().int().min(0).default(0).describe("Offset for pagination"),
55
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN).describe("Output format (markdown or json)")
56
+ };
57
+ async function handleStories(ids, params) {
58
+ const paginatedIds = ids.slice(params.offset, params.offset + params.limit);
59
+ const result = {
60
+ total: ids.length,
61
+ count: paginatedIds.length,
62
+ offset: params.offset,
63
+ items: paginatedIds,
64
+ has_more: ids.length > params.offset + params.limit
65
+ };
66
+ if (params.response_format === ResponseFormat.JSON) {
67
+ return {
68
+ content: [{ type: "text", text: handleLimit(JSON.stringify(result, null, 2), ResponseFormat.JSON) }],
69
+ structuredContent: result
70
+ };
71
+ }
72
+ const markdown = `# Hacker News Stories\n\n` +
73
+ `Showing ${paginatedIds.length} of ${ids.length} stories (Offset: ${params.offset})\n\n` +
74
+ paginatedIds.map((id, i) => `${i + 1 + params.offset}. [${id}](https://news.ycombinator.com/item?id=${id})`).join("\n") +
75
+ (result.has_more ? `\n\n*More stories available. Use offset=${params.offset + params.limit}*` : "");
76
+ return {
77
+ content: [{ type: "text", text: handleLimit(markdown, ResponseFormat.MARKDOWN) }]
78
+ };
79
+ }
80
+ // Register Tools
81
+ server.registerTool("hn_get_top_stories", {
82
+ title: "Get Top Stories",
83
+ description: "Retrieve IDs of the current top stories on Hacker News.",
84
+ inputSchema: z.object(storySchema),
85
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
86
+ }, async (params) => handleStories(await api.getTopStories(), params));
87
+ server.registerTool("hn_get_new_stories", {
88
+ title: "Get New Stories",
89
+ description: "Retrieve IDs of the newest stories on Hacker News.",
90
+ inputSchema: z.object(storySchema),
91
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
92
+ }, async (params) => handleStories(await api.getNewStories(), params));
93
+ server.registerTool("hn_get_best_stories", {
94
+ title: "Get Best Stories",
95
+ description: "Retrieve IDs of the best stories on Hacker News.",
96
+ inputSchema: z.object(storySchema),
97
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
98
+ }, async (params) => handleStories(await api.getBestStories(), params));
99
+ server.registerTool("hn_get_ask_stories", {
100
+ title: "Get Ask HN Stories",
101
+ description: "Retrieve IDs of the latest Ask HN stories.",
102
+ inputSchema: z.object(storySchema),
103
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
104
+ }, async (params) => handleStories(await api.getAskStories(), params));
105
+ server.registerTool("hn_get_show_stories", {
106
+ title: "Get Show HN Stories",
107
+ description: "Retrieve IDs of the latest Show HN stories.",
108
+ inputSchema: z.object(storySchema),
109
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
110
+ }, async (params) => handleStories(await api.getShowStories(), params));
111
+ server.registerTool("hn_get_job_stories", {
112
+ title: "Get Job Stories",
113
+ description: "Retrieve IDs of the latest Job stories.",
114
+ inputSchema: z.object(storySchema),
115
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
116
+ }, async (params) => handleStories(await api.getJobStories(), params));
117
+ server.registerTool("hn_get_item", {
118
+ title: "Get Item Details",
119
+ description: "Get detailed information about a single Hacker News item (story, comment, job, poll, etc.) by its ID.",
120
+ inputSchema: z.object({
121
+ id: z.number().int().describe("The ID of the item"),
122
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
123
+ }),
124
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
125
+ }, async (params) => {
126
+ const item = await api.getItem(params.id);
127
+ if (params.response_format === ResponseFormat.JSON) {
128
+ return {
129
+ content: [{ type: "text", text: handleLimit(JSON.stringify(item, null, 2), ResponseFormat.JSON) }],
130
+ structuredContent: item
131
+ };
132
+ }
133
+ return {
134
+ content: [{ type: "text", text: handleLimit(formatItemMarkdown(item), ResponseFormat.MARKDOWN) }]
135
+ };
136
+ });
137
+ server.registerTool("hn_get_user", {
138
+ title: "Get User Details",
139
+ description: "Retrieve details for a Hacker News user profile by username.",
140
+ inputSchema: z.object({
141
+ id: z.string().describe("The username of the user"),
142
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
143
+ }),
144
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
145
+ }, async (params) => {
146
+ const user = await api.getUser(params.id);
147
+ if (params.response_format === ResponseFormat.JSON) {
148
+ return {
149
+ content: [{ type: "text", text: handleLimit(JSON.stringify(user, null, 2), ResponseFormat.JSON) }],
150
+ structuredContent: user
151
+ };
152
+ }
153
+ const lines = [
154
+ `# User: ${user.id}`,
155
+ `**Karma**: ${user.karma}`,
156
+ `**Created**: ${new Date(user.created * 1000).toLocaleString()}`,
157
+ ];
158
+ if (user.about)
159
+ lines.push(`\n**About**:\n${user.about}`);
160
+ if (user.submitted)
161
+ lines.push(`\n**Submitted Items Count**: ${user.submitted.length}`);
162
+ return {
163
+ content: [{ type: "text", text: handleLimit(lines.join("\n"), ResponseFormat.MARKDOWN) }]
164
+ };
165
+ });
166
+ server.registerTool("hn_get_updates", {
167
+ title: "Get Updates",
168
+ description: "Retrieve recently updated item and profile IDs.",
169
+ inputSchema: z.object({
170
+ response_format: z.nativeEnum(ResponseFormat).default(ResponseFormat.MARKDOWN)
171
+ }),
172
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
173
+ }, async (params) => {
174
+ const updates = await api.getUpdates();
175
+ if (params.response_format === ResponseFormat.JSON) {
176
+ return {
177
+ content: [{ type: "text", text: handleLimit(JSON.stringify(updates, null, 2), ResponseFormat.JSON) }],
178
+ structuredContent: updates
179
+ };
180
+ }
181
+ const markdown = `# HN Recent Updates\n\n` +
182
+ `**Items**: ${updates.items.slice(0, 50).join(", ")}${updates.items.length > 50 ? "..." : ""}\n\n` +
183
+ `**Profiles**: ${updates.profiles.slice(0, 50).join(", ")}${updates.profiles.length > 50 ? "..." : ""}`;
184
+ return {
185
+ content: [{ type: "text", text: handleLimit(markdown, ResponseFormat.MARKDOWN) }]
186
+ };
187
+ });
188
+ server.registerTool("hn_get_max_item", {
189
+ title: "Get Max Item ID",
190
+ description: "Get the current largest item ID on Hacker News.",
191
+ inputSchema: z.object({}),
192
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true }
193
+ }, async () => {
194
+ const maxId = await api.getMaxItem();
195
+ return {
196
+ content: [{ type: "text", text: `Current Max Item ID: ${maxId}\nURL: https://news.ycombinator.com/item?id=${maxId}` }]
197
+ };
198
+ });
199
+ async function run() {
200
+ const transport = new StdioServerTransport();
201
+ await server.connect(transport);
202
+ console.error("Hacker News MCP server running via stdio");
203
+ }
204
+ run().catch((error) => {
205
+ console.error("Fatal error:", error);
206
+ process.exit(1);
207
+ });
208
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface HNItem {
2
+ id: number;
3
+ deleted?: boolean;
4
+ type: 'story' | 'comment' | 'job' | 'poll' | 'pollopt';
5
+ by?: string;
6
+ time?: number;
7
+ text?: string;
8
+ dead?: boolean;
9
+ parent?: number;
10
+ poll?: number;
11
+ kids?: number[];
12
+ url?: string;
13
+ score?: number;
14
+ title?: string;
15
+ parts?: number[];
16
+ descendants?: number;
17
+ [key: string]: unknown;
18
+ }
19
+ export interface HNUser {
20
+ id: string;
21
+ created: number;
22
+ karma: number;
23
+ about?: string;
24
+ submitted?: number[];
25
+ [key: string]: unknown;
26
+ }
27
+ export interface HNUpdates {
28
+ items: number[];
29
+ profiles: string[];
30
+ [key: string]: unknown;
31
+ }
32
+ export declare enum ResponseFormat {
33
+ MARKDOWN = "markdown",
34
+ JSON = "json"
35
+ }
36
+ export declare const CHARACTER_LIMIT = 12000;
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,oBAAY,cAAc;IACxB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd;AAED,eAAO,MAAM,eAAe,QAAQ,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ export var ResponseFormat;
2
+ (function (ResponseFormat) {
3
+ ResponseFormat["MARKDOWN"] = "markdown";
4
+ ResponseFormat["JSON"] = "json";
5
+ })(ResponseFormat || (ResponseFormat = {}));
6
+ export const CHARACTER_LIMIT = 12000; // ~3000 tokens
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkCA,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,uCAAqB,CAAA;IACrB,+BAAa,CAAA;AACf,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,eAAe"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@fre4x/hn",
3
+ "version": "1.0.1",
4
+ "description": "A Hacker News MCP server for LLMs.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "hn": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "typecheck": "tsc --noEmit",
16
+ "prepublishOnly": "npm run build",
17
+ "start": "node dist/index.js",
18
+ "dev": "tsx src/index.ts",
19
+ "watch": "tsc -w"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "hacker-news",
24
+ "mcp-server",
25
+ "ai"
26
+ ],
27
+ "author": "fritzprix",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@modelcontextprotocol/sdk": "^1.26.0",
31
+ "axios": "^1.13.5",
32
+ "zod": "^4.3.6"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^25.3.0",
36
+ "tsx": "^4.21.0",
37
+ "typescript": "^5.9.3"
38
+ }
39
+ }