0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code×Codexの横断が捗るエージェントメモリを作った

0
Last updated at Posted at 2026-05-20

作ったもの

PC 上での作業情報を多方面から集めてローカルに貯め、それを AI エージェントのための「記憶」として MCP 経由で渡すメモリアプリを作りました。

集めているのは、スクリーンショット・ブラウザ履歴・キーボード入力・アプリ使用履歴・エージェント会話履歴の 5 種類です(詳細は後述)。Claude Code / Codex / Cursor / GitHub Copilot / OpenClaw / LM Studio など MCP 互換クライアントで動作して、さっき何してた?と聞いたら、「E2Eテストをやりつつ、片手間でYoutube見てたよ」と答えるようなアプリになっています。
pbG0kQWRFTTMoqAs_2x_under10mb.gif

作成の動機

最近の開発スタイルとして、Claude Code と Codex を中心に複数の AI エージェントを横断で使い分ける ことが当たり前になってきました。設計の議論は Claude Code、別軸のレビューや差分検証は Codex、補助的な編集は Cursor、ターミナルでは GitHub Copilot ―― といった具合です。

ただ、各エージェントは 互いの会話を見ていません。さらに、作業の意思決定は対話に到達する前段(ブラウザ閲覧・別アプリでの試行錯誤)で大半が終わっています。結果、毎セッション、自分で自分の状況を喋り直す時間 がどうしても消えませんでした。

具体的には、こういう抜け落ちが日々積み重なっていきます。

  • 月曜の夜、Stack Overflow と GitHub Issue を 30 分読み込んで、ある実装方針を採用した
    どのエージェントの会話履歴にも残らない(エージェントを開いていなかったから)
  • 火曜の朝、Claude Code で続きをやろうと相談する
    → 月曜のブラウザ閲覧も、別エージェントで決めた方針も渡せない。ゼロから議論し直しになる

「金曜の続きから」を本当の意味でエージェントに再開させるには、作業の文脈そのもの ―― 画面に何が映っていたか、ブラウザで何を読んだか、どのアプリで何分作業したか、各エージェントと何を話したか ―― をひとまとめに記録しておく場所が必要です。

既存ツールでは届かなかったライン

近そうなツールは既にいくつか触ってみました。が、どれも一段ずつ届きませんでした。

  • OSS は自前ビルドが必要。.NET / Node 環境を整えて手元でビルドし直さないと使えないツールが多く、これでは開発者以外には薦められない
  • 「セットアップ不要」を求めると有料。商用 SaaS は便利な反面、最初の体験を試す前に課金画面で止まる
  • 裏で必要以上の処理が動いてメモリを食う。常駐アプリで 500MB〜1GB を踏むものも普通にあり、社用 PC では死活問題(後述)
  • AI Native な設計ではない。会話履歴ビューワー然としていて、「エージェントが context として食う」前提で作られていない
  • MCP / Export の経路がない。せっかく記憶を貯めても、エージェントに渡す導線がアプリ内チャット限定で外に出せない
  • macOS 専用。これが一番きつい。Windows 開発者は置いてけぼり

開発者以外の方にも届く形で「エージェントの記憶」を解こうとすると、ビルド不要・サインアップだけで使える・常駐しても邪魔をしない・最初から MCP で外に出せる アプリが必要だ、と判断しました。

目次

Contextberg の機能 — 4 つの柱

技術詳細に入る前に、ユーザーから見たアプリの全体像を 4 つの柱でまとめます。

01 · Context — もう、やったことを再入力する必要はない

  • すべてのウィンドウのスクリーンショットを MCP 経由でエージェントに直接提供
  • ブラウザの閲覧履歴を自動取り込み(Chrome / Edge の History SQLite から URL とタイトル)
  • Claude Code / Codex / Cursor / ターミナルの 会話履歴 を取り込み
  • MCP サーバー内蔵 ―― 対応エージェントを 1 クリックで接続
    1.png

02 · Memory — あなたの働き方が、メモリになる

  • 短期メモリ(Hourly Report): 時間別・アクティビティ別にやったことを自動記録
  • 長期メモリ(LTM, Long-Term Memory): よく使うツール・習慣・作業パターンを蓄積
  • すべて自動生成。エージェントがいつでも推論に使える
    2.png

03 · Private — 作業データは PC の外に出ない

  • アクティビティ・スクリーンショット・ブラウザ履歴は すべてローカルに保存
  • AI 処理はデフォルトでクラウドモデル(Google Gemini 経由、BFF が API キーを保持)
  • LM Studio に切り替えれば 完全オフラインで動作
    3.png

