Ambient Context は、前面ウィンドウに映っている文字を既定5秒ごとに読み取り、自分が選んだフォルダのMarkdownへ追記し続けるmacOSメニューバーアプリだ。溜まった記録は手元のエージェントCLI(Claude Code・Codex・opencode)が読み、引用付きの知識ベースと日次ノートに変える。「AIに毎回、メールとチケットと打ち合わせの内容を貼り直している」状態を、記録側から解こうとしている。本記事では2026-09-25時点の Ambient Context v1.1.2(star 195・MIT)をクローンし、MCPツールの本数・除外処理の段数・テストの通り方・外部通信先をコードで実測した。

Ambient Contextの3段の流れ。①記録:前面ウィンドウの文字を既定5秒間隔で追記、②加工:手元のCLIが知識ベースと日次ノートへ、③参照:MCP 20ツールまたはフォルダを直接読ませる
出典: クローンしたv1.1.2の src-tauri/src/settings.rs(interval_secs 既定5)と src-tauri/src/mcp/tools.rs(defs 20件)を実測して作図
30秒でわかるAmbient Context(2026-09-25時点)
  • ・macOS 14以降・Apple Silicon専用のメニューバーアプリ。Tauri 2(Rust+React)製・MIT・star 195・fork 10
  • ・記録は Days/YYYY-MM-DD/ 以下の apps.md・websites.md・messages.md の3ファイル。加工結果は KB/ と Summaries/ に別置き
  • ・アプリ自体はモデルAPIを呼ばない。加工は手元のCLIを起動して行う(既定は claude-opus-5)
  • ・バイナリはMCPサーバーも兼ねる。ツールは20本、うち読み取り専用10本。再構成した tools/list は約3,744トークン
  • ・書き込み前に4段の除外が入る。外部への通信先はコード上、更新確認のGitHub Releases 1つだけ
  • ・star 195は当サイトの題材ゲート(200以上)を下回るが、読者からの明示依頼として採用した(後述の配布メモ参照)

Claude Code側の設定・運用の全体像はClaude Code|2026年版・インストールからCLAUDE.md・Hooks・本番運用までの実装手引きにまとめてある。本記事はその「文脈をどこから持ってくるか」の一手段として読んでほしい。

Ambient Contextとは:画面に出ていた文字を、その日のうちにMarkdownへ落とす

READMEの主張は一文で、「あなたが一日にやったことを書き留めて、AIアシスタントに良い文脈を渡す」。実装はこれをかなり素直になぞっている。

メニューバーの目のアイコンが開いている間、アプリは数秒おきに「いま前面にあるウィンドウ」のアクセシビリティツリーを読み、テキストをその日のファイルに追記する。ここで重要なのは、取っているのが画像ではなくテキストだけだという点だ。スクリーンショットも録画もOCRも無い。

書かれるものは1日あたり3つで、役割が分かれている。

ファイル 中身 読む主体
Days/YYYY-MM-DD/apps.md 時系列の記録。いつ・どのアプリで何が画面に出ていたか。アプリが公開していればファイルパスやURLも一緒に 根拠が要るエージェント、grep、自分
Days/YYYY-MM-DD/websites.md 訪問の表。ドメイン・タイトル・滞在時間・訪問回数・初回と最終。本文は入れない 一日の輪郭を粗く掴みたいとき
Days/YYYY-MM-DD/messages.md メールとチャットの本文。時系列から分離して置く 本文をプロンプトから外したいとき

メール・チャットを別ファイルに追い出す設計は、実際に使う側から見ると効く。src-tauri/src/route.rs には MESSAGE_APPS・MESSAGE_URLS・BROWSERS の3つの定数表があり、アプリ名とURLのホストから「これはメッセージだ」と判定して messages.md に回している。日次ノートを作るときに messages.md だけ外せば、機微な本文をモデルに渡さずに済む。

加工後は KB/YYYY-MM-DD/ に people・commitments・threads・products・issues・reading の6ファイルと manifest、Summaries/YYYY-MM-DD.md に日次ノートが並ぶ。知識ベースの各行には時刻レンジの引用が付き、保存前に記録側と突き合わせる検証が入る(src-tauri/src/cite.rs の citation_in_spans が、引用した時刻が実在するブロックの範囲内かを確かめている)。

