MCP server for creating and maintaining Anki flashcards from LLMs
Server has 13 tools with mostly complete schemas and descriptions, but quality is inconsistent. Naming follows verb_noun convention well (list_decks, create_deck, search_notes). Descriptions range from adequate to verbose; several lack clarity on when to use them vs. similar tools. Parameter descriptions are present but often generic. Critical gap: YouTube tools (10-13) lack input validation and clear error guidance. Draft workflow tools (5-7) have good descriptions but complex interdependencies not fully documented. No tool annotations visible in schema output despite code using @mcp.tool(annotations=...). Output schemas partially documented via Pydantic models but not exposed in tool definitions.
Append notes to an existing draft. Nothing is written to Anki. Every note is validated against the note type's field names and checked for duplicates before it enters the draft. If any note fails, NONE are appended and the eror names every problem at once, so you can fix them in one go. Calling this twice with the same notes appends them twice. Use it to build a large batch across multiple calls, not to retry a failed call.
Write a draft to Anki. This is the only tool in this workflow that changes the collection. Do not call this on your own initiative. Present the drafted cards to the user first and wait for their approval. Every note gets tagged 'mcp::batch::<batch_id>'. The returned batch_id can be passed to 'undo_batch' to remove the entire batch again.
Create a new empty deck. Will not overwrite a deck that exists with the same name. Returns: DeckID of the new deck
IMPORTANT: If you have not called 'get_card_rules' in this conversation, do that before drafting. Start a new draft batch and optionally fill it in the same call. A draft is validated but NOT written to Anki. It exists only in this server's memory and disapears when the server restarts. Pas the notes right here unless you need to build the batch across several calls. Returns the draft_id. Pass it to 'add_to_draft' to append more notes, or to 'commit_draft' to write everything to Anki. Fails if the deck or the note type does not exist. Drafts are deleted from servers memory after 30 Minutes, if not used.
YouTube tools (10-13) lack error handling guidance. No documentation of what happens if URL is invalid, video is unavailable, or transcript is missing. LLM cannot recover from failures.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are used in code (@mcp.tool(annotations=...)) but not visible in schema output. Clients cannot see risk classification.
Draft workflow (tools 5-7) has complex interdependencies (create → add → commit) but no explicit documentation of required call sequence or error states. LLM may call tools out of order.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Delete a batch of notes that was created by commit_draft. This is the only way to undo a batch.
Gets the complete list of model names for the current user, if the name is None. Otherwise gets the complete list of field names for the provided model name. Args: name: modelName Returns: List of model names for the current user or list of field names for the provided model name.
Extract the complete transcript text from a YouTube video. Returns all transcript segments concatenated into a single string.
Extract a formatted outline from a YouTube video transcript. Returns timestamps and text snippets at regular intervals.
Extract transcript text from specific time intervals of a YouTube video. Returns the concatenated text from all transcript segments that overlap with the specified intervals.
Returns the comprehensive rules and guidelines for creating high-quality Anki flashcards. These rules cover card design, mathematical notation, formatting, and best practices. ALWAYS call this before drafting cards.
Fetch and process a YouTube video's transcript and metadata. Returns the video ID, language, transcript segments, and an outline. Optionally translate to a target language.
Returns: List of all Decknames
Finds notes in the Anki collection. - total_found is the number of matches for the whole query - note_ids is capped at limit. A total_found of 0 usually means the query was malformed rather than that the collection is empty. Set with_field=True to also get field contents, tags and note type. This is considerably more expensive, so leave it off unless the content is needed
delete_generated_batch_of_notes has minimal description (18 chars). Does not explain consequences, prerequisites, or when to use it vs. other deletion methods.
Output schemas not documented in tool definitions. Pydantic models (SearchResult, YouTubeVideoData, AddResult) exist in code but LLM cannot see what fields are returned.