Skip to main content

Headless AnkiConnect-compatible REST API server with AnkiWeb sync

Project description

AnkiConnect Server

License: AGPL-3.0 Python 3.12+ FastAPI

Headless AnkiConnect-compatible REST API server with AnkiWeb sync support and MCP server integration.

❓ Problem & Solution

Problem: Traditional AnkiConnect requires the Anki desktop app running, works only on localhost, and can't be deployed to servers.

Solution: This headless server provides direct collection access without Anki desktop, supports remote deployment, and includes automatic AnkiWeb sync.

✨ Features

  • Server Deployment - Run on VPS, Raspberry Pi, or cloud without GUI
  • AI Integration - MCP server for AI assistant access to your cards
  • Full AnkiConnect API Compatibility - Version 6 API with all standard actions
  • Headless Operation - No Qt/GUI required, perfect for servers and containers
  • AnkiWeb Sync - Automatic synchronization with AnkiWeb (optional)
  • Custom Sync Server - Support for self-hosted Anki sync servers
  • MCP Server - Model Context Protocol integration for AI assistants

📋 Table of Contents

🔧 Requirements

  • Python 3.12+
  • uv package manager
  • Anki collection file (.anki21)

📦 Installation

Quick Install

# Clone the repository
git clone https://github.com/glechic/anki-connect-server.git
cd anki-connect-server

# Install with uv
uv pip install -e .

From PyPI (coming soon)

pip install anki-connect-server

⚙️ Configuration

Set environment variables before running the server:

Variable Required Default Description
ANKI_COLLECTION_PATH Yes - Path to your .anki21 collection file
ANKICONNECT_PORT No 8765 Server port
ANKICONNECT_BIND No 127.0.0.1 Bind address (use 0.0.0.0 for external access)
ANKICONNECT_ANKIWEB_USER No - AnkiWeb username (required for sync)
ANKICONNECT_ANKIWEB_PASS No - AnkiWeb password (required for sync)
ANKIWEB_URL No - Custom sync server URL (optional)
ANKICONNECT_FULL_UPLOAD No false Allow full upload on sync conflict

Example .env File

# Required: Path to your Anki collection
ANKI_COLLECTION_PATH=/path/to/collection.anki21

# Optional: Server configuration
ANKICONNECT_PORT=8765
ANKICONNECT_BIND=127.0.0.1

# Optional: AnkiWeb sync credentials
ANKICONNECT_ANKIWEB_USER=your@email.com
ANKICONNECT_ANKIWEB_PASS=your_password

# Optional: Custom sync server
# ANKIWEB_URL=https://your-sync-server.com

⚠️ Security Warning: Store credentials securely. Never commit .env files to version control.

🚀 Usage

Development Server

uv run uvicorn anki_connect_server.api:app --reload --port 8765

Production Server

uv run uvicorn anki_connect_server.api:app --host 0.0.0.0 --port 8765

Using the CLI

# Start the API server
uv run server

# Start the MCP server
uv run mcp-server

📚 API Reference

The server exposes a single POST endpoint at /api that accepts AnkiConnect-style JSON requests.

Request Format

{
  "action": "actionName",
  "version": 6,
  "params": {
    "param1": "value1",
    "param2": "value2"
  }
}

Response Format

{
  "result": <action_result>,
  "error": null
}

On error:

{
  "result": null,
  "error": "Error message"
}

Examples

Get Deck Names

curl -X POST http://localhost:8765/api \
  -H "Content-Type: application/json" \
  -d '{"action": "deckNames", "version": 6}'

Create a Deck

curl -X POST http://localhost:8765/api \
  -H "Content-Type: application/json" \
  -d '{"action": "createDeck", "version": 6, "params": {"deck": "My New Deck"}}'

Add a Note

curl -X POST http://localhost:8765/api \
  -H "Content-Type: application/json" \
  -d '{
    "action": "addNote",
    "version": 6,
    "params": {
      "note": {
        "deckName": "Default",
        "modelName": "Basic",
        "fields": {
          "Front": "Hello",
          "Back": "World"
        },
        "tags": ["api"]
      }
    }
  }'

Sync with AnkiWeb

curl -X POST http://localhost:8765/api \
  -H "Content-Type: application/json" \
  -d '{"action": "sync", "version": 6}'

Batch Multiple Actions

curl -X POST http://localhost:8765/api \
  -H "Content-Type: application/json" \
  -d '{
    "action": "multi",
    "version": 6,
    "params": {
      "actions": [
        {"action": "deckNames", "params": {}},
        {"action": "modelNames", "params": {}}
      ]
    }
  }'

Supported Actions

Misc

  • version - Get API version
  • sync - Sync with AnkiWeb
  • syncStatus - Get sync status
  • syncMedia - Sync media only
  • multi - Execute multiple actions
  • importPackage - Import .apkg file
  • exportPackage - Export deck to .apkg