04 · Remember — 戻ってきた瞬間、直前の続きから

  • 戻ってきた瞬間に、直前の作業を要約して提示
  • アクティビティ・ブラウザ・エージェント履歴を横断して再構成
  • 気になるポイントは、そのままチャットで深掘り
    4.png

5 分で試す

1. Microsoft Store で「Contextberg」を検索してインストール
   または https://apps.microsoft.com/detail/9nhpvl6s5dw9 を開く
2. アプリ起動 → Google ログイン(無料プランで OK)
3. 数分そのまま PC を使う(裏でアクティビティが貯まります)
4. Memory タブを開く → Hourly レポートが 1 時間ごとに生成されているはず
5. Settings → MCP → 「Connect Claude Desktop」をクリック
   (Claude Desktop の設定ファイルに自動で 1 ブロック追記されます)
6. Claude Desktop を再起動して
   "What did I work on yesterday?" と聞く

何を記録しているか — 5 種類の信号

Contextberg の設計上の出発点は 「エージェントの会話履歴だけでは記憶として不十分」 という判断でした。

エージェント会話履歴を取り込むツールはすでにいくつかありますが、開発の意思決定は 対話に到達する前段 で大半が終わっています。Stack Overflow の議論を読む、GitHub Issue を眺める、VS Code で 30 分悩んで結局触らない ―― この種のリサーチ・閲覧・試行錯誤は会話履歴には残りません。残るのは「方針が固まってからエージェントに投げた最後の一手」だけです。

そこで Contextberg は PC 上で起きていることをまるごと 5 種類の信号として記録します。

信号 何を記録するか 何のため
アプリ / ウィンドウ使用 フォアグラウンドのプロセス名・ウィンドウタイトル・滞在時間 「VS Code で 1 時間 Auth 周り」の時間配分を復元
ブラウザ履歴 Chrome / Edge の History SQLite から URL・タイトル・最終訪問時刻 「Stack Overflow のこの議論を読んだ」を復元
スクリーンショット アクティブウィンドウのキャプチャ画像(PNG) 「画面に何が映っていたか」を後から人間も AI も読み返せる
キーボード入力 入力ログ(アプリごとの打鍵記録) 「何を書いていたか」「どこで詰まっていたか」の手がかり
エージェント会話履歴 Claude Code / Cursor / Codex / ターミナル等の対話 turn 各エージェントとのやり取りを横断で再構成

ポイントは 5 つを 1 本のタイムラインに統合する ことです。会話履歴単体だと「何を決めたか」しか分かりませんが、ブラウザ・画面・キーボード・アプリ使用と組み合わせると、「なぜその判断に至ったか」までエージェントが追える ようになります。

「全部記録するの?プライバシーは?」と当然なります。すべて PC のローカルにだけ 保存され、外に出るのは AI 要約用の整形済みテキストのみ・かつ LM Studio に切り替えれば一切出さない設計です。詳細は後述の「プライバシー設計」章で。


Record タブと Memory タブ — 取得した信号をユーザーが触れる UI

「裏で取って MCP で渡す」だけだと、ユーザーは何が貯まっているか不安になります。Contextberg は アプリ内に 2 つのタブ を用意して、取得した信号と生成された記憶をユーザー自身が直接見られるようにしています。

Record タブ — リアルタイムの作業ログ

「いま何が記録されているか」を可視化するタブです。

  • フォアグラウンドアプリの切り替えがリアルタイムで流れる
  • 直近のスクリーンショットがサムネイルで並ぶ
  • ブラウザ履歴の取り込み状況がリアルタイムに反映される
  • 1 日の使用時間の円グラフ・スタックバー

image.png

ここを開けば、「監視されている」という抽象的な不安が、実際に何が記録されたかを目視で確認できる安心 に変わるよう設計しています。また、単純に離席した後や過去の振り返りができるような機能になっています。

Memory タブ — 短期メモリ + 長期メモリのビュー

「貯まった記憶をユーザー自身も読む」タブです。短期メモリと長期メモリをそれぞれ管理できるようになっています。

  • LTM はユーザーが手動編集可能。AI が誤って書き込んだ事実を消したり、自分で「私は X が好き」を追記したりできる
  • 各 Hourly Report から そのまま Chat タブで深掘り できる("このときの判断を詳しく" など)

image.png
image.png


3 層の記憶パイプライン

Contextberg では用途の違う 3 種類のメモリを使い分け ています。それぞれ更新頻度と参照シーンが違うだけで、「下層を圧縮して上層に積む」というような直線的なパイプラインではありません。

