Notionの週次まとめをObsidianへ安全に保存する
週次の作業まとめをNotionに書いていると、見返しや共同編集は便利でも、長期の検索・自動集計・他の記録との突合では、Markdownとして保存しておきたくなる。今回はHermes Agentから、特定の週次ページをNotionから読み取り、LLMで再要約せずにMarkdownへ変換し、Obsidian側の知識Vaultへ安全に保存する週次エクスポートを作った。
実際に行ったことと確認結果
手元の実装では、週次エクスポート用のPythonスクリプトを追加し、READMEへ配置・実行方法・cron登録方針を記録した。処理対象は「実行日の前週、月曜から日曜」に固定し、Notion親ページの子ページから日付範囲が完全一致する1件だけを選ぶ。0件でも複数件でも停止するため、曖昧なページを勝手に採用しない。
保存先には週次Markdownを1ファイル作る。既に同じ内容があればnoop、差分があれば作成または更新に分ける。単体テストでは、前週計算、週次タイトルの解析、完全一致ページの選択、重複ページの拒否、見出し・箇条書き・ToDo・リンクのMarkdown変換、保存後の読み戻し、シンボリックリンク拒否を確認した。再実行時の検証では、該当テスト7件がすべて成功した。
仕組みの流れ
処理は大きく5段階に分けた。
1. Asia/Tokyo基準で前週の開始日と終了日を計算する。
2. Notion APIで親ページ配下の子ページをたどり、タイトル中の日付範囲を解析する。
3. 一致した子ページのブロックを取得し、見出し、段落、リスト、ToDo、引用、コード、リンクを決定的にMarkdownへ変換する。
4. 変換本文のSHA-256、生成時刻、対象期間をfrontmatterへ入れる。
5. Obsidian Vaultの識別マーカー、保存フォルダ、ファイル名、既存revisionを検証し、一時ファイルへ書いてから原子的に置換する。
LLMを使わず変換する理由は、週次まとめ自体がすでに人間の整理済み記録だからである。要約し直すと、表現の揺れや省略が入り、元ページとの差分確認が難しくなる。
再現手順
まずNotion側で、週次まとめを置く親ページを用意し、内部接続へ読み取り権限を与える。子ページのタイトルには、次のように週の範囲を入れる。
“`text
2026/07/13〜07/19 週次まとめ
“`
環境変数はプレースホルダーで用意し、秘密値は会話やGitへ置かない。
“`bash
NOTION_ACCESS_TOKEN=YOUR_NOTION_TOKEN
NOTION_PARENT_PAGE_ID=YOUR_PARENT_PAGE_ID
NOTION_VERSION=確認日現在の公式推奨バージョン
“`
次に、エクスポートスクリプトを安全な実行場所へ配置し、最初は書き込みなしで動かす。
“`bash
python /path/to/project/weekly_notion_export.py –dry-run
“`
問題がなければ、Hermes cronのスクリプトジョブとして毎週月曜夜などに登録する。保存先のVaultは、`.obsidian`と識別マーカーを持つ実ディレクトリに限定し、保存フォルダ名とファイル名もallowlistで検査する。
失敗しやすい点と安全策
もっとも危険なのは、似た名前のページや別プロジェクトのページを拾うことだ。そのためタイトルの日付範囲が完全一致する子ページだけを対象にした。複数見つかった場合は人が直すまで停止する。
次に、Obsidian側の保存先である。外付けボリュームや同期フォルダでは、リンクや移動で意図しない場所へ書くリスクがある。手元の実装では、Vaultルート、識別マーカー、保存フォルダ、対象ファイルが安全な実体であることを確認し、シンボリックリンクは拒否した。保存後は読み戻して本文一致を確認し、監査ログには本文ではなく期間、相対パス、hash、バイト数、結果だけを残す。
未完了事項として、実Notionでの権限切れ、巨大ページ、未対応ブロックの扱いは運用ログを見ながら調整する必要がある。業務記録を扱うため、公開や社外共有前には人の確認が必要である。
再現チェックリスト
- [ ] Notion親ページが内部接続へ共有されている。
- [ ] 子ページタイトルから対象週を一意に選べる。
- [ ] dry-runで対象期間、ページ、本文hash、警告を確認した。
- [ ] Vault識別マーカーと保存フォルダを検査している。
- [ ] 保存後に読み戻し検証をしている。
- [ ] 同じ内容の再実行がnoopになる。
- [ ] 本文やログに実名、会社名、ID、絶対パス、秘密値を残していない。
公式一次情報
- [Notion API: Retrieve block children](https://developers.notion.com/reference/get-block-children)
- [Notion API: Retrieve a page](https://developers.notion.com/reference/retrieve-a-page)
- [Obsidian CLI Help](https://obsidian.md/help/cli)
- [Hermes Agent Cron Scheduling](https://hermes-agent.nousresearch.com/docs/user-guide/features/cron)
- [Model Context Protocol Tools](https://modelcontextprotocol.io/specification/2025-06-18/server/tools)
