Skip to main content
Glama

License: MIT

Clanki - Claude's Anki Integration

An MCP server that enables AI assistants like Claude to interact with Anki flashcard decks through the Model Context Protocol (MCP).

Features

  • Create and manage Anki decks

  • Create basic notes with front/back content

  • Create cloze notes

  • Create many notes at once in a single request

  • Attach images and audio from URLs - automatically downloaded and embedded

  • HTML formatting support in note fields

  • Update existing notes and cloze deletions

  • Add and manage tags

  • Search for notes with Anki's query syntax

  • Delete notes permanently

  • View deck contents and note information

  • Full integration with AnkiConnect

Related MCP server: Anki MCP Server

Prerequisites

  • Anki installed and running

  • AnkiConnect plugin installed in Anki

  • Node.js 16 or higher

Installation

  1. Clone this repository:

git clone https://github.com/yourusername/clanki.git
cd clanki
  1. Install dependencies:

npm install
  1. Build the project:

npm run build

Setup

  1. Make sure Anki is running and the AnkiConnect plugin is installed and enabled.

  2. Note the absolute path to build/index.js in your clanki checkout. Every client below needs it, and none of them accept a relative path — they do not run from your project directory, so ./build/index.js will not resolve.

    # from the clanki directory
    node -e "console.log(require('path').resolve('build/index.js'))"

    On Windows this prints backslashes. They are fine as-is for the two CLI commands below, but must be doubled or swapped for forward slashes if you paste the path into a JSON config — see the Claude Desktop note.

  3. Register the server with your client, using one of the sections below.

  4. Verify the server can reach Anki. With Anki running:

curl -X POST http://127.0.0.1:8765 -d "{\"action\":\"version\",\"version\":6}"

A working setup replies {"result": 6, "error": null}. If it does not, see docs/troubleshooting.md — connection failures are by far the most common problem, and AnkiConnect's default configuration needs no changes.

Claude Desktop

Edit claude_desktop_config.json:

Platform

Location

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "clanki": {
      "command": "node",
      "args": ["/absolute/path/to/clanki/build/index.js"]
    }
  }
}

Replace /absolute/path/to/clanki with the actual path to your clanki installation. On Windows, write the path with either forward slashes or escaped backslashes (C:\\Users\\you\\clanki\\build\\index.js) — a single backslash is an escape character in JSON and will not parse.

Restart Claude Desktop afterwards; it reads the config only at startup.

Claude Code

claude mcp add clanki -- node /absolute/path/to/clanki/build/index.js

The -- is required. It marks the end of claude mcp add's own options, so everything after it is treated as the command to launch. Without it the arguments are parsed as options to claude mcp add itself and you get a broken entry rather than an error.

By default this registers the server for you in the current project only (--scope local). Two other scopes are available:

Scope

What it does

--scope local

You, in this project only. The default.

--scope user

You, in every project on this machine.

--scope project

Written to .mcp.json in the repo root, for committing so teammates get it too.

Check it worked:

claude mcp list

clanki should be listed as connected. If it is listed as failed to connect, claude mcp get clanki shows the error.

You can also write .mcp.json by hand instead, using the same shape as the Claude Desktop config above. Claude Code reads it at session start, so restart the session after editing it.

Codex

codex mcp add clanki -- node /absolute/path/to/clanki/build/index.js

As with Claude Code, the -- separates Codex's own options from the command that launches the server, and is required.

This writes to ~/.codex/config.toml. Codex uses TOML rather than JSON, so if you prefer to edit the file directly the entry looks like this:

[mcp_servers.clanki]
command = "node"
args = ["/absolute/path/to/clanki/build/index.js"]

Note that the TOML table is mcp_servers with an underscore, not mcpServers as in the JSON configs above.

List the configured servers with:

codex mcp list

Configuration

Clanki needs no configuration in a normal setup. Every variable below is optional.

Using Anki in a language other than English

Anki translates the names of its built-in note types, and their fields, when a collection is created — a German collection has Einfach with the fields Vorderseite and Rückseite, not Basic with Front and Back. Clanki finds them by their structure rather than their names, so this works with no setup whatever language you use.

If your collection contains several note types that look alike, Clanki cannot tell which you meant. It stops and lists the candidates rather than guessing, because guessing wrong would write your text into a field that does not exist, and Anki discards it without an error. Name the one you want:

