termloop
Telegram bot for spaced repetition of professional terms + MCP server to save terms straight from LLM conversations
Install / Use
claude mcp add Gyxer513 -- npx -y github:Gyxer513/termloopIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
AI & Machine LearningSupported Platforms
Skill content
View source on GitHub🧠 TermLoop
Terms keep coming back until you remember them.
A minimal Telegram bot for spaced repetition of professional terminology — plus an MCP server, so you can save terms into your dictionary right from a conversation with an LLM (Claude Code, Claude Desktop, or anything else that speaks MCP).
Docs: gyxer513.github.io/termloop · Документация на русском
Why
The problem is rarely a lack of engineering understanding — it's that professional vocabulary lags behind the concepts you already use in practice. You know that "reprocessing must not change the result"; TermLoop makes sure the word idempotency comes back to you until the link sticks.
No AI grading, no token spend: you judge yourself with two buttons, the priority math is deterministic.
Features
- Personal card dictionaries (term — definition, optional topic)
- Priority rotation: new and forgotten cards come back more often (100 → decrements of 1/10/25/50 per recall streak; "forgot" resets to 100)
- Self-assessment flow: show term → recall → reveal definition → Remember / Forgot
- Manual reviews (
/go [topic]) and a shared notification schedule - MCP server (streamable HTTP) with
add_term/list_terms/list_terms_topics— write terms from any LLM chat - Sturdy by design: state machine with single-use review tokens and TTL, idempotent callbacks, row-level ownership in every query, rate limiting, optional Telegram ID allowlist
- Boring ops: single process, long polling (no public endpoint), SQLite WAL, Alembic migrations, Docker Compose
Bot commands
| Command | Action |
|---|---|
| /start | create account, show help |
| /add Topic \| Term \| Definition | add a card (topic is optional) |
| /edit 17 \| Topic \| Term \| Definition | edit card #17 |
| /delete 17 | delete card #17 |
| /list [topic] | list your cards |
| /topics | list topics |
| /go [topic] | start or resume a review |
| /notify on\|off | toggle reminders |
| /cancel | reset the active attempt |
Quick start
Requirements: Docker + Compose, a bot token from @BotFather.
git clone https://github.com/Gyxer513/termloop.git
cd termloop
mkdir -p data && sudo chown 1000:1000 data # container runs as uid 1000
cp .env.example .env
# set BOT_TOKEN, MCP_TELEGRAM_USER_ID, MCP_AUTH_TOKEN in .env
docker compose up -d --build
Configuration (.env):
| Variable | Default | Purpose |
|---|---|---|
| BOT_TOKEN | — | Telegram bot token (required) |
| REVIEW_TIMES | 10:00,19:00 | shared reminder schedule |
| TIMEZONE | Europe/Moscow | schedule timezone |
| PENDING_TTL_MINUTES | 30 | active attempt expiry |
| ALLOWED_TELEGRAM_IDS | empty | optional allowlist (empty = everyone) |
| MCP_TELEGRAM_USER_ID | — | whose dictionary MCP tools write to (required for MCP) |
| MCP_AUTH_TOKEN | empty | static bearer token for the MCP endpoint |
| MCP_PORT | 8210 | MCP server port |
MCP: save terms from an LLM conversation
The termloop-mcp service exposes the dictionary at http://<host>:8210/mcp
(streamable HTTP, bearer auth). Cards land in the same rotation the bot uses.
Claude Code:
claude mcp add --transport http termloop http://<host>:8210/mcp \
--header "Authorization: Bearer <MCP_AUTH_TOKEN>"
Claude Desktop (claude_desktop_config.json, via a local mcp-remote
bridge — connectors on claude.ai itself require a public HTTPS URL):
"termloop": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://<host>:8210/mcp",
"--allow-http", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer <MCP_AUTH_TOKEN>" }
}
Then just say: "save to termloop: bulkhead — resource isolation so one failing component can't take down the rest, topic Architecture."
Development
Python 3.12+, no external services needed:
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements-dev.txt
pytest # 34 tests: priority policy, state machine, ownership, scheduler, migrations
ruff check .
Stack: aiogram 3 · SQLAlchemy 2 (async) · Alembic · APScheduler · MCP Python SDK · SQLite (WAL).
Layout: domain logic lives in app/services/ (~280 lines, fully covered by
tests), Telegram wiring in app/bot/, the MCP server in app/mcp_server.py.
Design notes
- Both triggers —
/goand the scheduler — call the samestart_review(user, topic, source)application service. - Card selection: top-10 by priority with deterministic tie-breaks, random
pick in the application. No
ORDER BY RANDOM(). - Review state machine:
IDLE → QUESTION_SHOWN → ANSWER_SHOWN → IDLE, guarded by a per-attempt random token; stale or replayed callbacks are safe no-ops. - Authorization is row-level and lives in the queries themselves: a foreign card is indistinguishable from a missing one.
- The stop rule is part of the spec: no AI grading, no web UI, no tag system, no analytics until real usage demands them.
Questions & feedback
Ask in Discussions (Q&A) — bugs go to Issues.
License
Related Skills
momen-cursurrules-prompt-file
40.6kCursor rules for building custom frontends with Momen.app as headless BaaS with GraphQL API, actionflows, AI agents, and Stripe integration.
pyspark-etl-best-practices-cursorrules-prompt-file
40.6kCursor rules for PySpark ETL development with code style, joins, window functions, map operations, and Iceberg patterns.
semiotic-react-dataviz-cursorrules-prompt-file
40.6kCursor rules for Semiotic data visualization library with 30+ chart types, MCP server, and AI-assisted chart generation.
claude-mem
90.8kPersistent Context Across Sessions for Every Agent – Captures everything your agent does during sessions, compresses it with AI, and injects relevant context back into future sessions. Works with Claude Code, OpenClaw, Codex, Gemini, Hermes, Copilot, OpenCode + More
