Anki MCP

официальный

MCP-сервер, который позволяет AI-ассистентам взаимодействовать с Anki — приложением для интервальных повторений флеш-карт.

Что можно делать с Anki MCP?

  • Review due cards — Попросите ассистента показать карточки, срок повторения которых наступил, из конкретной колоды, и провести вас по ним с помощью get_due_cards и present_card.
  • Rate card performance — Попросите ассистента записать качество вашего ответа (Again, Hard, Good, Easy), чтобы перенести повторения через rate_card.
  • Create custom flashcards — Поручите ассистенту создать новые типы заметок с пользовательскими полями и RTL-стилизацией с помощью createModel и updateModelStyling, а затем массово добавить заметки через addNotes.
  • Manage note content — Ищите заметки с помощью синтаксиса запросов Anki (deck:, tag:, is:due) через findNotes, затем обновляйте их поля с помощью updateNoteFields.
  • Import media into cards — Попросите ассистента загрузить изображение из локального пути или URL с помощью storeMediaFile и вставить его в поле выбранной заметки, используя guiSelectedNotes и updateNoteFields.
  • Organize decks and cards — Создавайте вложенные колоды (Parent::Child) с помощью createDeck, перемещайте карточки между колодами через changeDeck или приостанавливайте карточки с помощью suspend, чтобы пропускать их при повторении.

Документация

Сервер Anki MCP

Tests npm version

Anki + MCP Integration

Бесшовная интеграция Anki с AI-ассистентами через Model Context Protocol

[!IMPORTANT] Для большинства сценариев предпочтителен аддон AnkiMCP.

Аддон (GitHub) запускает MCP-сервер непосредственно внутри Anki. Не нужно устанавливать Node.js, настраивать AnkiConnect или поддерживать отдельный процесс: установите его с помощью кода 124672614, перезапустите Anki — и сервер будет работать при каждом запуске Anki. Он поддерживает локальный HTTP-доступ и удалённый доступ через встроенный туннель.

Этот репозиторий — правильный выбор, когда вам конкретно нужны:

  • Транспорт STDIO — Claude Desktop, Claude Code, Cursor или любой клиент, запускающий сервер как подпроцесс
  • Пакет MCPB — установка в один клик через .mcpb для Claude Desktop

Для HTTP, туннеля или веб-клиентов (claude.ai, ChatGPT) аддон — более простой и лучше поддерживаемый путь.

Этот репозиторий не прекращает поддержку. Он остаётся поддерживаемым и выпускается вместе с аддоном в рамках одного проекта ankimcp.ai.

Сервер Model Context Protocol (MCP), который позволяет AI-ассистентам взаимодействовать с Anki — приложением для интервального повторения карточек.

Преобразите свой опыт работы с Anki с помощью взаимодействия на естественном языке — как будто у вас есть личный репетитор. AI-ассистент не просто показывает вопросы и ответы; он может объяснять концепции, делать процесс обучения более увлекательным и человечным, предоставлять контекст и адаптироваться к вашему стилю обучения. Он может создавать и редактировать заметки на лету, превращая ваши учебные сессии в динамичные беседы. Скоро появится больше функций!

Примеры и обучающие материалы

Для получения подробных руководств, реальных примеров и пошаговых инструкций по использованию этого MCP-сервера с Claude Desktop посетите:

ankimcp.ai — Полная документация с практическими примерами и сценариями использования

См. docs/ для дополнительной документации, включая руководство по настройке рецензента и образец колоды Anki.

Примеры использования

Три показательных запроса, демонстрирующих потоки инструментов, которые обеспечивает этот сервер:

  1. «Помоги мне повторить мою испанскую колоду». — Ассистент предлагает синхронизироваться с AnkiWeb (sync), получает карточки, подлежащие повторению (get_due_cards с фильтром по колоде), показывает каждую карточку (present_card) и записывает вашу оценку (rate_card). Естественный учебный диалог с объяснениями, адаптированными под вас.

  2. «Создай 10 карточек арабской лексики с RTL-стилизацией». — Ассистент выводит список типов заметок (modelNames), создаёт пользовательскую RTL-модель при необходимости (createModel + updateModelStyling для CSS справа налево), затем массово создаёт карточки (addNotes).

  3. «Импортируй это изображение из моей папки Загрузки на лицевую сторону выбранной заметки». — Ассистент загружает локальный файл (storeMediaFile с путём к файлу), читает выбранную в данный момент заметку из браузера (guiSelectedNotes + notesInfo) и обновляет лицевое поле с тегом <img> (updateNoteFields).

Доступные инструменты

Сервер предоставляет 53 инструмента MCP — 42 основных инструмента для повседневных операций с Anki и 11 инструментов GUI, которые управляют интерфейсом настольного приложения Anki для рабочих процессов редактирования/создания заметок.

Основные инструменты

Повторение и обучение

  • sync — Синхронизация с AnkiWeb для получения последних данных и отправки изменений
  • get_due_cards — Получение карточек, подлежащих повторению, с возможностью фильтрации по колоде (ответы опущены, если не include_answer: true, по умолчанию false)
  • get_cards — Получение карточек с гибкой фильтрацией по состоянию (due, new, learning, suspended, buried) и колоде (ответы опущены, если не include_answer: true, по умолчанию false)
  • present_card — Показ карточки для повторения с её вопросом/лицевой стороной
  • rate_card — Оценка производительности карточки (Again, Hard, Good, Easy) и планирование следующего повторения
  • forgetCards — Сброс карточек в состояние «новые», отмена их расписания без записи повторения
  • setDueDate — Перенос карточек на срок в N дней ("0", "3-7", "1!") без записи повторения
  • areSuspended — Проверка состояния приостановки для одной или нескольких карточек без внесения изменений
  • suspend — Приостановка карточек, чтобы они пропускались при повторении до снятия приостановки
  • unsuspend — Снятие приостановки с карточек, чтобы они вернулись к обычному повторению

