Notionの週次まとめをObsidianへ安全に保存する


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)

Back to top