オンデバイスAIのmacOSアプリに、JSONだけで拡張できるTool機能を作った
macOS向けのデスクトップペット兼リマインダーアプリ、Mushroomを開発しました。
Mushroomは、デスクトップに住む小さなピクセルアートのきのこです。水分補給やストレッチ、目の休憩などを知らせるほか、Apple Intelligenceを使った会話や、自然言語によるリマインダー作成ができます。
この記事では、機能紹介だけではなく、Mushroomに実装した小さなJSONファイルによるTool拡張と、その安全性の考え方を紹介します。
- 公式サイト:https://www.getmushroom.app/
- Toolギャラリー:https://www.getmushroom.app/tools
オンデバイスで完結する会話機能
Mushroomの会話機能にはApple Intelligenceを利用しています。処理はMac上で完結し、アカウント登録は不要です。会話内容もクラウドへ送信しません。
デスクトップ上で日常的に話しかけるアプリには、仕事や生活に関する情報が入力される可能性があります。そのため、利便性を追加する前に「入力内容を外部へ持ち出さない」という境界を決めました。
自然言語で、たとえば次のように依頼できます。
2時間後にTomへ電話するよう知らせて
Mushroomは依頼を解釈してリマインダーを作成し、時間になると知らせます。英語、ドイツ語、フランス語、スペイン語、日本語に対応しています。
会話を拡張するTool plugins
会話機能をアプリ本体のアップデートだけに依存させず、小さな機能を追加できるようにしたのが「Tool plugins」です。
プラグインの実体はJSONファイルです。ランダムな猫の豆知識を取得するToolは、次の内容だけで動作します。
{
"name": "catFact",
"description": "Fetches a random cat fact. Use when the person asks about cats or wants a fun fact.",
"url": "https://catfact.ninja/fact",
"extract": "fact"
}
各フィールドの役割はシンプルです。
| フィールド | 役割 |
|---|---|
name |
Toolを識別する名前 |
description |
どのような依頼でToolを使うかをAIへ伝える説明 |
url |
呼び出すHTTPS API |
extract |
APIレスポンスから会話へ渡す値 |
このファイルを「Settings → Tools」から読み込むか、Toolsフォルダへ配置すると、きのこに猫の豆知識を聞けるようになります。
なぜコードを実行できるプラグインにしなかったのか
拡張機能を自由にしすぎると、ユーザーは「このファイルを読み込んで大丈夫か」を判断しにくくなります。
そこでMushroomのToolは、次のように機能を制限しています。
- 実行できるのはHTTPSリクエストのみ
- ローカルのプログラムは実行できない
- Mac上のファイルにはアクセスできない
- APIキーなどの個人値はMac上に保持する
- Toolを書き出すときは個人値を除去する
- 同時に有効にできるToolは最大4個
万能なプラグイン基盤を目指すより、一つのJSONに一つの小さな役割を持たせる設計にしました。
制約は少し不便ですが、ファイルを開けば何をするToolなのか確認しやすくなります。共有もしやすく、問題が起きたときの範囲も限定できます。
descriptionを「機能説明」だけにしない
Toolのdescriptionには、機能の説明だけでなく、使う条件まで具体的に書きます。
Use when the person asks about cats or wants a fun fact.
「何ができるか」に加えて「どんな依頼で使うか」を明示すると、会話からToolを選ぶための手がかりになります。
複数の用途を一つの賢いToolに詰め込むより、小さなToolへ分割した方が、説明も出力も予測しやすくなります。また、extractを必須にしてAPIレスポンス全体ではなく、必要な文字列だけを会話へ渡すようにしています。
リマインダー側でも「賢さ」より境界を重視した
Mushroomは、水分補給、ストレッチ、軽食、目の休憩、就寝時間などを知らせます。ただし、単純な一定間隔のタイマーではありません。Macを実際に使っていた時間を考慮し、離席中や静かに過ごしたい時間帯には通知を控えます。
macOSの集中モード中はペットが目立たない状態になり、メニューバーに常駐してDockにはアイコンを出しません。
ここでも、機能を増やすことより「いつ介入しないか」を決めることが重要でした。
まとめ
Mushroomでは、オンデバイスAIを使った会話に、JSONベースの小さなTool機構を組み合わせました。
今回の設計で重視したのは次の3点です。
- 会話内容をMacの外へ持ち出さない
- ToolができることをHTTPSリクエストに限定する
- 一つのToolに一つの小さな役割を持たせる
Toolギャラリーではサンプルを配布しており、自作Toolの投稿も受け付けています。オンデバイスAIや、制約のあるプラグイン設計に興味があれば試してみてください。
動作環境は、macOS 26以降、Apple Silicon、Apple Intelligence有効です。
- Mushroom:https://www.getmushroom.app/
- Tool plugins:https://www.getmushroom.app/tools
- フィードバック:hello@getmushroom.app