Variable

What it does

CLANKI_BASIC_NOTE_TYPE

Note type for ordinary two-sided notes, e.g. Einfach

CLANKI_CLOZE_NOTE_TYPE

Note type for cloze notes, e.g. Lückentext

CLANKI_BASIC_FIELDS

Its two fields, front first, e.g. Vorderseite,Rückseite

CLANKI_CLOZE_FIELDS

Its two fields, text first, e.g. Text,Extra

Naming the note type is usually enough — Clanki reads its fields from your collection in order. The _FIELDS variables are only needed for a note type whose fields are not in front-then-back order. Both are checked against your collection at startup, so a typo is reported rather than silently losing content.

Connecting to AnkiConnect elsewhere

Variable

Default

CLANKI_ANKI_CONNECT_URL

http://127.0.0.1:8765

Set this only if you changed AnkiConnect's port or reach Anki on another machine.

Where the variables go depends on your client.

In the JSON configs (Claude Desktop, and .mcp.json for Claude Code), they go in an env block alongside command and args:

{
  "mcpServers": {
    "clanki": {
      "command": "node",
      "args": ["/path/to/clanki/build/index.js"],
      "env": {
        "CLANKI_BASIC_NOTE_TYPE": "Einfach"
      }
    }
  }
}

In ~/.codex/config.toml, they go in an env sub-table under the server:

[mcp_servers.clanki]
command = "node"
args = ["/path/to/clanki/build/index.js"]

[mcp_servers.clanki.env]
CLANKI_BASIC_NOTE_TYPE = "Einfach"

Both CLIs can set them when you register the server, with --env repeated once per variable:

claude mcp add clanki --env CLANKI_BASIC_NOTE_TYPE=Einfach -- node /path/to/clanki/build/index.js
codex mcp add clanki --env CLANKI_BASIC_NOTE_TYPE=Einfach -- node /path/to/clanki/build/index.js

Restart the server after changing them.

Available Tools

create-deck

Creates a new Anki deck

  • Parameters:

    • name: Name for the new deck

create-card

Creates a new note in a specified deck. Supports HTML formatting and media attachments.

  • Parameters:

    • deckName: Name of the deck to add the note to

    • front: Front side content of the note (supports HTML)

    • back: Back side content of the note (supports HTML)

    • tags: (Optional) Array of tags for the note

    • frontImages: (Optional) Array of image URLs for the front

    • backImages: (Optional) Array of image URLs for the back

    • frontAudio: (Optional) Array of audio URLs for the front

    • backAudio: (Optional) Array of audio URLs for the back

create-cloze-card

Creates a new cloze note in a specified deck. Supports HTML formatting and media attachments.

  • Parameters:

    • deckName: Name of the deck to add the note to

    • text: Text containing cloze deletions using {{c1::text}} syntax (supports HTML)

    • backExtra: (Optional) Extra information to show on the back of the card (supports HTML)

    • tags: (Optional) Array of tags for the note

    • textImages: (Optional) Array of image URLs for the text field

    • backImages: (Optional) Array of image URLs for the back extra field

    • textAudio: (Optional) Array of audio URLs for the text field

    • backAudio: (Optional) Array of audio URLs for the back extra field

create-cards-bulk

Creates many basic notes in one request. Prefer this over repeated create-card calls for a batch: it sends a single request to Anki regardless of size. Does not support media — use create-card for notes that need images or audio.

  • Parameters:

    • deckName: Name of the deck to add the notes to

    • cards: Array of { front, back, tags? } objects (at least one)

Anki's addNotes is all-or-nothing — a single duplicate would otherwise fail the whole batch — so the tool asks which notes are addable first and sends only those. The response reports how many were added, and the input position and Anki's own reason for each note skipped, so you can correct and resend just those.

create-cloze-cards-bulk

Creates many cloze notes in one request. Same trade-offs as create-cards-bulk; use create-cloze-card when you need media.

  • Parameters:

    • deckName: Name of the deck to add the notes to

    • cards: Array of { text, backExtra?, tags? } objects (at least one)

Cloze syntax is validated for the whole batch before anything is sent, so a malformed entry fails the call rather than leaving a partial batch in the deck.

update-card

