目次
- 蔵書管理アプリ自作の道
- 今回作りたかったもの
- Notionデータベースの構成
- ISBNから情報が入るまで
- AIには「自由に分類」させすぎない
- ChatGPTとCodexに任せたこと
- ブクログから866冊を移行した
- Notionへ移して良かったこと
- 微妙な不満
- おわりに
蔵書管理アプリ自作の道
私は,銀行口座やクレジットカード,サブスクリプション,ガジェット,果ては就職活動に至るまで,さまざまな情報をNotionで管理しています。
ところが,書籍だけは長らくブクログを使い続けていました。Notionに移したい気持ちはありつつも,書名,著者,出版社,発売日,表紙画像といった書誌情報を1冊ずつ入力するのはあまりに大変です。ISBNから情報を取ってくる仕組みを自分で用意する必要がある,という点がネックになっていました。

そこで今回,ChatGPTに要件や構成を整理してもらい,CodexにNotionデータベースと自動取得処理を実装してもらうことで,ようやく蔵書管理をNotionへ移しました。
完成した仕組みでは,普段はISBNを1つ入力するだけで,数分待つと,書名や著者,出版社,内容紹介,書影などが入り,さらにAIがジャンル,タグ,短い要約まで付けてくれます。
この記事では,「Notionと外部APIをつなぐと,こんな蔵書管理が作れる」という全体像を紹介します。
今回作りたかったもの
最初に決めた要件は,おおむね次のようなものでした。
- Notionを蔵書情報の置き場所と入力画面にする
- 主に日本国内で出版された日本語書籍を扱う
- 新しい本は,原則としてISBNだけ入力すれば登録できる
- ブクログから書き出したCSVもまとめて移行できる
- 書誌情報だけでなく,表紙画像もNotionのギャラリーに表示する
- 読書状況,購入日,読了日,評価,感想などは自分で記録する
- 外部から取得できない本は,無理に埋めず手動入力に切り替えられる
- できるだけ無料枠の範囲で,急がず少しずつ処理する
Notionデータベースの構成
プロパティは,大きく3種類に分けました。
| 種類 | 主なプロパティ | 入力方法 |
|---|---|---|
| 書誌情報 | 書名,ISBN,ISBN-10,著者,出版社,発売日,ページ数,内容紹介,NDC,定価,表紙 | 外部APIから自動入力 |
| 自分で管理する情報 | 読書状況,所有形態,購入日,読了日,評価,感想,購入価格 | 手動入力 |
| システム管理情報 | 同期状態,取得元,同期日時,同期メッセージ,登録日時,更新日時 | 自動入力 |
これに加えて,AIが入力するジャンル,タグ,rationale,要約があります。
ジャンル:本の主題を表す大分類。18種類の候補から1つ選ぶタグ:より細かな主題,技術,用途などを複数付けるrationale:なぜそのジャンル・タグに分類したかという短い根拠要約:本そのものが何を扱っているかを示す1〜2文
例えば,統計検定の対策本であれば,ジャンルは「データ・統計・AI」,タグは「統計学」「資格試験」「R」といった具合です。「資格本」という大分類を作るのではなく,何についての本かをジャンル,何のための本かをタグで表すようにしました。
使用している18ジャンル
ジャンルは,現在の蔵書だけでなく今後追加する本にも使い回せる粒度を意識して,次の18種類に固定しました。当初,日本十進分類法(NDC)などの既存分類法を使おうかとも考えましたが,初期登録時の書籍から検討し以下のものになっています。
| ジャンル | 主な対象 |
|---|---|
| IT・コンピュータ | プログラミング,Web,セキュリティ,システム開発 |
| キャリア・就職 | 就職活動,面接,働き方,キャリア形成 |
| デザイン | グラフィック,UI,タイポグラフィ |
| データ・統計・AI | 統計,データ分析,AI,機械学習 |
| ノンフィクション・人物 | 伝記,企業史,ルポルタージュ |
| マーケティング・消費者 | マーケティング,消費者行動,広告,ブランド |
| 人文・歴史・地理 | 歴史,地理,哲学,宗教,文化 |
| 写真・映像 | 写真,カメラ,映像制作,編集 |
| 小説 | 文芸,ミステリー,SFなどのフィクション |
| 建築・都市 | 建築,都市,住宅,空間 |
| 政治・法律・社会 | 政治,法律,行政,社会問題 |
| 教育・学習 | 教育,学校,勉強法,学術 |
| 暮らし・旅行・実用 | 旅行,生活,趣味,実用 |
| 漫画 | 漫画作品 |
| 経営・組織 | 経営戦略,組織,人事,リーダーシップ |
| 経済・金融・会計 | 経済,金融,投資,銀行,会計 |
| 自然科学・医療 | 数学,自然科学,医学,健康 |
| 言語・語学 | 日本語,外国語,言語学,辞書 |
用途に応じてビューを分ける
同じデータベースに対して,現在は次のビューを用意しています。
本棚:ページカバーを書影として並べるギャラリービュージャンル別:18ジャンルでグループ化したボードビュー全蔵書:すべてのプロパティを確認するテーブルビュー同期状態:取得待ち,取得済,要確認,失敗などを確認するボードビュー要確認:ISBNや書誌の取得処理,タグの付与に問題があった本を確認するテーブルビュー
普段眺めるのは「本棚」,不具合を直すときだけ「同期状態」や「要確認」を開く,という使い分けです。
ISBNから情報が入るまで
全体の流れは次のとおりです。
NotionにISBNを入力
↓
Cloudflare Workersが5分ごとに未処理の本を確認
↓
ISBNの形式とチェックディジットを検証
↓
楽天ブックス・Google Booksから書誌情報を取得
↓
主要項目が足りない場合だけNDL Searchで補完
↓
OpenAI APIでジャンル・タグ・分類根拠・要約を生成
↓
利用できる書影URLを確認
↓
Notionのプロパティとページカバーを更新
実行基盤にはCloudflare WorkersとCron Triggerを使いました。1
3つの書誌APIを役割分担させる
1つのAPIだけですべての項目が揃うとは限りません。そのため,取得結果を共通の形式へ変換し,項目ごとに組み合わせています。
| 取得元 | 主な役割 |
|---|---|
| 楽天ブックス書籍検索API | 日本語書籍の基本情報,内容紹介,価格,書影候補 |
| Google Books API | ページ数,内容紹介,書影候補などの補完 |
| NDL Search API | 楽天・Googleで不足した書誌情報,NDCなどの補完 |
楽天ブックスとGoogle Booksは基本的に両方を検索し,主要情報が揃わなかった場合だけNDL Searchから情報を取得します。
書影については,書誌情報とは別に優先順位を決めています。Google BooksのextraLarge,large,medium……と大きい画像から順に確認し,利用できなければ楽天ブックスの画像へフォールバックします。選んだURLはNotionの「表紙」プロパティとページカバーの両方へ設定します。Google Booksには複数サイズの書影フィールドがありますが,すべての本ですべてのサイズが得られるわけではありません。2
実際のコードでは,ISBN-10/ISBN-13の正規化,取得結果側のISBN完全一致確認,リトライ,文字数制限,既存値の保護,書影URLの検証なども行っています。,またNotion APIにはレート制限やプロパティごとのサイズ制限があるため,応答時の待機や,長い本文の切り詰めも行なっています。3
AIには「自由に分類」させすぎない
書誌情報が揃った後は,OpenAI Responses APIへ書名と内容紹介を渡し,ジャンル,タグ,分類根拠,要約を生成します。
ここで重視したのは,AIに毎回好きな名前のジャンルやタグを作らせないことです。
- ジャンルは,Notionに登録済みの18候補から必ず1つ選ぶ
- タグも既存候補を優先する
- 適切なタグがない場合だけ,再利用できる新規タグを最大2つまで提案できる
- 1冊に付けるタグは最大6件までにする
実際の指示文は,おおむね次のような内容です。
AIの確度が高く,検証にも問題がなければ同期状態を取得済にします。確度が低い場合や判断に迷いがある場合はタグジャンル要確認にして,人が確認する運用にしました。AIに任せつつ,怪しい結果だけを後から拾えるようにしています。
また,すでに自分でジャンルやタグを入力している本は上書きしません。自動化の都合より,自分で整えた情報を優先するためです。
ChatGPTとCodexに任せたこと
今回の作業では,ChatGPTとCodexを次のように使い分けました。
ChatGPT:要件整理と設計の壁打ち
最初は「ISBNを入力したら書誌情報が入るNotionを作りたい」という程度のアイデアでした。そこからChatGPTとのやり取りで,次のような点を決めました。
- リアルタイム処理ではなく,定期処理にする
- 書誌情報は複数APIから補完する
- 書影は書誌情報と別の優先順位で選ぶ
- 自分で入力する項目をAPIで上書きしない
- ジャンルとタグの役割を分ける
その上でCodexに渡す用の仕様書を作りました。
Codex:実物を見ながら実装と修正
Codexには,Notionの実際のデータベース構成を確認させながら,Cloudflare Workersのプロジェクト作成,API連携,テスト,デプロイまで進めてもらいました。
初回同期では,表記揺れやCloudflare Workersの実行上限など,設計時には見つからない問題も起きました。こうした問題も,ログを確認し,原因を特定し,各種調整を行い,テストを追加するところまでCodexに任せました。
ブクログから866冊を移行した
初回移行では,ブクログから書き出したCSVを元に,866冊分のISBNをNotionへ登録しました。
ブクログからCSVを書き出す
↓
ISBN列だけを残す
↓
Notionの蔵書管理DBへCSVを取り込む
↓
Cloudflare Workersが順番に書誌情報を補完
↓
AIでジャンル・タグを一括分類
CSVには書名や著者も含められますが,今回はISBNだけを入口にしました。外部APIから取得した値を基準に揃えることで,ブクログ側の表記と新規登録分の表記が混在しにくくなります。
最初の一括分類では,Notionから書き出したデータをローカルのPythonツールで処理し,結果をCSVで確認してからNotion APIで反映しました。その後,同じ分類処理を通常のCloudflare Workers側へ組み込み,新しく登録する本にも自動でジャンル・タグが付くようにしています。
2026年9月8日時点では,866冊のうち861冊が取得済,外部APIで十分な情報を得られなかった5冊が手動入力になっています。ジャンルも全件に付与できました。
Notionへ移して良かったこと
一番大きいのは,書籍だけ別サービスに置かれていた状態を解消し,ほかの情報と同じNotion上で扱えるようになったことです。
- プロパティやビューを,自分が後から探しやすい形に変更できる
- 書誌情報と,自分の購入記録・読書記録を同じページに置ける
- ISBNだけで登録できるため,日常の入力負担は小さい
- ジャンルやタグを,自分の蔵書と関心に合わせて設計できる
- 外部APIやAIを追加して,今後も少しずつ改善できる
既製の蔵書管理サービスは導入直後から使いやすい一方,用意された項目や見せ方の範囲で使うことになります。NotionとAPIを組み合わせた今回の構成は作る手間こそかかりますが,「次はバーコード読み取りを付けたい」「別の書誌情報源を試したい」「シリーズ情報を追加したい」と思ったときに,自分で拡張できます。
微妙な不満
一方,ブクログのすべての機能を移し切れたわけではありません。
綺麗な書影が取れない本がある
Google Booksの大きな画像を優先しても,高解像度の書影が登録されていない本はあります。APIによって収録状況も異なるため,低解像度の画像しか見つからない,あるいは画像そのものがない本も残ります。
ギャラリービューでは書影の品質が見栄えに直結するので,気になる本だけ手動で差し替えるか,今後ほかの取得元を追加する必要がありそうです。
Notion特有の読み込み待ちがある
866冊分の書影や複数のプロパティを表示するため,ビューを開いた直後や切り替え時には,Notion特有の読み込み待ちが発生します。専用の蔵書管理サービスほど軽快ではなく,「すぐ本棚を眺めたい」という用途では少し気になります。
APIによる同期も即時ではなく,ISBN入力後に次のCronを待つ必要があります。ただし,書籍の登録に数分の遅延は困らないため,ここはアクセス量を抑えることとのトレードオフとして割り切っています。
おわりに
蔵書管理をNotionへ移せなかった最大の理由は,書誌情報の入力でした。しかし,ISBNを共通のキーにしてNotion APIと複数の書誌APIをつなぎ,足りない分類だけAIに任せることで,ようやく実用になる形を作れました。当面ブクログも併用しますが,ブクログ対比の欠点がないか潰し切ったら,Notionでの管理に完全に移行しようと思います。
今回の仕組みで面白かったのは,最初から完璧なシステムを設計できたことではなく,ChatGPTとの壁打ちで要件を固め,Codexに実装させ,実際のエラーを見ながら少しずつ育てられたことです。
蔵書管理サービスを自作する,と聞くと大がかりに感じますが,Notionを画面とデータベースとして使えば,自分で用意するのはその間をつなぐ部分です。APIの意味が分かり,Codexを使って小さなツールを作れるのであれば,個人の用途に合わせた情報管理を作る選択肢として十分現実的だと思います。
Footnotes
-
Cloudflare Docs. 「Cron Triggers」「Limits」(参照:2026年09月08日) ↩
-
Notion Labs. 「Request limits」(参照:2026年09月08日) ↩