关于 anki-connect
anki-connect 是一项通过 AnkiConnect 本地 HTTP API 与 Anki 交互的技能,面向需要用命令行执行并检查 Anki 操作的用户。它涵盖搜索、卡片与笔记管理,并要求修改前取得确认。
主要功能
- 01通过本地 HTTP API 调用 Anki
- 02构建并执行 JSON 请求
- 03搜索笔记和卡片并预览内容
- 04批量组合 API 操作
- 05修改前要求用户确认
适用场景
- 01查找符合条件的笔记或卡片
- 02查看笔记内容并核对修改范围
- 03经确认后新增或更新卡片与笔记
- 04管理牌组、标签及媒体文件
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ intellectronica/ agent-skills --skill anki-connect安装后在 Claude Code 中输入/anki-connect确认已加载。
详细介绍
AnkiConnect
概述
通过 AnkiConnect 本地 HTTP API 与 Anki 可靠交互。使用此技能将用户请求转换为 AnkiConnect 操作,构造 JSON 请求,通过 curl/jq(或等效工具)运行,并安全地解读结果。
前提条件和环境
- 如果 Anki 尚未运行,请启动 Anki,然后等待 AnkiConnect 服务在
http://127.0.0.1:8765(默认值)响应。使用 curl 验证其是否就绪,例如,curl -sS http://127.0.0.1:8765应返回Anki-Connect。
安全与确认策略(关键)
关键——无例外
在对笔记或卡片执行任何破坏性或修改操作(添加、更新、删除、重新排程、暂停、取消暂停、更改牌组或更改字段/标签)之前,必须征求用户确认。如果有 AskUserQuestion 工具,请使用;否则通过聊天询问。每个逻辑操作只请求确认一次,即使该操作需要多次 API 调用(例如,搜索 + 更新 + 验证)。按意图和范围归组确认(例如:“更新符合查询 X 的 125 条笔记”)。
默认情况下,以下操作需要确认:
- 笔记:
addNote、addNotes、updateNoteFields、updateNoteTags、updateNote、updateNoteModel、deleteNotes、removeEmptyNotes、replaceTags、replaceTagsInAllNotes、clearUnusedTags。 - 卡片:
setEaseFactors、setSpecificValueOfCard、suspend、unsuspend、forgetCards、relearnCards、answerCards、setDueDate、changeDeck。 - 会实质性更改卡片/笔记的牌组或模板修改(删除牌组、编辑模板)。即使操作未在上方明确列出,也要征求确认。
API 基础知识
请求格式
每个请求都是包含以下内容的 JSON:
action:字符串类型的操作名称version:API 版本(除非用户另有指定,否则使用6)params:参数对象(可选)
响应格式
每个响应都是包含以下内容的 JSON:
result:返回值error:成功时为null,否则为描述错误的字符串
使用 result 前,务必检查 error。
权限
- 从非受信任来源交互时,先使用
requestPermission;它是唯一接受任意来源的操作。 - 使用
version确保兼容性;较旧版本在version≤ 4 时,响应中可能省略error字段。
curl + jq 模式
优先使用 jq 构建 JSON 和解析响应。请求应明确且结构清晰。
最简请求模板
jq -n --arg action "deckNames" --argjson version 6 '{action:$action, version:$version}' \
| curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @-
带参数
jq -n \
--arg action "findNotes" \
--argjson version 6 \
--arg query "deck:French tag:verbs" \
'{action:$action, version:$version, params:{query:$query}}' \
| curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @-
处理 result/error
curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @- \
| jq -e 'if .error then halt_error(1) else .result end'
批量执行多个操作
使用 multi 减少往返次数,并在修改数据时将多个操作归入一次确认。
jq -n --argjson version 6 --arg query "deck:French" \
'{action:"multi", version:$version, params:{actions:[
{action:"findNotes", params:{query:$query}},
{action:"notesInfo", params:{notes:[]}}
]}}' \
| curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @-
链接操作时,将空数组替换为上一个操作的结果;使用命令行时,除非使用脚本语言,否则应拆分为两次调用。
核心工作流指南
1) 验证连接和版本
- 调用
requestPermission(安全)。 - 调用
version确认 API 级别,并在请求中使用version: 6。
2) 查找支持的操作
- 使用
apiReflect,并设置scopes: ["actions"],列出支持的操作。 - 使用此列表将用户意图映射到操作名称。
3) 将用户请求解析为操作序列
- 确定哪些操作是只读的,哪些具有破坏性。
- 对笔记/卡片执行破坏性或修改操作时,按范围和数量征求一次确认。
- 修改前,优先使用
findNotes/findCards+notesInfo/cardsInfo进行预览。
4) 执行并验证
- 按顺序执行调用。
- 检查每个响应中的
error。 - 汇总报告结果以及返回的任何 ID。
常见任务示例(面向命令行)
列出牌组
- 操作:
deckNames
创建牌组
- 操作:
createDeck - 如果创建牌组属于修改卡片/笔记工作流的一部分,则需要征求确认。
搜索笔记/卡片
- 操作:
findNotes、findCards - 使用 Anki 搜索语法(参见下方“搜索语法速览”)。
预览笔记数据
- 操作:
notesInfo(笔记 ID)
添加笔记
- 操作:
addNote、addNotes - 需要确认。
- 执行预检时使用
canAddNotes或canAddNotesWithErrorDetail。
更新笔记字段或标签
- 操作:
updateNoteFields、updateNoteTags或组合操作updateNote - 需要确认。
- 警告:请勿在浏览器中打开该笔记,否则更新可能无法应用。
删除笔记
- 操作:
deleteNotes - 需要确认。
暂停/取消暂停卡片
- 操作:
suspend、unsuspend - 需要确认。
将卡片移至牌组
- 操作:
changeDeck - 需要确认。
设置到期日期或重新安排
- 操作:
setDueDate - 需要确认。
上传/下载媒体
- 操作:
storeMediaFile、retrieveMediaFile、getMediaFilesNames、getMediaDirPath、deleteMediaFile - 上传时使用 base64(
data)、文件路径(path)或 URL(url)。
同步
- 操作:
sync
搜索语法速览(适用于 findNotes/findCards)
- 用空格分隔搜索词;默认使用 AND 逻辑。
- 使用
or、括号和-表示 NOT 逻辑。 - 使用
deck:Name、tag:tagname、note:ModelName、card:CardName。 - 使用
front:...或其他字段名来限定字段。 - 使用
re:进行正则表达式搜索,使用w:进行单词边界搜索,使用nc:忽略重音符号。 - 使用
is:due、is:new、is:learn、is:review、is:suspended、is:buried按卡片状态筛选。 - 使用
prop:搜索间隔或到期日期等属性。 - 根据需要用引号或反斜杠转义特殊字符。
操作目录(用作映射参考)
卡片操作
getEaseFactorssetEaseFactorssetSpecificValueOfCardsuspendunsuspendsuspendedareSuspendedareDuegetIntervalsfindCardscardsToNotescardsModTimecardsInfoforgetCardsrelearnCardsanswerCardssetDueDate
牌组操作
deckNamesdeckNamesAndIdsgetDeckscreateDeckchangeDeckdeleteDecksgetDeckConfigsaveDeckConfigsetDeckConfigIdcloneDeckConfigIdremoveDeckConfigIdgetDeckStats
图形界面操作
guiBrowseguiSelectCardguiSelectedNotesguiAddCardsguiEditNoteguiAddNoteSetDataguiCurrentCardguiStartCardTimerguiShowQuestionguiShowAnswerguiAnswerCardguiUndoguiDeckOverviewguiDeckBrowserguiDeckReviewguiImportFileguiExitAnkiguiCheckDatabaseguiPlayAudio
媒体操作
storeMediaFileretrieveMediaFilegetMediaFilesNamesgetMediaDirPathdeleteMediaFile
杂项操作
requestPermissionversionapiReflectsyncgetProfilesgetActiveProfileloadProfilemultiexportPackageimportPackagereloadCollection
模型操作
modelNamesmodelNamesAndIdsfindModelsByIdfindModelsByNamemodelFieldNamesmodelFieldDescriptionsmodelFieldFontsmodelFieldsOnTemplatescreateModelmodelTemplatesmodelStylingupdateModelTemplatesupdateModelStylingfindAndReplaceInModelsmodelTemplateRenamemodelTemplateRepositionmodelTemplateAddmodelTemplateRemovemodelFieldRenamemodelFieldRepositionmodelFieldAddmodelFieldRemovemodelFieldSetFontmodelFieldSetFontSizemodelFieldSetDescription
笔记操作
addNoteaddNotescanAddNotescanAddNotesWithErrorDetailupdateNoteFieldsupdateNoteupdateNoteModelupdateNoteTagsgetNoteTagsaddTagsremoveTagsgetTagsclearUnusedTagsreplaceTagsreplaceTagsInAllNotesfindNotesnotesInfonotesModTimedeleteNotesremoveEmptyNotes
统计操作
getNumCardsReviewedTodaygetNumCardsReviewedByDaygetCollectionStatsHTMLcardReviewsgetReviewsOfCardsgetLatestReviewIDinsertReviews
注意事项与陷阱
- 在 macOS 上让 Anki 保持前台运行,或禁用 App Nap,以防止 AnkiConnect 暂停。
- 更新笔记时,请确保未在浏览器编辑器中查看该笔记;否则更新可能不会生效。
importPackage路径是相对于 Anki 的collection.media文件夹,而非客户端。deleteDecks需要设置cardsToo: true,才能连同卡片一起删除牌组。
资源
此技能无需附带脚本或资源。
评论
支持 Markdown