Updates an existing note

  • Parameters:

    • noteId: ID of the note to update

    • front: (Optional) New front side content

    • back: (Optional) New back side content

    • tags: (Optional) New tags for the note

update-cloze-card

Updates an existing cloze note

  • Parameters:

    • noteId: ID of the note to update

    • text: (Optional) New text with cloze deletions

    • backExtra: (Optional) New extra information for the back

    • tags: (Optional) New tags for the note

find-cards

Searches for notes with Anki's query syntax and returns their note IDs, note type, tags, and a short excerpt of each field. Use it to obtain the noteId that update-card, update-cloze-card and delete-card need.

Field content is truncated and the number of results is capped, so narrow the query if the note you want is not listed — the reply always reports how many notes matched in total.

  • Parameters:

    • query: Anki search query, e.g. deck:Spanish, tag:vocab, deck:Spanish tag:verbs

delete-card

Permanently deletes notes. This cannot be undone — there is no trash to recover them from, and every card generated from a deleted note goes with it.

Note IDs must be listed explicitly; there is no delete-by-query. Use find-cards first to obtain them and to check you have the right notes. The reply reports which IDs were actually deleted and which did not exist, because Anki reports success either way.

  • Parameters:

    • noteIds: IDs of the notes to delete, at most 50 per call

    • confirm: Must be true

Resources

Besides the tools above, decks are exposed as a readable resource.

anki://deck/<name>

Reads one deck and returns every note in it — note ID, front, back and tags. Unlike find-cards, the content is returned in full rather than truncated.

Usage Examples

Basic card with text only

"Create a flashcard in my Spanish deck with 'Hola' on the front and 'Hello' on the back"

Card with images

"Create a flashcard about the Eiffel Tower with an image from https://example.com/eiffel.jpg on the front"

Card with audio

"Create a pronunciation card with audio from https://example.com/pronunciation.mp3"

Card with multiple media

"Create a card with images on both sides and audio on the back for studying animals"

Cloze card with media

"Create a cloze card: 'The capital of {{c1::France}} is {{c2::Paris}}' with an image of the Eiffel Tower"

Note: Media files are automatically downloaded from URLs and embedded into the cards. Ensure URLs are accessible and point to valid media files. A URL that cannot be used is reported back in the tool's response; the note is still created without that attachment.

Media placement: Attachments are appended to the end of the field they belong to, after any text. You cannot position an image inline with HTML, because the filename is generated at upload time and is not known in advance. HTML formatting and media attachments therefore do not compose: use HTML to format your text, and the media parameters to attach files after it.

Known Issue: Missing Back Extra on Older Cloze Cards

Earlier versions wrote the backExtra value to a field named Back. Anki's built-in Cloze note type has no such field — its fields are Text and Back Extra — and AnkiConnect silently discards values sent to a field that does not exist.

As a result, cloze cards created before this fix have no extra content stored, even though the card was reported as created successfully. The text was never written to Anki, so it cannot be recovered automatically; re-entering it on the affected cards is the only fix.

Cloze cards created from this version onward store backExtra correctly.

Development

To modify or extend the server:

  1. Make changes to src/index.ts

  2. Rebuild with npm run build

  3. Debug with npx @modelcontextprotocol/inspector node build/index.js

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Acknowledgments

Available Tools

9 tools
create-cardB

Create a new note in a specified deck. Supports HTML formatting in text fields. You can attach multiple images and audio files from URLs - they will be automatically downloaded and embedded in the note.

