anki mcp server

Local 2025-08-31 23:21:05 0

A server implementation that connects to a locally running Anki, enabling card review and creation through the Model Context Protocol.


An MCP server implementation that connects to a locally running Anki, providing card review and creation.

This server is designed to work with the Anki desktop app and the Anki-Connect add-on.

Make sure you have the add-on installed before using.

Resources

  • anki://search/deckcurrent
  • Returns all cards from current deck
  • Equivalent of deck:current in Anki
  • anki://search/isdue
  • Returns cards in review and learning waiting to be studied
  • Equivalent of is:due in Anki
  • anki://search/isnew
  • Returns all unseen cards
  • Equivalent of is:new in Anki

Tools

  • update_cards
  • Marks cards with given card IDs as answered and gives them an ease score between 1 (Again) and 4 (Easy)
  • Inputs:

    • answers (array): Array of objects with cardId (number) and ease (number) fields
  • add_card

  • Creates a new card in the Default Anki deck
  • Inputs:

    • front (string): Front of card
    • back (string): Back of card
  • get_due_cards

  • Returns n number of cards currently due for review
  • Inputs:

    • num (number): Number of cards
  • get_new_cards

  • Returns n number of cards from new
  • Inputs:
    • num (number): Number of cards

Development

Install dependencies:

npm install

Build the server:

npm run build

For development with auto-rebuild:

npm run watch

Configuration

To use with Claude Desktop, add the server config:

On MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json On Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "anki-mcp-server": {
      "command": "/path/to/anki-mcp-server/build/index.js"
    }
  }
}

Debugging

Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector, which is available as a package script:

npm run inspector

The Inspector will provide a URL to access debugging tools in your browser.

[
  {
    "description": "After the user answers cards you've quizzed them on, use this tool to mark them answered and update their ease",
    "inputSchema": {
      "properties": {
        "answers": {
          "items": {
            "properties": {
              "cardId": {
                "description": "Id of the card to answer",
                "type": "number"
              },
              "ease": {
                "description": "Ease of the card between 1 (Again) and 4 (Easy)",
                "type": "number"
              }
            },
            "type": "object"
          },
          "type": "array"
        }
      },
      "type": "object"
    },
    "name": "update_cards"
  },
  {
    "description": "Create a new flashcard in Anki for the user. Must use HTML formatting only. IMPORTANT FORMATTING RULES:n1. Must use HTML tags for ALL formatting - NO markdownn2. Use <br> for ALL line breaksn3. For code blocks, use <pre> with inline CSS stylingn4. Example formatting:n   - Line breaks: <br>n   - Code: <pre style="background-color: transparent; padding: 10px; border-radius: 5px;">n   - Lists: <ol> and <li> tagsn   - Bold: <strong>n   - Italic: <em>",
    "inputSchema": {
      "properties": {
        "back": {
          "description": "The back of the card. Must use HTML formatting only.",
          "type": "string"
        },
        "front": {
          "description": "The front of the card. Must use HTML formatting only.",
          "type": "string"
        }
      },
      "required": [
        "front",
        "back"
      ],
      "type": "object"
    },
    "name": "add_card"
  },
  {
    "description": "Returns a given number (num) of cards due for review.",
    "inputSchema": {
      "properties": {
        "num": {
          "description": "Number of due cards to get",
          "type": "number"
        }
      },
      "required": [
        "num"
      ],
      "type": "object"
    },
    "name": "get_due_cards"
  },
  {
    "description": "Returns a given number (num) of new and unseen cards.",
    "inputSchema": {
      "properties": {
        "num": {
          "description": "Number of new cards to get",
          "type": "number"
        }
      },
      "required": [
        "num"
      ],
      "type": "object"
    },
    "name": "get_new_cards"
  }
]