従来の手で貼る文脈とAmbient Contextの比較。従来はメールとチケットを都度コピペ、会議は記憶から要約、根拠のリンクが残らない。Ambient Contextはapps.md/websites.md/messages.mdに追記済み、知識ベースは全行に時刻レンジの引用、file:/url:参照をブロックごとに保持、list_daysで過去日をそのまま読める
出典: READMEの What Ambient Context does と src-tauri/src/cite.rs を突き合わせて作図

何を実測したか:v1.1.2をクローンしてテストまで動かす

READMEの数字をそのまま書かないために、リポジトリを浅くクローンして手元で確かめた。まず取得とビルド依存の導入まで。

git clone --depth 1 https://github.com/dragthelake/ambient-context
cd ambient-context
npm install

package.json の version は 1.1.2、タグは v1.0.0・v1.0.1・v1.1.0・v1.1.1・v1.1.2 の5本で、main の最新コミットは 2026-09-07 の 2cf41ef。つまりタグと main の間に差分は無く、v1.1.2 が現物だった。LICENSE の実体は MIT License / Copyright (c) 2026 Cameron Smith で、READMEの表記と一致する。

次に、READMEの Tests 節にあるフロントエンド側のコマンドをそのまま実行した。

npx tsc --noEmit && npx vitest run
#  Test Files  16 passed (16)
#       Tests  114 passed (114)
#    Duration  8.97s

型検査は無警告で通り、テストは16ファイル・114件が全て通った。ここはLinuxコンテナでも問題なく再現できる。

一方、Rust側の cd src-tauri && cargo test はLinuxでは通らない。Tauri 2のLinuxターゲットがGTK系のシステムライブラリを要求するためで、#[test] が492個あるのを数えることはできても、実行はmacOSかGTK入りの環境が要る。

cd src-tauri && cargo test
# The system library `gdk-3.0` required by crate `gdk-sys` was not found.
# error: failed to run custom build command for `gdk-sys`

したがって本記事では、Rust側のテスト結果は未検証として扱う。同じ理由でアプリ本体の起動・実際のキャプチャ動作も未検証で、macOS 14以降のApple Silicon機が要る。検証できたのは、ソースと設定ファイルから読み取れる事実と、フロントエンド側のテストまでだ。

検証環境:Linux 6.18.44/Node 22.22.2/npm 10.9.7/cargo 1.94.1/2026-09-25。リポジトリは main の 2cf41ef(2026-09-07)=タグ v1.1.2 を git clone --depth 1。npm install・npx tsc --noEmit・npx vitest run は実行して全通し(16ファイル114件・8.97秒)。tools/list は src-tauri/src/mcp/tools.rs の defs() とスキーマ生成ヘルパから応答JSONを再構成して計測。未検証:アプリ本体を一度も起動していない。macOS 14以降のApple Silicon専用のため、実際のキャプチャ・知識ベース生成・MCPサーバーとしての応答・同梱スキルの動作はいずれも未実行。cargo test はLinuxで gdk-3.0 が無く失敗したため、Rust側492件のテスト結果も未検証。star 195・fork 10 はGitHubリポジトリページの表示値。READMEの「ノイズ除去で行数が約5分の1減った」は元データが同梱されておらず再現不可。

Ambient Contextの実測データ。GitHub star 195・fork 10、MCPツール20本のうち読み取り専用10本、Rust側の#[test]は492個、フロント側テストは16ファイル114件が全通過
star/fork はGitHubのリポジトリページ、その他はクローンしたv1.1.2で実測(2026-09-25)

なおREADMEには「実際の2日分のキャプチャでノイズ除去が行数を約5分の1減らした」という記述があるが、この計測に使った元データはリポジトリに含まれていない。再現できないため、本記事ではこの数値を引用せず未検証として扱う。

記録の作られ方:5秒ポーリング・ブロック化・2種類の重複排除

「数秒おきに画面を読む」と聞いて心配になるのは、同じ文字が何百回も書き込まれることだ。ここは実装で手当てされている。