ParametersJSON Schema
NameRequiredDescriptionDefault
backYesBack side content of the note (supports HTML formatting)
tagsNoOptional tags for the note. A tag cannot contain a space (Anki splits it into two tags) or a tab or newline (Anki removes it) - use organic_chemistry or organic::chemistry for a hierarchy.
frontYesFront side content of the note (supports HTML formatting)
deckNameYesName of the deck to add the note to. The deck must already exist - use create-deck first if it does not. A `::` in the name means a nested deck: `Biology::Cells` is a deck named Cells inside a deck named Biology. There is no way to name a single deck literally `Biology::Cells`.
backAudioNoOptional array of audio file URLs to attach to the back of the note. Audio will be downloaded and can be played in Anki.
backImagesNoOptional array of image URLs to embed on the back of the note. Images will be downloaded and attached automatically.
frontAudioNoOptional array of audio file URLs to attach to the front of the note. Audio will be downloaded and can be played in Anki.
frontImagesNoOptional array of image URLs to embed on the front of the note. Images will be downloaded and attached automatically.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the behavioral disclosure burden. It does disclose meaningful behavior: HTML support, automatic downloading and embedding of media from URLs. However, it does not mention what happens on success or failure, whether a card ID is returned, or any side effects beyond creation. For a mutation tool with no annotations, richer behavioral disclosure would be expected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action. It consists of three sentences with no obvious filler. It could be slightly sharper by naming the front/back text fields instead of 'text fields,' but it is generally well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 8 parameters and no output schema, the description is adequate but incomplete for fully informed invocation. The rich schema covers parameter details, but the description does not clarify the expected return value, error behavior, or how this tool differs from the bulk and cloze siblings. That leaves some decision-making burden on the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all 8 parameters with 100% coverage, so the baseline is 3. The description's mention of HTML and URL-based media roughly mirrors the schema's per-parameter descriptions and adds little new semantic meaning beyond what is already structured.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Create a new note in a specified deck.' It also adds useful scope by mentioning HTML formatting and media attachment. It does not explicitly distinguish itself from siblings like create-cloze-card or create-cards-bulk, though the required front/back fields and name imply a standard note.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus alternatives such as create-cloze-card, create-cards-bulk, or update-card. There are no usage conditions, exclusions, or prerequisites stated in the description itself; the deck-existence prerequisite appears only in the schema, not in the tool description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create-cards-bulkA

Create multiple basic notes in a single call. Use this instead of calling create-card repeatedly — it sends one request to Anki regardless of how many notes are in the batch. Does not support images or audio: use create-card for notes that need media.

ParametersJSON Schema
NameRequiredDescriptionDefault
cardsYesArray of notes to create
deckNameYesName of the deck to add the notes to. The deck must already exist - use create-deck first if it does not. A `::` in the name means a nested deck: `Biology::Cells` is a deck named Cells inside a deck named Biology. There is no way to name a single deck literally `Biology::Cells`.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses the batching behavior (one request regardless of batch size) and the media constraint, which is genuinely useful. However, it omits batch failure semantics — whether the whole batch is atomic or partially applied if one note is invalid — which matters for a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: purpose, batching rationale, and limitation with alternative routing. The core purpose is front-loaded and there is zero wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with 100% schema coverage, the description covers purpose, usage, and exclusions well. Minor gaps remain: no mention of return value/behavior since no output schema exists, and no statement about partial-failure handling in a batch. These are small against the otherwise complete picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter descriptions are rich (tags constraints, deck nesting, prerequisite to create-deck first). The tool description itself adds no parameter-level detail, so the baseline 3 applies — the schema handles the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb-resource pair ('Create multiple basic notes in a single call') and pins down the note type ('basic'), distinguishing it from cloze siblings like create-cloze-cards-bulk. It also differentiates from create-card by explicitly addressing the media limitation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use directive ('Use this instead of calling create-card repeatedly') with the underlying reason (single request vs many). It also gives an explicit when-not-to-use rule ('Does not support images or audio: use create-card') that routes the agent to the correct alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create-cloze-cardB

