内容
# 间隔重复学习服务端
与代理程序无关的间隔重复学习服务端 — **不需要 Anki 的图形用户界面,不需要 Xvfb,不需要 AnkiConnect。** 自带卡片盒和调度器。
它在小型 SQLite 存储库周围封装了 **FSRS** ([免费间隔重复调度器](https://github.com/open-spaced-repetition/py-fsrs),现代 Anki 使用的相同算法),因此代理程序可以创建卡片、查看到期卡片和记录回忆 — 完全无需图形用户界面。
## 为什么不使用无界面 Anki?
驱动 Anki 桌面应用程序无界面意味着 Qt + 虚拟帧缓冲区(Xvfb)+ AnkiConnect 插件 — 容易出错且版本耦合。`anki` PyPI 包可以驱动真正的 `.anki2` 集合图形用户界面,如果您需要与手机上的 Anki 进行互操作。但如果您只想在 API 后面进行间隔重复,Anki 是不必要的:FSRS 是一个库,而这个服务端大约只有 200 行代码。
## 工具
- `add_card(front, back, deck="default") -> {card_id, due}` — 创建并调度一张卡片
- `due_cards(deck=None, limit=20) -> [{card_id, front, back, deck, due}]` — 查看当前到期卡片
- `grade_card(card_id, rating) -> {card_id, rating, next_due, reps}` — 记录回忆(`again`/`hard`/`good`/`easy`,或 1-4)
- `list_cards(deck=None, limit=50)` — 查看所有卡片概览,不论到期日期
- `delete_card(card_id)` — 删除一张卡片(重置 / 清理)
- `stats(deck=None) -> {total, due_now, reviews, decks}`
复习循环:`due_cards` → 用 `front` 询问用户 → 与 `back` 对比 → `grade_card`。FSRS 根据评分计算下一个到期日期。
## 运行
```bash
uv sync
# HTTP(默认;适用于 Railway / 远程代理)
PORT=8000 uv run srs-mcp
# 或标准输入输出(本地代理)
MCP_TRANSPORT=stdio uv run srs-mcp
```
## 存储
启动时选择两种后端之一:
- **Postgres(共享卡片盒)** — 将 `SRS_DATABASE_URL`(或 `DATABASE_URL`)设置为 Postgres 连接字符串(例如 Neon DB)。所有指向相同 URL 的部署都读取和写入 **一个共享卡片盒**,因此您可以从任何地方(本地、Railway 等)添加和查看卡片。FSRS 卡片 ID 较大,因此 Postgres 上的 `cards.card_id` 列为 `BIGINT`。需要 `psycopg` 依赖项(已声明)。
- **SQLite(备用)** — 当未设置 `*DATABASE_URL` 时,卡片存储在 `SRS_DB`(默认为 `./srs.db`)处的 SQLite 文件中。单主机 / 离线。在 Railway 上使用 SQLite 时,在 `/data` 处挂载一个卷并保持 `SRS_DB=/data/srs.db`,以便卡片盒在重新部署时存活。
模式相同(`cards` 表),并在首次使用时自动创建。