Примечание: forgetCards и setDueDate изменяют расписание без записи повторения, что отличает их от rate_card. Используйте их, когда расписание карточки неверно, а не ответ: оценка карточки как Again для более глубокого откладывания записывает реальную ошибку и снижает фактор лёгкости, навсегда искажая как будущее расписание, так и вашу статистику. forgetCards стирает интервал и начинает карточку заново; setDueDate сохраняет историю карточки и просто переносит следующее повторение.

Примечание: Содержимое карточки front/back отображается для каждой карточки на основе её собственного шаблона (как показывает Anki), поэтому перевёрнутые карточки и карточки с пропусками отображаются в правильном направлении. Статический текст, добавленный вашими шаблонами карточек, также появляется в выводе.

Управление колодами

  • listDecks — Список всех колод, опционально со статистикой очереди изучения по каждой колоде
  • deckStats — Получение подробной статистики для одной колоды (очередь изучения, фактические подсчёты состояний карточек, распределения лёгкости/интервалов)
  • createDeck — Создание новой пустой колоды (поддерживает Parent::Child, максимум 2 уровня)
  • changeDeck — Перемещение карточек в другую колоду (создаётся, если не существует)

Примечание: Статистика колод бывает двух видов. Блок counts (и всё, что сообщает listDecks) отражает браузер колод Anki: карточки подлежащие повторению сегодня, ограниченные ежедневными лимитами новых/повторяемых каждой колоды, с исключением приостановленных и отложенных карточек — поэтому review — это не «зрелые карточки», а категория other — просто арифметический остаток (в основном карточки для повторения не сегодня плюс новые карточки сверх ежедневного лимита). Для фактических итогов по состояниям используйте блок states на deckStats / collection_stats, который подсчитывает new, learning, review, suspended и buried через поиск Anki, игнорируя даты выполнения и ежедневные лимиты.

Управление заметками

  • addNote — Создание одной заметки с указанными полями и тегами
  • addNotes — Массовое создание до 100 заметок с общей колодой и моделью (поддерживается частичный успех)
  • findNotes — Поиск заметок с использованием синтаксиса запросов Anki (deck:, tag:, is:due и т. д.)
  • notesInfo — Получение подробной информации о заметках (поля, теги, тип заметки, ID карточек; CSS берётся из modelStyling)
  • updateNoteFields — Обновление существующих полей заметок (с учётом CSS, поддерживает HTML-содержимое)
  • deleteNotes — Удаление заметок и всех связанных карточек (необратимо, требует подтверждения)

Управление тегами

  • getTags — Получение всех тегов в коллекции (используйте первый, чтобы избежать дублирования)
  • addTags — Добавление тегов, разделённых пробелами, к указанным заметкам
  • removeTags — Удаление тегов, разделённых пробелами, из указанных заметок
  • replaceTags — Переименование тега в указанных заметках
  • clearUnusedTags — Удаление осиротевших тегов, не используемых ни одной заметкой (необратимо)

Управление медиафайлами

  • getMediaFilesNames — Список медиафайлов в collection.media, опционально с фильтром по шаблону
  • retrieveMediaFile — Загрузка медиафайла как содержимого base64
  • storeMediaFile — Загрузка медиа из данных base64, абсолютного пути к файлу или URL
  • deleteMediaFile — Удаление медиафайла из collection.media (необратимо)

