MCP server for integrating with Anki flashcards through conversational AI
This server exhibits significant gaps in definition quality despite having proper schemas. Tool descriptions are present but minimal (averaging ~30-50 chars, well below the 194-char baseline), lacking context about WHEN to use each tool and prerequisites. Parameter descriptions are sparse, many lack detail beyond restating the parameter name. No tool descriptions explain state modification semantics or whether operations are idempotent. The naming convention is reasonably clear (verb_noun pattern), but several tools are narrowly scoped when they could be consolidated. The server defines 13 tools but README indicates a 'consolidated tools' approach in code (registerConsolidatedTools), suggesting the actual tool surface may differ from the audit. Critical missing elements: no output schemas documented, no error handling guidance, no recovery paths for common failures. The schemas themselves are valid JSON Schema but lack the rich descriptive context needed for LLM-optimal tool selection.
Answer cards with ease ratings
Check if a single card is suspended
Check if cards are due
Check if cards are suspended
Find cards by query
Forget cards (make them new again)
Get ease factors for cards
Tool descriptions are minimal (20-50 chars vs. 194-char baseline). They state WHAT the tool does but omit WHEN to use it, prerequisites, and state modification semantics. Example: 'Find cards by query' provides no guidance on query syntax, expected result cardinality, or pagination behavior.
No output schemas documented. Tools return structured data but LLMs cannot predict field names, types, or availability without seeing the actual response schema. This forces LLMs to guess or rely on trial-and-error.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Get detailed card information
Relearn cards
Set due date for cards
Set ease factors for cards
Suspend cards
Unsuspend cards
No error handling guidance. Tools that modify state (suspend_cards, forget_cards, answer_cards) offer no recovery instructions. If a call fails, the LLM has no path forward: should it retry? Ask the user? Check prerequisites?
Potential tool duplication and naming ambiguity. Three distinct tools exist for checking suspension state (check_cards_suspended, check_card_suspended with singular 'card'). This forces LLMs to disambiguate between 'batch' and 'single' variants. Similarly, get_cards_info and multiple check_cards_* tools may overlap. These should be consolidated into parameterized variants (check_cards with optional 'property' filter).
Parameter 'days' in set_cards_due_date is typed as string instead of number. Description says 'Number of days' but type mismatch forces LLM to convert intent to string representation, introducing format ambiguity (e.g., should it be '-5' or 'in -5 days'?).
No idempotency or side-effect semantics documented. Tools like answer_cards and forget_cards are destructive (they modify card state irreversibly), but descriptions don't flag this. Agents need to know: can I retry safely? Will a retry cause duplicate state changes?
find_cards accepts a free-form 'query' parameter with no schema constraint, format hint, or examples. Anki's query syntax is non-trivial (deck:, tag:, is:, nid:, etc.). Without a format description, LLMs will guess and pass invalid queries, leading to silent failures or unexpected results.
No pagination or result limiting for find_cards. If a query matches thousands of cards, the tool may return an unmanageable result set, blowing the context window. No mention of limit, offset, or cursor-based pagination.
Ease factor constraints not documented. set_cards_ease_factors accepts an array of numbers but provides no min/max bounds, format guidance, or relationship to answer_cards ease ratings (1-4). Are ease factors percentages? Raw multipliers? The mismatch between answer_cards (1-4 discrete ratings) and set_cards_ease_factors (unbounded array) is unexplained.