MCP server that bridges Claude to Anki via Anki-Connect API, enabling card and deck management
AnkiMCPBridge has 16 well-named tools with clear verb-noun patterns (anki_deck_names, anki_create_deck, anki_find_cards). All tools have descriptions (10 - 200 chars, within baseline 194 avg). Input schemas are present and typed for all tools. However, output schemas are NOT documented, the code shows return type hints (List[str], Dict[str, int]) but the MCP tool definitions lack explicit output schema declarations. Parameter descriptions are present but minimal (avg ~40 chars vs baseline 72). No error handling guidance for LLMs (e.g., 'If Anki-Connect is unreachable, ensure Anki is running'). No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE). Missing pagination for tools that could return large lists (anki_find_cards, anki_cards_info). No confirmation pattern for destructive operations (anki_delete_decks).
Creates a new Anki note.
Checks if the given cards are due for review.
Checks if the given cards are suspended.
Gets detailed information about multiple cards.
Gets the note IDs corresponding to the given card IDs.
Moves cards to a different deck, creating the deck if it doesn't exist.
Creates a new empty Anki deck. Does not overwrite if deck already exists.
Output schemas not documented in MCP tool definitions. Code has return type hints (List[str], Dict[str, int]) but MCP @mcp.tool() decorators lack explicit output schema declarations. LLMs cannot plan downstream tool calls without knowing response structure.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels documented in the spec. Tools like anki_delete_decks (DESTRUCTIVE) and anki_suspend_cards (WRITE) should declare their safety profile to guide agent behavior.
No error recovery guidance. invoke_anki_connect() raises generic exceptions ('Anki-Connect request failed...') without actionable next steps. LLMs cannot self-correct, e.g., 'Is Anki running?' or 'Retry with a valid deck name.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Gets the complete list of deck names for the current Anki user.
Gets the complete list of deck names and their respective IDs.
Deletes decks with the given names. WARNING: This also deletes all cards within the decks.
Finds cards based on an Anki search query.
Resets the specified cards, making them 'new' again.
Gets statistics for the given decks, such as total cards and counts for new, learning, and review cards.
Puts the specified cards into the 'relearning' state.
Suspends the specified cards.
Unsuspends the specified cards.
No pagination for tools returning potentially large lists. anki_find_cards and anki_cards_info lack limit/offset parameters and total count in response. Large result sets blow context windows.
Destructive operation (anki_delete_decks) lacks confirmation pattern. No dry-run or explicit confirmation step, agents can accidentally delete entire decks and all cards with no recovery path.