💡 Лучшие практики для изображений:

  • ✅ Используйте пути к файлам (например, /Users/you/image.png) — быстро и эффективно
  • ✅ Используйте URL (например, https://example.com/image.jpg) — прямая загрузка
  • ❌ Избегайте base64 — крайне медленно и неэффективно по токенам

Просто скажите Claude, где находится изображение, и он автоматически выполнит загрузку наиболее эффективным способом.

Управление моделями/шаблонами

  • modelNames — Список всех доступных типов заметок/моделей
  • modelFieldNames — Получение имён полей для конкретного типа заметок
  • modelStyling — Получение информации о стилях CSS для типа заметок
  • modelTemplates — Получение шаблонов карточек (HTML лицевой и обратной сторон) для типа заметок
  • createModel — Создание нового типа заметок с пользовательскими полями, шаблонами карточек и CSS (например, RTL-модели)
  • updateModelStyling — Обновление стилей CSS для существующего типа заметок (применяется ко всем его карточкам)
  • updateModelTemplates — Обновление шаблонов карточек (HTML лицевой и обратной сторон) для существующего типа заметок (применяется ко всем его карточкам)
  • addModelField — Добавление нового поля в существующий тип заметок (добавляется в конец или вставляется в определённую позицию)
  • removeModelField — Удаление поля из существующего типа заметок (удаляет его содержимое из всех заметок; требует явного подтверждения)
  • renameModelField — Переименование поля в существующем типе заметок (Anki переписывает ссылки на старое имя в шаблонах карточек)
  • repositionModelField — Изменение позиции поля в существующем типе заметок

Статистика

  • collection_stats — Агрегированная статистика по всем колодам с разбивкой по каждой колоде и подсчётами состояний карточек по всей коллекции
  • review_stats — Анализ истории повторений (временные закономерности, показатели удержания, серии занятий)

Инструменты GUI

Инструменты, управляющие интерфейсом настольного приложения Anki. Предназначены для рабочих процессов редактирования/создания заметок и управления колодами, не для сессий повторения.

  • guiBrowse — Открытие браузера карточек и поиск карточек
  • guiSelectCard — Выбор конкретной карточки в браузере карточек
  • guiSelectedNotes — Получение ID заметок, выбранных в данный момент в браузере карточек
  • guiAddCards — Открытие диалога добавления карточек с предустановленными данными заметки
  • guiEditNote — Открытие редактора заметок для конкретной заметки
  • guiDeckOverview — Открытие диалога обзора колоды для конкретной колоды
  • guiDeckBrowser — Открытие диалога браузера колод
  • guiCurrentCard — Получение информации о текущей карточке в режиме повторения (включает ответ; ошибка вне режима повторения)
  • guiShowQuestion — Показ лицевой стороны текущей карточки
  • guiShowAnswer — Показ обратной стороны текущей карточки
  • guiUndo — Отмена последнего действия в Anki

Предварительные требования

  • Anki с установленным плагином AnkiConnect
  • Node.js 22.12.0+

Установка

Есть несколько способов установить сервер на вашу машину. После установки перейдите к разделу Подключение AI-клиента, чтобы подключить его к вашему AI-ассистенту — локально или удалённо.

npm (глобально или через npx)

Универсальный способ установки сервера, подходящий для любого MCP-клиента, который запускает его напрямую.

Установите глобально для клиентов, которые выполняют команду ankimcp:

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

Или запустите по требованию без установки:

npx @ankimcp/anki-mcp-server

Пакет MCPB (рекомендуется для Claude Desktop)

Самый простой способ установить этот MCP-сервер для Claude Desktop:

  1. Загрузите последний пакет .mcpb со страницы Releases
  2. В Claude Desktop установите расширение:
    • Способ 1: Перейдите в Настройки → Расширения, затем перетащите файл .mcpb
    • Способ 2: Перейдите в Настройки → Разработчик → Расширения → Установить расширение, затем выберите файл .mcpb
  3. При необходимости настройте URL AnkiConnect (по умолчанию http://localhost:8765)
  4. Перезапустите Claude Desktop

Вот и всё! Пакет включает всё необходимое для запуска сервера локально.

Для рецензентов каталога MCP Anthropic: пошаговое руководство от нуля до интеграции с предварительно заполненной образцовой колодой находится в docs/reviewer-setup.md.

Установка из исходного кода (для разработки)

Для разработки или продвинутого использования (запуск тестового набора требует Node.js 24.9+ — npm-скрипты тестирования загружают ESM-only пакеты NestJS 12 через require(esm), которые Jest поддерживает только там; требование к среде выполнения для использования сервера остаётся 22.12.0+):

npm install
npm run build

Подключение AI-клиента

Есть два способа, которыми AI-ассистент может получить доступ к этому серверу, в зависимости от того, где запущен ассистент:

  • Локально — сервер работает на той же машине, что и AI-клиент (Claude Desktop, Cursor, Cline, Zed или локальная браузерная сессия). Используйте STDIO для десктопных MCP-клиентов, HTTP для локальных веб-инструментов.
  • Удалённо — размещённый/удалённый AI (например, ChatGPT или Claude.ai в облаке) должен получить доступ к Anki, работающему на вашей локальной машине. Используйте управляемый Tunnel (✅ рекомендуется — с аутентификацией) или, как более лёгкую неаутентифицированную альтернативу, ngrok.

Локально

Сервер работает на том же компьютере, что и ваш AI-клиент, и общается с AnkiConnect на localhost.

STDIO (основная локальная интеграция)

STDIO — это стандартный транспорт для локальных десктопных MCP-клиентов — Claude Desktop, Cursor IDE, Cline, Zed Editor, opencode и других. Клиент запускает сервер как подпроцесс и общается через стандартный ввод/вывод.

Поддерживаемые клиенты:

  • Claude Desktop
  • Cursor IDE — AI-редактор кода
  • Cline — расширение VS Code для AI-помощи
  • Zed Editor — быстрый современный редактор кода
  • opencode — терминальный AI-агент для кодирования
  • Другие MCP-клиенты, поддерживающие транспорт STDIO

Для Claude Desktop MCPB-бандл — самый простой путь. Для других клиентов настройте npm-пакет с флагом --stdio.

Конфигурация — выберите один метод:

Метод 1: Использование npx (рекомендуется — без установки)

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

Метод 2: Использование глобальной установки

Сначала установите глобально:

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

Затем настройте:

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

opencode использует свой собственный формат — серверы размещаются в mcp, команда — это единый массив, а переменные окружения — в environment:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "anki-mcp": {
      "type": "local",
      "command": ["npx", "-y", "@ankimcp/anki-mcp-server", "--stdio"],
      "enabled": true,
      "environment": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

Расположение файлов конфигурации:

  • Cursor IDE: ~/.cursor/mcp.json (macOS/Linux) или %USERPROFILE%\.cursor\mcp.json (Windows)
  • Cline: доступно через настройки в VS Code
  • Zed Editor: установите как MCP-расширение через маркетплейс расширений
  • opencode: opencode.json в корне вашего проекта или ~/.config/opencode/opencode.json глобально

Для функций, специфичных для клиента, и устранения неполадок обратитесь к документации вашего MCP-клиента. Также см. Подключение к Claude Desktop для конфигурации, которая указывает напрямую на собранный dist/main-stdio.js.

HTTP (локальный веб-инструмент)

HTTP-режим запускает сервер как локальный веб-сервер, говорящий на протоколе MCP Streamable HTTP. Это транспорт, с которым веб-инструмент AI общается, когда он указывает на вашу машину, и это также то, что Удалённые опции открывают для внешнего мира. Сам по себе HTTP-режим привязывается только к localhost.

Привязка за пределами localhost? Если вы передаёте --host 0.0.0.0 (или работаете за обратным прокси/публичным доменом), сервер по умолчанию принимает только заголовки Host loopback для защиты от DNS-rebinding — установите ALLOWED_HOSTS на имя(имена) хоста, которые используют клиенты. См. Конфигурация HTTP-режима.

Настройка — выберите один метод:

Метод 1: Использование npx (рекомендуется — без установки)

# 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

Метод 2: Использование глобальной установки

# 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

Метод 3: Установка из исходников (для разработки)

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

Чтобы сделать локальный HTTP-сервер доступным для облачного AI, используйте одну из Удалённых опций ниже.

Удалённо

Размещённый/удалённый AI (например, ChatGPT или Claude.ai в облаке) не может напрямую получить доступ к localhost. Эти опции открывают ваш локальный Anki в интернет, чтобы удалённый ассистент мог с ним общаться.

Tunnel (✅ Рекомендуется)

Рекомендуемый удалённый путь — с аутентификацией и безопасный. В отличие от сырого публичного порта, туннельный режим требует входа в систему (OAuth 2.0 device flow), поэтому конечная точка не открыта для любого, кто угадает URL.

Туннельный режим позволяет веб-инструментам AI получать доступ к вашему локальному Anki без запуска собственного туннеля. Сервер подключается к управляемому туннельному сервису AnkiMCP (wss://tunnel.ankimcp.ai) через WebSocket и получает публичный URL. Аутентификация встроена — не требуется учётная запись ngrok или отдельный туннельный процесс, и вы входите один раз.

Вход (OAuth device flow):

Туннельный режим использует OAuth 2.0 Device Authorization Grant. Вход автоматически открывает ваш браузер на странице одобрения с кодом, уже встроенным в URL — ничего вводить не нужно, просто одобрите. (Если браузер не может открыться, терминал выводит URL для проверки и код для ручного ввода как запасной вариант.) При успехе учётные данные сохраняются в ~/.ankimcp/credentials.json (права доступа к файлу 0600).

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

# Clear saved credentials
ankimcp --logout

Запуск туннеля:

# 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

Если учётные данные отсутствуют, --tunnel автоматически сначала запускает процесс входа, затем продолжает с туннелем. Этот автоматический вход требует интерактивного терминала — когда stdout не является TTY (systemd, headless Docker, CI), сервер быстро завершается с ошибкой и просит сначала запустить ankimcp --login. После подключения выводится публичный URL туннеля; нажмите Ctrl+C для отключения. Поделитесь этим URL с вашим AI-ассистентом.

Переменные окружения туннельного режима:

ПеременнаяОписаниеПо умолчанию
TUNNEL_SERVER_URLURL WebSocket туннельного сервера (значение флага --tunnel/--login переопределяет это)wss://tunnel.ankimcp.ai
TUNNEL_AUTH_CLIENT_IDOAuth client ID для device flow. Продвинутое — нужно только при указании на самостоятельно размещённый туннельный/аутентификационный сервис.(встроенный)

Конечные точки аутентификации device-flow (/auth/device, /auth/token) выводятся из TUNNEL_SERVER_URL, поэтому указание --tunnel (или TUNNEL_SERVER_URL) на другой хост также перемещает аутентификацию на этот хост.

Как это работает: Туннельный режим запускает MCP-сервер в процессе за транспортом в памяти (TunnelTransport). Этот транспорт владеет MCP-сервером и превращает каждое переданное тело запроса в ответ, а TunnelClient соединяет его с удалённым туннельным сервисом через WebSocket — передавая MCP-запросы внутрь и ответы наружу. AnkiConnect по-прежнему доступен только на вашей локальной машине.

Версии протокола: Поскольку туннель подключает MCP-сервер в процессе, туннельный режим обслуживает только ревизию 2025 протокола MCP, в то время как STDIO и HTTP-режимы обслуживают как 2025, так и более новую ревизию 2026-07-28. Каждый инструмент ведёт себя одинаково в любом случае — но клиент, говорящий только на 2026-07-28, будет отклонён через туннель с ошибкой версии протокола; запустите STDIO или HTTP режим для такого клиента.

ngrok (неаутентифицированная альтернатива)

Если вы предпочитаете открыть локальный HTTP-режим публично без учётной записи на управляемом туннеле, встроенный флаг --ngrok запускает подпроцесс ngrok (src/services/ngrok.service.ts) и выводит публичный URL в стартовом баннере:

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

Этот путь не аутентифицирован — любой, у кого есть URL, может получить доступ к вашему Anki, поэтому он менее безопасен, чем Tunnel. Предпочитайте Tunnel, если у вас нет особой причины управлять собственной конечной точкой ngrok. (Требуется глобальная установка ngrok и authtoken.)

Флаг --ngrok запускает ngrok с --host-header=rewrite, поэтому ngrok переписывает вышестоящий Host на localhost перед пересылкой. Это сохраняет запросы в пределах loopback-списка разрешённых Host (см. Защита от DNS-rebinding) без необходимости добавлять публичный домен *.ngrok в ALLOWED_HOSTS. Если вы запускаете ngrok вручную, используйте тот же флаг — ngrok http --host-header=rewrite 3000 — иначе ngrok пересылает публичное имя хоста ngrok как Host, и сервер отклоняет его с 403.

Параметры командной строки (все режимы)

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 content changes and rescheduling; rating, suspend and sync still work)
  --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

Режим только для чтения (все режимы)

Флаг --read-only (или READ_ONLY=true) блокирует изменения содержимого заметок, колод, тегов, медиа и типов заметок, а также ручное перепланирование карточек. При включении:

  • Все операции чтения работают нормально (просмотр колод, просмотр карточек, поиск заметок)
  • Эти изменения всё ещё разрешены: оценка карточки во время повторения (rate_card), приостановка/возобновление карточек (suspend, unsuspend), синхронизация с AnkiWeb (sync) и GUI-инструменты, которые навигируют по окнам Anki (guiBrowse, guiDeckOverview, …)
  • Изменения содержимого заблокированы (addNote, deleteNotes, createDeck, updateNoteFields и т.д.); createDeck для уже существующей колоды всё ещё успешен, так как ничего не записывается
  • Ручное перепланирование заблокировано: forgetCards (сброс в новое) и setDueDate
  • guiUndo заблокирован, так как отмена может откатить изменение коллекции
  • guiAddCards и guiEditNote заблокированы, так как заметка, добавленная или сохранённая в диалоге, который они открывают, записывается в коллекцию
  • Полезно для изучения данных Anki без случайных изменений его содержимого
# 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

Вы также можете включить режим только для чтения через переменную окружения:

READ_ONLY=true ankimcp

Или в конфигурации MCP-клиента:

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

Подключение к Claude Desktop (локальный режим)

Вы можете настроить сервер в Claude Desktop либо:

  • Перейдя: Настройки → Разработчик → Изменить конфигурацию
  • Или вручную отредактировав файл конфигурации

Конфигурация

Добавьте следующее в конфигурацию Claude Desktop:

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

Замените /path/to/anki-mcp-server на фактический путь к вашему проекту.

Расположение файлов конфигурации

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

Для получения дополнительных сведений см. официальную документацию MCP.

Переменные окружения (необязательно)

ПеременнаяОписаниеПо умолчанию
ANKI_CONNECT_URLURL AnkiConnecthttp://localhost:8765
ANKI_CONNECT_API_VERSIONВерсия API6
ANKI_CONNECT_API_KEYКлюч API, если настроен в AnkiConnect-
ANKI_CONNECT_TIMEOUTТаймаут запроса в мс5000
READ_ONLYВключить режим только для чтения (true или 1)false
PORTHTTP-режим: порт для прослушивания (флаг --port имеет приоритет)3000
HOSTHTTP-режим: адрес для привязки (флаг --host имеет приоритет)127.0.0.1
ALLOWED_HOSTSHTTP-режим: дополнительные значения заголовка Host для принятия помимо loopback (имена хостов через запятую). Требуется при привязке к LAN/публичному адресу или работе за обратным прокси. См. Конфигурация HTTP-режима.только loopback
ALLOWED_ORIGINSHTTP-режим: список разрешённых шаблонов браузера Origin/Referer через запятую (поддерживаются подстановочные знаки, например https://*.ngrok.io).http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*
TUNNEL_SERVER_URLURL WebSocket туннельного сервера (только туннельный режим)wss://tunnel.ankimcp.ai
MEDIA_ALLOWED_TYPESДополнительные типы MIME для разрешения импорта файловых путей (через запятую, например application/pdf)-
MEDIA_IMPORT_DIRОграничить импорт файловых путей этим каталогом-
MEDIA_ALLOWED_HOSTSРазрешить конкретные хосты частной сети для импорта URL (через запятую, например 192.168.1.50,my-nas)-

Примеры использования

Поиск и обновление заметок

# 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)

Примеры синтаксиса запросов Anki

Инструмент findNotes поддерживает мощный синтаксис запросов Anki:

  • "deck:DeckName" - Все заметки в конкретной колоде
  • "tag:important" - Заметки с тегом «important»
  • "is:due" - Карточки, ожидающие повторения
  • "is:new" - Новые карточки, которые ещё не изучались
  • "added:7" - Заметки, добавленные за последние 7 дней
  • "front:hello" - Заметки со словом «hello» в поле «front»
  • "flag:1" - Заметки с красным флажком
  • "prop:due<=2" - Карточки, срок повторения которых наступает в течение 2 дней
  • "deck:Spanish tag:verb" - Заметки из испанской колоды с тегом verb (AND)
  • "deck:Spanish OR deck:French" - Заметки из любой из двух колод

Важные примечания

Обработка CSS и HTML

  • Инструмент notesInfo возвращает имя типа заметки для каждой заметки; сам CSS берётся из modelStyling
  • Инструмент updateNoteFields поддерживает HTML-содержимое в полях и сохраняет CSS-стилизацию
  • Каждая модель заметок имеет собственный CSS — используйте modelStyling, чтобы получить CSS для конкретной модели

Предупреждение об обновлении

⚠️ ВАЖНО: При использовании updateNoteFields НЕ просматривайте заметку в браузере Anki во время обновления, иначе поля не обновятся должным образом. Закройте браузер или переключитесь на другую заметку перед обновлением. Подробнее см. в разделе Известные проблемы.

Безопасность удаления

Инструмент deleteNotes требует явного подтверждения (confirmDeletion: true), чтобы предотвратить случайное удаление. Удаление заметки безвозвратно удаляет ВСЕ связанные с ней карточки.

Безопасность

Проверка путей к медиафайлам и URL-адресов

Медиаинструменты (storeMediaFile, retrieveMediaFile, deleteMediaFile) и поля аудио/изображений updateNoteFields включают проверку безопасности для предотвращения злоупотреблений через инъекции в подсказки:

  • Импорт файлов по пути ограничен только типами медиафайлов (изображения, аудио, видео). Не-медиафайлы (например, SSH-ключи, учётные данные, конфигурации оболочки) отклоняются на основе MIME-типа. Настройте MEDIA_ALLOWED_TYPES, чтобы разрешить дополнительные типы файлов, или MEDIA_IMPORT_DIR, чтобы ограничить импорт конкретным каталогом.
  • Импорт URL-адресов проверяется на SSRF-атаки. Запросы к частным сетям (10.x, 172.16.x, 192.168.x), loopback (127.x), link-local (169.254.x) и не-HTTP(S) схемы блокируются. Настройте MEDIA_ALLOWED_HOSTS, чтобы разрешить конкретные хосты частных сетей.
  • Имена файлов очищаются для предотвращения path traversal (например, последовательности ../../ удаляются).

Эти меры защиты применяются к storeMediaFile, retrieveMediaFile, deleteMediaFile и полям аудио/изображений updateNoteFields.

Уязвимость path traversal сообщена Hideaki Takahashi.

Защита от DNS-rebinding (HTTP-транспорт)

При работе в HTTP-режиме сервер проверяет заголовок Host в каждом запросе. По умолчанию принимаются только loopback-хосты (localhost, 127.0.0.1, ::1), независимо от порта. Host — это заголовок, запрещённый для браузеров, поэтому вредоносная веб-страница не может его подделать — это закрывает путь DNS-rebinding, когда перезагруженная страница достигает локального сервера с подделанным Host и без Origin, и достигает MCP-инструментов. Неразрешённый Host отклоняется с 403.

Если вы привязываетесь к 0.0.0.0, работаете за обратным прокси или открываете публичный туннельный домен, установите ALLOWED_HOSTS (имена хостов через запятую), чтобы разрешить эти хосты. При туннелировании через ngrok сервер использует --host-header=rewrite, поэтому вышестоящий сервер всё равно видит loopback Host. Полный список опций см. в разделе Конфигурация HTTP-режима.

Уязвимость DNS-rebinding сообщена avishaigo-commits и yotampe-pluto.

Политика конфиденциальности

Этот MCP-сервер работает локально на вашем компьютере и не собирает телеметрию, аналитику или данные об использовании.

Полная политика: https://ankimcp.ai/privacy/

  • Сбор данных: Сервер ничего не собирает. Он проксирует запросы между вашим ИИ-ассистентом и локальным плагином AnkiConnect.
  • Использование / хранение: Серверное хранение отсутствует. Все данные карточек остаются в вашей установке Anki на вашем устройстве.
  • Передача третьим лицам: Нет. Сервер взаимодействует только с настроенным URL AnkiConnect (по умолчанию: localhost). Если вы включите встроенную синхронизацию AnkiWeb в Anki, она будет происходить напрямую между вашей установкой Anki и AnkiWeb — вне области действия этого сервера.
  • Хранение: Не применимо — сервер не хранит никаких данных.
  • Контакт: support@ankimcp.ai

Известные проблемы

Полный список известных проблем и ограничений см. в нашей документации:

Документация по известным проблемам

Критические ограничения

Обновление заметок не работает при просмотре в браузере

⚠️ ВАЖНО: При обновлении заметок с помощью updateNoteFields обновление молча завершится ошибкой, если заметка в данный момент просматривается в окне браузера Anki. Это ограничение вышестоящего AnkiConnect.

Обходной путь: Всегда закрывайте браузер или переходите к другой заметке перед обновлением.

Подробнее и о других известных проблемах см. в полной документации.

Устранение неполадок

Ошибка ERR_REQUIRE_ESM

Если вы видите ошибку:

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

Это означает, что ваша версия Node.js не поддерживается. Сервер требует Node.js 22.12.0+.

Примечание: Минимальная поддерживаемая среда выполнения — Node.js 22.12.0. Node.js 20 (Iron) достиг конца жизненного цикла 2026-04-30 и больше не поддерживается.

Проверьте свою версию:

node --version

Решение: Обновите Node.js до версии 22.12.0+. Вы можете скачать её с nodejs.org или использовать менеджер версий, например nvm.

Разработка

Режимы транспорта

Этот сервер поддерживает три режима MCP-транспорта через отдельные точки входа:

Режим STDIO (по умолчанию)

  • Для локальных MCP-клиентов, таких как Claude Desktop
  • Использует стандартный ввод/вывод для связи
  • Точка входа: dist/main-stdio.js
  • Запуск: npm run start:prod:stdio или node dist/main-stdio.js
  • MCPB-пакет: использует режим STDIO

Режим HTTP (Streamable HTTP)

  • Для удалённых MCP-клиентов и веб-интеграций
  • Использует протокол MCP Streamable HTTP
  • Точка входа: dist/main-http.js
  • Запуск: npm run start:prod:http или node dist/main-http.js
  • Порт по умолчанию: 3000 (настраивается через переменную окружения PORT)
  • Хост по умолчанию: 127.0.0.1 (настраивается через переменную окружения HOST)
  • MCP-конечная точка: http://127.0.0.1:3000/ (корневой путь)

Режим туннеля (управляемый WebSocket-туннель)

  • Для веб-ИИ-ассистентов через управляемый туннельный сервис AnkiMCP со встроенной аутентификацией
  • MCP-сервер работает в процессе за транспортом в памяти; TunnelTransport владеет MCP-сервером, а TunnelClient соединяет его с туннельным сервисом через WebSocket
  • Протокол: обслуживает только ревизию MCP 2025 (STDIO и HTTP также обслуживают 2026-07-28)
  • Точка входа: dist/main-tunnel.js
  • Запуск: node dist/main-tunnel.js --tunnel (или ankimcp --tunnel)
  • Аутентификация: ankimcp --login / ankimcp --logout; учётные данные хранятся в ~/.ankimcp/credentials.json (0600)
  • Разработка: npm run start:dev:tunnel (режим наблюдения, запускает --tunnel --debug)

Сборка

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

main-stdio.js, main-http.js и main-tunnel.js собираются в один и тот же каталог dist/. Выбирайте, что запускать, в зависимости от ваших потребностей.

Конфигурация HTTP-режима

Переменные окружения:

  • PORT - Порт HTTP-сервера (по умолчанию: 3000)
  • HOST - Адрес привязки (по умолчанию: 127.0.0.1 для localhost)
  • ALLOWED_HOSTS - Дополнительные значения заголовка Host через запятую, которые принимаются помимо встроенного набора loopback (localhost, 127.0.0.1, ::1). Только имена хостов, без учёта порта. По умолчанию: только loopback.
  • ALLOWED_ORIGINS - Разрешённый список шаблонов браузера Origin/Referer через запятую; поддерживаются подстановочные знаки (например, https://*.ngrok.io). По умолчанию: http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*.
  • LOG_LEVEL - Уровень журналирования (по умолчанию: info)

Безопасность:

  • Проверка заголовка Host (защита от DNS-rebinding) — каждый HTTP-запрос должен содержать заголовок Host, соответствующий разрешённому списку. По умолчанию принимаются только loopback-хосты (localhost, 127.0.0.1, ::1), независимо от порта. Host — это заголовок, запрещённый для браузеров, поэтому вредоносная веб-страница не может его подделать — это закрывает путь DNS-rebinding, когда перезагруженная страница достигает сервера с подделанным Host и без Origin. Неразрешённый Host отклоняется с 403.
  • Проверка заголовка Origin — браузерные запросы с присутствующим, но неразрешённым Origin/Referer отклоняются. Запросы без Origin (curl, Postman, MCP-over-HTTP клиенты) разрешены; проверка Host является защитой от rebinding.
  • По умолчанию привязывается к localhost (127.0.0.1).
  • В текущей версии аутентификация отсутствует (планируется поддержка OAuth).

Предоставление доступа к HTTP-режиму за пределами localhost — если вы привязываетесь к LAN/публичному адресу или размещаете сервер за обратным прокси или публичным доменом, вы обязаны установить ALLOWED_HOSTS на имя(имена) хостов, которые будут использовать клиенты, иначе каждый не-loopback запрос будет отклонён с 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

Когда вы привязываетесь к 0.0.0.0/:: без ALLOWED_HOSTS, сервер регистрирует предупреждение при запуске о том, что будут приниматься только loopback-заголовки Host.

Docker / обратный прокси / публичный домен: применяется то же правило. В Docker запросы обычно приходят с опубликованным именем хоста контейнера или Host прокси, поэтому установите ALLOWED_HOSTS соответствующим образом. Обратный прокси (nginx, Caddy, Traefik) должен либо пересылать исходный Host и иметь это имя хоста в списке ALLOWED_HOSTS, либо переписывать вышестоящий Host на localhost. Встроенная интеграция --ngrok обрабатывает это автоматически (см. ниже).

Пример: Режимы запуска

# 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

Создание MCPB-пакета

Чтобы создать распространяемый MCPB-пакет:

npm run mcpb:bundle

Эта команда:

  1. Синхронизирует версию из package.json в manifest.json
  2. Удаляет старые файлы .mcpb
  3. Собирает TypeScript-проект
  4. Упаковывает dist/ и node_modules/ в файл .mcpb
  5. Запускает mcpb clean для удаления devDependencies (оптимизирует пакет с ~47MB до ~10MB)

Выходной файл будет назван anki-mcp-server-X.X.X.mcpb и может распространяться для установки в один клик.

Что входит в пакет

MCPB-пакет включает:

  • Скомпилированный JavaScript (каталог dist/ — включает все три точки входа)
  • Только производственные зависимости (node_modules/ — devDependencies удалены с помощью mcpb clean)
  • Метаданные пакета (package.json)
  • Конфигурацию манифеста (manifest.json — настроен на использование main-stdio.js)
  • Иконку (icon.png)

Исходные файлы, тесты и конфигурации разработки автоматически исключаются через .mcpbignore.

Журналирование в Claude Desktop

При запуске как MCPB-расширение в Claude Desktop журналы записываются в:

Расположение журналов: ~/Library/Logs/Claude/ (macOS)

Журналы разделены на несколько файлов:

  • main.log - Общие журналы приложения Claude Desktop
  • mcp-server-Anki MCP Server.log - Сообщения MCP-протокола для этого расширения
  • mcp.log - Объединённые MCP-журналы со всех серверов

Примечание: Вывод регистратора pino (сообщения INFO, ERROR, WARN из кода сервера) идёт в stderr и появляется в MCP-специфичных файлах журналов. Claude Desktop определяет, какой файл журнала получает какие сообщения, но в целом:

  • Запуск приложения и связь по MCP-протоколу → MCP-специфичный журнал
  • Внутреннее журналирование сервера (pino) → И MCP-специфичный журнал, и иногда main.log

Для просмотра журналов в реальном времени:

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

Отладка MCP-сервера

Вы можете отлаживать MCP-сервер с помощью MCP Inspector и подключения отладчика из вашей IDE (WebStorm, VS Code и т. д.).

Примечание для HTTP-режима: При тестировании HTTP-режима (Streamable HTTP) с MCP Inspector используйте «Connection Type: Via Proxy», чтобы избежать ошибок CORS.

Шаг 1: Настройка отладочного сервера в MCP Inspector

mcp-inspector-config.json уже включает конфигурацию отладочного сервера:

{
  "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"
    }
  }
}

Шаг 2: Запуск сервера отладки

Запустите MCP Inspector с сервером отладки:

npm run inspector:debug

Это запустит сервер с включенной отладкой Node.js на порту 9229 и приостановит выполнение на первой строке.

Шаг 3: Подключение отладчика из вашей IDE

WebStorm
  1. Перейдите в Run → Edit Configurations
  2. Добавьте новую конфигурацию Attach to Node.js/Chrome
  3. Установите порт на 9229
  4. Нажмите Debug для подключения
VS Code
  1. Откройте панель отладки (Ctrl+Shift+D / Cmd+Shift+D)
  2. Выберите конфигурацию Debug MCP Server (Attach)
  3. Нажмите F5 для подключения

Шаг 4: Установка точек останова и отладка

После подключения вы можете:

  • Устанавливать точки останова в исходных файлах TypeScript
  • Пошагово выполнять код
  • Проверять переменные и стек вызовов
  • Использовать консоль отладки для вычисления выражений

Отладчик будет работать с source maps, что позволяет отлаживать исходный код TypeScript, а не скомпилированный JavaScript.

Отладка с Claude Desktop

Вы также можете отлаживать MCP-сервер, пока он работает внутри Claude Desktop, включив отладчик Node.js и подключив вашу IDE.

Шаг 1: Настройка Claude Desktop для отладки

Обновите конфигурацию Claude Desktop для включения отладки:

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"
      }
    }
  }
}

