hn-mcp
Provides tools to search and retrieve Hacker News stories and comments via the Algolia API, including full comment trees with depth control and smart pruning.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@hn-mcpget the top 10 stories from Hacker News"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
hn-mcp
HN threads have 500+ comments nested 10 levels deep. Your AI agent needs to read them without blowing its context window.
hn-mcp is an MCP server that gives AI agents full access to Hacker News — complete comment trees, search, and user profiles — with depth control so they can explore progressively instead of fetching everything at once.
Features
Full comment trees — no depth limits, no truncation
Depth control — fetch just top-level comments or the entire tree
Smart pruning —
reply_countat cut-off points so agents decide what to expandSearch — full-text search across stories and comments with filters
No API keys — uses the public Algolia HN API
100% test coverage — tested with VCR cassettes, no network calls needed
Typical agent workflow
1. get_thread(42123456, depth=1) → story + 85 top-level comments with reply_counts
2. Agent picks Comment A (47 replies)
3. get_comment_tree(comment_a_id) → full 47-reply subtree
4. Agent summarizes branch, picks nextOr for smaller threads, just get_thread(id, depth=-1) to get the entire tree at once.
Getting started
Standard config works in most tools:
{
"mcpServers": {
"hn": {
"command": "uvx",
"args": ["hn-mcp"]
}
}
}claude mcp add hn -- uvx hn-mcpAdd --scope user to make it available in all projects.
Follow the MCP install guide, use the standard config above.
Add to your Cursor MCP config (~/.cursor/mcp.json):
{
"mcpServers": {
"hn": {
"command": "uvx",
"args": ["hn-mcp"]
}
}
}Follow the Windsurf MCP documentation, use the standard config above.
Add to your VS Code MCP config (.vscode/mcp.json):
{
"mcpServers": {
"hn": {
"command": "uvx",
"args": ["hn-mcp"]
}
}
}If you want to run from a local clone instead:
claude mcp add hn -- uv run --directory /absolute/path/to/news-ycombinator-mcp hn-mcpPrerequisites
Python 3.12+
uv (provides
uvx)
Related MCP server: Hacker News MCP Server
Tools
Tool | Description | Key Inputs | Returns |
| Fetch a story and its comment tree |
| Story metadata + pruned comment tree |
| Dive into a specific comment's reply subtree |
| Comment + nested replies |
| Browse HN by category |
| List of story summaries |
| Full-text search for stories |
| Paginated story results |
| Full-text search for comments |
| Paginated comment results |
| Fetch a user profile |
| Username, karma, about, created date |
Depth parameter
The depth parameter on get_thread and get_comment_tree controls how much of the tree you get:
depth=0 (no comments — story metadata only)
depth=1 Comment A (reply_count=3) ← just the comment + count
depth=2 Comment A ← comment + direct replies
├── Reply A1 (reply_count=2)
├── Reply A2 (reply_count=0)
└── Reply A3 (reply_count=1)
depth=-1 Full tree, no pruningDevelopment
git clone https://github.com/tomwojcik/news-ycombinator-mcp
cd news-ycombinator-mcp
make venv
make installRun tests
make testTests use vcrpy cassettes — no network calls needed. Coverage is reported automatically.
Re-record cassettes
If the Algolia API response format changes:
# In tests/conftest.py, temporarily change record_mode to "new_episodes"
uv run pytest
# Then change it back to "none"Project structure
src/hn_mcp/
├── app.py # FastMCP instance + tree pruning helpers
├── client.py # HNClient — async Algolia API client
├── server.py # Entrypoint
├── types.py # TypedDict definitions for all responses
└── tools/
├── get_thread.py
├── get_comment_tree.py
├── get_stories.py
├── search_stories.py
├── search_comments.py
└── get_user.pyLicense
MIT — see LICENSE.
Contributing
Contributions welcome. Please open an issue first to discuss what you'd like to change.
When submitting a PR:
Add tests for new functionality
Record VCR cassettes for any new API calls
Ensure
uv run pytestpasses with 100% coverage
Available Tools
6 toolsget_comment_treeA
Fetch a specific comment and its reply subtree.
Use this to dive into a branch after scanning top-level comments
with get_thread(depth=1).
Args:
comment_id: The HN comment ID.
depth: How many levels of replies to include below this comment.
0 = this comment only (with reply_count).
N = N levels of replies.
-1 = full subtree (default).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| comment_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains depth semantics: 0 means only the comment with reply_count, N means N levels, -1 means full subtree. This goes beyond schema defaults and gives the agent essential knowledge about response behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: a one-line summary, a usage sentence, then a structured Args list. Every element serves a purpose, with no redundant fluff. The format is easy to scan and parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return structure is available elsewhere. The description covers the critical contextual points: how to use it relative to get_thread, how the depth parameter behaves, and what depth=0 returns. For a relatively simple two-parameter tool, this is complete and actionable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, meaning no parameter descriptions exist in the schema. The description compensates fully: comment_id is identified as 'The HN comment ID' and depth is detailed with all three modes (0, N, -1) and the default behavior. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch a specific comment and its reply subtree.' This clearly distinguishes it from sibling tools like get_thread (top-level comments) and search_comments. The purpose is unambiguous and immediately understood.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explicitly states when to use this tool: 'dive into a branch after scanning top-level comments with get_thread(depth=1).' It names the alternative tool and provides a concrete use case, giving the agent clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storiesA
Browse HN stories by category. Returns metadata only (no comments).
Args:
category: One of: top, new, ask_hn, show_hn.
count: Number of stories to return (default 20, max 100).
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| category | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It states that only metadata is returned (no comments), defines count limits, and implies a read-only operation through 'Browse' and 'Returns.' It does not discuss rate limits or authentication, but for this simple HN read tool, the core behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely efficient: two purpose/behavior sentences plus a clean, well-formatted argument list. Every sentence carries meaningful information and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple browse tool with an output schema present, the description covers purpose, return type, parameter semantics, and constraints. No critical context is missing for selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema: it explains count as 'Number of stories to return' with default and max values, and enumerates category options in plain language. The schema provides enum/default but no descriptions; the description compensates well, though it could slightly expand on what each category signifies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Browse HN stories by category.' It further clarifies scope with 'Returns metadata only (no comments),' which distinguishes it from comment- and thread-focused sibling tools. This is clear and non-tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly frames the tool as a category-based story browser and notes it returns metadata only, implying it is not for comment retrieval or searching. However, it does not explicitly name alternatives or provide when-not-to-use guidance relative to search_stories or get_thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadA
Fetch a story and its comment tree from Hacker News.
Args:
story_id: The HN story ID.
depth: How many levels of comment nesting to include.
0 = story metadata only, no comments.
1 = top-level comments only (each includes reply_count).
2 = top-level + their direct replies.
N = N levels deep.
-1 = entire tree, no limits.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| story_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well by explaining the depth parameter's exact behavior (0, 1, 2, N, -1) and noting that top-level comments include reply_count. It doesn't mention potential side effects or rate limits, but for a read-only fetch the depth detail is substantive transparency beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized, opening with a clear one-sentence purpose and then using a structured list for arguments. Every line adds meaningful information, with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has a simple parameter set and an output schema, the description covers the essential behavior well, especially the depth options. It misses only an explicit note on how this relates to sibling get_comment_tree, which would strengthen completeness in the sibling context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description meticulously defines both parameters: story_id as 'The HN story ID' and depth with level-by-level semantics including special value -1. This fully compensates for the schema's lack of descriptions, going beyond mere names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches 'a story and its comment tree from Hacker News,' with a specific verb and resource. It doesn't explicitly differentiate from the sibling get_comment_tree, which could be ambiguous, but the mention of 'story and its comment tree' gives a distinct scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when the agent needs story metadata and nested comments, and the depth parameter provides guidance on how much of the tree to retrieve. However, it doesn't explicitly state when to prefer this over get_comment_tree or other sibling tools, leaving the when-to-use guidance implicit rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userB
Fetch a Hacker News user profile.
Args:
username: The HN username.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only says 'Fetch a Hacker News user profile' with no mention of return format, error handling, rate limits, or permission requirements. It discloses the basic action but little else.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the purpose. It is concise and to the point, though extremely terse with no additional structure or context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single parameter and an output schema present, the description doesn't need to explain return values. However, it lacks any usage context or behavioral caveats. Given its simplicity, it is barely adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions (0% coverage), so the description's 'Args: username: The HN username' adds minimal but necessary meaning. It confirms the required parameter's semantics beyond the schema's title alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Fetch a Hacker News user profile' with a clear verb and resource. This distinguishes it from sibling tools that fetch threads, comment trees, stories, or search results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided about when to use this tool versus alternatives. The description only states what it does, leaving the agent to infer usage from the tool name and sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_commentsA
Full-text search for HN comments.
Args:
query: Search terms.
sort_by: "relevance" or "date".
story_id: Optional — only search comments on this story.
author: Optional — only search comments by this author.
count: Results per page (default 20, max 100).
page: Page number, 0-indexed.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| count | No | ||
| query | Yes | ||
| author | No | ||
| sort_by | No | relevance | |
| story_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses search behavior and sort options ('relevance' or 'date'), but does not explicitly state read-only nature, output format, or potential side effects. The output schema covers return shape, but the description adds limited behavioral context beyond the parameter list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a brief summary followed by a tight, structured parameter list. Every sentence is informative and there is no redundant content. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so not explaining return values is fine. The description covers all parameters, defaults, and constraints (e.g., count max, page 0-indexed), making it complete for successful invocation. It lacks explicit rate limit or auth info, but these are not critical for a public HN search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description fully compensates by explaining every parameter: 'story_id: Optional — only search comments on this story,' 'count: Results per page (default 20, max 100),' 'page: Page number, 0-indexed.' This adds meaning well beyond the schema's bare types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Full-text search for HN comments,' a specific verb+resource that clearly distinguishes it from sibling tools like search_stories and get_thread. The parameter list further clarifies its comment-specific scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool (searching comments) through its title and 'Full-text search' context, but it does not explicitly name alternatives or provide exclusions. This is clear context without explicit 'do not use if' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_storiesA
Full-text search for HN stories.
Args:
query: Search terms.
sort_by: "relevance" or "date".
count: Results per page (default 20, max 100).
page: Page number, 0-indexed.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| count | No | ||
| query | Yes | ||
| sort_by | No | relevance |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It does disclose useful operational details like count default (20), max limit (100), and 0-indexed page numbers, but it does not describe response behavior, empty-result handling, or potential search caveats. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: a one-sentence purpose followed by a clean argument list. Every line provides useful information, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema covers return values and the tool is relatively simple, the description is fairly complete. It covers pagination, sorting, and result count constraints. It lacks explicit sibling-tool guidance, but that is a usage-guidelines concern rather than a completeness gap here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage, but the description documents all four parameters. It adds meaningful semantics beyond the schema, especially count's max value and page's 0-indexing. Some entries like 'query: Search terms' are minimal, but overall it compensates well for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Full-text search for HN stories', which clearly names the action (search) and the target resource (HN stories). This also differentiates it from siblings like search_comments, get_stories, and get_thread by resource type and search behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given about when to use this tool versus alternatives such as search_comments or get_stories. The intended use is implied by the word 'search' and the parameter list, but there are no clear exclusions or 'use this instead' hints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
get_comment_tree - First observed
get_stories - First observed
get_thread - First observed
get_user - First observed
search_comments - First observed
search_stories
TDQS
Scored across 6 tools
Each tool addresses a distinct purpose: browsing story lists, fetching a story with comments, drilling into a comment subtree, retrieving user profiles, and searching stories/comments. No overlap in core functionality.
All retrieval tools follow a consistent 'get_' prefix, while search tools use 'search_', making the naming pattern predictable and easy to navigate.
Six tools cover the essential read-only operations for Hacker News without excessive granularity or unnecessary overlap, which is well-scoped for the domain.
The toolkit provides comprehensive coverage for browsing HN: story feeds, story/comment retrieval with configurable depth, user profiles, and full-text search for both stories and comments. No obvious gaps for a read-only client.
Maintenance
Related MCP Connectors
Dive into the latest and greatest from the tech world with our Hacker News MCP server.
Hacker News MCP — search and retrieve stories from Hacker News
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables AI tools like Claude and Cursor to fetch and interact with live Hacker News data (posts, comments, users) via standardized MCP endpoints.114733MIT
- AlicenseDqualityDmaintenanceAn MCP server that enables AI assistants to access real-time Hacker News data including top stories, story details, comments, and search functionality.1143MIT
- AlicenseAqualityDmaintenanceMCP server for Hacker News that enables AI agents to search stories, read comments, and track tech trends via the public Hacker News API and Algolia HN Search.10104MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to access Hacker News data including stories, items, users, and comments via MCP tools.-