メモリ 更新頻度 主な用途
Activity 15 分ごと 「直近のセッションで何をしていたか」をそのまま参照
Hourly Report 1 時間ごと デイリー振り返り・「午前何やったっけ」への即答
Long-Term Memory (LTM) 1 日ごと 恒常的な事実(ロール・好み・進行中のプロジェクト)の事前注入

メモリの作り方

各メモリは、アプリ利用ごとのスクリーンショット・キーボード入力・エージェント会話履歴・ブラウジング履歴 をひとまとめに食わせて作っています。生のシグナルを直接渡してモデル側で要約してもらう、という流れです。

[14:00-14:18] VS Code (Contextberg.sln)
  - Views/MemoryView.xaml.cs を編集
  - スクリーンショット 4 枚
  - キーボード入力ログ抜粋: "Migrate" "Async" "await ctx.Database..."
[14:18-14:35] Edge
  - GitHub: contextberg/contextberg#42
  - Stack Overflow: "EF Core MigrateAsync vs EnsureCreated"
[14:35-15:00] Claude Code (session abc123)
  - "MigrateAsync に置き換える" と決定 → AppDbContext.cs を編集
[14:58] git commit "fix(db): use MigrateAsync"

会話の前後にブラウザ閲覧と画面・キーボードの動きが揃うことで、「なぜその実装になったか」までエージェントが推測できる ようになります。

Activity / Hourly Report / LTM

  • Activity(15 分): 直近のシグナルをほぼそのまま読める形でまとめる層。「さっきまで何やってた?」に即答する用途
  • Hourly Report(1 時間): 1 時間分の Activity を自然文サマリに整える層。日次・週次の振り返りで一番触る
  • LTM(1 日): 1 日分の Hourly から、恒常的に覚えておくべき事実(ロール・好み・進行中のプロジェクト等)を抽出してマージする層。エージェントへの "事前注入" として機能する

プライバシー設計 — クラウド側で一切保持しないという方針

Contextberg は 画面・ブラウザ履歴・キーボード入力・アプリ使用・会話履歴 を広く記録します。「記憶」という機能の本質上、ここを削るほど性能が下がるからです。

正直に書くと、個人開発の規模でローカル側のプライバシー対応には限界があります。OS のフックや SQLite を駆使しても、画面録画・キー入力のすべてを完璧に「危険なものだけ自動で外す」のは現状の自分の実力では不可能です。

そこで方針として、ローカルでは広く記録するが、クラウド側では何も残さない という線を引きました。

Microsoft Store 審査によるお墨付き

Microsoft Store では、画面録画・キーボード入力監視を行うアプリの審査が他カテゴリより厳しく、データ取り扱い・暗号化・サードパーティ送信の有無まで申告とレビューが必要です。Contextberg はこの審査を通過しています。Store のアプリページに記載された Privacy Statement とサポート連絡先 が、利用者が踏める一段目の安全ネットになっています。

ローカルに永続化されるもの

  • スクリーンショットの画像本体%LOCALAPPDATA%\Contextberg\screenshots\
  • キーボード入力ログ(アプリ別に SQLite に記録、内容を含む)
  • ブラウザ履歴のキャッシュ(Chrome / Edge の History SQLite から URL とタイトルと最終訪問時刻)
  • アプリ使用ログ(プロセス名・ウィンドウタイトル・滞在時間)
  • エージェント会話履歴の取り込みコピー
  • 認証トークン(DPAPI で暗号化、ProtectedData.Protect(bytes, null, DataProtectionScope.CurrentUser)、ログイン中の Windows ユーザーにのみ復号可能)

ブラウザの フォーム入力 / Cookie / タブの本文 は読み取り対象外です。

クラウドに送るもの

AI 解析(Hourly Report / LTM 生成)のために、上記のローカル記録から 要約用に整形したプロンプト をクラウドに送ります。整形プロンプトには スクリーンショット画像・キーボード入力ログの内容・ブラウザ閲覧履歴・アプリ使用履歴・会話履歴 が含まれます(Gemini は multimodal なので、スクリーンショットは画像のまま渡してモデル側に読ませます)。

ただし、クラウド側(BFF/ Vertex AI Gemini)でこれらを永続化しません。リクエストはステートレスに処理され、AI 生成後の応答テキストだけが WPF に返って再びローカルへ書き戻されます。

ここが Contextberg の現状のプライバシー設計の核です。「ローカルで全部記録するが、出した先で残さない」。完璧ではないものの、個人開発で踏める線として一番納得できる落としどころでした。