Ключевое изменение: Добавьте --inspect=9229 перед путём к dist/main-stdio.js

Параметры отладки:

  • --inspect=9229 — запустить отладчик немедленно, не блокируя (рекомендуется)
  • --inspect-brk=9229 — приостановить выполнение до подключения отладчика (для отладки проблем запуска)

Шаг 2: Перезапуск Claude Desktop

После сохранения конфигурации перезапустите Claude Desktop. MCP-сервер теперь будет работать с включенной отладкой на порту 9229.

Шаг 3: Подключение отладчика из вашей IDE

WebStorm
  1. Перейдите в Run → Edit Configurations
  2. Нажмите кнопку + и выберите Attach to Node.js/Chrome
  3. Настройте:
    • Name: Attach to Anki MCP (Claude Desktop)
    • Host: localhost
    • Port: 9229
    • Attach to: Node.js < 8 или Chrome or Node.js > 6.3 (в зависимости от версии WebStorm)
  4. Нажмите OK
  5. Нажмите Debug (Shift+F9) для подключения
VS Code
  1. Добавьте в .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. Откройте панель отладки (Ctrl+Shift+D / Cmd+Shift+D)
  2. Выберите Attach to Anki MCP (Claude Desktop)
  3. Нажмите F5 для подключения

Шаг 4: Отладка в реальном времени