Create a new cloze note in a specified deck. Use {{c1::text}} syntax for cloze deletions (e.g., {{c1::Paris}} is the capital of France). Supports HTML formatting and can attach multiple images and audio files from URLs - they will be automatically downloaded and embedded.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOptional tags for the note. A tag cannot contain a space (Anki splits it into two tags) or a tab or newline (Anki removes it) - use organic_chemistry or organic::chemistry for a hierarchy.
textYesText containing cloze deletions using {{c1::text}} syntax. Supports HTML formatting. Use {{c1::word}}, {{c2::word}}, etc. for multiple deletions.
deckNameYesName of the deck to add the note to. The deck must already exist - use create-deck first if it does not. A `::` in the name means a nested deck: `Biology::Cells` is a deck named Cells inside a deck named Biology. There is no way to name a single deck literally `Biology::Cells`.
backAudioNoOptional array of audio file URLs to attach to the back extra field. Audio will be downloaded and can be played in Anki.
backExtraNoOptional extra information to show on the back of the card (supports HTML formatting)
textAudioNoOptional array of audio file URLs to attach to the main text field. Audio will be downloaded and can be played in Anki.
backImagesNoOptional array of image URLs to embed in the back extra field. Images will be downloaded and attached automatically.
textImagesNoOptional array of image URLs to embed in the main text field. Images will be downloaded and attached automatically.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It does disclose the key non-obvious behavior: media from URLs is 'automatically downloaded and embedded.' However, this largely repeats what the schema parameter descriptions already state, and it omits other behaviors an agent might need, such as duplicate-creation consequences or deletion of previous notes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with the primary purpose and syntax example front-loaded. The example ({{c1::Paris}} is the capital of France) earns its place, and the media-handling sentence is compact. Slight redundancy with schema param descriptions prevents a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter creation tool with no annotations and no output schema, the description covers the core cloze workflow adequately and the schema richly documents every parameter. It is incomplete in that it doesn't address return values, duplicate-creation behavior, or how this differs from the bulk sibling, though schema richness compensates for much of the gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds marginal value by demonstrating the {{c1::text}} syntax pattern for the text parameter, but it adds nothing about deckName, tags, audio, or image parameters beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Create a new cloze note in a specified deck') and the cloze-deletion syntax example makes it clearly distinct from the sibling create-card. However, it does not differentiate itself from create-cloze-cards-bulk, so it falls just short of full sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains HOW to use the tool (cloze syntax, HTML support) but gives no guidance on WHEN to choose it over alternatives like create-card, create-cloze-cards-bulk, or update-cloze-card. The only usage routing (use create-deck first) lives in the schema, not the description, so an agent gets no explicit selection criteria from the description itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create-cloze-cards-bulkA

Create multiple cloze notes in a single call. Use this instead of calling create-cloze-card repeatedly — it sends one request to Anki regardless of how many notes are in the batch. Does not support images or audio: use create-cloze-card for notes that need media.

ParametersJSON Schema
NameRequiredDescriptionDefault
cardsYesArray of cloze notes to create
deckNameYesName of the deck to add the notes to. The deck must already exist - use create-deck first if it does not. A `::` in the name means a nested deck: `Biology::Cells` is a deck named Cells inside a deck named Biology. There is no way to name a single deck literally `Biology::Cells`.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses a key behavioral trait (sends one request regardless of batch size) and a limitation (no media support). This goes beyond the schema, which only describes parameters. However, it does not mention error handling, idempotency, or return behavior, which would make it more complete. Still, it provides meaningful context that an agent would find useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with zero fluff. The primary purpose and efficiency benefit are front-loaded in the first sentence, and the limitation with alternative is in the second. Every word earns its place, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a bulk creation tool with two parameters and no output schema, the description covers the essential context: what it does, when to use it, and a key limitation. It relies on the schema for deck existence and tag constraints, which is appropriate given 100% schema coverage. It lacks explicit mention of return values or failure modes, but those are not critical for a straightforward creation tool. Overall, it is complete enough for an agent to correctly invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters (deckName, cards, and nested fields). The tool description adds no extra parameter-specific meaning beyond the schema. Per calibration, baseline is 3 when schema covers all parameters, and no additional value is added here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates multiple cloze notes in a single call, using specific verbs and resources. It explicitly distinguishes itself from create-cloze-card by stating it is a batch alternative, and even names the sibling for media support. This leaves no ambiguity about its function or its differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: use this instead of calling create-cloze-card repeatedly, and use create-cloze-card when media (images/audio) is needed. It also implies it is the preferred choice for bulk cloze creation without media. This directly addresses when to use the tool versus its alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create-deckA

Create a new Anki deck

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new deck. A `::` in the name creates a nested deck - `Biology::Cells` is a deck named Cells inside a deck named Biology and Anki creates the parent if it does not exist. There is no way to name a single deck literally `Biology::Cells`.

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It only says 'Create' with no mention of side effects, error handling, or what happens on duplicate deck names. The schema does note nested deck behavior, but that is outside the description itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with zero redundancy. The purpose is front-loaded and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple creation tool with one parameter and no output schema, the definition is mostly complete. However, without annotations, the lack of behavioral disclosure (e.g., idempotency, failure modes) leaves some gaps for an agent expecting robust guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the 'name' parameter is thoroughly documented, including nested deck syntax and parent auto-creation. The description adds no additional parameter context, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Create') and a specific resource ('a new Anki deck'). It clearly distinguishes from sibling tools that operate on cards, so an agent can identify it without confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit alternative deck creation tool among siblings, so the intended use is implied. The description could mention when not to use it (e.g., if a deck already exists), but the context makes the primary use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete-cardA

