Anki MCP

resmi

Server MCP yang memungkinkan asisten AI berinteraksi dengan Anki, aplikasi kartu flash pengulangan berjarak.

Apa yang bisa Anda lakukan dengan Anki MCP?

  • Meninjau kartu yang jatuh tempo secara percakapan — Minta asisten Anda untuk menarik kartu yang jatuh tempo dengan get_due_cards, tampilkan masing-masing melalui present_card, dan catat penilaian Anda dengan rate_card.
  • Membuat dan menambahkan kartu flash secara massal — Minta asisten untuk membuat catatan secara massal dengan addNotes, opsional membangun model khusus terlebih dahulu melalui createModel dan updateModelStyling.
  • Mencari dan mengedit catatan yang ada — Gunakan findNotes dengan sintaks kueri Anki, periksa detail melalui notesInfo, dan perbarui bidang dengan updateNoteFields.
  • Mengelola dek dan penjadwalan — Buat dek dengan createDeck, pindahkan kartu melalui changeDeck, atau jadwalkan ulang kartu menggunakan setDueDate dan forgetCards.
  • Mengimpor media ke dalam catatan — Minta asisten untuk mengunggah gambar lokal atau URL dengan storeMediaFile dan sematkan ke dalam bidang catatan.
  • Mengendalikan GUI Anki — Buka browser atau editor dengan guiBrowse dan guiEditNote, atau ambil catatan yang dipilih melalui guiSelectedNotes.

Dokumentasi

Server Anki MCP

Tests npm version

Anki + MCP Integration

Integrasikan Anki secara mulus dengan asisten AI melalui Model Context Protocol

Beta - Proyek ini sedang dalam pengembangan aktif. API dan fitur dapat berubah.

Server Model Context Protocol (MCP) yang memungkinkan asisten AI berinteraksi dengan Anki, aplikasi kartu flashcard dengan pengulangan berjarak.

Ubah pengalaman Anki Anda dengan interaksi bahasa alami - seperti memiliki tutor pribadi. Asisten AI tidak hanya menyajikan pertanyaan dan jawaban; ia dapat menjelaskan konsep, membuat proses belajar lebih menarik dan manusiawi, memberikan konteks, dan beradaptasi dengan gaya belajar Anda. Ia dapat membuat dan mengedit catatan dengan cepat, mengubah sesi belajar Anda menjadi percakapan dinamis. Lebih banyak fitur segera hadir!

Contoh dan Tutorial

Untuk panduan komprehensif, contoh dunia nyata, dan tutorial langkah demi langkah tentang penggunaan server MCP ini dengan Claude Desktop, kunjungi:

ankimcp.ai - Dokumentasi lengkap dengan contoh praktis dan kasus penggunaan

Lihat docs/ untuk dokumentasi tambahan, termasuk panduan pengaturan peninjau dan dek Anki contoh.

Contoh Kasus Penggunaan

Tiga prompt representatif yang menunjukkan alur alat yang diaktifkan server ini:

  1. "Bantu saya meninjau dek Spanyol saya." — Asisten menyinkronkan dengan AnkiWeb (sync), mengambil kartu yang jatuh tempo (get_due_cards dengan filter dek), menyajikan setiap kartu (present_card), dan mencatat penilaian Anda (rate_card). Percakapan belajar alami dengan penjelasan yang disesuaikan untuk Anda.

  2. "Buat 10 kartu kosakata Arab dengan gaya RTL." — Asisten membuat daftar tipe catatan (modelNames), membuat model RTL kustom jika diperlukan (createModel + updateModelStyling untuk CSS kanan-ke-kiri), lalu membuat kartu secara massal (addNotes).

  3. "Impor gambar ini dari folder Unduhan saya ke bagian depan catatan yang dipilih." — Asisten mengunggah file lokal (storeMediaFile dengan jalur file), membaca catatan yang saat ini dipilih dari browser (guiSelectedNotes + notesInfo), dan memperbarui bidang depan dengan tag <img> (updateNoteFields).

Alat yang Tersedia

Server ini menyediakan 50 alat MCP — 39 alat penting untuk operasi Anki sehari-hari dan 11 alat GUI yang menggerakkan antarmuka desktop Anki untuk alur kerja pengeditan/pembuatan catatan.

Alat Penting

Tinjau & Belajar

  • sync - Sinkronkan dengan AnkiWeb untuk menarik data terbaru dan mendorong perubahan
  • get_due_cards - Dapatkan kartu yang jatuh tempo untuk ditinjau, opsional difilter berdasarkan dek (jawaban dihilangkan kecuali include_answer: true, default false)
  • get_cards - Dapatkan kartu dengan filter fleksibel berdasarkan status (jatuh tempo, baru, belajar, ditangguhkan, dikubur) dan dek (jawaban dihilangkan kecuali include_answer: true, default false)
  • present_card - Tampilkan kartu untuk ditinjau dengan sisi pertanyaan/depannya
  • rate_card - Nilai kinerja kartu (Lagi, Sulit, Baik, Mudah) dan jadwalkan tinjauan berikutnya
  • forgetCards - Atur ulang kartu menjadi baru, membuang penjadwalannya tanpa mencatat tinjauan
  • setDueDate - Jadwalkan ulang kartu menjadi jatuh tempo dalam N hari ("0", "3-7", "1!"), tanpa mencatat tinjauan

Catatan: forgetCards dan setDueDate mengubah penjadwalan tanpa mencatat tinjauan, yang membedakannya dari rate_card. Gunakan keduanya ketika jadwal kartu salah daripada jawabannya: menilai kartu Again untuk menguburnya lebih dalam mencatat kegagalan nyata dan menurunkan faktor kemudahannya, secara permanen memiringkan penjadwalan masa depan dan statistik Anda. forgetCards menghapus interval dan memulai kartu dari awal; setDueDate mempertahankan riwayat kartu dan hanya memindahkan tinjauan berikutnya.

Catatan: Konten kartu front/back dirender per kartu dari templatnya sendiri (seperti yang ditampilkan Anki), sehingga kartu terbalik dan cloze menampilkan arah yang benar. Teks statis yang ditambahkan oleh templat kartu Anda juga muncul di keluaran.

Manajemen Dek

  • listDecks - Daftar semua dek, opsional dengan statistik antrean belajar per dek
  • deckStats - Dapatkan statistik komprehensif untuk satu dek (antrean belajar, hitungan status kartu sebenarnya, distribusi kemudahan/interval)
  • createDeck - Buat dek kosong baru (mendukung Parent::Child, maksimal 2 level)
  • changeDeck - Pindahkan kartu ke dek yang berbeda (dibuat jika belum ada)

Catatan: Statistik dek tersedia dalam dua varian. Blok counts (dan semua yang dilaporkan listDecks) mencerminkan browser dek Anki: kartu jatuh tempo hari ini, dibatasi oleh batas harian baru/tinjauan setiap dek, dengan kartu yang ditangguhkan dan dikubur dikecualikan — jadi review bukan "kartu matang" dan bucket other hanyalah sisa aritmatika (sebagian besar kartu tinjauan yang tidak jatuh tempo hari ini ditambah kartu baru yang melebihi batas harian). Untuk total per status yang sebenarnya gunakan blok states pada deckStats / collection_stats, yang menghitung new, learning, review, suspended dan buried melalui pencarian Anki, mengabaikan tanggal jatuh tempo dan batas harian.