ポーリング間隔は settings.rs の interval_secs で、既定は5秒。同ファイルの既定値には min_dwell_secs: 10(10秒未満の滞在は捨てる)と similarity_threshold: 0.5 も並ぶ。

読み取った内容は「ブロック」という単位にまとめられる。src-tauri/src/segment.rs の Segmenter は、アプリが変わる・ウィンドウタイトルが変わる・内容の類似度が閾値を下回る、のいずれかでブロックを閉じる。類似度は空白区切りトークンのJaccard係数で、既定0.5を下回ると「別の作業に移った」と判定する。

重複排除は2種類ある。ひとつは完全一致で、同じ行は同じブロックに二度入らない。もうひとつが面白くて、数字の多い行だけ骨格(skeleton)で重複排除する。prune.rs の skeleton() が行中の数字を潰したものをキーにするので、カウンタやタイマーのように数字だけが動く行は、刻むたびに増えず1回で済む。

インターフェース由来のノイズは、prune.rs の正規表現で落ちる。数字と記号だけの行、1.2K 形式、312 views・45 points・12 comments のような「数値+単位語」、8 minutes ago、3 min、1 hour of 2 hours といった再生位置——いずれも本文ではないので落としている。

flowchart TD A["前面ウィンドウを読む
既定5秒間隔"] --> B{"除外対象か
アプリ名・タイトル"} B -- "はい" --> X["スナップショットごと破棄"] B -- "いいえ" --> C["行ごとに秘密情報を
[redacted] へ"] C --> D{"開いているブロックと
同じ作業か"} D -- "類似度 0.5 以上" --> E["同じブロックに追記
完全一致と骨格で重複排除"] D -- "下回る" --> F["ブロックを閉じる"] F --> G{"滞在 10 秒以上か"} G -- "はい" --> H["apps.md / websites.md
messages.md へ追記"] G -- "いいえ" --> X E --> H

この作りは、あとでモデルに読ませることを前提にしている。生の画面テキストは繰り返しとUI部品で膨らむので、書き込む前に削っておかないと、1日の記録がそのまま入力コストになる。

プライバシー:書き込み前に4段、外向きの通信先は1つ

常時記録ツールで最初に確かめるべきは「何が記録されないか」と「どこに送られるか」だ。両方ともコードで追える。

書き込み前の4段の除外。1.読む前:セキュア入力欄はOSの段階で対象外・ロック中は取得しない。2.スナップショット単位:パスワードマネージャ10種・プライベートウィンドウ3表記は丸ごと破棄。3.行単位:AWSキー・sk/pk/rk・bearer・ラベル付き秘密・カード桁の5正規表現を[redacted]へ。4.ユーザー規則:アプリ除外・見出しのみ・追加の正規表現を画面から追加
出典: src-tauri/src/redact.rs(EXCLUDED_APPS 10件・PRIVATE_WINDOW_MARKERS 3件・patterns() 5本)を実測して作図

src-tauri/src/redact.rs は短いファイルで、全部読める。丸ごと捨てる対象は定数 EXCLUDED_APPS に並ぶ10種のパスワードマネージャ(1Password・Bitwarden・Dashlane・Enpass・KeePassXC・Keychain Access・LastPass・NordPass・Proton Pass・Strongbox)で、アプリ名の部分一致・大小文字無視で判定する。PRIVATE_WINDOW_MARKERS は private browsing・incognito・inprivate の3語で、ウィンドウタイトルにこれが含まれればスナップショットごと破棄される。

ソースのコメントが正直で、この設計の弱点も書いてある。ブラウザは除外リストに入れられないので、通常ウィンドウで開いた銀行・医療・メールは記録に入る。公式の docs/privacy-and-security.md も Known gaps でこれを明記している。

行単位の除去は5本の正規表現で、AWSアクセスキー(AKIA + 16文字)、sk-/pk-/rk- 形式の秘密鍵、bearer に続くトークン、api_key:・secret=・password: のようなラベル付きの値、13〜19桁のカード形状の数字を [redacted] に置き換える。ユーザー側で正規表現を足すこともでき、validate_extra が不正なパターンを弾く。

通信先は実測した方が早い。src-tauri/Cargo.toml の依存に HTTP クライアントのクレートは無く、入っているのは tauri 本体と各プラグイン、serde・sha2・chrono・plist・regex・swift-rs だけだ。外向きのURLは src-tauri/tauri.conf.json の updater 設定にある1本、

https://github.com/dragthelake/ambient-context/releases/latest/download/latest.json

だけで、しかも minisign の公開鍵が同梱されていて署名検証が効く。minimumSystemVersion は 14.0、hardenedRuntime は true。「アカウントもサーバーもテレメトリも無い」というREADMEの主張は、少なくとも依存関係と設定ファイルの範囲では裏が取れた。

ただし注意点がある。アプリが送らなくても、エージェントCLIは送る。知識ベースと日次ノートを作る工程は、記録をClaude CodeやCodexに丸ごと渡す処理だ。記録フォルダの中身がモデルに渡ることそのものは設計の前提なので、「ローカルで完結する」とは読み違えないほうがいい。公式ドキュメントもこれを別の信頼境界として扱っている。

Ambient ContextのMCP 20ツールと常駐コスト:読ませ方は3通りある

バイナリはそのままMCPサーバーとしても起動する。Claude Codeへの登録は README にある claude mcp add --scope user --transport stdio ambient-context -- "/Applications/Ambient Context.app/Contents/MacOS/ambient-context" mcp の形(macOS実機が要るため本記事では未検証)。

ツールの本数は src-tauri/src/mcp/tools.rs の defs() を数えて20本。内訳は注釈まで読める。

種別 ツール 本数
読み取り(readOnlyHint: true) capture_status・list_days・read_day・read_summary・read_kb・search_record・read_ledger・list_rules・get_prompt・get_config 10
状態を変える(破壊的注釈あり) summarise_day・ingest_day・update_rule・remove_rule・set_prompt・set_config 6
その他の書き込み start_capture・stop_capture・add_rule・open_day 4

常駐コストも測った。tools.rs のツール定義とスキーマ生成ヘルパをたどって tools/list の応答を再構成すると、圧縮なしのJSONで14,976バイト、約3,744トークンになる(トークナイザは tools/token_audit.py の heuristic 近似=ASCII 4文字=1トークン。Anthropic系の実トークナイザとは数%ずれる)。Notion MCPの21,831トークンやdraw.io MCPの24,665トークンと比べれば、Blender MCPとは|25ツール6,480トークンとテレメトリ既定ONを実測で確かめるで見た水準よりさらに軽い部類だ。

エージェント側に常駐するコスト。tools/list(20ツール)は14,976バイトを再構成して約3,744トークン、同梱プロンプト4本が約2,865トークン、同梱スキル5本が約2,591トークン
tools/list はソース定義から再構成して計測。トークナイザは tools/token_audit.py の heuristic 近似(ASCII 4字=1)

読ませ方は3通りあり、前提が違う。

方式 アプリ起動の要否 常駐コスト(heuristic近似) 向いている場面
MCPサーバーとして登録 読み取り系は不要/状態を変える操作は要起動 約3,744トークン エージェントに検索・要約の再実行まで任せたいとき
フォルダを直接読ませる 不要 0(同梱の AGENTS.md が形式を説明する) 記録を読むだけでよいとき
同梱スキル5本を導入 MCP経由で使う前提 約2,591トークン(MCP分に加算) 「昨日の続き」「今日のstandup」を定型で呼びたいとき

同梱スキルは skills/ に5本(ambient-context、catch-me-up、standup、tune-rules、weekly-review)。設定画面から ~/.claude/skills/ と ~/.agents/skills/ へ入れる方式で、Claude Code・Cursor・Codex・Zed・Copilot・Gemini CLI・Goose・OpenCode が読む場所に合わせてある。この「1本のスキルを複数ツールへ配る」構図はskills-hubとは|Agent Skillsを47ツールへ同期するデスクトップアプリを実測やskills.shとは|npx skills add がディスクに何を書くかを実測で扱ったものと同じで、導入前に「どのファイルが増えるか」を見ておくと後で困らない。

書き込み系の操作は必ず起動中のアプリを通り、その日の台帳(ledger)にクライアント名付きで記録される。ledger.rs の Trigger::Mcp { client } が mcp: Claude Code のような行を残すので、後から「この設定変更は誰がやったか」を追える。エージェントに設定変更を任せる種類のツールでは、これがあるかどうかで安心感がだいぶ違う。

加工に使うモデルの既定は claude-opus-5、選択肢は claude-fable-5-1・claude-opus-5・claude-sonnet-5・claude-haiku-4-5 の4つ。長い入力(その日の記録)を安いモデルに、読む側のノートを強いモデルに、と分けられる。Haiku 4.5 だけ --effort を付けない分岐が入っていて、モデル側の仕様に追随している点は好感が持てる。常駐アプリをメニューバーに置いてClaude Codeの状態を見る発想自体はCodenotchとは|Claude Code・Cursor・Codexの利用上限を画面端に常時表示するとも重なる。

導入前に知っておくこと:既知の限界とライセンスの粒度

READMEの Known limits は正直に書かれているが、こちらでも補足できる点がある。

・Chromium/Electron系は初回が薄い:Chrome・Slack・VS Code・Obsidian・Figma はアクセシビリティツリーを初回アクセス時に組み立てるため、最初の数秒はテキストが取れず、後続のポーリングで埋まる
・GPU描画のターミナルはほぼ取れない:Kitty・Alacritty は文字を公開しない。Terminal.app と iTerm2 は取れる
・Windowsは未実装:reader/windows.rs は22行のスタブで snapshot() が None を返す。コメントに後のリリースで実装すると書かれている
・1日の入力には上限がある:ingest_max_chars の既定は400,000字(heuristic 近似で約10万トークン)。これを超える日は切られる
・さかのぼれるのは7日:jobs.rs の MAX_BACKFILL_DAYS が7で、溜まった未処理日をまとめて処理するときは直近7日分に絞られる

ライセンスは粒度を分けて見る必要がある。リポジトリ直下の LICENSE は MIT だが、同梱スキル5本の SKILL.md は frontmatter で license: Apache-2.0 を宣言しており、src/assets/fonts/ の Funnel フォントは SIL OFL(OFL.txt が同梱)だ。README は「MIT。同梱の Funnel フォントは SIL OFL」とだけ書いているので、スキルのApache-2.0表記は README からは読み取れない。再配布するなら3つとも確認したほうがいい。

日本語環境の話も一点。本アプリはアクセシビリティツリーからテキストを読むだけなので、日本語のアプリ・日本語のWebページでも仕組み上は同じように動くはずだが、実機がないため未検証とする。日本語での利用感については、kawarimidoll.com の紹介記事が個人の使用記として公開されている(当方の実行環境から同ドメインへ到達できなかったため、本記事では内容を引用していない)。

記録側を直す、という選択肢。 Ambient Context は「AIに文脈を渡す」問題を、プロンプト側ではなく記録側で解こうとしている。毎日3ファイルのMarkdownが自分のディスクに増え、それをエージェントが読む。アプリはモデルを呼ばず、外向きの通信は更新確認の1本だけで、除外は書き込み前に4段入る。MITで全部読めるので、主張はコードで確かめられる——実際、この記事の数字はほぼ全部ソースから取った。

一方で、macOS 14以降のApple Silicon専用、Rust側のテストとアプリの実動作はLinuxからは確認できない、加工を任せるCLIには記録が丸ごと渡る、という条件は動かない。常時記録を許すかどうかは好みではなくリスク判断なので、docs/privacy-and-security.md の Known gaps を読んでから決めるのが筋だと思う。

参照ソース

・dragthelake/ambient-context(公式リポジトリ) — README・ソース・src-tauri/tauri.conf.json・LICENSE を 2026-09-25 に確認
・Privacy and security(公式ドキュメント) — 信頼境界・データ目録・Known gaps
・MCP clients(公式ドキュメント) — Claude Code・Claude Desktop・Cursor・Zed への登録手順
・Agent skills(公式ドキュメント) — 同梱スキル5本の導入先
・kawarimidoll.com の紹介記事 — 日本語の個人使用記(本記事執筆環境からは到達できず、内容は未引用)