Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/hn-mcp-server

REMOTE · HN.CASEYJHAND.COM · 2 COMPONENTS

Browse Hacker News feeds, threads, and user profiles with full-text search.

0 this week 89 Trust /100

Last scanned (26 minutes ago)

Scores higher than 97% of remote servers

Reachable. Last reached 5 Nov 2026.

Category News and Social

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security83
Transport & Reachability100
Schema Quality & AI Usability75
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 1825 tokens (~365/item across 5 items; 4 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 4 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 6 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1
    • Stability: 0.97 → pass security
  • 4 Nov 26 −1
    • Stability: pass → 0.97 functional
  • 28 Oct 26 +3
    • Schema quality: 1596 → 1825 ▼ functional
    • Schema quality: unverified → 100 ▲ functional
    • New resource “hn-guide” functional
    • Server version: 0.5.22 → 0.6.0 functional
    • “hn_get_thread” reworded the description of “maxComments” cosmetic
    • “hn_search_content” reworded the description of “query” cosmetic
    • “hn_search_content” reworded the description of “view” cosmetic
  • 19 Oct 26 −1
    • Schema quality: 305 → 399 ▼ functional
    • Server version: 0.5.21 → 0.5.22 functional
    • “hn_search_content” reworded the description of “tags” cosmetic
    • “hn_search_content” reworded the description of “storyId” cosmetic
    • “hn_search_content” reworded the description of “query” cosmetic
    • “hn_search_content” reworded the description of “page” cosmetic
    • “hn_search_content” reworded the description of “count” cosmetic
    • “hn_search_content” reworded the description of “author” cosmetic
    • “hn_get_user” reworded the description of “submissionOffset” cosmetic
    • “hn_get_user” reworded the description of “submissionCount” cosmetic
    • “hn_get_thread” reworded the description of “maxComments” cosmetic
    • “hn_get_thread” reworded the description of “depth” cosmetic
    • “hn_get_stories” reworded the description of “count” cosmetic
  • 6 Oct 26 0
    • Server version: 0.5.20 → 0.5.21 functional
  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Sept 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “hn_search_content” rewrote its description, which is the text the model reads security
    • Tool “hn_get_thread” rewrote its description, which is the text the model reads security
    • Schema quality: 228 → 305 ▼ functional
    • Server version: 0.5.19 → 0.5.20 functional
    • Server version: 0.5.17 → 0.5.19 functional
    • “hn_get_thread” added an optional parameter “cursor” cosmetic
    • “hn_search_content” added an optional parameter “storyId” cosmetic
    • “hn_search_content” reworded the description of “minPoints” cosmetic
    • “hn_search_content” reworded the description of “dateRange” cosmetic
    • “hn_get_thread” reworded the description of “maxComments” cosmetic
    • “hn_get_thread” reworded the description of “itemId” cosmetic
    • “hn_get_thread” reworded the description of “depth” cosmetic
    • “hn_search_content” reworded the description of “query” cosmetic
    • “hn_search_content” reworded the description of “tags” cosmetic
    • “hn_search_content” made “query” optional cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://hn.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 2 Nov 2026 31 Jan 2027 ECDSA 256 ECDSA-SHA256 995a30681ab772540e934241ca1d576c
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of hn.caseyjhand.com. — Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
caseyjhand.com. present 2371 13 Verified
hn.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://hn.caseyjhand.com/mcp Verified 200
http (plaintext) http://hn.caseyjhand.com/mcp HTTPS enforced 301 https://hn.caseyjhand.com/mcp
MCP tools · 4 exposed · ~1,627 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
hn_get_stories ~150

Fetch stories from an HN feed (top, new, best, ask, show, jobs), with title, URL, score, author, and comment count for each story.

NameTypeReqDescription
countinteger–Number of stories to return, at most 100 per call. A larger value is served at 100, and the notice names the offset for the next page. Larger counts take longer.
feedstringyesWhich HN feed to fetch. "top" includes jobs. "ask" and "show" are Ask HN / Show HN posts.
offsetinteger–Number of stories to skip from the start of the feed. Use with count for pagination.
NameTypeReqDescription
capnumber–The count value served: as passed, or 100 when count was above that cap.
errorobject–Present when the call failed. Absent on success.
failedIdsarray–IDs on this page whose fetch failed after retries or ran past the call's 50-second time budget. They are not deleted or missing and may load on a later call: retry the page with the same offset, or p…
feedstring–Which feed was fetched.
hasMoreboolean–Whether more stories are available beyond this page.
noticestring–Agent guidance: the offset to pass for the next page while more stories remain, the IDs that failed to load and how to retry them (naming the call's 50-second time budget when it cut them), or why a…
offsetnumber–Offset that was applied to this page.
shownnumber–Number of stories returned on this page.
storiesarray–Stories from the feed, ordered by HN ranking.
totalnumber–Total items in the feed (up to 500 for top/new/best, 200 for ask/show/jobs).
truncatedboolean–True when more stories remain beyond this page (hasMore). Absent on the last page of the feed.

No examples provided.

hn_get_thread ~357

Get an item and its comment tree as a threaded discussion, with child comments resolved recursively. Use depth 0 for an item-only lookup. A long thread comes back in pages: pass the returned nextCursor as cursor to continue.

NameTypeReqDescription
cursorstring–nextCursor from a previous call, passed with the same itemId, to continue the traversal at the next unseen comment without repeating or skipping any. Omit to start from the top.
depthinteger–How many levels of replies to resolve, at most 10 per call. 0 = just the item, no comments. 1 = direct replies only. A larger value is served at 10. Replies below the depth served are never fetched —…
itemIdintegeryesID of the story, comment, job, poll, or poll option to fetch the thread for.
maxCommentsinteger–Maximum comments in one response, across all depth levels, at most 200 per call. A larger value is served at 200, and nextCursor continues from there. Highest-ranked top-level comments resolve first;…
NameTypeReqDescription
capnumber–The maxComments value served: as passed, or 200 when maxComments was above that cap.
commentsarray–Flat comment list ordered breadth-first by rank: highest-ranked top-level comments first, then their replies. Use depth/parentId to reconstruct nesting. With cursor, the page continues the same order.
errorobject–Present when the call failed. Absent on success.
failedIdsarray–Comment and poll-option IDs whose fetch failed after retries or ran past the call's 50-second time budget, so neither they nor their replies are in this response. They are not deleted or missing and…
itemobject–The root item: a story, comment, job, poll, or poll option.
nextCursorstring–Pass as cursor, with the same itemId, to continue from the next unseen comment. Present when truncationReason is count, size, rate_limited, or time; absent on the last page.
noticestring–Traversal context: counts of deleted/dead comments dropped, the IDs that failed to load and how to retry them, then what stopped the traversal and how to continue — nextCursor for a count, size, rate…
shownnumber–Number of comments returned.
totalAvailablenumber–HN's count of live comments in the thread (descendants); dead and deleted comments are not counted. Absent for comment and job roots.
totalLoadednumber–Number of comments in this response (this page, when paging with cursor).
truncatedboolean–True when comments remain unread: reachable through nextCursor (truncationReason count, size, rate_limited, or time), or below the depth limit (depth). Absent on a terminal page — including a thread…
truncationReasonstring–Why the traversal stopped short: count = maxComments (or the 1,000-item ceiling per call) was reached; size = the page stopped between comments to keep content[] and structuredContent each within the…

No examples provided.

hn_get_user ~215

Get an HN user profile with karma, about, and optionally their most recent submissions resolved into full items.

NameTypeReqDescription
includeSubmissionsboolean–Resolve the user's most recent submissions into full items. Without this, only the submission count is available.
submissionCountinteger–Page size — how many submissions to resolve per call, at most 50 per call. A larger value is served at 50, and the notice names the submissionOffset for the next page. Only used when includeSubmissio…
submissionOffsetinteger–How many submissions to skip before resolving, counting back from the most recent. Use with submissionCount to page through a long history: request offset 0, then advance by the page size served, and…
usernamestringyesHN username. Case-sensitive. Trimmed; blank or whitespace-only input is rejected.
NameTypeReqDescription
capnumber–The submissionCount value served: as passed, or 50 when submissionCount was above that cap.
errorobject–Present when the call failed. Absent on success.
failedIdsarray–Submission IDs in this window whose fetch failed after retries or ran past the call's 50-second time budget. They are not deleted or missing and may load on a later call: retry with the same submissi…
noticestring–Pagination context — which window of the history this page covers and the submissionOffset to send next, the submission IDs that failed to load and how to retry them, or a warning that the offset is…
shownnumber–Number of submissions returned.
submissionOffsetnumber–The offset this page started at. Absent when includeSubmissions is false or the user has never submitted.
submissionsarray–One page of submissions, most recent first, starting at submissionOffset. Absent when includeSubmissions is false or the user has never submitted. Empty when the page holds no live items — either the…
truncatedboolean–True when submissions remain beyond this page.
userobject–User profile.

No examples provided.

hn_search_content ~905

Search Hacker News stories, comments, polls, and jobs via Algolia — by keyword, by filters alone, or both. Filterable by content type, author, parent story, date range, and minimum points.

NameTypeReqDescription
authorstring–Filter results to a specific author — useful for finding a user's posts on a topic. Matches the HN username exactly and is case-sensitive, so a re-cased name finds nothing. Trimmed before filtering;…
countinteger–Number of results to return, at most 50 per call. A larger value is served at 50: the search runs at count 50 from the hit where the requested page starts, and the notice names the count and page to…
dateRangeobject–Filter to a creation-time window with a start, an end, or both. An empty object is rejected — omit dateRange instead.
minPointsinteger–Minimum score. Applies to stories and polls, including the ask_hn, show_hn, and front_page subsets. Comments and jobs carry no points in the search index, so any minPoints excludes them — combining i…
pageinteger–Page number for pagination (0-indexed), counted in pages of count results.
querystring–Search terms. Supports simple keywords — Algolia handles stemming and relevance, and a hit must contain every term. Matching is typo-tolerant and the last term also matches as a prefix (zig matches Z…
sortstring–Sort order. "relevance" for best match, "date" for most recent first.
storyIdinteger–Restrict results to one discussion: the id of a story or poll root, combined with the other filters. Pair with tags "comment" to search within a thread. Take it from hits[].storyId, from a poll hit's…
tagsstring–Filter results by content type: "story", "comment", "poll", or "job", or the story subsets "ask_hn", "show_hn", and "front_page". "front_page" is the HN front page right now (about 30 stories); no fi…
viewstring–How much of each hit to return. "full" includes every field, within a 64,000-byte budget on each response surface: a page over it drops highlights.text from every hit (highlightsTextOmitted), and if…
NameTypeReqDescription
capnumber–The count value served: as passed, or 50 when count was above that cap.
criteriaobject–The criteria this search ran with: each filter that was set, as sent — author trimmed, dateRange bounds as the exclusive UTC instants applied — then sort, count, and view, defaults included. Unset fi…
errorobject–Present when the call failed. Absent on success.
highlightsTextOmittedboolean–True when highlights.text was dropped from every hit to keep this view "full" page within the 64,000-byte response budget; highlights.title and matchedWords remain. Absent otherwise.
hitsarray–Search results ranked by sort order.
noticestring–Agent guidance, one string. It opens with the page state: the next page to request while more pages remain, the 1,000-hit ceiling on the last page of a search that matches more, the last valid page w…
pagenumber–Current page number (0-indexed), in pages of criteria.count hits. When count was above the per-call cap, the page of 50 where the requested page starts.
querystring–The query that was searched — for a URL query, without its leading scheme and www. Absent for a filter-only search.
reachableHitsnumber–How many of totalHits paging can reach: Algolia serves at most 1,000 hits per search. Present only when totalHits exceeds that; split the search into narrower dateRange windows to reach the rest.
shownnumber–Number of hits returned.
totalHitsnumber–Matching results across all pages, as Algolia counts them. An estimate when totalHitsExact is false — broad searches can be off by orders of magnitude — and paging reaches only the first 1,000 (see r…
totalHitsExactboolean–True when totalHits is an exact count, false when it is an estimate, as it is for keyword searches and broad filter-only searches. Absent when Algolia does not say, and on a page past the 1,000-hit c…
totalPagesnumber–Number of pages of criteria.count hits Algolia will actually serve for this query, covering at most the first 1,000 hits. Not derived from totalHits — broad queries report a totalHits far larger than…
truncatedboolean–True when more pages remain after this one (page + 1 < totalPages). Absent on the last page Algolia serves.

No examples provided.

Install

How do I install the io.github.cyanheads/hn-mcp-server server?

io.github.cyanheads/hn-mcp-server is a hosted endpoint at https://hn.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · hn.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-hn-mcp-server 'https://hn.caseyjhand.com/mcp'
Common questions

What is the io.github.cyanheads/hn-mcp-server server?

io.github.cyanheads/hn-mcp-server is listed in the public MCP registry as io.github.cyanheads/hn-mcp-server. Browse Hacker News feeds, threads, and user profiles with full-text search. This page covers its hosted endpoint (https://hn.caseyjhand.com/mcp).

Is the io.github.cyanheads/hn-mcp-server server safe to use?

io.github.cyanheads/hn-mcp-server scores 89 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/hn-mcp-server server expose?

io.github.cyanheads/hn-mcp-server exposes 4 tools: hn_get_stories, hn_get_thread, hn_get_user, hn_search_content. Their descriptions and schemas cost roughly 1,627 tokens of context every time the server is loaded.

Does the io.github.cyanheads/hn-mcp-server server require authentication?

No. We connected to io.github.cyanheads/hn-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/hn-mcp-server server still maintained?

io.github.cyanheads/hn-mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.