Manajemen Catatan

  • addNote - Buat satu catatan dengan bidang dan tag yang ditentukan
  • addNotes - Buat batch hingga 100 catatan yang berbagi dek dan model (dukungan sukses parsial)
  • findNotes - Cari catatan menggunakan sintaks kueri Anki (deck:, tag:, is:due, dll.)
  • notesInfo - Dapatkan informasi terperinci tentang catatan (bidang, tag, gaya CSS)
  • updateNoteFields - Perbarui bidang catatan yang ada (sadar CSS, mendukung konten HTML)
  • deleteNotes - Hapus catatan dan semua kartu terkait (destruktif, memerlukan konfirmasi)

Manajemen Tag

  • getTags - Dapatkan semua tag dalam koleksi (gunakan yang pertama untuk menghindari duplikasi)
  • addTags - Tambahkan tag yang dipisahkan spasi ke catatan yang ditentukan
  • removeTags - Hapus tag yang dipisahkan spasi dari catatan yang ditentukan
  • replaceTags - Ganti nama tag di seluruh catatan yang ditentukan
  • clearUnusedTags - Hapus tag yatim yang tidak digunakan oleh catatan mana pun (destruktif)

Manajemen Media

  • getMediaFilesNames - Daftar file media di collection.media, opsional difilter berdasarkan pola
  • retrieveMediaFile - Unduh file media sebagai konten base64
  • storeMediaFile - Unggah media dari data base64, jalur file absolut, atau URL
  • deleteMediaFile - Hapus file media dari collection.media (destruktif)

