AlarmBridge
AIがiPhoneのアラームを管理できるようなMCPサーバーを作成し、人間が通常の感覚でアラーム設定できるiOSアプリも用意しました。
消音モードや集中モードも貫通して鳴ります。
AIに予定の相談をしていると、「じゃあ明日は6:30に起こして」とそのまま頼みたくなります。ところがiPhone標準の時計アプリのアラームは、外から安定して読み書きする手段を持ちません。そこで、AIから操作できる自分用のアラームアプリと、その接続を実現するための小さなサーバーを設置しました。
何ができるか
MCPサーバーを登録したAIに話しかけるだけで、アラームの追加・変更・削除ができます。毎週の繰り返しや日付の指定に加えて、「この日だけ鳴らさない」という指定もできます。
あと、金曜だけは平日のアラームを鳴らさないで。
金曜(11/13)の回だけ無効にしています。
アラームはiOSのAlarmKitで鳴らすので、システムのアラームと同じように、消音モードや集中モードの間でも鳴ります。AIが何かを変えると、何を変えたかが通知で届きます(通知の音は鳴りません)。
以下に示すのは実際のアプリ画面です。AIが作ったアラームには「AI」の印が付き、「アラーム」タブでは一覧で、「予定」タブでは将来のアラームイベント予定を日ごとに確認できます。
アラーム
予定(14日間)しくみ
AIとiPhoneを直接つなぐことはできないので、あいだに「Alarm Hub」という小さなサーバーを置いています。HubはCloudflare Workersの無料プランで動き、アラームのデータはD1とKVに保存します。
AIはMCPでHubにだけ話しかけます。Hubはアラームの「望ましい状態」を記録したら、APNsの通知でiPhoneに「同期して」と合図を送ります。合図を受けたiPhoneは、自分からHTTPSでHubに差分を取りに行き、AlarmKitに反映します。アプリを完全に終了していても、通知拡張(Notification Service Extension)がこの同期を行います。
ずれない同期
通知は届かないことも、重複して届くこともあります。そのたびに状態がずれないよう、Hubは「どうあるべきか」だけを持ち、iPhoneから届いた実際の状態と比べて、差分を登録・取り消しの操作として返す方式にしています。
この方式なら、合図をひとつ取りこぼしても、次に同期したときに必ずそろいます。同期は、通知を受けたとき、アプリを開いたとき、ショートカット「AlarmBridge: アラームを同期」を実行したときに行われます。
それでも反映されない変更が残っているときは、Hubが5分ごとに見回って、間隔を広げながら合図を送り直します。
- 2分後
- 5分
- 10分
- 30分
- 1時間
- 3時間
予定と「この回だけ無効化」設定
アプリの「予定」タブでは、今後14日間に鳴る予定を日ごとに確認できます。「月」に切り替えると、それ以降の予定もカレンダーで確認できます。
特定の予定だけをスワイプで無効にできます。(同じことはAIからもできます。)
11月13日(金)の回だけ無効AlarmKitの繰り返しには「この日だけ除く」という機能がありません。そこで、次の回が無効になっていない曜日だけを登録しておき、無効にした回が過ぎたらその曜日を戻す、という形で実現しています。
人が変えたものは尊重
最後に変えたのがAIか人かを記録。人が手で変えたアラームは、頼まれない限りAIは触りません。
スヌーズを画面に
既定9分。残り時間をロック画面とDynamic Islandに表示します。
旅先でも現地時刻
「時刻+曜日」で登録するので、タイムゾーンが変わっても現地の6:30に鳴ります。
AIに渡している道具
AIから見えるMCPツールは9つです。一覧や作成といった基本の操作のほかに、「鳴る予定を時刻順に並べる」「この回だけ無効化する」「iPhoneに届いたかを確かめる」といったツールを用意しています。ツールの説明には、ユーザーが手で変えたアラームは勝手に書き換えないことや、「明日」「来週の金曜」をiPhoneの現在の日時から解釈することも記載しています。
list_alarms一覧と、iPhoneへの反映状況
create_alarm作成(時刻・曜日・日付・スヌーズ)
update_alarm指定した項目だけ変更
delete_alarm削除
list_occurrences期間内に鳴る予定を時刻順に
skip_occurrenceこの回だけ無効にする
unskip_occurrence無効にした回を戻す
get_command_status変更がiPhoneに届いたかの確認
request_device_synciPhoneに同期をやり直させる