AnkiConnect Server
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)
- MCP Server - Model Context Protocol integration for AI assistants
📋 Table of Contents
⚙️ 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
[email protected]
ANKICONNECT_ANKIWEB_PASS=your_password
# Optional: Custom sync server
ANKIWEB_URL=https://your-sync-server.com
🚀 Usage
Quick Start with uvx (No Installation)
# Run the API server
ANKI_COLLECTION_PATH=/path/to/collection.anki21 \
[email protected] \
ANKICONNECT_ANKIWEB_PASS=your_password \
uvx anki-connect-server api
# Run the MCP server
ANKI_COLLECTION_PATH=/path/to/collection.anki21 \
[email protected] \
ANKICONNECT_ANKIWEB_PASS=your_password \
uvx anki-connect-server mcp
📚 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 versionsync- Sync with AnkiWebsyncStatus- Get sync statussyncMedia- Sync media onlymulti- Execute multiple actionsimportPackage- Import.apkgfileexportPackage- Export deck to.apkg
Decks
deckNames- Get all deck namesdeckNamesAndIds- Get deck names with IDscreateDeck- Create a new deckdeleteDecks- Delete deckschangeDeck- Move cards to different deckgetDecks- Get decks for cardsgetDeckConfig- Get deck configurationsaveDeckConfig- Save deck configurationsetDeckConfigId- Assign config to deckscloneDeckConfigId- Clone deck configremoveDeckConfigId- Remove deck config
Models
modelNames- Get all model namesmodelNamesAndIds- Get model names with IDsmodelFieldNames- Get field names for modelmodelFieldsOnTemplates- Get fields used in templatescreateModel- Create a new note modelmodelTemplates- Get card templatesmodelStyling- Get CSS stylingupdateModelTemplates- Update templatesupdateModelStyling- Update CSS
Notes
addNote- Add a single noteaddNotes- Add multiple notescanAddNotes- Check if notes can be addedupdateNoteFields- Update note fieldsfindNotes- Search for notesnotesInfo- Get note detailsdeleteNotes- Delete notesaddTags- Add tags to notesremoveTags- Remove tags from notesgetTags- Get all tags
Cards
findCards- Search for cardscardsToNotes- Get note IDs from card IDscardsInfo- Get card detailssuspend- Suspend cardsunsuspend- Unsuspend cardsareSuspended- Check if cards are suspendedareDue- Check if cards are duegetIntervals- Get card intervals
Media
getMediaDirPath- Get media directory pathstoreMediaFile- Store a media file (base64)retrieveMediaFile- Retrieve a media filedeleteMediaFile- Delete a media file
🤖 MCP Server
The server includes a Model Context Protocol (MCP) integration for AI assistants.
Starting the MCP Server
ANKI_COLLECTION_PATH=/path/to/collection.anki21 \
[email protected] \
ANKICONNECT_ANKIWEB_PASS=your_password \
uvx anki-connect-server mcp
Available MCP Tools
get_deck_names- Get all deck namesget_deck_names_and_ids- Get decks with IDscreate_deck- Create a new deckdelete_decks- Delete decksget_model_names- Get all model namesget_model_field_names- Get fields for a modeladd_note- Add a new notefind_notes- Search for notesget_notes_info- Get note detailsdelete_notes- Delete notesfind_cards- Search for cardsget_cards_info- Get card detailssuspend_cards/unsuspend_cards- Manage card suspensionare_suspended/are_due- Check card statusget_card_intervals- Get card intervalsget_all_tags- Get all tagsadd_tags/remove_tags- Manage tagsget_media_dir_path- Get media directorystore_media_file/retrieve_media_file/delete_media_file- Media operationschange_deck- Move cards between deckscards_to_notes- Convert card IDs to note IDsget_deck_config- Get deck configurationget_model_templates/get_model_styling- Model customizationget_api_version- Get API versionimport_package/export_package- Import/export deckssync/sync_media/get_sync_status- Sync operations
Adding to Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"anki-connect-server": {
"command": "uvx",
"args": ["anki-connect-server", "mcp"],
"env": {
"ANKI_COLLECTION_PATH": "/path/to/collection.anki21",
"ANKICONNECT_ANKIWEB_USER": "[email protected]",
"ANKICONNECT_ANKIWEB_PASS": "your_password"
}
}
}
}
🐳 Docker
Using Pre-built Image
docker run -d \
-p 8765:8765 \
-v /path/to/collection.anki21:/data/collection.anki21 \
-e ANKI_COLLECTION_PATH=/data/collection.anki21 \
-e [email protected] \
-e ANKICONNECT_ANKIWEB_PASS=your_password \
--name anki-connect-server \
glechic/anki-connect-server:latest
Docker Compose
version: '3.8'
services:
anki-connect-server:
image: glechic/anki-connect-server:latest
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
Building from Source
docker build -t anki-connect-server .
No comments yet
Be the first to share your take.