Go back

Notionの読書データベースへの本の登録を、録画から作ったSkillと本棚の写真で片づける

Posted on:

読んだ本や持っている本は、Notionの「読書」データベースで管理しています。書名、著者、出版社、発売日、表紙画像、Amazonのリンクをまとめておくと、あとから振り返るときに便利です。

これまでは、Chromeの拡張機能 Save.to(旧Save to Notion) を使って、1冊ずつ登録していました。

  1. Amazonで本を検索する
  2. 商品ページを開く
  3. アソシエイトツールバーでリンクを作る
  4. Save.toでデータベースに送る
  5. リンクや発売日など、足りない項目を手でコピペして直す

数冊ならまだしも、本棚にある数十冊をこれでやると休日が終わります。結果として、「本棚にはあるのにNotionには入っていない本」がどんどん増えていました。

入れ忘れがたまりすぎたので、とりあえず一気に片づけたくなりました。そこで登録の流れを録画してClaudeに渡し、Skillにしています。いまは 本棚の写真を渡すだけで、未登録の本がまとめて登録される ところまで来たので、やり方をまとめておきます。

登録作業を録画して、Skillにする

最初にやったのは、いつもの登録作業の画面録画です。Amazonで検索して、商品ページを開いて、リンクを作って、Notionに送る。この一連の操作をそのまま録画して、Claudeに渡しました。

そこから手順を読み取ってもらい、book-to-notion-reading-log というSkillにしています。録画した操作を画面上でなぞるのではなく、同じ結果をツールで直接作る手順に置き換えたのがポイントです。Notionへの書き込みはNotion MCP経由、Amazonの検索はClaude in Chrome経由で行います。

Skillの中身は、おおむね次の流れです。

  1. 登録先の確認
    Notionの「読書」データベースのスキーマ(プロパティ名と型)を最初に取得する。
  2. Amazonで本を特定する
    ログイン済みのChromeでamazon.co.jpを開き、ページ内から検索結果と商品ページをfetchして解析する。紙の本(ISBN-10のASIN)を優先し、Kindle版しか出てこない場合は商品ページから紙の本のASINをたどる。
  3. 書誌情報を取る
    書名、著者(役割つき)、出版社、発売日、表紙画像のURLを商品ページから抜き出す。紹介文は商品説明を参考に1〜2文で書き直す。
  4. アソシエイトリンクを作る
    https://www.amazon.co.jp/dp/<ASIN>?tag=<トラッキングID> の形で組み立てる。ツールバーの操作は不要。
  5. 重複チェック
    同じ本がすでにあれば新規作成はせず、既存ページの「ほしい書籍」ステータスを外し、表紙画像が空なら補う。
  6. Notionに登録する
    複数冊は1回の呼び出しでまとめて作成する。genre、出版社、発売日、Link、カバー画像、本文を設定する。
  7. 表紙画像をImageプロパティに入れる
    Imageはファイル型なので、画像URLをNotionにアップロードしてからプロパティに設定する。

録画から作られたSKILL.mdの全文も載せておきます。データソースのIDとトラッキングIDはダミーに置き換えています。

book-to-notion-reading-log の SKILL.md
---
name: "book-to-notion-reading-log"
description: "本のタイトルを受け取り、Amazon.co.jpで書誌情報とアソシエイトリンクを取得して、Notionの「読書記録」データベースに1件登録する。"
---

# 本をNotionの読書記録に登録する

ユーザーが本のタイトル(またはAmazonのURL/ASIN/ISBN)を1冊または複数冊渡したら、書誌情報を集めてNotionの読書データベースにページを作る。手作業の流れ(Amazon検索 → 商品ページ → アソシエイトツールバーでリンク生成 → Save.to拡張でNotionへクリップ)を、ツールで直接再現する。画面操作の再生はしない。

## 0. 登録先

- Notionのデータベース「📙 読書」(Dashboard / 本棚 / 読書。Save.to上の表示名は「読書記録」)。
- データソース: `collection://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
- スキーマが変わっている可能性があるので、最初に `notion-fetch` で確認する(出力は非常に長いので、プロパティ名と型が分かれば十分)。

## 1. Amazonを読む手段

- 優先: Claude in Chrome(ユーザーのChromeでAmazonにログイン済み)。`tabs_context_mcp` → 新しいタブで `https://www.amazon.co.jp/` を開く。
- Chromeが繋がっていなければ、デスクトップアプリの内蔵ブラウザ(amazon.co.jp のサイト許可が必要)。
- サンドボックスのシェルやWebFetchからはAmazon・openBD・国立国会図書館APIに届かないので試さない。
- 複数冊のときは、Amazonのページを1つ開いた状態で `javascript_tool` から同一オリジンの `fetch('/s?k=...&i=stripbooks')` や `fetch('/dp/<ASIN>')` を順に呼び、DOMParserで解析すると1回でまとめて取れる。出力が長いと切れるので、1回あたり3〜5冊にする。

