Clanki
Clanki is an MCP server that lets AI assistants manage Anki flashcards through AnkiConnect.
Create decks, including nested decks via
::in the nameCreate basic flashcards with HTML-formatted front/back, tags, and embedded images/audio from URLs
Create cloze cards with
{{c1::text}}deletions, extra back content, tags, and mediaBulk-create many basic or cloze notes in one request, with automatic duplicate and cloze-syntax handling
Update existing notes and cloze cards (content and tags)
Search notes using Anki's query syntax and get IDs, note types, tags, and excerpts
Permanently delete notes by explicit ID, with a required confirmation flag
Read an entire deck's notes through the
anki://deck/<name>resource
Enables interaction with Anki flashcard decks through AnkiConnect, allowing creation and management of decks, creation of basic and cloze deletion cards, updating existing cards, adding tags, and viewing deck contents.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Clankicreate a flashcard in my Spanish deck with 'hola' on the front and 'hello' on the back"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Clone this repository:
git clone https://github.com/yourusername/clanki.git
cd clankiInstall dependencies:
npm installBuild the project:
npm run buildSetup
Make sure Anki is running and the AnkiConnect plugin is installed and enabled.
Note the absolute path to
build/index.jsin 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.jswill 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.
Register the server with your client, using one of the sections below.
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 |
|
Windows |
|
Linux |
|
{
"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.jsThe -- 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 |
| You, in this project only. The default. |
| You, in every project on this machine. |
| Written to |
Check it worked:
claude mcp listclanki 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.jsAs 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 listConfiguration
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 |
| Note type for ordinary two-sided notes, e.g. |
| Note type for cloze notes, e.g. |
| Its two fields, front first, e.g. |
| Its two fields, text first, e.g. |
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 |
|
|
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.jscodex mcp add clanki --env CLANKI_BASIC_NOTE_TYPE=Einfach -- node /path/to/clanki/build/index.jsRestart 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 tofront: Front side content of the note (supports HTML)back: Back side content of the note (supports HTML)tags: (Optional) Array of tags for the notefrontImages: (Optional) Array of image URLs for the frontbackImages: (Optional) Array of image URLs for the backfrontAudio: (Optional) Array of audio URLs for the frontbackAudio: (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 totext: 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 notetextImages: (Optional) Array of image URLs for the text fieldbackImages: (Optional) Array of image URLs for the back extra fieldtextAudio: (Optional) Array of audio URLs for the text fieldbackAudio: (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 tocards: 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 tocards: 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 updatefront: (Optional) New front side contentback: (Optional) New back side contenttags: (Optional) New tags for the note
update-cloze-card
Updates an existing cloze note
Parameters:
noteId: ID of the note to updatetext: (Optional) New text with cloze deletionsbackExtra: (Optional) New extra information for the backtags: (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 callconfirm: Must betrue
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:
Make changes to
src/index.tsRebuild with
npm run buildDebug 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
Built with the Model Context Protocol SDK
Integrates with Anki via AnkiConnect
Available Tools
9 toolscreate-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.
| Name | Required | Description | Default |
|---|---|---|---|
| back | Yes | Back side content of the note (supports HTML formatting) | |
| tags | No | Optional 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. | |
| front | Yes | Front side content of the note (supports HTML formatting) | |
| deckName | Yes | Name 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`. | |
| backAudio | No | Optional array of audio file URLs to attach to the back of the note. Audio will be downloaded and can be played in Anki. | |
| backImages | No | Optional array of image URLs to embed on the back of the note. Images will be downloaded and attached automatically. | |
| frontAudio | No | Optional array of audio file URLs to attach to the front of the note. Audio will be downloaded and can be played in Anki. | |
| frontImages | No | Optional array of image URLs to embed on the front of the note. Images will be downloaded and attached automatically. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cards | Yes | Array of notes to create | |
| deckName | Yes | Name 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional 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. | |
| text | Yes | Text containing cloze deletions using {{c1::text}} syntax. Supports HTML formatting. Use {{c1::word}}, {{c2::word}}, etc. for multiple deletions. | |
| deckName | Yes | Name 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`. | |
| backAudio | No | Optional array of audio file URLs to attach to the back extra field. Audio will be downloaded and can be played in Anki. | |
| backExtra | No | Optional extra information to show on the back of the card (supports HTML formatting) | |
| textAudio | No | Optional array of audio file URLs to attach to the main text field. Audio will be downloaded and can be played in Anki. | |
| backImages | No | Optional array of image URLs to embed in the back extra field. Images will be downloaded and attached automatically. | |
| textImages | No | Optional array of image URLs to embed in the main text field. Images will be downloaded and attached automatically. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cards | Yes | Array of cloze notes to create | |
| deckName | Yes | Name 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
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Must be true. Acknowledges that this deletion is permanent and was requested by the user. | |
| noteIds | Yes | IDs of the notes to delete permanently, at most 50 per call. Obtain them with find-cards. |
TDQS
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.
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.
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.
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.
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Anki search query, e.g. 'deck:Default', 'tag:vocab', or 'deck:Spanish tag:verbs'. See Anki's search documentation for the full syntax. |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| back | No | New back side content | |
| tags | No | New 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. | |
| front | No | New front side content | |
| noteId | Yes | ID of the note to update |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | New 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. | |
| text | No | New text with cloze deletions using {{c1::text}} syntax | |
| noteId | Yes | ID of the note to update | |
| backExtra | No | New extra information to show on the back of the card |
TDQS
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.
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.
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.
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.
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.
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.
9 tool updates
v1.0.0- First observed
create-card - First observed
create-cards-bulk - First observed
create-cloze-card - First observed
create-cloze-cards-bulk - First observed
create-deck - First observed
delete-card - First observed
find-cards - First observed
update-card - First observed
update-cloze-card
TDQS
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Cloud-hosted MCP server for durable AI memory
MCP server for AI dialogue using various LLM models via AceDataCloud
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server that integrates Claude with Anki flashcards, allowing users to review due cards and create new flashcards directly through conversation.1429 PyPI13MIT
- AlicenseNot gradedqualityAmaintenanceAn 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 npm484MIT
- AlicenseNot gradedqualityDmaintenanceAn 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.4MIT
- FlicenseAqualityDmaintenanceAn 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-