После подключения вы можете:

  • Устанавливать точки останова в исходных файлах TypeScript (например, src/mcp/primitives/essential/tools/create-model.tool.ts)
  • Использовать Claude Desktop в обычном режиме — точки останова сработают при вызове инструментов
  • Пошагово выполнять код
  • Проверять переменные и стек вызовов
  • Использовать консоль отладки

Пример: Установите точку останова в create-model.tool.ts на строке 119, затем попросите Claude создать новую модель. Отладчик остановится на вашей точке останова!

Примечание: Отладчик остаётся подключённым, пока работает Claude Desktop. Вы можете отключиться/подключиться в любое время без перезапуска Claude Desktop.

Команды сборки

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

Локальное тестирование npm-пакета

Протестируйте npm-пакет локально перед публикацией:

# 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

Как это работает:

  • npm pack создаёт файл .tgz, идентичный тому, что создал бы npm publish
  • Установка из .tgz имитирует то, что получат пользователи из npm install -g ankimcp
  • Это позволяет протестировать полный пользовательский опыт перед публикацией в npm

Команды тестирования

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)

Покрытие тестами

Проект поддерживает минимальные пороги покрытия 70% для:

  • Ветвей
  • Функций
  • Строк
  • Операторов

Отчёты о покрытии создаются в каталоге coverage/.

