context について
Cortland は、AI エージェントから Mac アプリや個人データを扱うためのローカル優先 MCP サーバースイートです。メール、カレンダー、リマインダー、メモ、コンテキストのツールを備え、ドライランを既定とし、人による承認とローカル監査ログで操作を管理します。
主な機能
- 01Mail、Calendar、Reminders、Notes のツール
- 02重要な操作は事前プレビューと承認が必要
- 03ツールの活動をローカル監査ログに記録
- 04コンテキスト層は本文でなくメタデータへのポインターを保存
- 05iMessage ブリッジと所有者への通知
活用シーン
- 01特定の話題に関するメールを検索
- 02ブリーフィングでカレンダーやメールのメタデータを確認
- 03承認を経てリマインダーやメモを作成
- 04無人のエージェントから通知を受信
MCP 対応
Cortland は stdio 経由で Cursor、Claude Code、Claude Desktop、Codex、LM Studio などの MCP クライアントにツールを提供します。読み取りは承認不要で、重要な書き込みは事前プレビューまたは人の承認を経て実行されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Cortland 🍎
エージェントが頭脳を持ち込み、Cortlandが手と、人間によるゲートを提供します。
AIにMac上の実データ(メール、カレンダー、リマインダー、メモ、ファイル)へのアクセスを与えつつ、鍵は渡さずに済みます。重要な操作はすべて事前にプレビューされ、モデルが触れられないチャネルを通じてあなたの承認を待ち、ログに記録され、取り消すこともできます。
Cortlandには独自のモデルも、クラウドも、ウェブアクセスもありません。それが重要なのです。すでに使っているエージェントがClaude、Codex、Cursorでも、マシンから出ることのないローカルのGemmaでも、実データにアクセスし、あなたに連絡するための、適切に管理された方法を得られます。
使用例
あるエージェントが数日間、小売店のページをいくつか監視し、限定生産のコントローラーが再入荷するのを待っていました。ついに再入荷したとき、私はデスクから遠く離れた時間だったにもかかわらず、スマートフォンにiMessageが届きました。私はそれを購入しました。
Cortlandはウェブサイトに一切触れていません。 ウェブ取得ツールはなく、これまでもありません。監視を行ったのは、インターネットにアクセスできるコーディングエージェントです。私に連絡したのがCortlandです。私自身のMac上で、Messagesを通じて、宛先をローカル設定で固定していたため、エージェントが生成した内容によって、そのメッセージをほかの誰かに送ることはできませんでした。
この役割分担が、このプロジェクトの売りを一つの物語で示しています。エージェントには推論能力とインターネットがあります。CortlandにはあなたのMac、Appleのアプリ、そしてあなたの注意があります。そして外部への操作はすべて、実行前に確認を求めます。
伝える価値のある部分
最初のバージョンには抜け道がありました。それに気づいたのは、自分の監査ログを読んだときでした。
人間に連絡するための、ガバナンスの効いた「通知」ツールは存在しませんでした。iMessageブリッジは私からのメッセージに返信できましたが、会話を始める方法はありませんでした。そのため監視プログラムはCortlandの送信モジュールを直接インポートして呼び出していました。動作はしましたし、実際に送信したのはCortlandでした。設定ファイルの同じ所有者ハンドル、同じAppleScriptのエスケープ処理、同じ時間あたりの上限を使っていました。しかし、フレームワークを通さずに迂回していたため、何日間動かしても監査行はゼロ件でした。
これは、このプロジェクトが自らのテストに失敗したということです。正規の経路で実行できない保証は、人々が迂回する保証です。そして迂回したのは、その保証を書いた本人でした。
その修正がnotify_ownerです。書き込みに安全です。あなたへのメッセージは外部への操作ではなく、レビューのループそのものだからです。宛先の引数は一切なく、ハンドルはローカル設定から取得されるため、モデルの出力や注入されたコンテンツによって宛先を変更することはできません。時間あたりの上限はメモリではなく監査ログから計算されるため、実行のたびに新たに起動するcronジョブでも上限を超えられません。通知を送信すると、今度は記録が残ります。これは実際の記録です。自分のスマートフォンにテストメッセージを送信した後、監査DBからコピーしました。
notify_owner | Messages | write-safe | undo=none | dry_run=0 | ok
principal: cli:notify tool_version: 0.2.0
args: {"text":{"redacted":true,"length":84,"sha256":"3e389e33…"},
"source":"cortland-test"}
本文は長さとハッシュとして保存されます。つまり、この行はメッセージが送信されたことを証明しながら、内容は保持しません。sourceはラベルであり、スラッグに制限され、誰かが自由に作成できるコンテンツではないため、読み取れる状態のままです。
使用時の様子
連絡先のようにメッセージを送ります — 8 GB の MacBook Air 上で、4 GB のモデルがブリッジに応答します。Mac の外に出るものはありません。
You: Add a reminder to call the vet tomorrow at 2pm
Cortland: Received — working on it…
Cortland: Added "Call vet" for tomorrow, Aug 3 at 2:00 PM.
メッセージインターフェースを使うには、Mac の Messages にだけサインインする2 つ目の Apple IDが必要です。これは窓口であり、処理を行うものではありません。メール、カレンダー、データは一切持ちません。通常の連絡先と同じようにスマートフォンからメッセージを送ります。Mac は引き続き、あなたとして作業します。システムの iCloud はそのままです。Claude Code、Cursor、Codex、その他の MCP クライアントでは、この手順は不要です。同じツールと stdio 経由で通信します。
今週の予定を尋ねます — 読み取りは無料で、承認も不要です。
You: Anything from the school this week?
Cortland: Three emails from Lincoln Elementary. Two are the weekly
newsletter; one from Ms. Alvarez on Tuesday asks for a
permission slip by Friday.
変更を依頼します — 書き込みは毎回いったん停止し、確認を求めます。
このプロンプトのコードはフレームワークによって生成され、モデルのコンテキストには入りません。そのため、完全にプロンプトインジェクションされたモデルでさえ、あなたの承認を偽造できません。メッセージを無視すると、操作は期限切れとなり、拒否されます。
できることを尋ねます — 実際にインストールされているツールをもとに回答するため、できることを誇張できません。
You: what can you do?
Cortland: Here's what I can do with your Mac:
• Calendar: list, look up, create, delete
• Mail: search, read, follow threads, draft, send (asks first), flag, file
• Notes: search, read, create, add to
• Reminders: list, search, create, tick off, delete
Anything that deletes or changes things asks you first — I text
you a code and wait for "yes <code>". Reads just happen.
Claude Code または Claude Desktop では、同じツールをそのまま利用できます。
あなた: Alvarez さんに、書類は木曜日に届くと返信して
Claude: [メールを検索し、スレッドを読みます] Personal アカウントから [email protected] に送信できます。通常の方法で承認してください。
mail_send は書き込みが制限されています。ライブモードでは、操作ごとに人間の承認が必要です。トークンを盗まれても、できるのは依頼することだけです。
要件
macOS 専用です。ここにあるものは Windows や Linux では動作しません。ツールは Automation 経由で Apple のアプリと通信します。
| 最小要件 | 推奨 | |
|---|---|---|
| OS | macOS 13 Ventura | macOS 15 以降 |
| Mac | Ventura が動作する Mac(Intel でも Cursor/Claude を実行できます) | Apple Silicon(M1 以降) |
| Node | 20 LTS(node -v) | 22 |
| ツールチェーン | Xcode Command Line Tools(xcode-select -p) | 同じ — better-sqlite3 はネイティブコードをコンパイルします |
| クライアント | MCP アプリを 1 つ:Cursor、Claude Code、Claude Desktop、Codex、または LM Studio | メッセージを送信する場合は Ollama も必要 |
| RAM | 8 GB(クラウド/Cursor モデル、または Gemma 4 E2B) | より大きなローカルモデルには 16 GB 以上 |
| ディスク | このリポジトリのビルドに約 500 MB | gemma4:e2b-it-qat を取得する場合はさらに 6 GB |
| Apple アプリ | 操作したいアプリに、あなたとしてサインイン済みであること | 最初に使う組み合わせは通常、Mail + Reminders |
iMessage ブリッジのみ: macOS 13 以降(新しい chat.db)、Node を実行するプロセスへのフルディスクアクセス、Automation → Messages、および Messages.app にサインインした2 つ目の Apple IDが必要です。システム設定にはサインインしないでください。SETUP.md §5.1 を参照してください。
クライアントとして Osaurus を使う場合: Apple Silicon、macOS 15.5 以降。
不要なもの:開発者アカウント、Path A 用の iCloud、API キー。
クイックスタート
「メールを検索してくれた」までの最短ルート — Cursor(または Claude Code)を頭脳として使います。2 つ目の Apple ID も Ollama も不要です。
xcode-select --install # if `xcode-select -p` fails
git clone https://github.com/cortland-suite/cortland.git
cd cortland
npm install && npm run build # first install compiles sqlite — a minute
次に、Cursor Settings → MCP で、node が packages/mail/dist/server.js を指すようにサーバーを追加します(必要に応じて reminders/notes/calendar も追加します)。絶対パスを指定してください。JSON は docs/08_local_models.md にあります。
「今週、学校から来たメールがないか検索して」と尋ねます。macOS にAutomation(Cursor → Mail)の許可を求められたら、許可してください。
~/Library/Application Support/cortland/config.json で "live": true に設定するまでは、書き込みはプレビューのままです。設定したあとも、送信/削除のたびに確認を求められます。
スマートフォンからメッセージを送る場合は、もう少し手順が必要です(2 つ目の Apple ID + Ollama)。 SETUP.md は手順の一覧、docs/08 は図解版です。
存在する理由
個人データを扱う MCP サーバーの多くは、AppleScript を呼び出すだけの薄いラッパーです。
delete_email や send_message は、モデルが呼び出した瞬間に実行されます。受信トレイを任せるには不安が残りますし、代替手段も役に立ちません。クラウドアシスタント(Poke、Arlo、Lindy)は、Apple が API を提供していないため、Apple ネイティブのデータにまったくアクセスできません。また、OpenClaw のようなセルフホスト型エージェントは制御されていません(2026 年 1 月に CVSS 8.8 の脆弱性があり、権限ゲートはまだロードマップ上です)。
Cortland はデフォルトを逆転させます。ライブモードを選択していない限り、ツール呼び出しは実行する内容をプレビューし、ライブモードでも、影響の大きい操作はすべてユーザーの承認を待ちます。それを強制するフレームワークは小さなライブラリで、各保証が回避できないことを証明するテストスイートを備えています。スイート内のすべてのツールは、このライブラリを基盤にしています。
保証すること
| デフォルトはドライラン | ゲート付きツールは実行せずにプレビューします。設定エラーが発生した場合は、必ずドライランになるように処理されます。 |
| 人による承認はモデルの外で行う | 承認は、ネイティブダイアログ、ユーザーが移動するファイル、クライアント独自の UI、返信するテキストメッセージのいずれかを通じて行われます。モデルのテキストを介することはありません。 |
| すべてを監査記録に残す | 成功、失敗、ドライラン、拒否、実行見送りは、それぞれローカルの SQLite に 1 行ずつ記録されます。「ツールは実際に何をしたのか?」には、いつでも答えられます。 |
| 登録時に取り消しを強制 | ネイティブな取り消し機能があるとするツールは、書き込み前に取り消し手順を用意しなければなりません。用意できない場合、フレームワークはそのツールを拒否します。 |
| コンテンツは命令ではなくデータ | メール、メモ、メッセージから読み取った内容はすべて、ノンスで区切られたフェンスの中に返されます。 |
| 機能を設けないことで安全を確保 | ゲートなしで送信する機能はありません。参加者を招待する機能もありません。自分以外の会話を読む機能もありません。 |
| ローカルファースト | アカウントも、認証情報も、クラウドもありません。モデルも、マシンも、ディスクも、ユーザー自身のものです。 |
インストール
リポジトリから実行します。
git clone https://github.com/cortland-suite/cortland.git
cd cortland
npm install
npm run build
npx cortland setup
ウィザードは各ステップの前に確認し、実行した内容を記録します。iMessage ブリッジ、権限、モデルの選択を含む詳しい手順は、SETUP.md をご覧ください。Cursor、Codex、LM Studio、Osaurus、Ollama への接続については、docs/08_local_models.md をご覧ください。
パッケージ
| パッケージ | 機能 |
|---|---|
@cortland/governed | フレームワークです。ドライランのデフォルト設定、承認ゲート、監査、来歴、取り消し、インジェクション対策のフェンスを備えています。これを使って、独自のガバナンス付きツールを構築できます。 |
@cortland/mail | Apple Mail:読み取り、検索(2 段階)、スレッド、下書き、送信(書き込みにはゲートが必要)。 |
@cortland/reminders | リマインダー:リスト、検索、作成、完了、削除。ネイティブな取り消し機能付きです。 |
@cortland/notes | メモ:フォルダ、検索、読み取り、作成、追記。 |
@cortland/calendar | カレンダー:期間を指定したクエリ、作成、削除。設計上、招待は送信できません。 |
@cortland/context | ローカルコンテキストレイヤー:メール/カレンダーのメタデータ(ポインターのみで、本文は含みません)、ブリーフィング、人物の検索、修正を取り込むフィードバックループ。 |
@cortland/imessage | 自分専用の AI にテキストメッセージを送信できます。メッセージを送るためだけの 2 つ目の Apple ID を Messages に追加します。設計上、操作できるのは所有者のみです。返信による承認に対応し、無人のエージェントから先に連絡できる notify_owner も備えています。 |
@cortland/folders | フォルダを API として利用します。どのデバイスからでも iCloud にファイルを置くと、宣言済みのローカルパイプラインが実行されます。 |
@cortland/remote | 自分専用のプライベートネットワークを介して、ほかのデバイスからスイートを利用できます。 |
@cortland/setup | オンボーディングウィザードです。 |
モデルは自由に選べます
Cortland はツールです。頭脳となるモデルはあなたが選びます。
パス A。 Cursor、Claude Code、Claude Desktop、Codex、LM Studio、または Osaurus が モデルをホストします。Cortland は MCP プラグインです。2 つ目の Apple ID は不要です。
パス B。 Cortland にメッセージを送ります。Mac の Messages には 2 つ目の Apple ID でサインインします
(メッセージを中継するだけです)。Ollama は Gemma 4 をローカルディスク上で実行します。承認は同じスレッド内で
yes <code> と送信します。
8 GB の M2 で実地検証済みです。gemma4:e2b-it-qat(4.3 GB)は適切にツールを呼び出し、できないことは正直に断ります。小さなモデルほど、統制された契約が
重要になります。
クリーンインストールから始める LM Studio と Osaurus を含む手順: docs/08_local_models.md。クリーンな Mac での手順、 権限、iMessage 用の 2 つ目の Apple ID の設定手順については、SETUP.md をご覧ください。
プライバシーモデル
- コピーではなくポインターです。 コンテキストレイヤーには、メッセージを ID で参照するメタデータが保存されます。本文は保存されません。Mail でメッセージを削除すると、 ポインターは参照先を失い、整理されます。
- モデルの使用はオプトインで、明示されます。 モデルなしでも完全に決定論的に動作します。モデルを設定すると、そのネットワークへのデータ送信先が設定ファイルに明示され、実行のたびに監査ログへ記録されます。
- 外部への情報送信はありません。 唯一の任意の送信呼び出しは、自分で設定するプッシュ通知です。送信するのは情報を含まない固定文字列です。
ドキュメント
- SETUP.md — クリーンな Mac からアシスタントを動作させるまでの手順と、注意点。
- docs/08_local_models.md — Cursor、Codex、 LM Studio、Osaurus、または Ollama の接続方法。図解付きで、初めての方にもわかりやすく説明します。
- SECURITY.md — 報告方法と、対象範囲。
docs/— コンポーネントごとの設計ドキュメント:フレームワークの契約(01)、 Mail(02)、フォルダーを API として使う方法(03)、コンテキストレイヤー(04)、リモートアクセス(05)、 iMessage ブリッジ(06)、脅威モデル/レビューガイド(07)、ローカルモデル(08)。NOTES.md— エンジニアリングログ。日付入りの決定事項、未解決の質問、 現場で得た知見をすべて記録しています。気恥ずかしいものも含みます。
ライセンス
MIT です。LICENSE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。