addedInput schema / properties / cursor
Added value: +{
+ "description": "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.",
+ "type": "string"
+}
changedInput schema / properties / depth / description
Previous value: -"How many levels of replies to resolve. 0 = just the item, no comments. 1 = direct replies only. Popular stories often have more top-level comments than maxComments — to see nesting, raise maxComments together with depth, or call again with a specific comment's itemId to drill into a subtree."New value: +"How many levels of replies to resolve. 0 = just the item, no comments. 1 = direct replies only. Replies below this depth are never fetched — to read them, raise depth or call again with a specific comment's itemId to drill into its subtree. Ignored when cursor is set: the depth the cursor was issued with applies."
changedInput schema / properties / itemId / description
Previous value: -"ID of the story, comment, or poll to fetch the thread for."New value: +"ID of the story, comment, job, poll, or poll option to fetch the thread for."
changedInput schema / properties / maxComments / description
Previous value: -"Maximum total comments to include across all depth levels. Highest-ranked top-level comments resolve first; replies fill in only after the level above is exhausted."New value: +"Maximum comments in one response, across all depth levels. Highest-ranked top-level comments resolve first; replies fill in only after the level above is exhausted. A response also stops at a fixed 64,000-byte text budget. When either limit stops the traversal, nextCursor continues it."
changedOutput schema / properties / comments / description
Previous value: -"Flat comment list ordered breadth-first by rank: highest-ranked top-level comments first, then their replies. Use depth/parentId to reconstruct nesting."New value: +"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."
changedOutput schema / properties / error / properties / data / properties / reason / description
Previous value: -"Machine-readable failure mode. Declared by this tool: `item_not_found`: HN reports no item exists for the given itemId. `upstream_rejected`: The HN API answered with a 4xx status other than 429 — it rejected the request as built. `upstream_rate_limited`: The HN API answered with HTTP 429. `upstream_unavailable`: The HN API answered with a 5xx status. `upstream_html`: The HN API served an HTML error page with a 200 status, which it does under rate limiting or maintenance. `upstream_malformed`: The HN API answered with a 200 status and a body that is not JSON. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `item_not_found`: HN reports no item exists for the given itemId. `invalid_cursor`: The cursor was issued for a different itemId than the one passed with it. `upstream_rejected`: The HN API answered with a 4xx status other than 429 — it rejected the request as built. `upstream_rate_limited`: The HN API answered with HTTP 429. `upstream_unavailable`: The HN API answered with a 5xx status. `upstream_html`: The HN API served an HTML error page with a 200 status, which it does under rate limiting or maintenance. `upstream_malformed`: The HN API answered with a 200 status and a body that is not JSON. Other values are possible when a failure originates below the handler."
changedOutput schema / properties / error / properties / data / properties / reason / examples
Previous value: -[
- "item_not_found",
- "upstream_rejected",
- "upstream_rate_limited",
- "upstream_unavailable",
- "upstream_html",
- "upstream_malformed"
-]New value: +[
+ "item_not_found",
+ "invalid_cursor",
+ "upstream_rejected",
+ "upstream_rate_limited",
+ "upstream_unavailable",
+ "upstream_html",
+ "upstream_malformed"
+]
addedOutput schema / properties / failedIds
Added value: +{
+ "description": "Comment and poll-option IDs whose fetch failed after retries, so neither they nor their replies are in this response. They are not deleted or missing and may load on a later call. Failed comments ride in nextCursor and are retried when you continue; without one, call again, or pass an ID as itemId to fetch that comment and its replies. Absent when everything the traversal reached loaded.",
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+}
changedOutput schema / properties / item / description
Previous value: -"The root item (story, comment, or poll)."New value: +"The root item: a story, comment, job, poll, or poll option."
addedOutput schema / properties / item / properties / dead
Added value: +{
+ "const": true,
+ "description": "Present and `true` when the root is dead (flagged or killed); its replies are still walked. Omitted otherwise.",
+ "type": "boolean"
+}
addedOutput schema / properties / item / properties / deleted
Added value: +{
+ "const": true,
+ "description": "Present and `true` when HN reports the root deleted; its author and text are gone, but its replies are still walked. Omitted otherwise.",
+ "type": "boolean"
+}
addedOutput schema / properties / item / properties / options
Added value: +{
+ "description": "For a poll root, its options with text and votes in parts order, resolved at every depth including 0. Deleted and dead options are kept and marked; an option whose fetch failed is listed in failedIds instead. Options do not count toward maxComments or totalLoaded.",
+ "items": {
+ "additionalProperties": false,
+ "description": "One poll option.",
+ "properties": {
+ "dead": {
+ "const": true,
+ "description": "Present and `true` when the option is dead (flagged or killed). Omitted otherwise.",
+ "type": "boolean"
+ },
+ "deleted": {
+ "const": true,
+ "description": "Present and `true` when the option was deleted. Omitted otherwise.",
+ "type": "boolean"
+ },
+ "id": {
+ "description": "Poll option ID.",
+ "type": "number"
+ },
+ "score": {
+ "description": "Votes for this option.",
+ "type": "number"
+ },
+ "text": {
+ "description": "Option text (HTML stripped). Absent once deleted.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+}
addedOutput schema / properties / item / properties / parent
Added value: +{
+ "description": "For a comment root, the ID of the story or comment it replies to — pass it as itemId for the context above.",
+ "type": "number"
+}
addedOutput schema / properties / item / properties / parts
Added value: +{
+ "description": "For a poll root, its option IDs in HN order.",
+ "items": {
+ "type": "number"
+ },
+ "type": "array"
+}
addedOutput schema / properties / item / properties / poll
Added value: +{
+ "description": "For a poll-option root, the ID of its poll.",
+ "type": "number"
+}
changedOutput schema / properties / item / properties / title / description
Previous value: -"Story/job title."New value: +"Story/job/poll title."
addedOutput schema / properties / nextCursor
Added value: +{
+ "description": "Pass as cursor, with the same itemId, to continue from the next unseen comment. Present when truncationReason is count, size, or rate_limited; absent on the last page.",
+ "type": "string"
+}
changedOutput schema / properties / notice / description
Previous value: -"Truncation context: counts of deleted/dead comments dropped during traversal, then either how to get past the maxComments cap when it stopped the traversal, or a raise-maxComments-or-depth hint when totalLoaded < totalAvailable. Absent when no comments were dropped and all available comments were loaded."New value: +"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, or rate-limit stop, or a larger depth or a comment id as itemId for a depth cut. Absent when nothing was dropped, failed, or left unread."
changedOutput schema / properties / totalAvailable / description
Previous value: -"Total comment count from the root item. If totalLoaded < totalAvailable, raise maxComments (and depth, if you want nested replies) and call again."New value: +"HN's total comment count for the root (descendants), which also counts dead and deleted comments. Absent for comment and job roots."
changedOutput schema / properties / totalLoaded / description
Previous value: -"Number of comments actually fetched and included."New value: +"Number of comments in this response (this page, when paging with cursor)."
changedOutput schema / properties / truncated / description
Previous value: -"True when maxComments stopped the traversal while comments remained. Absent when every available comment was loaded, even at exactly maxComments."New value: +"True when comments remain unread: reachable through nextCursor (truncationReason count, size, or rate_limited), or below the depth limit (depth). Absent on a terminal page — including a thread that loads in full at exactly maxComments."
addedOutput schema / properties / truncationReason
Added value: +{
+ "description": "Why the traversal stopped short: count = maxComments (or the 1,000-item ceiling per call) was reached; size = the 64,000-byte response budget was reached; rate_limited = the HN API throttled the fetches; depth = replies lie below the depth limit, which nextCursor does not reach — raise depth or pass a comment id as itemId. When a cursor reason and a depth cut both apply, the cursor reason is reported.",
+ "enum": [
+ "count",
+ "size",
+ "depth",
+ "rate_limited"
+ ],
+ "type": "string"
+}