取得してほしくない情報は設定で除外できる

「LLM に送りたくない情報」「そもそも記録してほしくない情報」は、Settings から除外設定が可能 です。具体的には次の単位で除外できます。

  • アプリ単位の除外: パスワードマネージャ・銀行アプリ・特定のメッセージングアプリなど、起動中は Record を一時停止
  • ウィンドウタイトル・URL パターンの除外: *.bank.* を含むウィンドウや特定ドメインを無視
  • 時間帯の除外: 業務時間外・特定時間帯は Record しない
  • 信号単位のオフ: スクリーンショットだけオフ、キーボード入力だけオフ、といった粒度での無効化
  • Record タブの停止ボタン: その場で全記録を一時停止(再開も 1 クリック)

除外設定したアプリ・ウィンドウは、そもそも Activity 層に書き込まれない ので、Hourly Report・LTM・MCP どこからも漏れません。

自動除外の強化はロードマップ

現状の除外は ユーザーが事前に設定する 必要があり、未設定のアプリで秘密情報を扱うと普通に記録されます。今後強化したいのは 記録段階での自動除外 です。

  • パスワードマネージャ・銀行アプリ等の自動検知と Record 一時停止
  • スクリーンショット内のテキストに対する PII 検出と自動マスキング
  • インカメラ的に「いま記録しています」の通知バナー強化

完全ではないにせよ、個人開発でもここまで踏めば実用上の安全マージンが取れる ラインを目指しています。

フルローカル運用も選べる

クラウドを一切踏みたくない場合は、LM Studio に切り替え て Hourly Report / LTM 生成もローカル LLM で完結できます。Settings から OpenAI 互換 API のエンドポイントを指定するだけで、外部通信はゼロになります。業務マシンや会社支給 PC で使いたい人向けに、最初から想定して作りました。

データの可視化と削除

ユーザーがいつでも自分のデータを 見て、消せる ことを必須要件にしました。

  • Record タブで 記録された 1 件 1 件を目視確認 できる
  • 右クリックで 不要な記録をその場で削除 可能(後ろめたいウィンドウが映ってしまった時の救済)
  • Settings から ZIP エクスポート / 全データ削除 がいつでも実行できる

パフォーマンス設計 — なぜ Windows-native にこだわったか

「画面・ブラウザ・キー入力を常時監視」と聞いて多くの人が次に気にするのが メモリと CPU です。実測ベースで答えます。

指標
アイドル時メモリ 120〜180 MB
アクティブ時メモリ 約 250 MB
アイドル時 CPU < 1%
MSIX サイズ 約 100 MB

メモリ・CPU・配布サイズを抑えること を 1 つの設計ラインに置いています。常時起動するアプリなので、ここを超えると「Slack や Chrome と並んでメモリを食う邪魔者」になり、ユーザーは静かにアンインストールします。

Electron / Tauri ではなく WPF を選んだ理由

クロスプラットフォームを諦める判断は最初の設計時点でしました。理由は次の 3 つです。

  1. 常駐アプリの Electron は、起動 5 秒間で 300〜500 MB を踏むことが多い。Chromium プロセスを 1 つ抱える時点で、< 200MB のラインは現実的に守れません。
  2. Win32 API への直アクセスが頻繁に必要。キーボードフック、フォアグラウンドウィンドウのプロセス特定、画面キャプチャ、DPAPI、MSIX パッケージ識別 ―― いずれも .NET なら 1〜数行ですが、Tauri / Electron だと FFI レイヤを挟むことになります。
  3. MS Store 配布が前提。MSIX に綺麗に乗せるには、WPF + .NET 8 + Windows App SDK の組み合わせが最も摩擦が少ないです。

代償として macOS / Linux 版は別途書き直しが必要で、ロードマップに置いています。「全 OS 対応で 400MB 食うアプリ」より「Windows でだけ動く 250MB のアプリ」のほうが、最初のユーザー層には刺さる という判断です。

いずれは企業 PC にも入れてほしい

中長期では、社用 PC にも入れてもらえるツール にしたいと思っています。エージェントを使う開発者ほど、メインの作業環境が会社支給のラップトップだったりするからです。

ただ、企業 PC は メモリが 8GB か 16GB の構成が圧倒的に多い。Slack・Teams・Edge・VS Code・Docker Desktop を立ち上げている状態で、Contextberg が 500MB 食うと一気に死活問題になります。実際、勤務先でも Slack の通知すら届かない瀕死状態のラップトップで疲弊している同僚をよく見かけます(笑)。

