MCP server for interacting with Anki flashcard application via AnkiConnect
The server has 4 well-defined tools with proper schema registration using mcp-go. Tool names follow verb_noun convention (deck_names, add_note, add_notes, find_notes). All tools have descriptions and documented input parameters with types. However, there are notable gaps: (1) Output schemas are not documented, handlers return plain text via mcp.NewToolResultText(), losing structure that LLMs need for downstream composition. (2) Parameter descriptions are minimal (10-50 chars), lacking guidance on constraints, formats, and use cases. (3) No error recovery guidance, errors return generic failure messages without actionable recovery hints. (4) No idempotency guarantees documented for write operations. (5) The add_notes tool expects a JSON string parameter rather than a structured array, forcing the LLM to serialize and the tool to deserialize, poor UX. Overall, the toolset is functional but lacks production-grade polish in output structuring, error messaging, and parameter ergonomics.
Add a new note to Anki
Add multiple notes to Anki
Get all deck names from Anki
Find notes in Anki using a search query
Output schemas not documented. All handlers return plain text via mcp.NewToolResultText(). LLMs cannot parse structured results, plan downstream calls, or extract IDs for chaining. E.g., add_note returns 'Note added successfully with ID: 123' as unstructured text; a structured output would let the LLM immediately use that ID in follow-up operations.
Parameter descriptions are too brief (10 - 50 characters) and lack actionable guidance. E.g., 'Front content of the note' does not explain format (plain text? HTML? Markdown?), length limits, or whether special characters are allowed. Users must infer from trial and error.
Error responses lack recovery guidance. E.g., 'Failed to add note: deckName not found' tells the LLM a deck is missing but does not suggest calling deck_names() to discover valid decks. Errors should include actionable next steps.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 39 | - | v1 |
add_notes accepts a 'notes' parameter as a JSON string, not a structured array. The tool then deserializes it internally. This forces the LLM to serialize JSON as a string and the tool to re-parse, poor ergonomics and error-prone. Structured array parameters are more maintainable.
No idempotency guarantees or deduplication strategy documented for write operations (add_note, add_notes). If an agent retries after a timeout, are duplicate notes created? LLMs rely on explicit idempotency semantics to decide when retrying is safe.
No pagination support in find_notes. The description states it 'finds notes' but does not mention result limits or how to paginate large result sets. If a query matches 10,000 notes, returning all IDs could exhaust the context window.
Lack of input validation error messages. When JSON deserialization fails in add_notes (e.g., malformed array), the error 'Invalid notes JSON format: ...' is returned but does not show the invalid input or expected format. LLMs cannot self-correct without explicit guidance.