PERMANENTLY deletes notes. This cannot be undone and there is no trash to recover them from — the notes and every card generated from them are gone. Only delete notes the user has asked you to delete. Use find-cards first to obtain the note IDs and to confirm you have the right notes; there is no delete-by-query, and IDs must be listed explicitly. Deleting one cloze note removes every card generated from it.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Acknowledges that this deletion is permanent and was requested by the user.
noteIdsYesIDs of the notes to delete permanently, at most 50 per call. Obtain them with find-cards.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly warns that deletion is permanent, cannot be undone, has no trash recovery, removes every card generated from the notes, and that deleting a cloze note removes all its generated cards. This is exemplary disclosure for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized for a destructive tool and front-loads the most important fact: permanent deletion. Every sentence adds relevant guidance. It is slightly redundant between 'cannot be undone' and 'notes and every card generated from them are gone,' but the repetition serves to emphasize severity, so it remains effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with no annotations and no output schema, the description is fully complete. It covers the safety warning, the prerequisite find-cards workflow, explicit ID requirements, the confirm acknowledgement, and the cloze-note cascade behavior. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds substantial meaning beyond the schema: it explains that noteIds must come from find-cards, that there is no delete-by-query, and that IDs must be listed explicitly. It also reinforces the confirm parameter's purpose by tying it to user-requested deletion and permanence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'PERMANENTLY deletes notes.' It clearly distinguishes itself from the create/update/find siblings by focusing exclusively on deletion, and it adds the critical 'permanent' qualifier that defines the tool's scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: only delete notes the user has asked to delete. It also provides a required workflow: use find-cards first to obtain note IDs and confirm the right notes, and states that there is no delete-by-query and IDs must be listed explicitly. This fully routes the agent away from misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find-cardsA

Search for notes using Anki's search syntax and return their note IDs, note type, tags, and a short excerpt of each field. Use this to get the noteId needed by update-card, update-cloze-card or delete-card. Field content is truncated and the number of results is capped, so narrow the query if the note you want is not listed. Examples: 'deck:Spanish', 'tag:vocab', 'front:hello', 'deck:Spanish tag:verbs'.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesAnki search query, e.g. 'deck:Default', 'tag:vocab', or 'deck:Spanish tag:verbs'. See Anki's search documentation for the full syntax.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It discloses that field content is truncated, results are capped, and the output includes note IDs, note type, tags, and excerpts. It does not mention auth, exact caps, or ordering, but for a read-only search tool the disclosed behavior is substantially transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, front-loads the core purpose, then gives the usage context, limitations, and examples. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a single parameter, no output schema, and no annotations, the description covers the essential information: what it searches, what it returns, how to use the query, and the main limitations. It could add the exact truncation cap or result format, but the existing content is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already describes the query parameter, so the baseline is 3. The description adds value by giving concrete Anki query syntax examples and explaining the consequence of overly broad queries, which helps the agent choose an effective parameter value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Search for notes using Anki's search syntax') and enumerates the returned fields (note IDs, note type, tags, excerpts). It also explicitly positions the tool as the prerequisite for update-card, update-cloze-card, and delete-card, clearly differentiating it from the sibling create/update/delete tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: to obtain the noteId needed by update-card, update-cloze-card, or delete-card. It also warns that results are truncated and capped and instructs the agent to narrow the query if the desired note is not listed, which is actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update-cardC

Update an existing note

