内容
# hn-get
`hn-get` 是一个拥有五个客户端的 Hacker News 数据管道。
<p>
<a href="https://github.com/iannuttall/hn-get/actions/workflows/check.yml"><img alt="检查" src="https://img.shields.io/github/actions/workflow/status/iannuttall/hn-get/check.yml?branch=main&label=检查"></a>
<a href="https://www.npmjs.com/package/hn-get"><img alt="npm 版本" src="https://img.shields.io/npm/v/hn-get?label=npm"></a>
<a href="LICENSE"><img alt="MIT 许可证" src="https://img.shields.io/badge/许可证-MIT-black"></a>
</p>
[文档](https://hn-get.iann.workers.dev) · [安全策略](SECURITY.md) · [MIT 许可证](LICENSE)
- 面向人、脚本和代理的 JSON-first CLI
- 本地 stdio MCP 服务器
- 带有公共 HTTP API 的 Cloudflare Worker
- 远程 Streamable HTTP MCP 服务器
- 列表、搜索、用户、项目和招聘线程的 RSS 源
Firebase 提供实时的项目、用户和官方列表。Algolia 提供搜索、评论和历史活动。一个小型 HTML 解析器涵盖公共的 Hacker News 页面,例如活跃的讨论和最佳评论。
## 安装 CLI 和 stdio MCP 服务器
```bash
npx hn-get help
npm install --global hn-get
```
JSON 是默认输出。
```bash
hn-get frontpage --limit 30
hn-get search "sqlite" --sort points --since 30d
hn-get item 40956979 --comments --depth 2
hn-get user pg --submitted-limit 20
hn-get whoishiring jobs --limit 20
```
可读的 Markdown、文本、紧凑的 JSON 和 NDJSON 在需要时可用。
```bash
hn-get show --sort points --format markdown
hn-get newest --format ndjson
```
## 连接本地 MCP 服务器
npm 包通过主 CLI 运行其 stdio 服务器。
客户端配置如下所示。
```json
{
"mcpServers": {
"hacker-news": {
"command": "npx",
"args": ["-y", "hn-get", "mcp"]
}
}
}
```
共享的 MCP 包公开了这些工具。
| 工具 | 返回内容 |
| --- | --- |
| `hn_search` | 过滤后的 Algolia 搜索结果 |
| `hn_list` | 实时的、可搜索的或 HTML 支持的 HN 列表 |
| `hn_item` | 一个项目,带有可选的有界评论树 |
| `hn_item_comments` | 一个项目的可搜索评论 |
| `hn_user` | 一个紧凑的用户配置文件 |
| `hn_user_activity` | 提交、评论或线程 |
| `hn_replies` | 对一个项目或最近的用户评论的回复 |
| `hn_who_is_hiring` | 当前招聘线程的结果 |
## 使用 Worker API
Worker 在 `/v1` 处提供 API。
```text
GET /v1/search?q=sqlite&sort=points&limit=20
GET /v1/lists/frontpage?limit=30
GET /v1/items/40956979?comments=true&depth=2
GET /v1/items/40956979/comments?q=sqlite
GET /v1/users/pg
GET /v1/users/pg/activity?type=story
GET /v1/replies/40956979
GET /v1/whoishiring/jobs
```
响应是 JSON。限制是有限的,错误的输入会返回带有有用 HTTP 状态的 JSON 错误。
远程 MCP 端点是 `/mcp`。它使用无状态的 Streamable HTTP,因此它共享相同的工具而无需 Durable Object 或会话数据库。
## 订阅 RSS 源
RSS 路由在 `/rss` 下工作。
```text
GET /rss/newest
GET /rss/frontpage?count=30
GET /rss/newcomments?q=sqlite
GET /rss/item?id=40956979
GET /rss/user?id=pg
GET /rss/whoishiring/jobs?q=typescript
```
旧的 hnfeed 样式路径在没有 `/rss` 前缀的情况下也有效,包括 `/newest`、`/item` 和 `/whoishiring/jobs`。
支持的源参数包括 `q`、`points`、`comments`、`count`、`description`、`link`、`id` 和 `author`。
## 仓库结构
```text
apps/worker
Cloudflare HTTP API、RSS 路由和远程 MCP 传输
apps/docs
Starlight 文档,作为 Worker 静态资产提供
packages/core
Hacker News 和 Algolia 客户端、规范化、限制和解析
packages/rss
源路由和基于核心结果的 RSS 渲染
packages/mcp
一个由远程 HTTP 和本地 stdio 共享的 MCP 工具注册表
packages/cli
已发布的 hn-get 包、终端输出和 stdio 入口点
```
核心拥有 Hacker News 行为。每个客户端只解析其输入,调用核心,并格式化结果。修复查询或规范化错误一次即可修复所有客户端。
## 在本地进行开发
```bash
corepack enable
pnpm install
pnpm check
pnpm security:check
pnpm pack:dry-run
pnpm worker:deploy:dry-run
```
有用的开发命令如下:
```bash
pnpm dev
pnpm dev:docs
pnpm dev:cli -- search sqlite
pnpm types
pnpm build
pnpm test
pnpm lint
pnpm typecheck
```
Wrangler 配置位于 `apps/worker/wrangler.jsonc`。它没有账户 ID、路由或机密。Cloudflare Git 构建应使用存储库根目录,并使用 `pnpm build` 作为构建命令,使用 `pnpm worker:deploy` 作为部署命令。
## 通过 npm 受信任的发布进行发布
`.github/workflows/publish.yml` 在每次相关推送到 `main` 时检查包版本。更改的版本会运行完整的检查,检查 tarball,并使用 npm OIDC 发布。没有长期存在的 `NPM_TOKEN`。
使用这些受信任的发布者值在 npm 上配置 `hn-get` 包。
| 设置 | 值 |
| --- | --- |
| 提供者 | GitHub Actions |
| 所有者 | `iannuttall` |
| 仓库 | `hn-get` |
| 工作流 | `publish.yml` |
| 允许的操作 | `npm publish` |
当准备发布时,请增加 `packages/cli/package.json`。根版本仅是存储库元数据。
## 数据和输出规则
- JSON 仍然是 CLI 和 HTTP 的默认格式。
- 搜索结果每个请求限制为 100 条。
- 列表限制为 500 个项目。
- 评论树受到深度和数量限制。
- 上游调用使用超时和保守的重试。
- 没有客户端爬取链接的文章页面。
- 没有身份验证、cookie 状态或隐藏的本地配置。