Server has 16 tools with basic schemas and descriptions, but significant quality gaps. All tools have descriptions (10-50 chars, mostly under 20 chars), which violates the 20-char minimum for scoring above 0-20. Parameter descriptions are present but minimal. No output schemas documented. Error handling exists but lacks recovery guidance. Tool names follow verb_noun pattern (good), but descriptions are too terse to guide LLM selection. No tool annotations (readOnlyHint/destructiveHint). Composition is reasonable, tools are single-purpose, but descriptions don't explain WHEN to use each tool or dependencies between them.
Reflect on the AnkiConnect API.
Get the active profile from AnkiConnect.
Get all profiles from AnkiConnect.
Check the Anki database.
Edit a note in Anki.
Exit Anki.
Import a file into Anki.
Select a card in the Anki browser.
Tool descriptions are critically short (10-20 chars). Rubric requires 10-1024 chars; descriptions under 20 chars score 0-20. Examples: 'Replace tags in notes by note ID.' (34 chars, acceptable) but 'Request permission from AnkiConnect.' (36 chars) and 'Reflect on the AnkiConnect API.' (31 chars) lack context for WHEN to use vs similar tools. LLMs cannot distinguish replaceTags from replaceTagsInAllNotes without longer descriptions explaining use cases.
No output schemas documented. Rubric requires 'Document the output schema. LLMs need to know what fields to expect.' Tools return JSON.stringify(result) or plain text, but callers cannot predict structure. E.g., getProfiles returns profiles array, but schema is not declared. This forces LLMs to guess field names for downstream tool calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | 2026-07-28+ | v2 |
Get the currently selected notes in the Anki browser.
Undo the last action in Anki.
Load a profile in AnkiConnect.
Execute multiple AnkiConnect actions.
Reload the Anki collection.
Replace tags in notes by note ID.
Replace tags in all the notes for the current user.
Request permission from AnkiConnect.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Rubric rewards tool annotations as current MCP pattern. Tools marked WRITE (replaceTags, loadProfile, multi, reloadCollection, guiSelectCard, guiEditNote, guiImportFile, guiExitAnki) should declare destructiveHint=true. Tools marked READ_ONLY should declare readOnlyHint=true. guiUndo should declare idempotentHint=true. Absence prevents LLMs from reasoning about side effects.
Error handling lacks recovery guidance. Rubric requires 'Error responses must tell the LLM what to do next.' Current code throws McpError with InvalidParams but no actionable next steps. E.g., if invokeAnkiConnect fails, error message is raw 'AnkiConnect error: <message>' with no suggestion to retry, check Anki is running, or call requestPermission first.
Parameter descriptions are minimal. Rubric requires descriptions to state format, range, and constraints. E.g., 'notes' param in replaceTags says 'Array of note IDs' but does not specify: are IDs integers or strings? What is the max array size? What happens if an ID is invalid? 'tag_to_replace' and 'replace_with_tag' lack format guidance (e.g., case-sensitive? special chars allowed?).