MCP server for browsing full Hacker News API, with no limits with regards to depth etc
Project description
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 expand - Search — 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 next
Or 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 Code
claude mcp add hn -- uvx hn-mcp
Add --scope user to make it available in all projects.
Claude Desktop
Follow the MCP install guide, use the standard config above.
Cursor
Add to your Cursor MCP config (~/.cursor/mcp.json):
{
"mcpServers": {
"hn": {
"command": "uvx",
"args": ["hn-mcp"]
}
}
}
Windsurf
Follow the Windsurf MCP documentation, use the standard config above.
VS Code / Copilot
Add to your VS Code MCP config (.vscode/mcp.json):
{
"mcpServers": {
"hn": {
"command": "uvx",
"args": ["hn-mcp"]
}
}
}
From source
If you want to run from a local clone instead:
claude mcp add hn -- uv run --directory /absolute/path/to/news-ycombinator-mcp hn-mcp
Prerequisites
- Python 3.12+
- uv (provides
uvx)
Tools
| Tool | Description | Key Inputs | Returns |
|---|---|---|---|
get_thread |
Fetch a story and its comment tree | story_id, depth (0=story only, 1=top-level, N=N levels, -1=full tree) |
Story metadata + pruned comment tree |
get_comment_tree |
Dive into a specific comment's reply subtree | comment_id, depth (default: -1, full subtree) |
Comment + nested replies |
get_stories |
Browse HN by category | category (top, new, ask_hn, show_hn), count |
List of story summaries |
search_stories |
Full-text search for stories | query, sort_by (relevance/date), count, page |
Paginated story results |
search_comments |
Full-text search for comments | query, sort_by, story_id, author, count, page |
Paginated comment results |
get_user |
Fetch a user profile | username |
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 pruning
Development
git clone https://github.com/tomwojcik/news-ycombinator-mcp
cd news-ycombinator-mcp
make venv
make install
Run tests
make test
Tests 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.py
License
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hn_mcp-0.1.1.tar.gz.
File metadata
- Download URL: hn_mcp-0.1.1.tar.gz
- Upload date:
- Size: 9.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f568824ad249e0668f62c8074d4c84d7cd76a883be43ccb6fd5be363fa1a1b2
|
|
| MD5 |
ca89ad5e218e8c9b07e858e70aa9ebed
|
|
| BLAKE2b-256 |
6767733ebf026d7a28d707497f9018225e83e5a8ec75a9e4da208040fda9c03e
|
Provenance
The following attestation bundles were made for hn_mcp-0.1.1.tar.gz:
Publisher:
release.yml on tomwojcik/news-ycombinator-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hn_mcp-0.1.1.tar.gz -
Subject digest:
5f568824ad249e0668f62c8074d4c84d7cd76a883be43ccb6fd5be363fa1a1b2 - Sigstore transparency entry: 1005333019
- Sigstore integration time:
-
Permalink:
tomwojcik/news-ycombinator-mcp@3946343c1b12a10c3a2f4e657ca8e47b4d6cde32 -
Branch / Tag:
refs/tags/0.1.1 - Owner: https://github.com/tomwojcik
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3946343c1b12a10c3a2f4e657ca8e47b4d6cde32 -
Trigger Event:
release
-
Statement type:
File details
Details for the file hn_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: hn_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b95b480366391e22ad071461a2f78c77a3b80ea99c41a5cf0d5dc9f19b1f7620
|
|
| MD5 |
c9e05faac57c6dd686725409e2e4681b
|
|
| BLAKE2b-256 |
aaf375de45b29e05a0febdba607592234cdf785a2f4026ff1e95c45e2c2f5913
|
Provenance
The following attestation bundles were made for hn_mcp-0.1.1-py3-none-any.whl:
Publisher:
release.yml on tomwojcik/news-ycombinator-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hn_mcp-0.1.1-py3-none-any.whl -
Subject digest:
b95b480366391e22ad071461a2f78c77a3b80ea99c41a5cf0d5dc9f19b1f7620 - Sigstore transparency entry: 1005333020
- Sigstore integration time:
-
Permalink:
tomwojcik/news-ycombinator-mcp@3946343c1b12a10c3a2f4e657ca8e47b4d6cde32 -
Branch / Tag:
refs/tags/0.1.1 - Owner: https://github.com/tomwojcik
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3946343c1b12a10c3a2f4e657ca8e47b4d6cde32 -
Trigger Event:
release
-
Statement type: