srs-mcp
You can use this server to give an MCP-compatible agent real, correctly scheduled spaced-repetition memory (SM-2) backed by a local SQLite file.
Add review items under topics (flashcards, vocab, interview questions, LeetCode problems, etc.); new items are due immediately.
Get due or overdue items, optionally filtered by topic and limited in count; answers are withheld until you grade them.
Grade an item on a 0–5 recall quality scale; the server computes the next review date via SM-2 and shows the correct answer.
View summary stats: total items, due-today count, and average ease factor, optionally per topic.
With a Pro license, export/backup items as JSON or CSV, and get a forecast of how many items will be due over the next N days to spot upcoming review pile-ups.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@srs-mcpShow me my items due for review today."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
srs-mcp — spaced repetition, as an MCP server
Give any MCP-capable agent (Claude Code, Claude Desktop, or any other MCP host) real, correctly-scheduled spaced-repetition memory instead of re-deriving "what's due today" from a markdown table by hand every session. Implements SM-2 (the algorithm behind Anki/SuperMemo) as four callable tools, backed by a local SQLite file. No account, no network calls, no telemetry — everything runs on your machine.
Status: prototype, not yet published anywhere. Built and verified locally (see "How it's been verified" below); not yet installed by anyone outside this project. Treat version 0.2.0 as pre-release.
Why this exists
Markdown checklists and vocab tables are common ways people (and the agents helping them) track what to review, but nothing computes an actual schedule from them — "due today" ends up being a guess, re-read by eye every time. srs-mcp is the missing piece: a small, real scheduling algorithm exposed as tools, so an agent can track review state for anything — flashcards, interview questions, vocab, onboarding quizzes — without re-implementing SM-2 in a prompt.
Related MCP server: srs-mcp
The four core tools (free, unlimited, forever)
Tool | What it does |
| Add a review item under a topic. New items are due immediately. |
| List items due today or overdue. Answer withheld until graded, like a real flashcard review. |
| Grade recall 0–5 (5 = perfect, <3 = fail/reset). Returns the next due date via SM-2 and the correct answer. |
| Totals, due-today count, average ease factor. |
Get Pro
Two additional tools are gated behind a Pro license — this is the free/paid split srs-mcp uses instead of subscriptions or a hosted backend:
Tool | What it does |
| Bulk export/backup all your review data. |
| Review-load forecast — how many items come due each of the next N days, so a pile-up is visible before it happens. |
How licensing works, concretely: srs-mcp signs license keys with an
Ed25519 private key that never leaves the maintainer's machine; this
repo ships only the matching public key (license.py), which can
verify a signature but can't forge one. Buy a key, set it as
SRS_LICENSE_KEY (env var) or save it to ~/.srs-mcp/license.key, and
the Pro tools unlock — no account, no phone-home check, works offline.
See license.py for the full mechanism and its stated limitations
(short version: this deters casual copying, it isn't DRM — nothing
stops someone from patching out the check in their own local copy of
an open-source Python file; see the module docstring for the honest
version of this tradeoff).
No live purchase link exists yet. This section describes the
mechanism, which is built and tested (see test_license_gate.py), not
a working store. When a purchase flow exists, it goes here.
Install
Requires Python 3.11+.
git clone <repo-url> # not yet public — see status note above
cd srs-mcp
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/srs-mcp # runs the server on stdioTo use it as a Claude Code plugin, point Claude Code at this directory
(or, once published, at its marketplace listing) — .claude-plugin/plugin.json
and .mcp.json are already set up; the server reads SRS_DB_PATH so a
plugin install's data survives updates (${CLAUDE_PLUGIN_DATA}/srs.db
under Claude Code, or a co-located srs.db for a direct/manual run).
How it's been verified
Not just "it imports" — actually run, over the real MCP protocol:
test_client.pyspawnsserver.pyas a subprocess (the same way a real MCP host does), drives a full add/list/grade/list session, and independently re-checks the resulting SQLite rows outside the test harness.test_license_gate.pyspawns the server three ways (no license, valid license, tampered license) and confirmsexport_items/get_forecastrefuse in cases 1 and 3 and return real data in case 2 — proving the license check is a real gate, not a no-op.examples/bulk_import.pyis a working, idempotent example script that loads a generic CSV or JSON file of items into srs-mcp via realadd_itemMCP calls (not direct SQLite writes) — a starting point for bulk-loading your own tracker (vocab, interview prep, onboarding checklists, anything else) instead of adding items one at a time.
Honest gap to "ready to launch" — not rounded up
No public repo. Every real distribution path (Claude Code's community plugin marketplace, a GitHub release, an MCP directory listing) needs this reachable at a public git URL. This project is local-only. Creating that (a GitHub repo, possibly an account) is outside this project's current autonomy without an explicit go-ahead — everything above is prepared to make that a copy-and-push action, not a build task, once given.
Can't self-validate against
claude plugin validate. NoclaudeCLI or Node/npx available in this dev environment. The plugin manifest is schema-conformant as far as careful reading of Anthropic's docs and cross-referencing their own productionmarketplace.jsoncan confirm, not machine-validated.No live purchase flow. The license mechanism is real and tested; turning it into an actual sale needs a storefront (Ko-fi, Gumroad, or similar) that doesn't exist yet — that's an account-creation step, outside this project's autonomy without a go-ahead.
License enforcement is honesty-based, not tamper-proof, by design and by the nature of shipping readable Python — see the "Get Pro" section above and
license.py's docstring.No auth/multi-tenant story. Single local SQLite file, single user. Fine for the current "runs on your machine" model; would need real design work to become a hosted/team product.
Zero external validation. Nobody outside this project has installed or used this. Every claim above is "this works as built and tested," not "people want this."
License
MIT — see LICENSE. (The Pro-tier license key mechanism is separate
from the code's own MIT license — see "Get Pro" above.)
Available Tools
6 toolsadd_itemA
Add a new spaced-repetition item (e.g. a LeetCode problem, a Chinese vocab word, an interview question) under a topic. New items are due immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| answer | Yes | ||
| question | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose a key behavioral fact: new items are due immediately. However, it does not mention side effects, permissions required, reversibility, or what happens if the topic doesn't exist. The single behavioral note is valuable but insufficient for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence immediately states the action and provides useful examples, and the second adds a critical behavioral note. Every word earns its place, and the information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and 0% schema description coverage, the description is incomplete. It omits what the tool returns, how errors are surfaced, whether there are constraints on topic or content, and any side effects on related data. For a create operation, this is a notable gap that could mislead an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It hints at parameter meanings through examples ('LeetCode problem', 'under a topic') but does not explicitly define 'topic', 'question', or 'answer'. While some semantics are implied, the description does not fully explain each parameter's purpose or format, leaving gaps that the schema cannot fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Add), a specific resource (spaced-repetition item) with concrete examples (LeetCode problem, vocab word, interview question), and the container (under a topic). It is clearly distinct from the sibling tools, which handle retrieval, grading, stats, export, and forecasting. An agent can immediately tell this tool is for creating a new item.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case unambiguous: it is for adding new items. While it does not explicitly name alternatives or say 'use this instead of X', the action of adding is clearly differentiated from the sibling tools (e.g., grade_item, get_due_items). This provides clear context with no explicit exclusions, which fits a score of 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_itemsA
[Pro] Export items (id, topic, question, answer, interval_days, repetitions, ease_factor, due_date, created_at) as json or csv text, optionally filtered to one topic. Requires a valid Pro license (see README's "Get Pro" section) -- this is the free/Pro split's first concrete gate: the 4 core tools stay free and unlimited forever, bulk export/backup is part of the paid tier. Without a valid license, returns an upgrade message instead of data, not an error the caller has to guess the meaning of.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | ||
| format | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does well: it states the Pro license requirement and explicitly explains that an invalid license yields an upgrade message rather than a confusing error. It does not mention rate limits or pagination, but the license-gate behavior is the most important non-obvious trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core function is front-loaded, and the license explanation is useful context rather than filler, but the free/Pro split commentary is slightly longer than strictly necessary. Overall it is well-organized and each sentence contributes to correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description compensates by listing the exact returned fields, formats, filtering option, and license failure mode. Minor gaps remain, such as whether the topic filter is exact-match or case-sensitive, but the definition is complete enough for an agent to use it correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains both parameters: 'topic' as an optional filter and 'format' as json or csv text. That is sufficient to invoke correctly, though exact enum values or default behavior are not restated in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the exact operation ('Export items'), the fields returned, the supported formats (json/csv), and the optional topic filter. This clearly distinguishes it from siblings like add_item and get_due_items, which are about adding or retrieving due items rather than exporting the whole collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: this is the paid-tier bulk export/backup tool, optionally scoped to one topic, while the 4 core tools remain free. It does not explicitly name sibling alternatives or when not to use them, but the positioning and verb make the use case evident enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_due_itemsA
List items due for review today (or overdue), optionally filtered to one topic. Returns id, topic, question (answer withheld until grade_item is called, same as a real flashcard review).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| topic | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavior disclosure. It explicitly states that the answer is withheld until grade_item is called, and that overdue items are included. It does not mention rate limits or auth, but for a read-only list operation this is adequate and adds notable context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary purpose is front-loaded, and the answer-withheld detail is placed logically at the end. Every word earns its place; the structure is clean and immediately scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no output schema or annotations, the description covers purpose, scope, filters, and return fields (id, topic, question). The only significant gap is the undefined 'limit' parameter semantics, but overall it provides enough for an agent to call correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain both parameters. It explains the 'topic' filter explicitly ('optionally filtered to one topic') but does not mention 'limit' at all. The limit parameter has a default but no description, leaving its behavior (e.g., maximum number of items, pagination) undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), names the resource ('items due for review'), and states scope ('today (or overdue)') plus an optional filter ('one topic'). It clearly distinguishes from siblings like add_item, grade_item, get_stats, and export_items, which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (to see due items) and mentions that answers are withheld until grade_item is called, giving a hint about downstream steps. However, it does not explicitly compare with get_forecast or state when not to use this tool, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecastA
[Pro] Review-load forecast: how many items become due on each of the next N days, optionally filtered to one topic. Lets a user see an upcoming pile-up before it happens instead of discovering it the day of -- a real planning feature, not a gate for its own sake. Requires a valid Pro license, same as export_items.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| topic | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load. It discloses the Pro license requirement (a key constraint) and specifies the output nature (counts per day, not a list of items). It also implies read-only behavior without saying so explicitly. This adds meaningful context beyond the name, though it doesn't discuss error handling or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core functionality is front-loaded, the value proposition is concise, and the license note is a necessary addition. Every sentence earns its place; it is well-structured and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (2 optional params, no output schema), the description covers the essential aspects: purpose, parameters, and a key constraint (license). It clearly implies the return shape (counts per day). It does not contrast with get_due_items explicitly, but the purpose is distinct enough. Minor gaps like pagination or error behavior are acceptable for this complexity, so a 4 is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description is responsible for explaining the parameters. It does so effectively: 'next N days' maps to the 'days' parameter and 'optionally filtered to one topic' maps to 'topic'. It clarifies their roles without repeating schema types. It does not explicitly mention defaults, but those are present in the schema, so the description adds value beyond the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a clear purpose: providing a forecast of how many items become due per day over a horizon, with optional topic filtering. It explicitly distinguishes from siblings like get_due_items by framing it as a proactive planning feature ('see an upcoming pile-up before it happens'). The verb+resource is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Offers a concrete usage context ('lets a user see an upcoming pile-up before it happens') and implies it is for planning rather than immediate action. It does not explicitly name alternatives or exclusions, but the scenario is clear enough. The license prerequisite is highlighted. Missing explicit 'when not to use' or direct sibling comparison, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statsA
Summary stats: total items, how many due today, average ease factor, optionally scoped to one topic.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must shoulder the full burden of behavioral disclosure. It does state the specific output metrics (total items, due today count, average ease factor) and the optional scoping, but it does not explicitly confirm the operation is read-only, nor does it mention any side effects, error conditions, or response format. The description gives partial behavioral context but is not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the purpose ('Summary stats:') then enumerates the outputs and the optional scoping. There is no wasted phrasing or repetition; each segment earns its place. It is appropriately concise and well-structured for rapid parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, with one optional parameter, and the description covers its primary outputs and the scoping option. It lacks an explicit statement of read-only behavior and the exact output shape, but given the tool's simplicity and the absence of an output schema, the description provides sufficient context for an agent to invoke it correctly. The main gap is the unstated read-only guarantee, which is minor because the function's name and description strongly imply it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one optional parameter 'topic' with zero description coverage. The description adds meaning by explaining that the tool is 'optionally scoped to one topic', directly addressing the parameter's purpose and optionality. It does not specify the default behavior when omitted or acceptable topic formats, but given the single simple parameter and the description's acknowledgment, it compensates well for the schema's lack of documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it provides summary statistics (total items, number due today, average ease factor) with optional topic scoping. This distinguishes it from sibling tools like get_due_items (which likely lists individual due items) and get_forecast (which projects future trends). The verb 'get' plus the resource 'stats' is explicit and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates this tool is for summary statistics, implying use when an aggregate overview is needed rather than detailed item lists. However, it does not explicitly name alternative tools or state when not to use it, leaving the agent to infer the appropriate context from the purpose. Clear context is provided, but no exclusions or comparisons to siblings are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grade_itemA
Grade recall quality for an item just reviewed (0-5: 0 = total blackout, 3 = correct with effort, 5 = perfect instant recall) and return the newly computed next-due date, plus the correct answer for confirmation. Uses SM-2 scheduling.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | ||
| quality | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It usefully discloses the 0-5 quality scale, SM-2 scheduling, and the returned next-due date/correct answer. However, it does not explicitly state whether the grade is persisted or how the item's scheduling state is updated, which is a meaningful side-effect gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the action, then efficiently packs the scale, return values, and algorithm into the remainder. There is no filler or redundant repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description covers the invocation context, the grading scale, the scheduling algorithm, and the key return values. Minor gaps remain around exact output format and whether the grade permanently mutates stored state, but the description is largely sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does explain the key parameter 'quality' with concrete anchors (0, 3, 5) and ties 'item_id' to the item being reviewed. It does not give explicit numeric bounds/validation for quality, but the 0-5 range is clearly communicated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Grade recall quality') and names the resource ('an item just reviewed'), then explains the grading scale and what the tool returns. This clearly distinguishes it from sibling tools like add_item or get_due_items, which perform different actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for an item just reviewed' gives clear contextual guidance on when to call this tool. It does not explicitly name alternatives or exclusions, but none of the sibling tools perform the same grading function, so the usage context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.2.0- First observed
add_item - First observed
export_items - First observed
get_due_items - First observed
get_forecast - First observed
get_stats - First observed
grade_item
TDQS
Scored across 6 tools
Each tool serves a clearly distinct purpose: adding items, fetching due items, grading recall, viewing stats, exporting data, and forecasting workload. There is no overlap or ambiguity in their intended actions.
Every tool follows a consistent verb_noun pattern (add_item, get_due_items, grade_item, get_stats, export_items, get_forecast), making it easy to infer the action and target. No mixed conventions or vague verbs.
With 6 tools, the server is well-scoped for a spaced-repetition system, covering the core workflows (add, review, stats, export, forecast) without unnecessary bloat or excessive granularity.
The tool surface covers the primary lifecycle (add, review, stats, export, forecast) well, but lacks direct update and delete operations for items. Export tools can serve as a workaround, so the gap is minor.
Maintenance
Related MCP Connectors
Read, write, and conversationally review open-source flashcards through split read/write MCP tools.
- FlipnemOAuthcom.flipnem
Build and study spaced-repetition flashcards with your agent.
Spaced-repetition flashcards your AI writes, quizzes you on by voice, and schedules with FSRS.
Zero-friction personal operating system: habits, tasks, and FSRS-5 study retention via remote MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables users to create, review, and manage flashcards using the SM-2 spaced repetition algorithm for optimized learning. It supports organizing cards into projects and automatically handles review scheduling based on user performance.15 npm2MIT
- AlicenseAqualityCmaintenanceEnables agents to perform spaced-repetition learning with FSRS scheduling, including adding cards, reviewing due cards, and grading recall, using a headless SQLite or Postgres backend.92MIT
- AlicenseNot gradedqualityCmaintenanceLocal Leitner flashcard MCP server enabling AI clients to create decks, manage cards, study with spaced repetition, and track progress.MIT
- AlicenseNot gradedqualityCmaintenanceA lightweight MCP server that adds spaced-repetition flashcards (SM-2) to AI assistants, storing data locally in SQLite and enabling card creation, review, and scheduling.MIT