## 2. 本を特定する

- URLやASINが渡されていればそれを使う。
- 検索結果: `div[data-component-type="s-search-result"]` の `data-asin`、`h2`(書名)、`.a-row.a-size-base.a-color-secondary`(著者と日付)。
- 紙の本(単行本・ソフトカバー)を優先する。紙の本のASINは数字10桁(ISBN-10)、`B0`で始まるものはKindle版。
- 検索結果の先頭がKindle版しかない場合は、そのKindle商品ページのHTMLから `/dp/(4\d{8}[\dX])` に一致するリンクを探し、書名が一致する紙の本のASINを使う。
- タイトルが少し違う(例:「テスト」と「コンテスト」)場合は、最も近い本を選び、そう解釈したことを報告で伝える。旧版と新版がある場合は、DBに旧版が既にあれば新版を選ぶ。判別できないときだけユーザーに確認する。

## 3. 書誌情報を取る

商品ページ `/dp/<ASIN>` から:

- 書名: `#productTitle`(Amazonの表記をそのまま使う。シリーズ名の括弧も残す。既存ページもこの形式)。
- 著者: `#bylineInfo .author`(「(著)」「(翻訳)」「(監修)」の役割付き)。
- 出版社・発売日: `#detailBullets_feature_div li` のうち「出版社」「発売日」を含む行。発売日は YYYY-MM-DD に直す。
- 表紙画像: `#landingImage` の `data-old-hires`(m.media-amazon.com の大きい画像)。
- 本文用の紹介文は商品説明を参考に自分の言葉で1〜2文にまとめる。丸写しはしない。

## 4. アソシエイトリンク

- ストアID / トラッキングID: `example-22`
- 形式: `https://www.amazon.co.jp/dp/<ASIN>?tag=example-22`
- amzn.to の短縮リンクが必要と言われた場合だけ、Chromeでアソシエイトツールバーの「リンク生成」→「ショートリンク」→「アフィリエイトリンクをコピー」を使う。

## 5. 重複チェックと既存ページの更新

- 作成前に、各タイトルの特徴的な語で `notion-search`(`data_source_url` に上記データソース、`max_highlight_length: 0`)を実行する。
- 同じ本が既にあれば新しいページは作らず、その既存ページを `notion-fetch` して次の2つを確認する(確認なしで行ってよい):
  1. Status が「ほしい書籍」なら、Status を外す(`update_properties` で `{"Status": null}`)。それ以外の Status(doing / done など)は触らない。
  2. Image プロパティが空(fetch 結果の properties に Image がない)なら、手順7と同じ方法で表紙をアップロードして設定する。
- それ以外の既存の値(Link、著者、本文など)は変えない。
- 旧版だけがある場合は新版として新規登録してよい。
- 報告では、既存ページごとに何を変えたか(「ほしい書籍」を外した、画像を追加した、変更なし)を伝える。

## 6. Notionに登録する

`notion-create-pages`(parent は `data_source_id`、複数冊は1回の呼び出しでまとめる)。

- title: 書名
- genre(複数選択): 技術書・プログラミング系は「技術書」、ビジネス・ファシリテーション系は「ビジネス書」、英語学習は「英語」。既存の選択肢から選ぶ。
- 出版社(複数選択): 出版社名。既存の選択肢と表記を合わせる(例:「ハーパーコリンズ・ ジャパン」)。
- 著者(複数選択): **既存の選択肢に一致する名前だけ設定する**(姓名の間に半角スペースがある表記が多い)。選択肢にない名前を入れると作成全体がエラーになる。APIで選択肢を追加するには既存の約1,000件を全部書き直す必要があり、消してしまう恐れがあるので行わない。設定できなかった著者は本文に「著者: …」として書き、報告で伝える。
- 発売日: `date:発売日:start` に YYYY-MM-DD、`date:発売日:is_datetime` に 0。
- Link: アソシエイトリンク。
- Status / 希望: 空のまま(ユーザーが指定した場合のみ)。
- cover: 表紙画像URL。
- 本文: 表紙画像、著者(全員・役割付き)、紹介文、Amazonリンク。

## 7. 表紙画像をImageプロパティに入れる

Image はファイル型なので外部URLはそのまま入らない。新規ページの作成後、または既存ページのImageが空のときに:

