← Works
AlarmBridge のアイコン

AlarmBridge

AIがiPhoneのアラームを管理できるようなMCPサーバーを作成し、人間が通常の感覚でアラーム設定できるiOSアプリも用意しました。
消音モードや集中モードも貫通して鳴ります。

SwiftAlarmKitMCPCloudflare WorkersD1 · KVAPNsiOSiOSアプリ+サーバー

AIに予定の相談をしていると、「じゃあ明日は6:30に起こして」とそのまま頼みたくなります。ところがiPhone標準の時計アプリのアラームは、外から安定して読み書きする手段を持ちません。そこで、AIから操作できる自分用のアラームアプリと、その接続を実現するための小さなサーバーを設置しました。

何ができるか

MCPサーバーを登録したAIに話しかけるだけで、アラームの追加・変更・削除ができます。毎週の繰り返しや日付の指定に加えて、「この日だけ鳴らさない」という指定もできます。

明日は6:30に起こして。
あと、金曜だけは平日のアラームを鳴らさないで。
Claude 「起床」を6:30で追加しました。
金曜(11/13)の回だけ無効にしています。
イメージ図会話から、アラームの登録と「この回だけ鳴らさない」までをAIが行います。消音・集中モード中でも、システムのアラームと同じように鳴ります。

アラームはiOSのAlarmKitで鳴らすので、システムのアラームと同じように、消音モードや集中モードの間でも鳴ります。AIが何かを変えると、何を変えたかが通知で届きます(通知の音は鳴りません)。

以下に示すのは実際のアプリ画面です。AIが作ったアラームには「AI」の印が付き、「アラーム」タブでは一覧で、「予定」タブでは将来のアラームイベント予定を日ごとに確認できます。

アラームタブ。起床・ゴミ出し・ジム・新幹線に乗るの4つのアラームが並び、それぞれに AI の印が付いているアラーム
予定タブ。明日からの予定が日ごとに並んでいる予定(14日間)
iOSシミュレーターで撮影。アラームは、AIと同じようにMCPのツールから作成しています。

しくみ

AIとiPhoneを直接つなぐことはできないので、あいだに「Alarm Hub」という小さなサーバーを置いています。HubはCloudflare Workersの無料プランで動き、アラームのデータはD1とKVに保存します。

AIエージェントはMCPでAlarm Hubに話し、HubはAPNsでiPhoneに合図を送り、iPhoneはHTTPSで差分を受け取ってAlarmKitに反映する AIエージェント Claude ChatGPT MCP HTTP + OAuth 2.1 Alarm Hub Cloudflare Workers D1 KV アラームの 「望ましい状態」を持つ APNs 同期の合図だけ HTTPS 差分の受け渡し AlarmBridge iPhoneアプリ AlarmKit 消音・集中モード でも鳴る アプリを終了していても通知拡張が同期
AIはHubにだけ話します。HubはiPhoneに「同期して」と合図し、iPhoneが自分から差分を取りに来ます。

AIはMCPでHubにだけ話しかけます。Hubはアラームの「望ましい状態」を記録したら、APNsの通知でiPhoneに「同期して」と合図を送ります。合図を受けたiPhoneは、自分からHTTPSでHubに差分を取りに行き、AlarmKitに反映します。アプリを完全に終了していても、通知拡張(Notification Service Extension)がこの同期を行います。

9AIが使えるMCPツール
0円Cloudflare Workersの無料プランで動く
5分ごとにHubが反映を見回る
366日先まで、日付を指定して鳴らせる

ずれない同期

通知は届かないことも、重複して届くこともあります。そのたびに状態がずれないよう、Hubは「どうあるべきか」だけを持ち、iPhoneから届いた実際の状態と比べて、差分を登録・取り消しの操作として返す方式にしています。

Hubの望ましい状態とiPhoneの実際の状態を比べ、差分だけを登録や取り消しの操作としてiPhoneに返す Hub:望ましい状態 06:30 起床 平日 19:00 ジム 火木 iPhone:実際の状態 06:30 起床 平日 (まだない) 差分 を計算 操作:「ジム」を登録
Hubは「どうあるべきか」だけを持ち、iPhoneから届いた実際の状態との差分を、登録・取り消しの操作として返します。

この方式なら、合図をひとつ取りこぼしても、次に同期したときに必ずそろいます。同期は、通知を受けたとき、アプリを開いたとき、ショートカット「AlarmBridge: アラームを同期」を実行したときに行われます。

それでも反映されない変更が残っているときは、Hubが5分ごとに見回って、間隔を広げながら合図を送り直します。

  1. 2分後
  2. 5分
  3. 10分
  4. 30分
  5. 1時間
  6. 3時間
iPhoneのアラーム設定に反映されていない変更があると、間隔を広げながら合図を送り直します。3回届かなければ「AlarmBridgeを開いてください」と知らせます。また、30分以内に鳴る予定のアラームがiPhoneに未反映のときも知らせます。

予定と「この回だけ無効化」設定

アプリの「予定」タブでは、今後14日間に鳴る予定を日ごとに確認できます。「月」に切り替えると、それ以降の予定もカレンダーで確認できます。
特定の予定だけをスワイプで無効にできます。(同じことはAIからもできます。)

予定タブ。11月13日(金)の起床だけが取り消し線付きで「無効」と表示されている11月13日(金)の回だけ無効
「金曜だけ鳴らさないで」と頼んだあとの「予定」タブ。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_sync

iPhoneに同期をやり直させる

次の作品PerAppAudio