Версионирование

Этот проект следует Semantic Versioning с подходом разработки до версии 1.0:

  • 0.x.x — бета/разработочные версии (текущая фаза)

    • 0.1.x — исправления ошибок и патчи
    • 0.2.0+ — новые функции или незначительные улучшения
    • Критические изменения допустимы в версиях 0.x
  • 1.0.0 — первый стабильный релиз

    • Будет выпущен, когда API станет стабильным и протестированным
    • Критические изменения потребуют увеличения мажорной версии (2.0.0 и т.д.)

Текущий статус: 0.27.0 — активная бета-разработка. Недавние функции включают анализ повторений по всей коллекции (review_stats теперь агрегирует данные по всем колодам, когда deck опущен), управление полями моделей (addModelField, removeModelField, renameModelField, repositionModelField), массовое создание заметок (addNotes), встроенный ngrok-туннелинг (флаг --ngrok), управление медиафайлами, управление моделями/шаблонами и комплексная статистика колод. API может меняться на основе отзывов и тестирования.

Эволюция спецификации MCPB

Этот проект нацелен на спецификацию пакета MCPB от Anthropic, которая всё ещё развивается. Мы отслеживаем спецификацию на https://github.com/modelcontextprotocol/mcpb и можем вводить критические изменения для соответствия. Критические изменения допустимы в рамках схемы версионирования 0.x.x.