ParametersJSON Schema
NameRequiredDescriptionDefault
backNoNew back side content
tagsNoNew tags for the note. A tag cannot contain a space (Anki splits it into two tags) or a tab or newline (Anki removes it) - use organic_chemistry or organic::chemistry for a hierarchy.
frontNoNew front side content
noteIdYesID of the note to update

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It only states 'update' without revealing whether fields are partially updated or fully replaced, what happens to omitted fields, or any side effects. This is a significant gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no wasted words. It's appropriately sized for a simple update operation, though it could benefit from more detail. The brevity is a strength, not a flaw.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and annotations, the description leaves out important operational context. It doesn't explain the effect on fields not provided, whether tags are replaced or merged, or what the response looks like. For a tool with four parameters, this is incomplete and could lead to incorrect usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter already having a clear description in the schema. The tool description adds no additional meaning beyond what the schema provides, so the baseline of 3 applies. The schema itself adequately explains the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an existing note, giving a specific verb and resource. However, it doesn't differentiate from sibling update-cloze-card, which is a similar operation on a specialized note type. The name 'update-card' vs description 'note' adds minor ambiguity, but it's still understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives like update-cloze-card. There's no mention of what kinds of notes are appropriate, nor any exclusions or prerequisites. An agent is left to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update-cloze-cardC

Update an existing cloze note

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoNew tags for the note. A tag cannot contain a space (Anki splits it into two tags) or a tab or newline (Anki removes it) - use organic_chemistry or organic::chemistry for a hierarchy.
textNoNew text with cloze deletions using {{c1::text}} syntax
noteIdYesID of the note to update
backExtraNoNew extra information to show on the back of the card

TDQS

C2.4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the full burden of behavioral disclosure. It only states the action without mentioning side effects, permission requirements, whether the update is partial or full, or any impact on existing card data. For a mutation tool, this is a significant gap – the agent knows it updates but not how it behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short, essentially restating the tool name. While it is not verbose, it fails to add any value beyond the name – it does not earn its place by providing useful context. It is under-specified rather than concise, similar to a tautology.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 4 parameters, no annotations, and no output schema, the description is completely inadequate. It does not explain what 'update' means operationally, whether fields are optional or overwrite existing values, or what the expected outcome is. An agent cannot safely invoke this tool based solely on this description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are already documented in the input schema. The description adds no additional parameter context, but per the rubric, the baseline is 3 when the schema covers everything. The description does not clarify parameter relationships or update semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Update an existing cloze note'. It distinguishes from create-cloze-card by using 'update' and specifies 'cloze' to differentiate from generic update-card. However, it does not mention the fields that can be updated or the fact that it operates on a note rather than a card, leaving some ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus the sibling update-card or create-cloze-card. An agent cannot determine whether to use this for cloze notes and update-card for basic notes without additional context. No exclusions or alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv1.0.0
    • First observedcreate-card
    • First observedcreate-cards-bulk
    • First observedcreate-cloze-card
    • First observedcreate-cloze-cards-bulk
    • First observedcreate-deck
    • First observeddelete-card
    • First observedfind-cards
    • First observedupdate-card
    • First observedupdate-cloze-card

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct action and note type: deck creation, card creation/update for basic and cloze types, bulk variants, search, and deletion. The bulk tools are explicitly separated from single-card tools, and find-cards is clearly the retrieval path. No two tools appear to do the same thing.

Naming Consistency5/5

All tool names follow a consistent hyphenated lowercase verb-noun pattern: create-deck, create-card, update-card, create-cloze-card, update-cloze-card, create-cards-bulk, create-cloze-cards-bulk, find-cards, delete-card. The pattern is uniform and predictable.

Tool Count5/5

With 9 tools, the server is well-scoped for Anki card management. It covers core lifecycle operations (create, update, find, delete) with separate handling for basic vs. cloze notes and bulk operations, without excessive redundancy.

Completeness4/5

The card lifecycle is well covered: create (single/bulk, basic/cloze), update, find, delete. Deck management is limited to creation only, with no update or delete deck tools, but this is a minor gap since decks are simple containers and find-cards can search by deck name.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that enables AI assistants to interact with the Anki flashcard application for studying, deck management, and note creation. It supports natural language interaction for reviewing cards, searching content, and managing media files across local and remote environments.
    1,774 npm
    484
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables AI assistants to seamlessly manage Anki flashcards, decks, and templates through the AnkiConnect API. It supports intelligent querying, batch note creation, and detailed study progress analysis using natural language.
    4
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    An MCP server that enables Claude Code to create, manage, and search Anki flashcards directly from the terminal. It supports batch card creation, deck statistics retrieval, and synchronization with AnkiWeb for cross-platform review.
    8
    -