1. `notion-create-attachment` に `source_url`(表紙画像URL)と `filename`(`<ASIN>.jpg`)を渡してNotionにアップロードし、`file_upload_id` を得る。複数冊なら並列に呼ぶ。
2. `notion-update-page` の `update_properties` で `{"Image": [{"type": "file_upload", "file_upload": {"id": "<file_upload_id>"}}]}` を設定する。

アップロードは1時間で期限切れになるので、すぐに設定する。

## 8. 後片付けと報告

- 自分で開いたブラウザのタブを閉じる。
- 報告は、登録した本(書名・出版社・発売日とNotionページのリンク)の一覧、登録済みだった本とそこで変えた内容、解釈した点(タイトルの読み替え・新版選択・genreの判断)、手作業が必要な点(未設定の著者)を短くまとめる。

手作業でやっていたことを分解すると、「本を特定する」「情報を集める」「重複を避けて書き込む」の3つでした。それぞれをツールに置き換えただけですが、毎回手でコピペしていたリンクや発売日を、もう触らなくてよくなりました。

本棚の写真から、まるごと登録する

Skillができてからは、入力を「書名」から「本棚の写真」に変えました。たとえば書斎の本棚は、こんな写真です。

書斎の本棚。上下2段に技術書とビジネス書が並んでいる

依頼もかなり簡単で、スラッシュコマンドでSkillを指定し、iPhoneで撮った本棚のHEIC画像をそのまま渡して、こう頼むだけです。

自分の本棚にある本のタイトルを抽出して、読書データベースに入ってないデータを登録して

Claude側では次の順で進みます。

  1. HEICをJPEGに変換して、背表紙から書名を読み取る(読みにくいところは拡大して確認)
  2. 漫画や雑誌、端で切れていて特定できない本は除外する
  3. データベースを検索して、登録済みの本を除く
  4. 残った本をAmazonで調べて、まとめて登録する
  5. 表紙画像を設定する

写真4〜5枚分を処理して、新しく登録したのは約60冊でした。登録済みだった本も、ざっと100冊近く照合しています。手作業でやっていたら、何日かかったかわかりません。

判断が必要なところは、こちらに確認が来るようにしています。たとえば「ビジネスモデル・ジェネレーション」は、背表紙だけでは2012年の通常版か2025年のコンパクト版か判別できませんでした。表紙の写真を追加で撮って渡すと、「横長の装丁なので通常版」と判断して登録してくれました。版違いや増補改訂版のように写真だけでは決めきれないものは、報告に残してくれるので、あとから確認できます。

表記ズレと重複も、ついでに整理できた

思っていなかった収穫が、既存データの整理です。Save.toで手入力していたころのデータには、書名の表記が微妙に違うまま入っている本や、同じ本が二重に登録されているものが混ざっていました。

登録のたびにデータベース全体と照合するので、こうした表記ズレや重複もまとめて洗い出せます。本棚にある本で、ステータスが「ほしい書籍」のままになっていたものも外しました。登録を回すたびに、データベースの状態が少しずつ正しくなっていきます。

運用してみてSkillに書き足したこと

使っているうちに、Skillに書いておくべきことがいくつか見つかりました。

  • 重複チェックは「DBの中身」を見る
    キーワード検索は長い書名だと拾えないことがあります。短いキーワードで検索し直したり、データベースへのSQLクエリでタイトルを横断的に照合したりしています。プランによってはクエリの利用上限があるので、そのときは検索にフォールバックします。
  • 選択肢にない値は入れない
    出版社(複数選択)の選択肢にない出版社は無理に入れず、本文に書くようにしています。著者は途中から「著者データベース」へのリレーションに変わっていたので、既存の著者ページがある人だけを関連付けています。
  • Notion APIのレート制限
    表紙画像のアップロードを並列で大量に投げると制限にかかるので、数件ずつ区切って待ちながら進めています。

おわりに

一番大きかったのは、Save.toで1冊ずつ登録して、リンクや発売日を手でコピペする作業がまるごとなくなったことです。いまは本棚を撮ってSkillに渡せば終わりで、表紙画像や出版社、アフィリエイトリンクまでそろった状態で入ります。「登録しないといけない本がたまっている」という小さなストレスが消えたのが、地味にうれしいです。

進め方としては、いきなり「写真から登録」を作らずに、手作業の録画、Skill化、入力を写真に広げる、の順にしたのがよかったと思います。途中で困ったことがあっても、Skillに書き足すだけで済みました。面倒な定型作業があるなら、まず自分の操作を録画してClaudeに渡してみると、すんなりSkillにできるかもしれません。