💡 Praktik Terbaik untuk Gambar:

  • Gunakan jalur file (mis., /Users/you/image.png) - Cepat dan efisien
  • Gunakan URL (mis., https://example.com/image.jpg) - Unduhan langsung
  • Hindari base64 - Sangat lambat dan tidak efisien token

Cukup beri tahu Claude di mana gambar berada, dan ia akan menangani unggahan secara otomatis menggunakan metode yang paling efisien.

Manajemen Model/Templat

  • modelNames - Daftar semua tipe catatan/model yang tersedia
  • modelFieldNames - Dapatkan nama bidang untuk tipe catatan tertentu
  • modelStyling - Dapatkan informasi gaya CSS untuk tipe catatan
  • modelTemplates - Dapatkan templat kartu (HTML Depan dan Belakang) untuk tipe catatan
  • createModel - Buat tipe catatan baru dengan bidang kustom, templat kartu, dan CSS (mis., model RTL)
  • updateModelStyling - Perbarui gaya CSS untuk tipe catatan yang ada (berlaku untuk semua kartunya)
  • updateModelTemplates - Perbarui templat kartu (HTML Depan dan Belakang) untuk tipe catatan yang ada (berlaku untuk semua kartunya)
  • addModelField - Tambahkan bidang baru ke tipe catatan yang ada (ditambahkan di akhir atau disisipkan di posisi tertentu)
  • removeModelField - Hapus bidang dari tipe catatan yang ada (menghapus kontennya dari semua catatan; memerlukan konfirmasi eksplisit)
  • renameModelField - Ganti nama bidang dalam tipe catatan yang ada (templat kartu yang mereferensikan nama lama harus diperbarui secara terpisah)
  • repositionModelField - Ubah posisi bidang dalam tipe catatan yang ada

Statistik

  • collection_stats - Statistik agregat di semua dek dengan perincian per dek dan hitungan status kartu di seluruh koleksi
  • review_stats - Analisis riwayat tinjauan (pola temporal, metrik retensi, rentang belajar)

Alat GUI

Alat yang menggerakkan antarmuka desktop Anki. Dimaksudkan untuk alur kerja pengeditan/pembuatan catatan dan manajemen dek, bukan untuk sesi tinjauan.

  • guiBrowse - Buka Browser Kartu dan cari kartu
  • guiSelectCard - Pilih kartu tertentu di Browser Kartu
  • guiSelectedNotes - Dapatkan ID catatan yang saat ini dipilih di Browser Kartu
  • guiAddCards - Buka dialog Tambah Kartu dengan detail catatan yang telah ditentukan
  • guiEditNote - Buka editor catatan untuk catatan tertentu
  • guiDeckOverview - Buka dialog Ringkasan Dek untuk dek tertentu
  • guiDeckBrowser - Buka dialog Browser Dek
  • guiCurrentCard - Dapatkan info tentang kartu saat ini dalam mode tinjauan
  • guiShowQuestion - Tampilkan sisi pertanyaan dari kartu saat ini
  • guiShowAnswer - Tampilkan sisi jawaban dari kartu saat ini
  • guiUndo - Batalkan tindakan terakhir di Anki

Prasyarat

Instalasi

Ada beberapa cara untuk memasang server di mesin Anda. Setelah terpasang, buka Menghubungkan Klien AI untuk menghubungkannya ke asisten AI Anda — secara lokal atau jarak jauh.

npm (global atau npx)

Cara umum untuk memasang server, cocok untuk klien MCP apa pun yang meluncurkannya secara langsung.

Pasang secara global untuk klien yang menjalankan perintah ankimcp:

npm install -g @ankimcp/anki-mcp-server

Atau jalankan sesuai permintaan tanpa perlu instalasi:

npx @ankimcp/anki-mcp-server

Bundel MCPB (Direkomendasikan untuk Claude Desktop)

Cara termudah untuk memasang server MCP ini untuk Claude Desktop:

  1. Unduh bundel .mcpb terbaru dari halaman Rilis
  2. Di Claude Desktop, pasang ekstensi:
    • Metode 1: Buka Pengaturan → Ekstensi, lalu seret dan lepas file .mcpb
    • Metode 2: Buka Pengaturan → Pengembang → Ekstensi → Pasang Ekstensi, lalu pilih file .mcpb
  3. Konfigurasikan URL AnkiConnect jika diperlukan (default ke http://localhost:8765)
  4. Mulai ulang Claude Desktop

Itu saja! Bundel ini mencakup semua yang diperlukan untuk menjalankan server secara lokal.

Untuk peninjau Direktori MCP Anthropic: panduan dari nol hingga integrasi dengan dek contoh yang telah diisi sebelumnya tersedia di docs/reviewer-setup.md.

Pasang dari Sumber (untuk pengembangan)

Untuk pengembangan atau penggunaan lanjutan (menjalankan rangkaian pengujian memerlukan Node.js 24.9+ — skrip pengujian npm memuat paket NestJS 12 khusus ESM melalui require(esm), yang hanya didukung Jest di sana; persyaratan runtime untuk menggunakan server tetap 22.12.0+):

npm install
npm run build

Menghubungkan Klien AI

Ada dua cara asisten AI dapat menjangkau server ini, tergantung di mana asisten berjalan:

  • Lokal — server berjalan di mesin yang sama dengan klien AI (Claude Desktop, Cursor, Cline, Zed, atau sesi browser lokal). Gunakan STDIO untuk klien MCP desktop, HTTP untuk alat berbasis web lokal.
  • Jarak Jauh — AI yang dihosting/jarak jauh (mis., ChatGPT atau Claude.ai di cloud) perlu menjangkau Anki yang berjalan di mesin lokal Anda. Gunakan Tunnel terkelola (✅ direkomendasikan — terautentikasi) atau, sebagai alternatif tanpa autentikasi yang lebih ringan, ngrok.

Lokal

Server berjalan di komputer yang sama dengan klien AI Anda dan berkomunikasi dengan AnkiConnect di localhost.

STDIO (integrasi lokal utama)

STDIO adalah transport standar untuk klien MCP desktop lokal — Claude Desktop, Cursor IDE, Cline, Zed Editor, dan lainnya. Klien meluncurkan server sebagai subproses dan berkomunikasi melalui input/output standar. Klien yang Didukung:

Untuk Claude Desktop, bundel MCPB adalah jalur termudah. Untuk klien lain, konfigurasikan paket npm dengan flag --stdio.

Konfigurasi - Pilih salah satu metode:

Metode 1: Menggunakan npx (disarankan - tanpa instalasi)

{
  "mcpServers": {
    "anki-mcp": {
      "command": "npx",
      "args": ["-y", "@ankimcp/anki-mcp-server", "--stdio"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

Metode 2: Menggunakan instalasi global

Pertama, instal secara global:

npm install -g @ankimcp/anki-mcp-server

Kemudian konfigurasikan:

{
  "mcpServers": {
    "anki-mcp": {
      "command": "ankimcp",
      "args": ["--stdio"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

Lokasi file konfigurasi:

  • Cursor IDE: ~/.cursor/mcp.json (macOS/Linux) atau %USERPROFILE%\.cursor\mcp.json (Windows)
  • Cline: Dapat diakses melalui UI pengaturan di VS Code
  • Zed Editor: Instal sebagai ekstensi MCP melalui marketplace ekstensi

Untuk fitur khusus klien dan pemecahan masalah, konsultasikan dokumentasi klien MCP Anda. Lihat juga Hubungkan ke Claude Desktop untuk konfigurasi yang mengarah langsung ke dist/main-stdio.js yang sudah dibangun.

HTTP (AI berbasis web lokal)

Mode HTTP menjalankan server sebagai server web lokal yang berbicara dengan protokol MCP Streamable HTTP. Ini adalah transport yang digunakan oleh alat AI berbasis web saat diarahkan ke mesin Anda, dan juga yang digunakan oleh opsi Remote untuk diekspos ke dunia luar. Dengan sendirinya, mode HTTP terikat hanya ke localhost.

Mengikat di luar localhost? Jika Anda meneruskan --host 0.0.0.0 (atau menjalankan di belakang reverse proxy/domain publik), server hanya menerima header Host loopback secara default untuk perlindungan DNS-rebinding — atur ALLOWED_HOSTS ke nama host yang digunakan klien. Lihat Konfigurasi Mode HTTP.

Pengaturan - Pilih salah satu metode:

Metode 1: Menggunakan npx (disarankan - tanpa instalasi)

# Quick start
npx @ankimcp/anki-mcp-server

# With custom options
npx @ankimcp/anki-mcp-server --port 8080 --host 0.0.0.0
npx @ankimcp/anki-mcp-server --anki-connect http://localhost:8765

Metode 2: Menggunakan instalasi global

# Install once
npm install -g @ankimcp/anki-mcp-server

# Run the server
ankimcp

# With custom options
ankimcp --port 8080 --host 0.0.0.0
ankimcp --anki-connect http://localhost:8765

Metode 3: Instal dari sumber (untuk pengembangan)

npm install
npm run build
npm run start:prod:http

Untuk membuat server HTTP lokal dapat dijangkau oleh AI yang dihosting di cloud, gunakan salah satu opsi Remote di bawah ini.

Remote

AI yang dihosting/remote (seperti ChatGPT atau Claude.ai yang berjalan di cloud) tidak dapat menjangkau localhost secara langsung. Opsi ini mengekspos Anki lokal Anda ke internet sehingga asisten jarak jauh dapat berbicara dengannya.

Tunnel (✅ Disarankan)

Jalur remote yang disarankan — terautentikasi & aman. Tidak seperti port publik mentah, mode tunnel mengharuskan Anda masuk (alur perangkat OAuth 2.0), sehingga endpoint tidak terbuka untuk siapa pun yang menebak URL.

Mode Tunnel memungkinkan asisten AI berbasis web menjangkau Anki lokal Anda tanpa menjalankan tunnel Anda sendiri. Server terhubung keluar ke layanan tunnel AnkiMCP yang dikelola (wss://tunnel.ankimcp.ai) melalui WebSocket dan diberi URL publik. Autentikasi sudah terintegrasi — tidak perlu akun ngrok atau proses tunnel terpisah, dan Anda masuk sekali.

Masuk (alur perangkat OAuth):

Mode Tunnel menggunakan Otorisasi Perangkat OAuth 2.0 Grant. Masuk akan membuka browser Anda secara otomatis ke halaman persetujuan dengan kode yang sudah tertanam di URL — tidak perlu mengetik apa pun, cukup setujui. (Jika browser tidak dapat terbuka, terminal akan mencetak URL verifikasi dan kode untuk dimasukkan secara manual sebagai cadangan.) Setelah berhasil, kredensial disimpan ke ~/.ankimcp/credentials.json (izin file 0600).

# Pre-authenticate (optional — --tunnel will trigger this automatically if needed)
ankimcp --login
npx @ankimcp/anki-mcp-server --login

# Clear saved credentials
ankimcp --logout

Mulai tunnel:

# Connect to the managed tunnel service (wss://tunnel.ankimcp.ai)
ankimcp --tunnel
npx @ankimcp/anki-mcp-server --tunnel

# Override the tunnel server URL (must be ws:// or wss://) — e.g. for self-hosting
ankimcp --tunnel wss://my-tunnel.example.com

Jika tidak ada kredensial, --tunnel secara otomatis memulai alur masuk terlebih dahulu, lalu melanjutkan ke tunnel. Login otomatis ini memerlukan terminal interaktif — ketika stdout bukan TTY (systemd, Docker tanpa kepala, CI), server akan gagal dengan cepat dan meminta Anda untuk menjalankan ankimcp --login terlebih dahulu. Setelah terhubung, URL tunnel publik akan dicetak; tekan Ctrl+C untuk memutuskan koneksi. Bagikan URL itu dengan asisten AI Anda.

Variabel lingkungan mode Tunnel:

VariabelDeskripsiDefault
TUNNEL_SERVER_URLURL WebSocket server tunnel (nilai flag --tunnel/--login menimpa ini)wss://tunnel.ankimcp.ai
TUNNEL_AUTH_CLIENT_IDID klien OAuth untuk alur perangkat. Lanjutan — hanya diperlukan saat menunjuk ke layanan tunnel/auth yang dihosting sendiri.(bawaan)

Endpoint auth alur perangkat (/auth/device, /auth/token) diturunkan dari TUNNEL_SERVER_URL, jadi menunjuk --tunnel (atau TUNNEL_SERVER_URL) ke host yang berbeda juga memindahkan autentikasi ke host tersebut.

Cara kerjanya: Mode Tunnel menjalankan server MCP dalam proses di belakang transport dalam memori (TunnelTransport). Transport itu memiliki server MCP dan mengubah setiap isi permintaan yang diteruskan menjadi respons, dan TunnelClient menjembatani ke layanan tunnel jarak jauh melalui WebSocket — meneruskan permintaan MCP masuk dan respons keluar. AnkiConnect tetap hanya dijangkau di mesin lokal Anda.

Revisi protokol: Karena tunnel menghubungkan server MCP dalam proses, mode tunnel hanya melayani revisi 2025 dari protokol MCP, sementara mode STDIO dan HTTP melayani revisi 2025 dan revisi 2026-07-28 yang lebih baru. Setiap alat berperilaku sama — tetapi klien yang hanya berbicara 2026-07-28 akan ditolak melalui tunnel dengan kesalahan versi protokol; jalankan mode STDIO atau HTTP untuk klien tersebut.

ngrok (alternatif tanpa autentikasi)

Jika Anda lebih suka mengekspos mode HTTP lokal secara publik tanpa akun di tunnel terkelola, flag bawaan --ngrok meluncurkan subproses ngrok (src/services/ngrok.service.ts) dan mencetak URL publik di banner startup:

# One-time ngrok setup, then:
ankimcp --ngrok

Rute ini tanpa autentikasi — siapa pun dengan URL dapat menjangkau Anki Anda, jadi ini kurang aman dibandingkan Tunnel. Lebih suka Tunnel kecuali Anda memiliki alasan spesifik untuk mengelola endpoint ngrok Anda sendiri. (Memerlukan instalasi ngrok global dan authtoken.)

Flag --ngrok meluncurkan ngrok dengan --host-header=rewrite, sehingga ngrok menulis ulang Host hulu menjadi localhost sebelum meneruskan. Itu menjaga permintaan dalam daftar izin Host loopback (lihat perlindungan DNS-rebinding) tanpa Anda harus menambahkan domain publik *.ngrok ke ALLOWED_HOSTS. Jika Anda menjalankan ngrok secara manual, gunakan flag yang sama — ngrok http --host-header=rewrite 3000 — jika tidak, ngrok meneruskan nama host ngrok publik sebagai Host dan server menolaknya dengan 403.

Opsi CLI (semua mode)

ankimcp [options]

Options:
  --stdio                        Run in STDIO mode (for MCP clients)
  --tunnel [url]                 Connect via the managed tunnel (authenticated)
  --login                        Authenticate for tunnel mode (OAuth device flow)
  --logout                       Clear saved tunnel credentials
  -p, --port <number>            Port to listen on (HTTP mode; default: 3000, or PORT env var)
  -h, --host <address>           Host to bind to (HTTP mode; default: 127.0.0.1, or HOST env var)
  -a, --anki-connect <url>       AnkiConnect URL (default: http://localhost:8765, or ANKI_CONNECT_URL env var)
  --ngrok                        Start ngrok tunnel (requires global ngrok installation)
  --read-only                    Run in read-only mode (blocks all write operations)
  --help                         Show help message

Usage with npx (no installation needed):
  npx @ankimcp/anki-mcp-server                        # HTTP mode
  npx @ankimcp/anki-mcp-server --port 8080            # Custom port
  npx @ankimcp/anki-mcp-server --stdio                # STDIO mode
  npx @ankimcp/anki-mcp-server --tunnel               # Managed tunnel mode
  npx @ankimcp/anki-mcp-server --ngrok                # HTTP mode with ngrok tunnel
  npx @ankimcp/anki-mcp-server --read-only            # Read-only mode

Usage with global installation:
  npm install -g @ankimcp/anki-mcp-server             # Install once
  ankimcp                                             # HTTP mode
  ankimcp --port 8080                                 # Custom port
  ankimcp --stdio                                     # STDIO mode
  ankimcp --tunnel                                    # Managed tunnel mode
  ankimcp --ngrok                                     # HTTP mode with ngrok tunnel
  ankimcp --read-only                                 # Read-only mode

Mode Hanya-Baca (semua mode)

Flag --read-only mencegah modifikasi apa pun pada koleksi Anki Anda. Saat diaktifkan:

  • Semua operasi baca berfungsi normal (menjelajahi dek, melihat kartu, mencari catatan)
  • Operasi tinjauan diizinkan (sinkronisasi, answerCards, suspend/unsuspend)
  • Modifikasi konten diblokir (addNote, deleteNotes, createDeck, updateNoteFields, dll.)
  • Berguna untuk menjelajahi data Anki dengan aman tanpa risiko perubahan yang tidak disengaja
# HTTP mode with read-only
ankimcp --read-only

# STDIO mode with read-only
ankimcp --stdio --read-only

# Can combine with other flags
ankimcp --ngrok --read-only

Anda juga dapat mengaktifkan mode hanya-baca melalui variabel lingkungan:

READ_ONLY=true ankimcp

Atau dalam konfigurasi klien MCP:

{
  "mcpServers": {
    "anki-mcp": {
      "command": "npx",
      "args": ["-y", "@ankimcp/anki-mcp-server", "--stdio", "--read-only"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

Hubungkan ke Claude Desktop (Mode Lokal)

Anda dapat mengonfigurasi server di Claude Desktop dengan:

  • Buka: Pengaturan → Pengembang → Edit Konfigurasi
  • Atau edit file konfigurasi secara manual

Konfigurasi

Tambahkan berikut ini ke konfigurasi Claude Desktop Anda:

{
  "mcpServers": {
    "anki-mcp": {
      "command": "node",
      "args": ["/path/to/anki-mcp-server/dist/main-stdio.js"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

Ganti /path/to/anki-mcp-server dengan jalur proyek Anda yang sebenarnya.

Lokasi File Konfigurasi

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

Untuk detail lebih lanjut, lihat dokumentasi MCP resmi.

Variabel Lingkungan (Opsional)

VariabelDeskripsiDefault
ANKI_CONNECT_URLURL AnkiConnecthttp://localhost:8765
ANKI_CONNECT_API_VERSIONVersi API6
ANKI_CONNECT_API_KEYKunci API jika dikonfigurasi di AnkiConnect-
ANKI_CONNECT_TIMEOUTWaktu tunggu permintaan dalam ms5000
READ_ONLYAktifkan mode hanya-baca (true atau 1)false
PORTMode HTTP: port untuk mendengarkan (flag --port lebih diutamakan)3000
HOSTMode HTTP: alamat untuk diikat (flag --host lebih diutamakan)127.0.0.1
ALLOWED_HOSTSMode HTTP: nilai header Host tambahan untuk diterima selain loopback (nama host dipisahkan koma). Diperlukan saat mengikat ke alamat LAN/publik atau berjalan di belakang reverse proxy. Lihat Konfigurasi Mode HTTP.hanya loopback
ALLOWED_ORIGINSMode HTTP: daftar izin pola Origin/Referer browser yang dipisahkan koma (wildcard didukung, mis. https://*.ngrok.io).http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*
TUNNEL_SERVER_URLURL WebSocket server tunnel (khusus mode tunnel)wss://tunnel.ankimcp.ai
MEDIA_ALLOWED_TYPESJenis MIME tambahan untuk diizinkan untuk impor jalur file (dipisahkan koma, mis., application/pdf)-
MEDIA_IMPORT_DIRBatasi impor jalur file ke direktori ini-
MEDIA_ALLOWED_HOSTSIzinkan host jaringan pribadi tertentu untuk impor URL (dipisahkan koma, mis., 192.168.1.50,my-nas)-

Contoh Penggunaan

Mencari dan Memperbarui Catatan

# Search for notes in a specific deck
findNotes(query: "deck:Spanish")

# Get detailed information about notes
notesInfo(notes: [1234567890, 1234567891])

# Update a note's fields (HTML content supported)
updateNoteFields(note: {
  id: 1234567890,
  fields: {
    "Front": "<b>¿Cómo estás?</b>",
    "Back": "How are you?"
  }
})

# Delete notes (requires confirmation)
deleteNotes(notes: [1234567890], confirmDeletion: true)

Contoh Sintaks Kueri Anki

Alat findNotes mendukung sintaks kueri Anki yang kuat:

  • "deck:DeckName" - Semua catatan di dek tertentu
  • "tag:important" - Catatan dengan tag "penting"
  • "is:due" - Kartu yang jatuh tempo untuk ditinjau
  • "is:new" - Kartu baru yang belum dipelajari
  • "added:7" - Catatan yang ditambahkan dalam 7 hari terakhir
  • "front:hello" - Catatan dengan "halo" di bidang depan
  • "flag:1" - Catatan dengan bendera merah
  • "prop:due<=2" - Kartu yang jatuh tempo dalam 2 hari
  • "deck:Spanish tag:verb" - Catatan dek Spanyol dengan tag kata kerja (DAN)
  • "deck:Spanish OR deck:French" - Catatan dari salah satu dek

Catatan Penting

Penanganan CSS dan HTML

  • Alat notesInfo mengembalikan informasi gaya CSS untuk kesadaran rendering yang tepat
  • Alat updateNoteFields mendukung konten HTML di bidang dan mempertahankan gaya CSS
  • Setiap model catatan memiliki gaya CSS sendiri - gunakan modelStyling untuk mendapatkan CSS khusus model

Peringatan Pembaruan

⚠️ PENTING: Saat menggunakan updateNoteFields, JANGAN melihat catatan di browser Anki saat memperbarui, atau bidang tidak akan diperbarui dengan benar. Tutup browser atau beralih ke catatan lain sebelum memperbarui. Lihat Masalah yang Diketahui untuk detail lebih lanjut.

Keamanan Penghapusan

Alat deleteNotes memerlukan konfirmasi eksplisit (confirmDeletion: true) untuk mencegah penghapusan yang tidak disengaja. Menghapus catatan menghapus SEMUA kartu terkait secara permanen.

Keamanan

Validasi Jalur File Media dan URL

Alat media (storeMediaFile, retrieveMediaFile, deleteMediaFile) dan bidang audio/gambar updateNoteFields menyertakan validasi keamanan untuk mencegah penyalahgunaan melalui injeksi prompt:

  • Impor jalur file dibatasi hanya untuk jenis file media (gambar, audio, video). File non-media (mis., kunci SSH, kredensial, konfigurasi shell) ditolak berdasarkan jenis MIME. Konfigurasikan MEDIA_ALLOWED_TYPES untuk mengizinkan jenis file tambahan, atau MEDIA_IMPORT_DIR untuk membatasi impor ke direktori tertentu.
  • Impor URL divalidasi terhadap serangan SSRF. Permintaan ke jaringan pribadi (10.x, 172.16.x, 192.168.x), loopback (127.x), link-local (169.254.x), dan skema non-HTTP(S) diblokir. Konfigurasikan MEDIA_ALLOWED_HOSTS untuk mengizinkan host jaringan pribadi tertentu.
  • Nama file dibersihkan untuk mencegah path traversal (mis., urutan ../../ dihapus).

Perlindungan ini berlaku untuk storeMediaFile, retrieveMediaFile, deleteMediaFile, dan bidang audio/gambar updateNoteFields.

Kerentanan path traversal dilaporkan oleh Hideaki Takahashi.

Perlindungan DNS-Rebinding (transport HTTP)

Ketika berjalan dalam mode HTTP, server memvalidasi header Host pada setiap permintaan. Secara default hanya host loopback (localhost, 127.0.0.1, ::1) yang diterima, tanpa memandang port. Host adalah header yang dilarang untuk browser, sehingga halaman web berbahaya tidak dapat memalsukannya — ini menutup jalur DNS-rebinding di mana halaman yang diarahkan ulang mencapai server lokal dengan Host yang dipalsukan dan tanpa Origin, serta mencapai alat MCP. Host yang tidak diizinkan ditolak dengan 403.

Jika Anda mengikat ke 0.0.0.0, berjalan di belakang reverse proxy, atau mengekspos domain tunnel publik, atur ALLOWED_HOSTS (nama host yang dipisahkan koma) untuk mengizinkan host tersebut. Saat menggunakan tunnel dengan ngrok, server menggunakan --host-header=rewrite, sehingga upstream masih melihat Host loopback. Lihat Konfigurasi Mode HTTP untuk daftar lengkap opsi.

Kerentanan DNS-rebinding dilaporkan oleh avishaigo-commits dan yotampe-pluto.

Kebijakan Privasi

Server MCP ini berjalan secara lokal di mesin Anda dan tidak mengumpulkan telemetri, analitik, atau data penggunaan.

Kebijakan lengkap: https://ankimcp.ai/privacy/

  • Pengumpulan data: Server tidak mengumpulkan apa pun. Server hanya meneruskan permintaan antara asisten AI Anda dan plugin AnkiConnect lokal Anda.
  • Penggunaan / penyimpanan: Tidak ada penyimpanan di sisi server. Semua data kartu flash tetap berada di instalasi Anki Anda di perangkat Anda sendiri.
  • Berbagi dengan pihak ketiga: Tidak ada. Server hanya berbicara dengan URL AnkiConnect yang Anda konfigurasikan (default: localhost). Jika Anda mengaktifkan sinkronisasi AnkiWeb bawaan Anki, itu terjadi antara instalasi Anki Anda dan AnkiWeb secara langsung — di luar cakupan server ini.
  • Retensi: Tidak berlaku — tidak ada data yang disimpan di sisi server.
  • Kontak: support@ankimcp.ai

Masalah yang Diketahui

Untuk daftar lengkap masalah yang diketahui dan keterbatasan, silakan kunjungi dokumentasi kami:

Dokumentasi Masalah yang Diketahui

Keterbatasan Kritis

Pembaruan Catatan Gagal Saat Dilihat di Browser

⚠️ PENTING: Saat memperbarui catatan menggunakan updateNoteFields, pembaruan akan gagal secara diam-diam jika catatan sedang dilihat di jendela browser Anki. Ini adalah keterbatasan upstream AnkiConnect.

Solusi: Selalu tutup browser atau navigasikan ke catatan yang berbeda sebelum memperbarui.

Untuk detail lebih lanjut dan masalah lain yang diketahui, lihat dokumentasi lengkap.

Pemecahan Masalah

Kesalahan ERR_REQUIRE_ESM

Jika Anda melihat kesalahan seperti:

Error [ERR_REQUIRE_ESM]: require() of ES Module not supported

Ini berarti versi Node.js Anda tidak didukung. Server memerlukan Node.js 22.12.0+.

Catatan: Runtime minimum yang didukung adalah Node.js 22.12.0. Node.js 20 (Iron) mencapai akhir masa pakai pada 2026-04-30 dan tidak lagi didukung.

Periksa versi Anda:

node --version

Solusi: Perbarui Node.js ke versi 22.12.0+. Anda dapat mengunduhnya dari nodejs.org atau menggunakan manajer versi seperti nvm.

Pengembangan

Mode Transport

Server ini mendukung tiga mode transport MCP melalui titik masuk terpisah:

Mode STDIO (Default)

  • Untuk klien MCP lokal seperti Claude Desktop
  • Menggunakan input/output standar untuk komunikasi
  • Titik masuk: dist/main-stdio.js
  • Jalankan: npm run start:prod:stdio atau node dist/main-stdio.js
  • Bundle MCPB: Menggunakan mode STDIO

Mode HTTP (HTTP Streamable)

  • Untuk klien MCP jarak jauh dan integrasi berbasis web
  • Menggunakan protokol MCP Streamable HTTP
  • Titik masuk: dist/main-http.js
  • Jalankan: npm run start:prod:http atau node dist/main-http.js
  • Port default: 3000 (dapat dikonfigurasi melalui variabel env PORT)
  • Host default: 127.0.0.1 (dapat dikonfigurasi melalui variabel env HOST)
  • Endpoint MCP: http://127.0.0.1:3000/ (jalur root)

Mode Tunnel (Tunnel WebSocket Terkelola)

  • Untuk asisten AI berbasis web melalui layanan tunnel AnkiMCP terkelola, dengan autentikasi bawaan
  • Server MCP berjalan dalam proses di belakang transport dalam memori; TunnelTransport memiliki server MCP dan TunnelClient menjembatani ke layanan tunnel melalui WebSocket
  • Protokol: melayani revisi MCP 2025 saja (STDIO dan HTTP juga melayani 2026-07-28)
  • Titik masuk: dist/main-tunnel.js
  • Jalankan: node dist/main-tunnel.js --tunnel (atau ankimcp --tunnel)
  • Autentikasi: ankimcp --login / ankimcp --logout; kredensial disimpan di ~/.ankimcp/credentials.json (0600)
  • Dev: npm run start:dev:tunnel (mode watch, menjalankan --tunnel --debug)

Membangun

npm run build  # Builds once, creates dist/ with all three entry points

main-stdio.js, main-http.js, dan main-tunnel.js semuanya dibangun ke dalam direktori dist/ yang sama. Pilih mana yang akan dijalankan berdasarkan kebutuhan Anda.

Konfigurasi Mode HTTP

Variabel Lingkungan:

  • PORT - Port server HTTP (default: 3000)
  • HOST - Alamat bind (default: 127.0.0.1 untuk localhost saja)
  • ALLOWED_HOSTS - Nilai header Host tambahan yang dipisahkan koma untuk diterima di luar set loopback bawaan (localhost, 127.0.0.1, ::1). Hanya nama host dan tidak bergantung port. Default: loopback saja.
  • ALLOWED_ORIGINS - Daftar izin pola Origin/Referer browser yang dipisahkan koma; wildcard didukung (mis. https://*.ngrok.io). Default: http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*.
  • LOG_LEVEL - Tingkat logging (default: info)

Keamanan:

  • Validasi header Host (perlindungan DNS-rebinding) — setiap permintaan HTTP harus membawa header Host yang cocok dengan daftar izin. Secara default hanya host loopback (localhost, 127.0.0.1, ::1) yang diterima, tanpa memandang port. Host adalah header yang dilarang untuk browser, sehingga halaman web berbahaya tidak dapat memalsukannya — ini menutup jalur DNS-rebinding di mana halaman yang diarahkan ulang mencapai server dengan Host yang dipalsukan dan tanpa Origin. Host yang tidak diizinkan ditolak dengan 403.
  • Validasi header Origin — permintaan browser dengan Origin/Referer yang ada tetapi tidak diizinkan ditolak. Permintaan dengan tanpa Origin (curl, Postman, klien MCP-over-HTTP) diizinkan; validasi Host adalah pertahanan terhadap rebinding.
  • Mengikat ke localhost (127.0.0.1) secara default.
  • Tidak ada autentikasi di versi saat ini (dukungan OAuth direncanakan).

Mengekspos mode HTTP di luar localhost — jika Anda mengikat ke alamat LAN/publik atau menempatkan server di belakang reverse proxy atau domain publik, Anda harus mengatur ALLOWED_HOSTS ke nama host yang akan digunakan klien, jika tidak setiap permintaan non-loopback ditolak dengan 403:

# Bind to all interfaces and accept the machine's LAN name + a public domain
ALLOWED_HOSTS=my-nas.local,anki.example.com PORT=8080 HOST=0.0.0.0 node dist/main-http.js

Ketika Anda mengikat ke 0.0.0.0/:: tanpa ALLOWED_HOSTS, server mencatat peringatan startup bahwa hanya header Host loopback yang akan diterima.

Docker / reverse proxy / domain publik: aturan yang sama berlaku. Di Docker, permintaan biasanya tiba dengan nama host yang dipublikasikan dari kontainer atau Host proxy, jadi atur ALLOWED_HOSTS sesuai. Reverse proxy (nginx, Caddy, Traefik) harus meneruskan Host asli dan memiliki nama host tersebut terdaftar di ALLOWED_HOSTS, atau menulis ulang Host upstream menjadi localhost. Integrasi --ngrok bawaan menangani ini secara otomatis (lihat di bawah).

Contoh: Mode Menjalankan

# Development - STDIO mode (watch mode with auto-rebuild)
npm run start:dev:stdio

# Development - HTTP mode (watch mode with auto-rebuild)
npm run start:dev:http

# Production - STDIO mode
npm run start:prod:stdio
# or
node dist/main-stdio.js

# Production - HTTP mode
npm run start:prod:http
# or
PORT=8080 HOST=0.0.0.0 node dist/main-http.js

Membangun Bundle MCPB

Untuk membuat bundle MCPB yang dapat didistribusikan:

npm run mcpb:bundle

Perintah ini akan:

  1. Sinkronkan versi dari package.json ke manifest.json
  2. Hapus file .mcpb lama
  3. Bangun proyek TypeScript
  4. Kemas dist/ dan node_modules/ ke dalam file .mcpb
  5. Jalankan mcpb clean untuk menghapus devDependencies (mengoptimalkan bundle dari ~47MB menjadi ~10MB)

File output akan diberi nama anki-mcp-server-X.X.X.mcpb dan dapat didistribusikan untuk instalasi satu klik.

Apa yang Dibundel

Bundle MCPB mencakup:

  • JavaScript yang dikompilasi (direktori dist/ - mencakup ketiga titik masuk)
  • Hanya dependensi produksi (node_modules/ - devDependencies dihapus oleh mcpb clean)
  • Metadata paket (package.json)
  • Konfigurasi manifes (manifest.json - dikonfigurasi untuk menggunakan main-stdio.js)
  • Ikon (icon.png)

File sumber, pengujian, dan konfigurasi pengembangan secara otomatis dikecualikan melalui .mcpbignore.

Logging di Claude Desktop

Ketika berjalan sebagai ekstensi MCPB di Claude Desktop, log ditulis ke:

Lokasi Log: ~/Library/Logs/Claude/ (macOS)

Log dibagi ke beberapa file:

  • main.log - Log aplikasi Claude Desktop umum
  • mcp-server-Anki MCP Server.log - Pesan protokol MCP untuk ekstensi ini
  • mcp.log - Log MCP gabungan dari semua server

Catatan: Output logger pino (pesan INFO, ERROR, WARN dari kode server) pergi ke stderr dan muncul di file log khusus MCP. Claude Desktop menentukan file log mana yang menerima pesan mana, tetapi secara umum:

  • Startup aplikasi dan komunikasi protokol MCP → Log khusus MCP
  • Logging internal server (pino) → Keduanya log khusus MCP dan kadang-kadang main.log

Untuk melihat log secara real-time:

tail -f ~/Library/Logs/Claude/mcp-server-Anki\ MCP\ Server.log

Men-debug Server MCP

Anda dapat men-debug server MCP menggunakan MCP Inspector dan melampirkan debugger dari IDE Anda (WebStorm, VS Code, dll.).

Catatan untuk Mode HTTP: Saat menguji mode HTTP (Streamable HTTP) dengan MCP Inspector, gunakan "Connection Type: Via Proxy" untuk menghindari kesalahan CORS.

Langkah 1: Konfigurasi Server Debug di MCP Inspector

mcp-inspector-config.json sudah menyertakan konfigurasi server debug:

{
  "mcpServers": {
    "stdio-server-debug": {
      "type": "stdio",
      "command": "node",
      "args": ["--inspect-brk=9229", "dist/main-stdio.js"],
      "env": {
        "MCP_SERVER_NAME": "anki-mcp-stdio-debug",
        "MCP_SERVER_VERSION": "1.0.0",
        "LOG_LEVEL": "debug"
      },
      "note": "Anki MCP server with debugging enabled on port 9229"
    }
  }
}

Langkah 2: Mulai Server Debug

Jalankan MCP Inspector dengan server debug:

npm run inspector:debug

Ini akan memulai server dengan debugging Node.js diaktifkan pada port 9229 dan menjeda eksekusi di baris pertama.

Langkah 3: Lampirkan Debugger dari IDE Anda

WebStorm
  1. Buka Run → Edit Configurations
  2. Tambahkan konfigurasi Attach to Node.js/Chrome baru
  3. Atur port ke 9229
  4. Klik Debug untuk melampirkan
VS Code
  1. Buka panel Debug (Ctrl+Shift+D / Cmd+Shift+D)
  2. Pilih konfigurasi Debug MCP Server (Attach)
  3. Tekan F5 untuk melampirkan

Langkah 4: Atur Breakpoint dan Debug

Setelah terpasang, Anda dapat:

  • Mengatur breakpoint di file sumber TypeScript Anda
  • Melangkah melalui eksekusi kode
  • Memeriksa variabel dan tumpukan panggilan
  • Menggunakan konsol debug untuk mengevaluasi ekspresi

Debugger akan bekerja dengan source maps, memungkinkan Anda untuk men-debug kode TypeScript asli daripada JavaScript yang dikompilasi.

Debugging dengan Claude Desktop

Anda juga dapat men-debug server MCP saat berjalan di dalam Claude Desktop dengan mengaktifkan debugger Node.js dan melampirkan IDE Anda.

Langkah 1: Konfigurasi Claude Desktop untuk Debugging

Perbarui konfigurasi Claude Desktop Anda untuk mengaktifkan debugging:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "anki-mcp": {
      "command": "node",
      "args": [
        "--inspect=9229",
        "<path_to_project>/anki-mcp-server/dist/main-stdio.js"
      ],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

Perubahan kunci: Tambahkan --inspect=9229 sebelum jalur ke dist/main-stdio.js

Opsi debug:

  • --inspect=9229 - Mulai debugger segera, tidak memblokir (disarankan)
  • --inspect-brk=9229 - Jeda eksekusi sampai debugger terpasang (untuk men-debug masalah startup)

Langkah 2: Mulai Ulang Claude Desktop

Setelah menyimpan konfigurasi, mulai ulang Claude Desktop. Server MCP sekarang akan berjalan dengan debugging diaktifkan pada port 9229.

Langkah 3: Lampirkan Debugger dari IDE Anda

WebStorm
  1. Buka Run → Edit Configurations
  2. Klik tombol + dan pilih Attach to Node.js/Chrome
  3. Konfigurasi:
    • Nama: Attach to Anki MCP (Claude Desktop)
    • Host: localhost
    • Port: 9229
    • Attach to: Node.js < 8 atau Chrome or Node.js > 6.3 (tergantung versi WebStorm)
  4. Klik OK
  5. Klik Debug (Shift+F9) untuk melampirkan
VS Code
  1. Tambahkan ke .vscode/launch.json:
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach to Anki MCP (Claude Desktop)",
      "port": 9229,
      "skipFiles": ["<node_internals>/**"],
      "sourceMaps": true,
      "outFiles": ["${workspaceFolder}/dist/**/*.js"]
    }
  ]
}
  1. Buka panel Debug (Ctrl+Shift+D / Cmd+Shift+D)
  2. Pilih Attach to Anki MCP (Claude Desktop)
  3. Tekan F5 untuk melampirkan

Langkah 4: Debug Secara Real-Time

Setelah terpasang, Anda dapat:

  • Menetapkan breakpoint di file sumber TypeScript Anda (misalnya, src/mcp/primitives/essential/tools/create-model.tool.ts)
  • Menggunakan Claude Desktop secara normal - breakpoint akan aktif saat alat dipanggil
  • Melangkah melalui eksekusi kode
  • Memeriksa variabel dan call stack
  • Menggunakan konsol debug

Contoh: Tetapkan breakpoint di create-model.tool.ts pada baris 119, lalu minta Claude untuk membuat model baru. Debugger akan berhenti di breakpoint Anda!

Catatan: Debugger tetap terpasang selama Claude Desktop berjalan. Anda dapat melepas/memasang kembali kapan saja tanpa memulai ulang Claude Desktop.

Perintah Build

npm run build              # Build the project (compile TypeScript to JavaScript)
npm run start:dev:stdio    # STDIO mode with watch (auto-rebuild)
npm run start:dev:http     # HTTP mode with watch (auto-rebuild)
npm run type-check         # Run TypeScript type checking
npm run lint               # Run ESLint
npm run mcpb:bundle        # Sync version, clean, build, and create MCPB bundle

Pengujian Paket NPM (Lokal)

Uji paket npm secara lokal sebelum menerbitkan:

# 1. Create local package
npm run pack:local         # Builds and creates @ankimcp/anki-mcp-server-*.tgz

# 2. Install globally from local package
npm run install:local      # Installs from ./@ankimcp/anki-mcp-server-*.tgz

# 3. Test the command
ankimcp                    # Runs HTTP server on port 3000

# 4. Uninstall when done testing
npm run uninstall:local    # Removes global installation

Cara kerjanya:

  • npm pack membuat file .tgz yang identik dengan apa yang akan dibuat oleh npm publish
  • Menginstal dari .tgz mensimulasikan apa yang didapat pengguna dari npm install -g ankimcp
  • Ini memungkinkan Anda menguji pengalaman pengguna secara penuh sebelum menerbitkan ke npm

Perintah Pengujian

npm test              # Run all tests
npm run test:unit     # Run unit tests only
npm run test:tools    # Run tool-specific tests
npm run test:workflows # Run workflow integration tests
npm run test:e2e      # Run end-to-end tests
npm run test:cov      # Run tests with coverage report
npm run test:watch    # Run tests in watch mode
npm run test:debug    # Run tests with debugger
npm run test:ci       # Run tests for CI (silent, with coverage)

Cakupan Pengujian

Proyek ini mempertahankan ambang cakupan minimum 70% untuk:

  • Cabang (Branches)
  • Fungsi (Functions)
  • Baris (Lines)
  • Pernyataan (Statements)

Laporan cakupan dihasilkan di direktori coverage/.

Versioning

Proyek ini mengikuti Semantic Versioning dengan pendekatan pengembangan pra-1.0:

  • 0.x.x - Versi Beta/Pengembangan (fase saat ini)

    • 0.1.x - Perbaikan bug dan patch
    • 0.2.0+ - Fitur baru atau perbaikan minor
    • Perubahan yang bersifat breaking dapat diterima dalam versi 0.x
  • 1.0.0 - Rilis stabil pertama

    • Akan dirilis ketika API stabil dan teruji
    • Perubahan yang bersifat breaking akan memerlukan kenaikan versi mayor (2.0.0, dst.)

Status Saat Ini: 0.22.0 - Pengembangan beta aktif. Fitur terbaru mencakup analisis tinjauan seluruh koleksi (review_stats kini mengagregasi semua dek saat deck dihilangkan), manajemen bidang model (addModelField, removeModelField, renameModelField, repositionModelField), pembuatan catatan batch (addNotes), tunneling ngrok terintegrasi (flag --ngrok), manajemen file media, manajemen model/template, dan statistik dek yang komprehensif. API dapat berubah berdasarkan umpan balik dan pengujian.

Evolusi spesifikasi MCPB

Proyek ini menargetkan spesifikasi bundel MCPB Anthropic, yang masih terus berkembang. Kami melacak spesifikasi di https://github.com/modelcontextprotocol/mcpb dan dapat memperkenalkan perubahan yang bersifat breaking untuk tetap patuh. Perubahan yang bersifat breaking diizinkan dalam skema versioning 0.x.x.

Proyek Serupa

Jika Anda menjelajahi integrasi Anki MCP, berikut adalah proyek lain di ruang ini:

scorzeth/anki-mcp-server

  • Status: Tampaknya ditinggalkan (tidak ada pembaruan terbaru)
  • Implementasi awal integrasi Anki MCP

nailuoGG/anki-mcp-server

  • Pendekatan: Ringan, implementasi satu file
  • Arsitektur: Struktur kode prosedural dengan semua alat dalam satu file
  • Cocok untuk: Kasus penggunaan sederhana, dependensi minimal

Mengapa proyek ini berbeda:

  • Arsitektur kelas enterprise: Dibangun di atas NestJS dengan dependency injection
  • Desain modular: Setiap alat adalah kelas terpisah dengan pemisahan tanggung jawab yang jelas
  • Keterpeliharaan: Mudah diperluas dengan fitur baru tanpa menyentuh kode yang ada
  • Pengujian: Rangkaian pengujian komprehensif dengan persyaratan cakupan 70%
  • Keamanan tipe: TypeScript ketat dengan validasi Zod
  • Penanganan kesalahan: Penanganan kesalahan yang kuat dengan umpan balik pengguna yang membantu
  • Siap produksi: Logging yang tepat, pelaporan kemajuan, dan dukungan bundel MCPB
  • Skalabilitas: Dapat dengan mudah berkembang dari alat dasar ke alur kerja yang kompleks

Kasus penggunaan: Jika Anda membutuhkan fondasi yang solid untuk membangun integrasi Anki tingkat lanjut atau berencana memperluas fungsionalitas secara signifikan, pendekatan arsitektur proyek ini memudahkan pemeliharaan dan penskalaan seiring waktu.

Tautan Berguna

Lisensi & Atribusi

Proyek ini dilisensikan di bawah Lisensi MIT — lihat LICENSE untuk teks lengkap.

Hak Cipta © 2026 Anatoly Tarnavsky.

Atribusi Pihak Ketiga

  • Anki® adalah merek dagang terdaftar dari Ankitects Pty Ltd. Proyek ini adalah alat pihak ketiga tidak resmi dan tidak berafiliasi dengan, didukung oleh, atau disponsori oleh Ankitects Pty Ltd. Logo Anki digunakan di bawah lisensi alternatif untuk mereferensikan Anki dengan tautan ke https://apps.ankiweb.net. Untuk aplikasi Anki resmi, kunjungi https://apps.ankiweb.net.

  • Model Context Protocol (MCP) adalah standar terbuka oleh Anthropic. Logo MCP berasal dari repositori dokumentasi MCP resmi dan digunakan di bawah Lisensi MIT. Untuk informasi lebih lanjut tentang MCP, kunjungi https://modelcontextprotocol.io.

  • Ini adalah proyek independen yang menjembatani teknologi Anki dan MCP. Semua merek dagang, merek layanan, nama dagang, nama produk, dan logo adalah milik pemiliknya masing-masing.