{
  "markdown": "# Memora MCP\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![MCP Apps](https://img.shields.io/badge/MCP-Apps%20(SEP--1865)-orange)](https://github.com/modelcontextprotocol/ext-apps)\n[![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)\n[![React](https://img.shields.io/badge/React-149ECA?logo=react&logoColor=white)](https://react.dev/)\n\nTurn any conversation into an interactive study session, right inside Claude Desktop. Ask Claude to make a deck and it generates the cards, then renders them as an inline review you can click through: flip **flashcards**, answer **multiple-choice quizzes**, and fill in **cloze** blanks. Every answer updates a **spaced-repetition** schedule, and your results flow back to Claude so it can drill what you missed.\n\nKeywords: Model Context Protocol, MCP server, MCP Apps, Claude Desktop, flashcards, quizzes, spaced repetition, SRS, FSRS, Anki alternative.\n\nBuilt on the [MCP Apps extension](https://github.com/modelcontextprotocol/ext-apps) (SEP-1865): core MCP spec `2025-11-25` plus the Apps extension `2026-01-26`.\n\n![Three ways to study, rendered inline in Claude](media/review-modes.svg)\n\n## Features\n\n**Three ways to study**, all rendered inline and all graded the same way:\n\n- **Flashcards**: click to flip, then grade **Got it** / **Missed it**.\n- **Multiple-choice quizzes**: pick an option and the correct/wrong answers reveal instantly.\n- **Cloze (fill-in-the-blank)**: the blank reveals in place so the sentence stays intact. Write a blank as `[...]` in a card front and it becomes a cloze card automatically.\n\n**Spaced repetition**: every grade updates a per-card **FSRS** schedule (via [`ts-fsrs`](https://github.com/open-spaced-repetition/ts-fsrs)), so weak cards resurface sooner and due cards come first. Ask *\"what's due today?\"* for a summary across all your decks.\n\n**Organize with categories**: name decks with `::` to nest them (e.g. `LLM::Attention`). Browse the **category tree**, or the same tree as an interactive **mind map**, and **study** a whole branch in one merged session. Quiz decks are flagged with a badge.\n\n**Manage your decks**: create, append to, edit, rename, and delete decks and cards without leaving the chat. Pass `reverse` when creating a deck to also drill each card back-to-front (handy for vocabulary).\n\n**Just JSON**: decks live in `data/decks.json`, read live on every call. Hand-edit them or let Claude build them. No database, no external service.\n\n![Browse decks as a category tree or a mind map](media/mind-map.svg)\n\n## The tools\n\nOnly `review_deck` and `study` open the inline flip-card UI; everything else returns a text summary, so editing or creating in chat no longer pops the widget.\n\n| Tool | What it does |\n| --- | --- |\n| `review_deck` | Open one deck for review (due cards first, capped per session). |\n| `study` | Review a whole category subtree, merged into one session (capped per session). |\n| `create_deck` | Generate flashcards or cloze cards; `reverse` also adds back-to-front cards. |\n| `create_quiz` | Generate multiple-choice questions. |\n| `grade_card` | Record a review result and update the card's FSRS schedule (called by the UI). |\n| `due_today` | Summarize what is due across all decks, and flag struggling cards (3+ lapses). |\n| `edit_card` | Change a card's front and/or back. |\n| `refine_card` | Propose splitting a card into atomic pieces, or rewriting it to test understanding. |\n| `apply_refinement` | Persist a refinement after the user approves the proposed cards. |\n| `capture` | Turn something that just burned you (a bug, a missed question) into draft cards. |\n| `apply_capture` | Persist captured cards after the user approves them. |\n| `rename_deck` | Rename a deck (also moves it in the category tree). |\n| `delete_card` | Remove a single card. |\n| `delete_deck` | Remove a whole deck. |\n\nCard generation follows Memora's quality rules (atomic single-concept cards, 1-5 word answers, active recall, unambiguous, no answer leakage, application over definition), based on Wozniak's *20 Rules of Formulating Knowledge*. New cards are linted on write and flagged (never blocked) so Claude can revise them.\n\n## How it works (MCP Apps)\n\nA tool declares a `ui://` resource. When Claude calls the tool, the host (Claude Desktop) fetches that resource, renders its HTML in a **sandboxed iframe**, passes the tool result to the UI, and the UI talks back to the host over JSON-RPC (to grade cards and report progress to the model).\n\n![The MCP Apps round trip](media/architecture.svg)\n\n## Quick start\n\n### Prerequisites\n\n- Node.js 20.11+\n\n### Connect to Claude Desktop\n\nOpen **Settings > Developer > Edit Config** and add Memora under `mcpServers`:\n\n```json\n{\n  \"mcpServers\": {\n    \"memora\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@servation/memora-mcp\", \"--stdio\"]\n    }\n  }\n}\n```\n\nThen fully quit Claude Desktop (from the system tray) and relaunch. `memora` appears under Settings > Developer, pre-loaded with a few sample decks.\n\nYour decks are stored in `~/.memora/decks.json` (override the path with the `MEMORA_DECKS` environment variable). Hand-edit that file or let Claude manage it.\n\n<details>\n<summary><b>Run from source instead</b></summary>\n\n```bash\ngit clone https://github.com/Servation/memora-mcp.git\ncd memora-mcp\nnpm install\nnpm run build\n```\n\nPoint the config at the built entry with an absolute path (decks then live in the repo's `data/decks.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"memora\": {\n      \"command\": \"node\",\n      \"args\": [\"C:\\\\path\\\\to\\\\memora-mcp\\\\dist\\\\main.js\", \"--stdio\"]\n    }\n  }\n}\n```\n</details>\n\n### Try it (in a Claude Desktop chat)\n\n- `review my World Capitals deck`\n- `make me a deck of 10 Spanish travel phrases`\n- `make a reversible deck of 10 Spanish words` (drills both directions)\n- `make a fill-in-the-blank deck about the water cycle` (cloze cards)\n- `quiz me with 10 multiple-choice questions on the solar system`\n- `turn what we just discussed into a deck called \"Photosynthesis\"`\n- `study my LLM category`\n- `what's due today?`\n\n## Tech stack\n\n- **Server**: TypeScript, [`@modelcontextprotocol/sdk`](https://www.npmjs.com/package/@modelcontextprotocol/sdk) plus [`@modelcontextprotocol/ext-apps`](https://www.npmjs.com/package/@modelcontextprotocol/ext-apps), stdio transport (Streamable HTTP also available).\n- **UI**: React plus Vite, bundled to a single inlined HTML file via `vite-plugin-singlefile`.\n- **Scheduling**: [`ts-fsrs`](https://github.com/open-spaced-repetition/ts-fsrs) (FSRS).\n- Runtime is plain `node` once built (no bun or tsx needed).\n\n## Deck format\n\n```json\n{\n  \"Deck Name\": [\n    { \"front\": \"Capital of France?\", \"back\": \"Paris\" }\n  ]\n}\n```\n\n- Stored in `~/.memora/decks.json` when installed (or `data/decks.json` from source); override with `MEMORA_DECKS`.\n- Read live (mtime-cached). `create_deck`, `create_quiz`, and `grade_card` write here atomically.\n- A **quiz** card adds `\"options\": [\"...\", \"...\"]`; its `back` is the correct option.\n- A **cloze** card writes the blank as `[...]` in the front, with the hidden term as the `back`.\n- Cards gain a `due` date and an FSRS `srs` block as you review them; cards without them are treated as new.\n- Keep it valid JSON, or the server falls back to a built-in default deck.\n\n## Project structure\n\n```\nmemora-mcp/\n├── server.ts            # MCP tools + the ui:// resource\n├── decks.ts             # data model, decks.json storage, result builder\n├── scheduling.ts        # FSRS scheduling + review ordering\n├── main.ts              # entry: stdio (Claude Desktop) or Streamable HTTP\n├── mcp-app.html         # UI entry HTML (bundled by Vite)\n├── src/\n│   ├── mcp-app.tsx      # review orchestrator (flip / quiz / cloze, grade -> model)\n│   ├── deck-lib.tsx     # tree, mind map, card list, quiz/cloze views, helpers\n│   ├── mcp-app.module.css\n│   └── global.css       # host theme variable fallbacks (light/dark)\n├── data/decks.json      # editable decks, read live\n├── media/               # README images\n├── vite.config.ts       # single-file bundle config\n└── tsconfig*.json\n```\n\n## Development\n\n```bash\nnpm run dev        # vite watch (UI) plus tsx server on http://localhost:3001/mcp\nnpm run typecheck  # tsc --noEmit\n```\n\nFor fast local iteration you can also run the app against the MCP Apps reference host (`basic-host`) from the [ext-apps repo](https://github.com/modelcontextprotocol/ext-apps).\n\n## Roadmap\n\nSee [TODO.md](TODO.md) for the backlog: npm + MCP Registry publishing, cross-client hosting (Streamable HTTP), tests around parsing and scheduling, and a real screen-capture demo GIF.\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 8693,
  "sha": "e085869e5f4e226afd9d46091400e88a7a07a1ffa8c8955747a61cd0c86a2c97",
  "repo_slug": "servation/memora-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_servation_memora_mcp_33e68b46/readme"
}