Connect Claude conversations with AnkiConnect via MCP to make spaced repetition as easy as "Help me remember this"
This server has three well-defined tools with solid descriptions and partial schema documentation. Tool naming follows verb_noun convention (inspect_cards, update_note_fields, update_note_tags), which is good. Descriptions are comprehensive (ranging from ~150-200 chars), helping LLMs understand when to call each tool. However, there are significant gaps: (1) parameter type definitions are visible in the docstrings but the actual JSON schema constraints are not shown in source; (2) no explicit error handling patterns or recovery guidance in descriptions; (3) output schemas are undocumented, responses return JSON strings but the structure of that JSON is not formally specified; (4) no enum constraints for properties parameter in inspect_cards, allowing LLM to hallucinate invalid categories; (5) deprecation guidance for include_history param is present but could be clearer.
Inspect per-card state with sparse fieldset selection. Provide EXACTLY ONE of `card_ids` or `note_ids`. When `note_ids` is given, the tool resolves to all cards belonging to those notes via an `nid:` query. Use `properties` to pick which categories of information to return. The default keeps responses small; opt into the heavier categories explicitly. Property categories: - `identity` — cardId, noteId, deck, modelName - `state` — suspended, queue, queue_label, type - `scheduling` — ease, interval, reps, lapses, raw_due - `timestamps` — modified_iso, last_review_iso (the latter only with `history`) - `history` — full review log (extra AnkiConnect call). Each entry has an ISO timestamp, an "again"/"hard"/"good"/"easy" rating, interval in days, and time taken in ms. - `fields` — cleaned, non-empty note field content (extra `notesInfo` round trip). Image Occlusion notes collapse to a single placeholder. - `all` — shorthand for every category above. Default when `properties` is None: `["identity", "state", "scheduling"]`. `include_history=True` is kept as a soft-deprecated alias — equivalent to adding `"history"` to `properties`. Prefer the new param going forward.
Update the text content of one or more fields on an existing note. Only fields you pass in are changed; omitted fields are left alone. MathJax (`<math>...</math>`) and code blocks/inline code are auto-converted to the same HTML representations used by `add_note`.
Add and/or remove tags on one or more notes. Tags MUST NOT appear in both `add` and `remove`. At least one of the two lists must be non-empty.
Output schemas not documented. Tools return JSON strings but the structure (field names, types, nesting) is not formally specified in tool definitions or code comments. LLMs cannot plan downstream operations or extract values reliably.
inspect_cards 'properties' parameter lacks enum constraint. Description lists valid options ('identity', 'state', etc.) but parameter definition does not formally restrict values, allowing LLM to pass invalid categories.
No error handling guidance in tool descriptions. When AnkiConnect is unavailable or input is invalid, descriptions do not tell LLM what recovery steps to take. The @handle_anki_connection_error decorator exists in code but its behavior is not documented for LLM consumption.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 63 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 47 | - | v1 |
Mutual exclusivity constraint for inspect_cards (exactly one of card_ids or note_ids required) is stated in docstring but not enforced by schema. Tool returns error string at runtime, but LLM will only learn this after failing, better to document constraint in parameter descriptions.
Parameter descriptions lack format/constraint details. E.g., update_note_fields accepts dict[str, str] for field names but does not explain valid field names, required vs optional fields, or length limits. Similarly, update_note_tags does not specify tag format (spaces forbidden, max length, etc.) in parameter descriptions, only in docstring prose.