Похожие проекты

Если вы изучаете интеграции Anki MCP, вот другие проекты в этой области:

scorzeth/anki-mcp-server

  • Статус: Похоже, заброшен (нет недавних обновлений)
  • Ранняя реализация интеграции Anki MCP

nailuoGG/anki-mcp-server

  • Подход: Лёгкая реализация в одном файле
  • Архитектура: Процедурная структура кода со всеми инструментами в одном файле
  • Подходит для: Простых случаев использования, минимальных зависимостей

Чем этот проект отличается:

  • Архитектура корпоративного уровня: Построен на NestJS с внедрением зависимостей
  • Модульный дизайн: Каждый инструмент — отдельный класс с чётким разделением ответственности
  • Поддерживаемость: Легко расширять новыми функциями без изменения существующего кода
  • Тестирование: Комплексный набор тестов с требованием покрытия 70%
  • Безопасность типов: Строгий TypeScript с валидацией Zod
  • Обработка ошибок: Надёжная обработка ошибок с полезной обратной связью для пользователя
  • Готовность к продакшену: Правильное логирование, отчёты о прогрессе и поддержка пакетов MCPB
  • Масштабируемость: Лёгкий рост от базовых инструментов до сложных рабочих процессов

Случай использования: Если вам нужна надёжная основа для создания продвинутых интеграций Anki или вы планируете значительно расширить функциональность, архитектурный подход этого проекта упрощает поддержку и масштабирование с течением времени.

Полезные ссылки

Лицензия и атрибуция

Этот проект лицензирован под лицензией MIT — см. LICENSE для полного текста.

Copyright © 2026 Anatoly Tarnavsky.

Атрибуция третьих сторон

  • Anki® является зарегистрированным товарным знаком Ankitects Pty Ltd. Этот проект — неофициальный сторонний инструмент и не связан с Ankitects Pty Ltd, не одобрен и не спонсируется ею. Логотип Anki используется по альтернативной лицензии для ссылки на Anki со ссылкой на https://apps.ankiweb.net. Для официального приложения Anki посетите https://apps.ankiweb.net.

  • Model Context Protocol (MCP) — открытый стандарт от Anthropic. Логотип MCP взят из официального репозитория документации MCP и используется по лицензии MIT. Для получения дополнительной информации о MCP посетите https://modelcontextprotocol.io.

  • Это независимый проект, который соединяет технологии Anki и MCP. Все товарные знаки, знаки обслуживания, торговые наименования, названия продуктов и логотипы являются собственностью их соответствующих владельцев.