mcpField
A
apple-books-mcp

apple-books-mcp

github.com/vladmdgolam生产力939 次安装2 周前更新
代码仓库

关于 apple-books-mcp

apple-books-mcp 是用于访问 Apple Books 图书与批注的 MCP 服务,适合整理阅读标注或搜索书中内容的用户。它提供按颜色筛选、批注搜索及图书全文搜索等工具。

主要功能

  1. 01列出图书、书架和批注
  2. 02查看单条批注及颜色
  3. 03按颜色筛选全库高亮
  4. 04搜索高亮文本和笔记
  5. 05搜索图书全文
  6. 06查询最近批注

适用场景

  1. 01按阅读清单提取图书高亮
  2. 02跨图书查找特定引文
  3. 03汇总某种颜色的高亮
  4. 04将图书批注整理为 Markdown

MCP 相关

该项目是 MCP 服务,向 MCP 客户端提供 Apple Books 图书、批注、集合及全文搜索相关工具。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/vladmdgolam/agent-skills --skill apple-books-mcp

安装后在 Claude Code 中输入/apple-books-mcp确认已加载。

详细介绍

Apple Books MCP

MCP 服务:vgnshiyer/apple-books-mcp

安装:npx -y @anthropic-ai/claude-code mcp add apple-books -- uvx apple-books-mcp

工具参考

工具用途
list_all_books列出所有图书(ID、标题、作者)
get_book_annotations获取指定 ID 图书的所有批注。不含颜色数据。
describe_annotation获取单条批注的完整详情,包括颜色
get_highlights_by_color获取整个书库中所有指定颜色的高亮内容
search_highlighted_text按高亮文本搜索批注
search_notes按用户撰写的笔记搜索
list_all_annotations获取所有图书中的全部批注
list_all_collections列出所有合集
get_collection_books获取合集中的图书
describe_book / describe_collection按 ID 获取详情
recent_annotations获取最近创建的批注
full_text_search在所有图书中进行全文搜索

重要:颜色提取策略

get_book_annotations 不会返回颜色。describe_annotation 会返回颜色,但一次只能查询一条批注——单本图书就需要调用 150 次以上。

**解决方案:**每种颜色调用一次 get_highlights_by_color(总共调用 5 次),然后以编程方式交叉匹配批注 ID。

Available colors: PINK, BLUE, YELLOW, GREEN, PURPLE
Underlines: color = null, is_underline = 1
构建颜色映射
import json, glob

# After calling get_highlights_by_color for PINK, BLUE, YELLOW, GREEN, PURPLE
# Results save to files when they exceed token limits

ann_color = {}
colors = ["PINK", "BLUE", "YELLOW", "GREEN", "PURPLE"]

for color_file, color in zip(sorted(glob.glob("path/to/results/*.txt")), colors):
    with open(color_file, 'r') as f:
        data = json.load(f)
    current_id = None
    for line in data.get("text", "").split("\n"):
        line = line.strip()
        if line.startswith("ID: "):
            current_id = line.split("ID: ")[1].strip()
        elif line.startswith("Selected text: ") and current_id:
            selected = line[len("Selected text: "):]
            if selected and selected != "None":
                ann_color[current_id] = color

# Look up: ann_color.get(str(annotation_id), None)  # None = underline

工作流:提取图书列表中的高亮内容

第 1 步:匹配图书

调用 list_all_books 并与用户的列表进行匹配。提示:

  • 图书可能以译名显示(例如,俄语版本)
  • PDF 的标题往往乱码或以文件名命名
  • 使用部分匹配或模糊匹配——“Vignelli Canon”可能只显示为“canon”
  • 同一本书可能有多个版本(ID 不同)
第 2 步:获取每本图书的批注
get_book_annotations(book_id="531")

返回:ID、selected_text、representative_text、note、chapter、location、修改日期。过滤掉 selected_text 为 None 的条目(空书签)。

第 3 步:获取颜色(批量)
get_highlights_by_color(color="PINK")
get_highlights_by_color(color="BLUE")
get_highlights_by_color(color="YELLOW")
get_highlights_by_color(color="GREEN")
get_highlights_by_color(color="PURPLE")

结果很大(100k-400k 个字符)。使用 Python 解析。

第 4 步:导出为 Markdown
color_emoji = {
    "PINK": "🩷", "BLUE": "🔵", "YELLOW": "🟡",
    "GREEN": "🟢", "PURPLE": "🟣",
}

lines = [f"# {title}", f"**{author}**", "", "---", ""]
for ann_id, text in annotations:
    color = ann_color.get(str(ann_id), None)
    tag = color_emoji.get(color, "〰️")  # 〰️ for underlines
    lines.append(f"{tag} {text}")
    lines.append("")

批注数据结构

来自 describe_annotation:

{
  "id": 2133,
  "selected_text": "be impeccable with your word",
  "representative_text": "The first agreement is to be impeccable...",
  "note": null,
  "is_underline": 0,
  "style": 4,
  "color": "PINK",
  "chapter": null,
  "location": "epubcfi(/6/12[c005]!/4/10,/1:26,/2/1:28)"
}
样式与颜色的对应关系
样式颜色
0下划线(无颜色)
1绿色
2蓝色
3黄色
4粉色
5紫色

示例

示例 1:导出阅读清单中的所有高亮内容

用户说:“提取我的阅读清单中图书的高亮内容”

  1. 读取用户的列表(文件、笔记等),获取图书标题
  2. list_all_books → 将标题与 ID 匹配
  3. 对每本匹配的图书:get_book_annotations(book_id=ID) → 收集批注 ID 和文本
  4. get_highlights_by_color x5 → 构建颜色映射
  5. Python 脚本合并批注和颜色 → 为每本图书写入 .md 文件
示例 2:搜索所有图书中的引文

用户说:“查找我标记过的关于影子工作的内容”

  1. search_highlighted_text(text="shadow") → 返回匹配的批注及图书上下文
  2. 如果需要颜色:对少量结果调用 describe_annotation(annotation_id=ID)
示例 3:获取所有粉色高亮内容

用户说:“显示我所有粉色的高亮内容”

  1. get_highlights_by_color(color="PINK") → 获取整个书库中的所有粉色高亮内容
  2. 按图书标题分组,便于阅读

故障排除

问题现象原因解决方法
list_all_books 为空从未打开过 Apple Books打开一次 Apple Books 应用
图书没有批注读过图书,但没有标记高亮这是预期行为
describe_annotation 的颜色为 null这是下划线检查 is_underline 字段
颜色结果过大书库中的高亮内容很多结果会自动保存到文件;使用 Python 解析
图书标题不匹配版本或译本不同尝试作者名或部分标题
selected_text 为 None这是书签,不是高亮内容过滤掉这些条目

评论

支持 Markdown