Agent! ブログへようこそ:ひとつのアプリで、あらゆる AI を使い、Mac を完全に操る
AgentiLoop Agent! とは何か、なぜこういう作りにしたのか、そしてここで何を読めるのかを、ソースコードから直接お伝えします。
こんにちは、Todd です。ネイティブ macOS AI エージェント AgentiLoop Agent! を作っていて、ここはそのブログです。
README やリリースノートには収まりきらない Agent! の話をする場所が欲しかったんです。あるガードレールがなぜその形になっているのか。エージェントループがなぜ自分の仕事をチェックするのか。リリース候補で何が壊れて、どうやって直したのか。ここで読める内容の多くは、コードベースから直接持ってきたものです。それが私の一番よく知っているものだからです。ときどきは、AI エージェントを取り巻くもっと広い世界にも目を向けて、それがあなたの Mac にとってどんな意味を持つのかも考えていきます。
初めての方は、ここから始めてください。この記事を地図だと思ってもらえればと思います。
Agent! とは
Agent! は 100% ネイティブの Swift と SwiftUI で作られています。やりたいことを入力する(あるいは話しかける)と、やり方を説明するのではなく、あなたの Mac 上で実際に作業をこなしてくれます。
- 本物のコードを書きます。 プロジェクトを読み込み、文字列置換方式の diff でファイルを編集し、Xcode でビルドし、エラーを読んで直し、git でコミットします。
- あらゆる Mac アプリを操作します。 アクセシビリティ API に加えて、AppleScript、JXA、51 個の ScriptingBridge アプリブリッジを使います。
- あなたとして、あるいは root としてシェルコマンドを実行します。 SMAppService で登録し、XPC 経由でアクセスする Launch Agent と Launch Daemon を通して動きます。
- 23 の LLM プロバイダーに対応しています。 さらにオンデバイスの Apple Intelligence も。Claude、Codex、OpenAI、Gemini、Grok、Mistral、DeepSeek、Qwen、Z.ai、OpenRouter、Ollama、vLLM、LM Studio などが使えます。
- ちゃんと聞いています。 "Agent!" と呼びかけてからタスクを伝えるか、iPhone から iMessage で送ってください(承認済みの送信者のみ)。
README ではひとことでこうまとめています。Siri は答える。Agent! は動く。
NPM も Electron もなし
ここはよく驚かれるところです。Electron のシェルはありません。Node ランタイムもありません。いつの間にかディスクを食いつぶしていく node_modules フォルダもありません。Agent! が依存している Swift パッケージはすべて私が書いたもので、それぞれ AgentiLoop organization の下にある独立したリポジトリに置いてあります。
| パッケージ | 役割 |
|---|---|
| AgentTools | ツールスキーマ、システムプロンプト、プロバイダー管理 |
| AgentLLM | LLM プロバイダーのプロトコル、型、レジストリ |
| AgentMCP | MCP クライアント(stdio と HTTP) |
| AgentAccess | アクセシビリティによる自動化 |
| AgentEventBridges | 50 以上の Mac アプリ向け ScriptingBridge プロトコル |
| AgentD1F | 複数行 diff エンジン |
| AgentSwift | SwiftSyntax によるコード解析 |
| AgentColorSyntax · AgentTerminalNeo | シンタックスハイライト · レトロなターミナル風 Markdown |
| AgentAudit | os.log による監査ログ |
その結果、メモリはほんの少ししか使わないのに、Xcode の自動化、Swift の構文解析、アクセシビリティ、AppleScript、Safari の自動化、MCP が最初から全部そろったアプリになりました。
中心にあるループ
Agent! のすべては、ひとつの考え方から成り立っています。自己検証型のタスクループ です。モデルが考え、ツールを呼び出し、実際の結果を見て、自分で軌道修正する。これは信頼できてこそ意味があるので、いくつかのルールを最初から組み込んであります。
- ツール呼び出しはごまかせません。 すべての呼び出しは単一のディスパッチャーを通り、実際の出力を返します。モデルが実際にはツールを呼ばずに 「クリックしました」 と言ったら、Agent! はそれを指摘して訂正を送ります。
- 「完了」には証拠が必要です。
goal_stateの基準が、ビルド成功やテスト合格といった証拠つきでチェックされるまで、タスクは自分で完了を名乗れません。 - 編集の前に読む。 モデルがまだ読んでいないファイルや、読んだ後にディスク上で変わったファイル(SHA-256 で確認)への編集は、Agent! が拒否します。拒否するときに最新のファイルをモデルに渡すので、次の試行では正しい行が使われます。
- 何でも元に戻せます。 すべての編集は 1 週間スナップショットとして残ります。1 つのファイルだけロールバックすることも、
rewind_taskでタスク全体を巻き戻すこともできます。
これらは今後の記事で 1 つずつ分解して解説していきます。
AgentScript:フル権限を持つ Swift
AgentScript は、私のお気に入りの部分のひとつです。スクリプトはただの Swift ファイルです。Agent! は SwiftPM で各スクリプトを .dylib にコンパイルし、dlopen でプロセス内にロードします。だからあなたのスクリプトは、Agent! がすでに持っている macOS の権限をそのまま使えます。アクセシビリティ、オートメーション、カレンダー、連絡先、メール、写真などです。必要なのはエントリーポイント 1 つだけ。
import Foundation
import CalendarBridge // any `import XBridge` auto-wires, no Package.swift edits
@_cdecl("script_main")
public func scriptMain() -> Int32 {
print("Hello from AgentScript! 👋")
return 0
}
スクリプトが出力したものはすべてモデルに返り、戻り値が終了ステータスになります。アプリには TodayEvents、NowPlaying、CheckMail、CreateDmg など、約 35 個のサンプルが付属しています。
読んで確かめられる安全性
Agent! は root としてコマンドを実行できます。これはかなりの信頼をお願いすることなので、安全性をプレゼン資料の 1 枚のスライドで済ませるわけにはいきません。安全性はコードであり、GitHub で実際に読めます。ハードコードされた ShellSafetyService が、壊滅的なコマンドを送信される前に拒否し、特権デーモンの側でも同じチェックをもう一度行います。さらに、Jev というオプションのセカンドオピニオンがあり、コマンドがデータを破壊する可能性がどれくらいあるかを評価します。その仕組みは 最初の詳細解説 でじっくり紹介しています。
広がり続けるファミリー
同じエージェントループが、今ではターミナルでも、macOS、Windows、Linux で動きます。同じ機能を持つ CLI が 2 つあって、Rust 製の AgentiLoopCLI と Go 製の AgentiLoopGo です。README の中で私が一番好きな小ネタは、この小さな弟妹たちを Mac 版 Agent! が自分で書いた、という話です。
ここで読めること
- 内部構造: エージェントループ、コンテキスト圧縮、ツールのディスパッチ、サブエージェント、メモリ、プラン。
- セキュリティ: ガードレール、XPC の信頼モデル、そして最近のエージェント関連のインシデントから私たちみんなが学べること。
- 「なぜ」まで伝えるリリースノート: 各ビルドで何が変わったのか、そしてそれを必要にしたバグ。
- ハウツー: AgentScript のレシピ、予算に合わせたプロバイダーの選び方、完全ローカルでの動かし方。
- エージェントを取り巻く広い世界: ニュースやレビューを、いつも「あなたの Mac にとってどういう意味があるか」に引き戻してお届けします。
Agent! は macOS 14.6 以降で、Apple Silicon と Intel の両方で動き、個人利用は無料です。下から入手して、何か本当にやりたいことを任せてみてください。どうだったか、ぜひ教えてくださいね。