hn_get_storiesLABSCO SUMMARY
A thread read as a thread, not as a list of comment ids.
hn_get_thread walks the tree breadth-first in HN's own ranking order and returns depth and parentId per comment, so an agent can summarise a discussion rather than a heap of replies. Depth 0 doubles as a single-item lookup, which saves a separate tool for the same job.
What it is
A TypeScript server over the Hacker News Firebase API and Algolia search. Four read-only tools; no key, because both APIs are public.
What you get
- Stories from any of six feeds — top, new, best, ask, show and jobs — with a count from 1 to 100 and an offset for paging — hn_get_stories
- An item and its comment tree by ranked breadth-first traversal, depth 0 to 10 and up to 200 comments, flattened with depth and parentId so the tree can be rebuilt — hn_get_thread
- A user profile with karma, creation date and about text, optionally resolving up to 50 submissions per page — hn_get_user
- Full-text search over stories and comments through Algolia, filtered by type, author, date range and minimum points — hn_search_content
- A compact search view that drops the two body-text fields, which otherwise repeat a long comment twice per hit
- Server instructions delivered on initialize — item types, id reuse across tools, case-sensitive usernames and field sparsity
Requirements
Nothing to authenticate. Run npx -y @cyanheads/hn-mcp-server over stdio, use the published Docker image, or point a Streamable HTTP client at the public instance at https://hn.caseyjhand.com/mcp. A local install wants Bun v1.3.0 or Node.js 24 and above; HN_CONCURRENCY_LIMIT defaults to 10 and caps batch item fetches.
Setup effort
One command — npx -y @cyanheads/hn-mcp-server
USE CASES
Catching up on what is being discussed
Pull a feed with a count and an offset, and get enriched stories back — title, URL, score, author, comment count and body text.
Summarising a long comment thread
Fetch the item with its comment tree under a depth and total limit, ranked as HN ranks it, flattened with the structure preserved.
Finding earlier discussion of a topic
Full-text search filtered by type, author, date range and minimum points, with the compact view keeping long comments from doubling in size.
Looking up who said something
A profile with karma and about text, and their submissions paged fifty at a time with dead and deleted items filtered out.
4 tools
Listed in project docs. Your client may show a different list.
hn_get_threadhn_get_userhn_search_contentBEFORE YOU INSTALL
What to know first
Tools you get
4 tools named in the project's documentation.
Requires
A client that can reach a remote MCP server over HTTP
INSTALLATION
Connect your client
Server setup
npx
npx -y @cyanheads/hn-mcp-serverHosted endpoint
https://hn.caseyjhand.com/mcpAdd this hosted endpoint to your MCP client.
MCP Clients
Claude Desktop
Download hn-mcp-server.mcpb from https://github.com/cyanheads/hn-mcp-server/releases/latest/download/hn-mcp-server.mcpb
Open the downloaded file to install it in Claude Desktop.
Cursor
{
"mcpServers": {
"hn-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/hn-mcp-server"
]
}
}
}Any MCP client — HTTP
{
"mcpServers": {
"hn-mcp-server": {
"type": "streamable-http",
"url": "https://hn.caseyjhand.com/mcp"
}
}
}Clients spell the "type" value differently: Claude Code and VS Code use "http", Cline uses "streamableHttp", and Roo Code uses "streamable-http". Claude Desktop does not accept a URL entry in its config file; remote servers go under Settings → Connectors.
Any MCP client — bunx
{
"mcpServers": {
"hn-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": [
"@cyanheads/hn-mcp-server@latest"
],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Any MCP client — Docker
{
"mcpServers": {
"hn-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/hn-mcp-server:latest"
]
}
}
}