# Anki (mcpb · anki-mcp.mcpb)

Study and manage Anki flashcards via AnkiConnect: quizzes, stats, leeches, bulk edits.

- Trust score: 57/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- mcpb · `anki-mcp.mcpb`: 57/100 (this document), [markdown](https://verifymcp.io/servers/nietus-anki-mcp/anki-mcp.md), [page](https://verifymcp.io/servers/nietus-anki-mcp/anki-mcp)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/nietus/anki-mcp/releases/download/v0.2.0/anki-mcp.mcpb`
- Transport: `stdio`
- SHA-256: `79f429e01b4abb8af26a23a05900d9aced901a468fa0ffa3a648d675043c7a25`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 23/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs were checked across the 105 of 105 dependencies we could resolve, so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - 32 of 105 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 30 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 79/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 3438 tokens (~88/item across 39 items; 35 tools + 4 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 92/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 77% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 37 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Anki MCP server?

Anki ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 79f429e01b4abb8af26a23a05900d9aced901a468fa0ffa3a648d675043c7a25; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/nietus/anki-mcp/releases/download/v0.2.0/anki-mcp.mcpb`
- SHA-256: `79f429e01b4abb8af26a23a05900d9aced901a468fa0ffa3a648d675043c7a25`

### Verify on macOS / Linux

```bash
echo "79f429e01b4abb8af26a23a05900d9aced901a468fa0ffa3a648d675043c7a25  anki-mcp.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\anki-mcp.mcpb).Hash -eq "79f429e01b4abb8af26a23a05900d9aced901a468fa0ffa3a648d675043c7a25"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 57, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 55, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 54, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 53, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 52, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 51, +4)

- [functional improvement] Stability: unverified → 0.23

### 2026-10-15 (score 47, +31)

- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: fail
- [functional] First check of Destructive annotations: 100
- [functional] First check of Schema quality: pass
- [functional] First check of Tool coverage: 77
- [functional] First check of Schema quality: good

## MCP tools (35)

### `get_deck_names` (~15 tokens)

List all deck names.

### `create_deck` (~39 tokens)

Create a deck (use '::' for subdecks, e.g. 'Japanese::Verbs').

Input parameters:

- `deckName` (string, required)

### `get_deck_model_info` (~43 tokens)

Which note types a deck uses. Call before adding cards to an existing deck to pick the right modelName and fields.

Input parameters:

- `deckName` (string, required)

### `get_study_overview` (~67 tokens)

Today's study plan: new/learning/review counts per deck, cards reviewed today, streak, and 7/30-day review totals. A good first call for a study session.

Input parameters:

- `deckNames` (array): Decks to include (default: all top-level decks).

### `get_retention_stats` (~70 tokens)

Learning analytics for a deck (subdecks included) over the last N days: true retention (young/mature), reviews per day, average seconds per review.

Input parameters:

- `days` (number): Look-back window, 1-365 (default 30).
- `deckName` (string, required)

### `sync` (~24 tokens)

Sync the collection with AnkiWeb (user must be logged in inside Anki).

### `get_due_cards` (~70 tokens)

Get cards due for review now (learning cards first, then oldest due). Each card includes the interval every button would give (nextIntervals).

Input parameters:

- `deckName` (string): Optional deck to study (subdecks included).
- `num` (number, required): How many cards to return (1-100).

### `get_new_cards` (~54 tokens)

Get new, never-studied cards (suspended cards excluded).

Input parameters:

- `deckName` (string): Optional deck (subdecks included).
- `num` (number, required): How many cards to return (1-100).

### `answer_cards` (~54 tokens)

Record the user's answers to cards you quizzed them on (1=Again, 2=Hard, 3=Good, 4=Easy). Returns each card's new interval.

Input parameters:

- `answers` (array, required)

### `undo` (~31 tokens)

Undo the most recent action in Anki (a review, a field edit, a suspend...). One action per call.

### `find_cards` (~136 tokens)

Search cards with an Anki query and return a page of results. Choose the sections you need to keep output small; use 'fields' when you plan to edit notes.

Input parameters:

- `include` (array): Sections to return (default: question, answer).
- `limit` (number): Page size, 1-100 (default 20).
- `offset` (number): Number of cards to skip (default 0).
- `query` (string, required): Anki search query, e.g. '"deck:My Deck" tag:verbs -is:suspended'. Empty field: 'Field:'; non-empty: 'Field:_*'.

### `suspend_cards` (~151 tokens)

Deactivate (suspend) cards so they stop appearing in reviews until unsuspend_cards is called. Scheduling (interval, ease, due date) is kept intact. Pass a label when the user will want to resume this exact group later.

Input parameters:

- `cardIds` (array): Card IDs (override filters).
- `deckName` (string): Deck (subdecks included).
- `dryRun` (boolean): Preview without changing anything.
- `label` (string): Name for this pause (e.g. 'hsk5-6'). Tags the notes with paused::<label>.
- `query` (string): Extra Anki search, ANDed.
- `tags` (array): Notes with any of these tags.

### `unsuspend_cards` (~139 tokens)

Reactivate (unsuspend) cards with their original scheduling. With a label, resumes exactly the cards paused under it (cards suspended for other reasons stay suspended); list groups with manage_tags { action: 'list', prefix: 'paused' }.

Input parameters:

- `cardIds` (array): Card IDs (override filters).
- `deckName` (string): Deck (subdecks included).
- `dryRun` (boolean): Preview without changing anything.
- `label` (string): Resume the group paused under this label.
- `query` (string): Extra Anki search, ANDed.
- `tags` (array): Notes with any of these tags.

### `move_cards` (~98 tokens)

Move cards to another deck (created automatically if it doesn't exist).

Input parameters:

- `cardIds` (array): Card IDs (override filters).
- `deckName` (string): Deck (subdecks included).
- `dryRun` (boolean): Preview without changing anything.
- `query` (string): Extra Anki search, ANDed.
- `tags` (array): Notes with any of these tags.
- `targetDeck` (string, required): Destination deck name.

### `reschedule_cards` (~200 tokens)

Change card scheduling: set a due date (e.g. vacation backlog), forget (reset to new) or relearn. Reversible only via undo, so preview with dryRun on broad filters.

Input parameters:

- `action` (string, required): set_due_date: make cards due on given days; forget: reset to new; relearn: put back into relearning.
- `cardIds` (array): Card IDs (override filters).
- `days` (string): For set_due_date: '0' = today, '1' = tomorrow, '3-7' = spread randomly over 3-7 days, suffix '!' also sets the interval (e.g. '1!').
- `deckName` (string): Deck (subdecks included).
- `dryRun` (boolean): Preview without changing anything.
- `query` (string): Extra Anki search, ANDed.
- `tags` (array): Notes with any of these tags.

### `find_leeches` (~146 tokens)

Find the user's weakest cards (leech tag or many lapses), ranked by lapses and ease. Good for focused drills or rewriting confusing cards.

Input parameters:

- `deckName` (string): Deck (subdecks included).
- `includeSuspended` (boolean): Include suspended cards (Anki auto-suspends leeches). Default true.
- `limit` (number): How many cards to return, 1-50 (default 15).
- `minLapses` (number): Minimum lapses to count as weak (default 3).
- `query` (string): Extra Anki search, ANDed.
- `tags` (array): Notes with any of these tags.

### `get_card_history` (~49 tokens)

Full review log of specific cards (date, button, interval change, time spent), to explain why a card keeps being forgotten.

Input parameters:

- `cardIds` (array, required): Up to 20 card IDs.

### `add_card` (~105 tokens)

Create ONE new note. For several notes use add_bulk; to change existing notes use update_note_fields.

Input parameters:

- `deckName` (string): Target deck (default 'Default').
- `fields` (object, required): Field name → HTML content, e.g. {"Front": "...", "Back": "..."}. Names must match the note type.
- `modelName` (string, required): Note type name (see get_deck_model_info / get_model_names).
- `tags` (array)

### `add_bulk` (~57 tokens)

Create many new notes in one call. Duplicates and invalid notes are skipped and reported with the reason. Use dryRun to check before adding.

Input parameters:

- `dryRun` (boolean): Preview without changing anything.
- `notes` (array, required)

### `add_cloze_cards` (~102 tokens)

Create cloze notes from text. Either pass 'terms' to hide (each becomes {{c1::}}, {{c2::}}...) or text that already has {{c1::...}} markup.

Input parameters:

- `deckName` (string)
- `dryRun` (boolean): Preview without changing anything.
- `items` (array, required)
- `modelName` (string): Cloze note type (default 'Cloze').
- `tags` (array)

### `update_note_fields` (~45 tokens)

Update fields of ONE existing note. For many notes use bulk_update_notes.

Input parameters:

- `fields` (object, required): Field name → new HTML content.
- `noteId` (number, required)

### `bulk_update_notes` (~26 tokens)

Update fields of many existing notes in one call.

Input parameters:

- `notes` (array, required)

### `find_and_replace` (~174 tokens)

Find and replace text across notes (plain text or regex), optionally only in some fields. Returns before/after samples; use dryRun to preview.

Input parameters:

- `caseSensitive` (boolean): Default false.
- `deckName` (string): Deck (subdecks included).
- `dryRun` (boolean): Preview without changing anything.
- `fields` (array): Only these fields (default: all).
- `find` (string, required)
- `noteIds` (array): Note IDs (override filters).
- `query` (string): Extra Anki search, ANDed.
- `regex` (boolean): Treat 'find' as a JavaScript regex (default false).
- `replace` (string, required): Replacement (regex mode supports $1 groups). Empty string deletes.
- `tags` (array): Notes with any of these tags.

### `delete_notes` (~125 tokens)

Permanently delete notes (and all their cards). Two steps: call without confirmToken to preview and get a token, show the preview to the user, then call again with the token after they confirm.

Input parameters:

- `confirmToken` (string): Token from the preview call. Only valid while the same notes still match.
- `deckName` (string): Deck (subdecks included).
- `noteIds` (array): Note IDs (override filters).
- `query` (string): Extra Anki search, ANDed.
- `tags` (array): Notes with any of these tags.

### `manage_tags` (~168 tokens)

Tag management: list tags (with a deck/filter it returns tag counts for those notes), add/remove tags on notes, rename a tag, or clear unused tags.

Input parameters:

- `action` (string, required)
- `deckName` (string): Deck (subdecks included).
- `dryRun` (boolean): Preview without changing anything.
- `newTag` (string): For rename.
- `noteIds` (array): Note IDs (override filters).
- `oldTag` (string): For rename.
- `prefix` (string): For list: only tags starting with this.
- `query` (string): Extra Anki search, ANDed.
- `tags` (array): Notes with any of these tags.
- `tagsToChange` (array): For add/remove: the tags to add or remove.

### `add_image` (~134 tokens)

Attach an image to a note field from a URL, a local file path, or base64 data. The image is stored in Anki's media folder.

Input parameters:

- `data` (string): Base64-encoded image data.
- `field` (string, required): Field that receives the <img> tag.
- `filename` (string): Optional file name (needed with 'data' to set the extension).
- `mode` (string): Append to the field (default) or replace it.
- `noteId` (number, required)
- `path` (string): Absolute path of a local image file.
- `url` (string)

### `add_card_with_audio` (~115 tokens)

Create ONE new note with Azure TTS audio generated from one of its fields.

Input parameters:

- `audioField` (string, required): Field that receives the [sound:...] tag.
- `deckName` (string)
- `fields` (object, required)
- `language` (string): Language code, default 'en' (e.g. es, fr, de, ja, zh, pt).
- `modelName` (string, required)
- `sourceField` (string, required): Field whose text is spoken.
- `tags` (array)

### `update_card_with_audio` (~89 tokens)

Generate audio for ONE existing note from one of its fields.

Input parameters:

- `audioField` (string, required): Field that receives the [sound:...] tag.
- `language` (string): Language code, default 'en' (e.g. es, fr, de, ja, zh, pt).
- `noteId` (number, required)
- `sourceField` (string, required): Field whose text is spoken.

### `bulk_generate_audio` (~204 tokens)

Generate audio for many notes at once (e.g. a whole deck). By default only notes whose audio field is empty are processed.

Input parameters:

- `audioField` (string, required): Field that receives the [sound:...] tag.
- `deckName` (string): Deck (subdecks included).
- `dryRun` (boolean): Preview without changing anything.
- `language` (string): Language code, default 'en' (e.g. es, fr, de, ja, zh, pt).
- `limit` (number): Max notes per call, 1-200 (default 50). Call again for the rest.
- `noteIds` (array): Note IDs (override filters).
- `overwrite` (boolean): Also regenerate notes that already have audio (default false).
- `query` (string): Extra Anki search, ANDed.
- `sourceField` (string, required): Field whose text is spoken.
- `tags` (array): Notes with any of these tags.

### `get_model_names` (~18 tokens)

List all note type (model) names.

### `get_model_details` (~28 tokens)

Fields, card templates and CSS of a note type.

Input parameters:

- `modelName` (string, required)

### `edit_note_type_field` (~103 tokens)

Add, remove, rename or reposition a field of a note type. 'remove' deletes that field's content from every note of the type.

Input parameters:

- `action` (string, required)
- `fieldName` (string, required): Field to act on (the current name when renaming).
- `index` (number): For add (optional) and reposition: 0-based position.
- `modelName` (string, required)
- `newFieldName` (string): For rename.

### `update_note_type_templates` (~66 tokens)

Replace the Front/Back HTML of card templates of a note type.

Input parameters:

- `modelName` (string, required)
- `templates` (object, required): Template name → {Front, Back}, e.g. {"Card 1": {"Front": "...", "Back": "..."}}.

### `update_note_type_styling` (~35 tokens)

Replace the CSS of a note type.

Input parameters:

- `css` (string, required)
- `modelName` (string, required)

### `create_model` (~56 tokens)

Create a new note type.

Input parameters:

- `cardTemplates` (array, required)
- `css` (string)
- `fieldNames` (array, required)
- `isCloze` (boolean): Default false.
- `modelName` (string, required)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/nietus-anki-mcp/anki-mcp#diagnostics

## Score history

- 2026-11-05: 57
- 2026-11-04: 57
- 2026-11-03: 56
- 2026-11-02: 56
- 2026-11-01: 55
- 2026-10-31: 55
- 2026-10-30: 54
- 2026-10-29: 54
- 2026-10-28: 54
- 2026-10-27: 53
- 2026-10-26: 53
- 2026-10-25: 52
- 2026-10-24: 52
- 2026-10-23: 51
- 2026-10-22: 51
- 2026-10-21: 47
- 2026-10-20: 47
- 2026-10-19: 47
- 2026-10-18: 47
- 2026-10-17: 47
- 2026-10-16: 47
- 2026-10-15: 47
- 2026-10-14: 16
- 2026-10-13: 16
- 2026-10-12: 16
- 2026-10-10: 16
- 2026-10-08: 16
- 2026-10-06: 16

## Common questions

### What is the Anki MCP server?

Anki is an MCP server listed in the public MCP registry as io.github.nietus/anki-mcp. Study and manage Anki flashcards via AnkiConnect: quizzes, stats, leeches, bulk edits. This page covers its MCPB bundle (https://github.com/nietus/anki-mcp/releases/download/v0.2.0/anki-mcp.mcpb).

### Is the Anki MCP server safe to use?

Anki scores 57 out of 100 on VerifyMCP. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Anki MCP server expose?

Anki exposes 35 tools: get_deck_names, create_deck, get_deck_model_info, get_study_overview, get_retention_stats, and 30 more. Their descriptions and schemas cost roughly 3,036 tokens of context every time the server is loaded.

### What licence is the Anki MCP server under?

Anki declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the Anki MCP server?

VerifyMCP ran 15 checks on Anki, covering Known CVEs, Install scripts, Dependency health, Source repository and 11 more. One item could not be completed, a gap on our side rather than a finding about Anki: Malware scan. Endpoint Security and Transport & Reachability do not apply to an MCPB bundle, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Repository: https://github.com/nietus/anki-mcp
- Changelog RSS feed: https://verifymcp.io/servers/nietus-anki-mcp/anki-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/nietus-anki-mcp/anki-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/nietus-anki-mcp/anki-mcp.json
- HTML version of this page: https://verifymcp.io/servers/nietus-anki-mcp/anki-mcp