「インストールしても他の業務ツールの邪魔をしない」サイズに収めることが、企業導入を視野に入れたときの 絶対要件 だと考えています。今後も < 300MB を上限に守る方針です。


MCP でエージェントに渡す

Contextberg は WPF プロセス内で ローカル HTTP サーバー(http://127.0.0.1:18080 を立て、薄い MCP プロキシ経由で MCP クライアントに接続します。Claude Desktop など MCP クライアントの設定に次の 1 ブロックを追加するだけで使えます(Settings の「Connect Claude Desktop」ボタンが、この JSON を自動で書き込みます)。

{
  "mcpServers": {
    "contextberg": {
      "command": "npx",
      "args": ["-y", "@contextberg/mcp-server"]
    }
  }
}

提供しているツール:

ツール 何を返すか
get_activity 直近 N 時間の Activity(アプリ・ウィンドウタイトル・スクリーンショット・ブラウザ履歴)
get_daily_memory 指定日の Daily レポート
get_weekly_memory 指定週の Weekly レポート
get_agent_history Claude Code / Cursor / Codex の 横断的 な会話 turn
read_ltm LTM 全体を Markdown で取得
update_ltm LTM のセクションを差分追記

実際の使われ方

ユーザー(Claude Desktop で)
  「金曜にやってた認証リファクタの続き、どこまで進んだ?」

Claude Desktop(裏で)
  get_agent_history({query: "auth refactor", since: "2026-05-08"})

Claude Desktop(ユーザーに)
  「金曜 17:30 に AccessTokenStore の DPAPI 化まで終わって、
   テストの失敗を 2 つ残してます。直前に Stack Overflow で
   `ProtectedData.Protect` のスレッドセーフ性の議論を読んでいて、
   その方針で実装したようです。CodexとClaude Codeでそれぞれテストを流していました。
   失敗テストは test_token_refresh_idempotent と
   test_logout_clears_pkce_state。どちらから片付けますか?」

Stack Overflow を読んでいた事実は会話履歴には残っていませんが、ブラウザ履歴と Hourly Report 経由でエージェントに見えています。これが「会話履歴だけでは足りなかった」を補った効果です。


プラン — Free と Lite の境界

プラン 含まれるもの
Free コア機能すべて — キャプチャ・MCP・ローカル LLM(LM Studio)・3 層メモリ
Lite クラウド Gemini のクォータ拡張・プレミアムモデル・データ保持期間延長

Free でも MCP・3 層メモリ・LM Studio フルローカル運用まで全部使えます。これは設計の意思で、「お金を払わないとエージェントに記憶を渡せない」という構造にすると、本来一番恩恵を受けるはずの個人開発者・学生が試せなくなるからです。

Lite はあくまで「クラウド AI のクォータと長期保管が欲しい人、MCPとLocalLLMでカスタムする人向け」として現在設計しています。まず無料で価値を感じもらえるように境界を引いています。


こんな人に

  • Claude Code / Codex / Cursor / GitHub Copilot を毎日使う開発者
    ―― 複数エージェントを跨いで作業する人ほど、記憶の分断のストレスが大きい
  • どこまでやったっけ」をエージェントに説明し直すのが面倒な人
    ―― 朝イチの 15 分が無条件に消える問題への解
  • 作業の 続きを素早く再開したい人
    ―― セッションの境目をなくしたい
  • データを クラウドに送らずに AI の恩恵を受けたい人
    ―― LM Studio フルローカル運用で、社用 PC でも踏める線まで設計しています

逆に、画面・ブラウザ履歴・キーボード入力を記録すること自体に抵抗がある方には向きません。ローカル保存とはいえ、収集する信号の幅は意図的に広く取っています。


ロードマップ

  • macOS / Linux 対応
  • Hermes モデル統合
  • Skill コマンドの自動生成
  • Skills 管理ビュー

アイデア募集中です。コメント欄に投げていただいたフィードバックを参考にさせていただきます!


おわりに

個人的な課題感から始まりましたが、多くの人が抱えていると思い、プロダクト化しました。自分が1日中起動してもストレスが溜まらないという第一のゴールはクリアしたので、次は皆様に使っていただき、ブラッシュアップの案をたくさんいただきたいです。

Product Hunt にも同時公開しております。ご関心を持っていただけたら、upvote とコメントで応援いただけるとはげみになります。

ご質問・ご批判は、本記事のコメント欄か X(@screenest_ai)でお待ちしております。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?