index.ts•1.5 kB
import express from "express";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'
import { z } from "zod";
const app = express();
const server = new McpServer({
name: "hackernews-server",
version: "1.0.0"
});
server.tool(
"get-hackernews-top-stories",
"Get the stories from Hacker News",
{
type: z.enum(['topstories', 'newstories', 'beststories']),
amount: z.number().min(1).max(500).default(10)
},
async (params) => {
const response = await fetch(`https://hacker-news.firebaseio.com/v0/${params.type}.json`);
const ids = await response.json();
const stories = await Promise.all(ids.slice(0, params.amount).map(async (id: number) => {
const storyResponse = await fetch(`https://hacker-news.firebaseio.com/v0/item/${id}.json`);
return storyResponse.json();
}));
return {
content: stories.map((story) => ({
type: "text",
text: JSON.stringify(story)
}))
};
}
)
let transport: SSEServerTransport | null = null;
app.get("/sse", (req, res) => {
transport = new SSEServerTransport("/messages", res);
server.connect(transport);
});
app.post("/messages", (req, res) => {
if (transport) {
transport.handlePostMessage(req, res);
}
});
app.listen(3000, () => {
console.log("Server is running on port 3000");
});