Decks

  • deckNames - Get all deck names
  • deckNamesAndIds - Get deck names with IDs
  • createDeck - Create a new deck
  • deleteDecks - Delete decks
  • changeDeck - Move cards to different deck
  • getDecks - Get decks for cards
  • getDeckConfig - Get deck configuration
  • saveDeckConfig - Save deck configuration
  • setDeckConfigId - Assign config to decks
  • cloneDeckConfigId - Clone deck config
  • removeDeckConfigId - Remove deck config

Models

  • modelNames - Get all model names
  • modelNamesAndIds - Get model names with IDs
  • modelFieldNames - Get field names for model
  • modelFieldsOnTemplates - Get fields used in templates
  • createModel - Create a new note model
  • modelTemplates - Get card templates
  • modelStyling - Get CSS styling
  • updateModelTemplates - Update templates
  • updateModelStyling - Update CSS

Notes

  • addNote - Add a single note
  • addNotes - Add multiple notes
  • canAddNotes - Check if notes can be added
  • updateNoteFields - Update note fields
  • findNotes - Search for notes
  • notesInfo - Get note details
  • deleteNotes - Delete notes
  • addTags - Add tags to notes
  • removeTags - Remove tags from notes
  • getTags - Get all tags

Cards

  • findCards - Search for cards
  • cardsToNotes - Get note IDs from card IDs
  • cardsInfo - Get card details
  • suspend - Suspend cards
  • unsuspend - Unsuspend cards
  • areSuspended - Check if cards are suspended
  • areDue - Check if cards are due
  • getIntervals - Get card intervals

Media

  • getMediaDirPath - Get media directory path
  • storeMediaFile - Store a media file (base64)
  • retrieveMediaFile - Retrieve a media file
  • deleteMediaFile - Delete a media file

🤖 MCP Server

The server includes a Model Context Protocol (MCP) integration for AI assistants.

Starting the MCP Server

uv run mcp-server

Available MCP Tools

  • get_deck_names - Get all deck names
  • get_deck_names_and_ids - Get decks with IDs
  • create_deck - Create a new deck
  • delete_decks - Delete decks
  • get_model_names - Get all model names
  • get_model_field_names - Get fields for a model
  • add_note - Add a new note
  • find_notes - Search for notes
  • get_notes_info - Get note details
  • delete_notes - Delete notes
  • find_cards - Search for cards
  • get_cards_info - Get card details
  • suspend_cards / unsuspend_cards - Manage card suspension
  • are_suspended / are_due - Check card status
  • get_card_intervals - Get card intervals
  • get_all_tags - Get all tags
  • add_tags / remove_tags - Manage tags
  • get_media_dir_path - Get media directory
  • store_media_file / retrieve_media_file / delete_media_file - Media operations
  • change_deck - Move cards between decks
  • cards_to_notes - Convert card IDs to note IDs
  • get_deck_config - Get deck configuration
  • get_model_templates / get_model_styling - Model customization
  • get_api_version - Get API version
  • import_package / export_package - Import/export decks
  • sync / sync_media / get_sync_status - Sync operations

🐳 Docker

Building the Image

docker build -t anki-connect-server .

Running the Container

docker run -d \
  -p 8765:8765 \
  -v /path/to/collection.anki21:/data/collection.anki21 \
  -e ANKI_COLLECTION_PATH=/data/collection.anki21 \
  -e ANKICONNECT_ANKIWEB_USER=your@email.com \
  -e ANKICONNECT_ANKIWEB_PASS=your_password \
  --name anki-connect-server \
  anki-connect-server

Docker Compose

version: '3.8'

services:
  anki-connect-server:
    build: .
    ports:
      - "8765:8765"
    volumes:
      - ./collection.anki21:/data/collection.anki21
    environment:
      - ANKI_COLLECTION_PATH=/data/collection.anki21
      - ANKICONNECT_ANKIWEB_USER=${ANKIWEB_USER}
      - ANKICONNECT_ANKIWEB_PASS=${ANKIWEB_PASS}
    restart: unless-stopped

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

anki_connect_server-0.1.0.tar.gz (21.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

anki_connect_server-0.1.0-py3-none-any.whl (14.1 kB view details)

Uploaded Python 3

File details

Details for the file anki_connect_server-0.1.0.tar.gz.

File metadata

  • Download URL: anki_connect_server-0.1.0.tar.gz
  • Upload date:
  • Size: 21.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for anki_connect_server-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7643c46a7b991cbf4e4521f12b6030b31dbff8b9dfdcf066992020c620c5db9a
MD5 27716d58163a376f2618d614bcbd8810
BLAKE2b-256 ead3c3483da6a109e9073134917a05db1f4d211284822eab7b57dd3e04309480

See more details on using hashes here.

File details

Details for the file anki_connect_server-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: anki_connect_server-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 14.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for anki_connect_server-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 477e8b4845745fb9d80b0c02617c157c6011877071ba1f4313e8ee1518dadea9
MD5 c253de5297bb752f5ec6dd1295c5fb33
BLAKE2b-256 e4330ac59418dfb1a41ecea0ec6a8a3fa6b04bcdbe3c3f0310ee8e1bfcfb4431

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page