Backstory: search your data exports locally について
Backstoryは、個人データのエクスポートをローカルで検索したい人向けのツールです。複数のソースをSQLiteのタイムラインに統合し、MCP対応のAIアシスタントからも検索できます。
主な機能
- 01Google、Telegram、Spotify、Instagramのデータを取り込み
- 02キーワードまたは意味でイベントを検索
- 03ソースをまたいで人物や場所を照合
- 04ダウンロード完了後にデータを自動取り込み
- 05ベンチマークで検索品質を評価
活用シーン
- 01複数のエクスポートから過去のメッセージや行動を検索
- 02位置情報とメディアの履歴をまとめて検索
- 03AIアシスタントからローカルの個人タイムラインを検索
MCP 対応
BackstoryはMCPサーバーを起動し、MCPクライアントにタイムライン検索、イベント取得、人物や場所の検索、期間の要約、取り込み済みソースの一覧を提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Backstory
すべてのデータエクスポートを一か所で検索できます。すべてお使いのコンピューター上で実行され、データが PC の外に送信されることはありません。
Google、Telegram、その他ほとんどのサービスからデータをダウンロードできます。問題は、ダウンロードしたデータがほとんど読めない大量の JSON ファイルや CSV ファイルだということです。Backstory はそれらのエクスポートデータをひとつのローカルデータベースに取り込み、まとめて検索できるようにします。コマンドラインから検索することも、MCP 経由で AI アシスタントに接続することもできます。
クラウドにデータが送信されることはありません。データはお使いのマシン上の SQLite ファイルに保存されます。これは、このツールが存在する主な理由です。なぜなら、これは最も個人的なデータだからです。
目次
できること
- Google、Telegram、Spotify、Instagram のエクスポートデータをインポートできます。
- 時系列をひとつにまとめ、意味またはキーワードで検索できます。
- 異なるデータソース間で、同じ人物や場所を照合できます。
- 「Sarah に夕食のことを最後にメッセージしたのはいつ?」などの質問に、AI エージェントが回答できるようにします。
- データのエクスポート方法を案内し、ダウンロードが完了すると自動的にインポートします。
- ベンチマークを実行して、検索の実際の精度を確認できます。
データソース
各データソースは、エクスポートデータをイベントに変換する小さなアダプターです。現在対応しているデータソースと、それぞれが取り込むデータを以下に示します。
| データソース | インポートするデータ | エクスポート方法 |
|---|---|---|
| Google Takeout | 検索履歴、YouTube の履歴、保存した場所、ロケーション履歴 | backstory fetch google |
| Telegram | メッセージ、連絡先 | backstory fetch telegram |
| Spotify | 再生履歴、ポッドキャスト、検索履歴 | backstory fetch spotify |
| ダイレクトメッセージ、投稿、コメント、検索履歴 | backstory fetch instagram |
新しいデータソースを追加するには、アダプターをひとつ作成するだけです。それ以外を変更する必要はありません。
クイックスタート
.NET 10 SDK が必要です。Linux、macOS、Windows で動作します。
グローバルツールとしてインストールします。
dotnet tool install -g Backstory
または、今すぐソースからビルドします。
git clone https://github.com/magna-nz/backstory && cd backstory
dotnet build Backstory.slnx -c Release
データを取り込みましょう。Backstory がエクスポート方法を案内し、データが Downloads フォルダーに届くとインポートします。
backstory fetch google # or: telegram
backstory watch
ファイルや zip を直接指定することもできます。複数パートに分かれたものも含め、Takeout の zip は自動で展開されます。
backstory import ~/Downloads/takeout-20240101.zip
backstory import ~/Downloads/telegram-export/result.json
続いて検索します。
backstory search "dinner plans with sarah"
backstory search "trip to japan" --from 2023-01-01
AI エージェントから利用する
Backstory は MCP に対応しているため、どの MCP クライアントからでも(Claude など)、時系列を検索できます。サーバーを起動します。
backstory serve
次のコマンドひとつで登録します。
claude mcp add backstory -- backstory serve
または、MCP の設定に直接追加します。
{
"mcpServers": {
"backstory": { "command": "backstory", "args": ["serve"] }
}
}
これで、「東京で調べたあのラーメン店はどこ?」といった質問をエージェントに尋ねられます。エージェントは Google と Telegram の両方のデータを検索して回答します。
仕組み
エクスポート形式ごとに扱いが異なるため、それぞれを処理して、タイムライン上のイベントと、そこに登場する人や場所という共通の形式に変換する小さなアダプターを用意しています。あとはすべて同じように動作します。データの保存には、キーワード検索用の全文検索インデックスと、意味検索用のベクトルインデックスを備えた SQLite を使用します。検索では両方を実行し、結果を統合します。
flowchart TD
TG["Telegram<br/>result.json"]:::src
GT["Google Takeout<br/>JSON / CSV"]:::src
TG --> AD
GT --> AD
AD["Adapters<br/><i>parse and normalize</i>"]:::ingest
NR["Normalizer<br/><i>events and entities</i>"]:::ingest
ER["Entity resolution<br/><i>link people and places</i>"]:::ingest
AD --> NR --> ER
ER --> FTS[("SQLite + FTS5<br/>timeline, keyword")]:::store
ER --> VEC[("Vector index<br/>meaning")]:::store
FTS --> HQ
VEC --> HQ
HQ["Search<br/><i>keyword + meaning</i>"]:::query
HQ --> CLI["CLI"]:::iface
HQ --> MCP["MCP server"]:::iface
classDef src fill:#FAECE7,stroke:#993C1D,color:#4A1B0C;
classDef ingest fill:#EEEDFE,stroke:#534AB7,color:#26215C;
classDef store fill:#E1F5EE,stroke:#0F6E56,color:#04342C;
classDef query fill:#E1F5EE,stroke:#0F6E56,color:#04342C;
classDef iface fill:#F1EFE8,stroke:#5F5E5A,color:#2C2C2A;
magna-nz.github.io/backstory と SPEC.md に、詳細な技術解説があります。
コマンド
| コマンド | 機能 |
|---|---|
fetch google|telegram|spotify|instagram | データのエクスポート方法を表示し、ページを開きます |
watch [--dir <path>] | エクスポートが ~/Downloads にダウンロードされると、自動的にインポートします |
import <path> | エクスポートをインポートします(ファイル、フォルダー、または Takeout zip) |
search "<query>" | タイムラインを検索します。フィルター:--from --to --source --limit |
timeline | 同じフィルターを使って、イベントを時系列順に一覧表示します |
entity "<name>" | 人や場所を検索します |
stats | ソースと種類ごとの件数、および使用中の埋め込みモデルを表示します |
serve | MCP サーバーを起動します |
model fetch | 意味検索モデルをダウンロードします(任意、初回のみ) |
eval | ベンチマークを実行します |
データベースは $BACKSTORY_DB に保存されます。指定がない場合は ~/.backstory/backstory.db が使われます。
検索品質
テキストをベクトルに変換する方法は2種類あり、切り替えて使用できます。
- Hashing(デフォルト)。セットアップ不要で、完全にオフラインで動作し、出現する単語に基づいて一致を判定します。使い始めるには十分です。
- ONNX MiniLM。意味に基づいて一致を判定する、本格的な意味検索です。
backstory model fetchを一度実行してください(約90 MB)。すると、Backstory が自動的にこのモデルを使用します。これにより、「japan vacation」で検索すると、「東京へのフライト」についてのメッセージが見つかります。
backstory eval を実行すると、違いを自分で測定できます。サンプルデータを読み込み、2つの数値を報告します。データがどれだけ解析されたか、また、検索結果の上位5件に正しいイベントがどれだけ含まれるかです。
| 埋め込みモデル | 解析されたデータ | 上位5件に正解あり |
|---|---|---|
| Hashing(デフォルト) | 100% | 87.5% |
| ONNX MiniLM | 100% | 100% |
MCP ツール
| ツール | 戻り値 |
|---|---|
search_timeline | 自然言語のクエリに対する、順位付けされたイベント |
get_events | IDで指定したイベントの全記録。ソースへの参照を含みます |
lookup_entity | 名前で指定した人や場所 |
summarize_period | エージェントが要約するための日付範囲内のすべてのイベント |
list_sources | インポートされたソースと、それぞれのイベント数 |
プライバシー
すべてローカルで実行され、テレメトリーはありません。Backstory がネットワークに接続するのは、検索モデルをダウンロードするために backstory model fetch を実行するときだけです。この手順は任意です。データがマシンの外に出ることはありません。データベースやエクスポートを誤ってコミットしないよう、.gitignore を設定しています。
ライセンス
MIT。詳しくは LICENSE を参照してください。ModelContextProtocol SDK、ONNX Runtime、all-MiniLM-L6-v2 を基盤として構築されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。