mcpField
C
calendarmcp

calendarmcp

ローカル
github.com/aernouddekker生産性58 週間前に更新

calendarmcp について

calendarmcp は macOS Calendar.app のカレンダーとイベントを管理するローカル MCP サーバーです。AppleScript で設定済みのカレンダーを操作し、API キー、OAuth、クラウドサービスを必要としません。

主な機能

  1. 01カレンダーの一覧表示と管理
  2. 02イベントの検索と取得
  3. 03イベントの作成、更新、削除、移動
  4. 04参加者とアラームの管理
  5. 05Calendar.app の表示切り替え

活用シーン

  1. 01日付範囲を指定してイベントを検索
  2. 02カレンダーイベントを作成または修正
  3. 03参加者やイベントアラームを追加

MCP 対応

stdio でローカルに動作し、Calendar.app のカレンダーとイベントを操作するツールを MCP クライアントに提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"aernouddekker-calendarmcp": {
"command": "npx",
"args": [
"-y",
"@aernoud/calendarmcp"
]
}
}
}
起動コマンドnpx -y @aernoud/calendarmcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@aernoud/calendarmcp0.2.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

macos-mcp

macOS ネイティブアプリ向けの MCP サーバーです。Claude Code、Claude Desktop、およびあらゆる MCP クライアントから、Mail、Numbers、Contacts、Calendar、Reminders、FaceTime/電話にネイティブアクセスできます。

API キー、OAuth、クラウドサービスは不要です。AppleScript と URL スキーム(tel://、facetime://)を介して、macOS アプリと直接通信します。お使いの Mac 上でローカルに動作します。

CUPS 印刷(printmcp)は以前ここにありましたが、シェルラッパーであり AppleScript ブリッジではないため、office-mcp に移動しました。

サーバー

Mail(mailappmcp)— 21 個のツール

Mail.app に設定されているあらゆるメールアカウント(iCloud、Gmail、Outlook、Fastmail など)で動作します。

ツール説明
list-mailboxesすべてのアカウントのメールボックスを未読数とともに一覧表示します
list-accounts設定済みのメールアカウントをメールアドレスと種類とともに一覧表示します
list-signatures利用可能なメール署名を一覧表示します
search-messages件名または送信者でメッセージを検索します(空のクエリではすべて表示します)
read-message指定したメールの全文を読み取ります
get-message-sourceメッセージの RFC822 形式の生ソースを取得します
list-attachmentsメッセージの添付ファイルを名前、MIME タイプ、サイズとともに一覧表示します
save-attachmentメールの添付ファイルをディスクに保存します
compose-messageMail.app に下書きを作成します(送信はしません)。htmlBody によるプレーンテキストまたは HTML の本文と、添付ファイルに対応しています
send-messageメールをすぐに送信します(from、添付ファイル、htmlBody によるプレーンテキストまたは HTML の本文に対応しています)
reply-to-messageメッセージに返信または全員に返信します。正しくスレッド化され、ブランド化された htmlBody または添付ファイルに対応しています
forward-message新しい宛先にメッセージを転送します
redirect-messageメッセージをリダイレクトします(元の送信者を保持します)
move-messagesメッセージをメールボックス間で移動します
delete-messagesMessage-ID でメッセージを削除します
mark-as-readメッセージを既読にします
mark-as-junkメッセージを迷惑メールとしてマーク、または解除します
flag-message色を指定してメッセージにフラグを付ける、または解除します
set-message-colorメッセージリスト内のメッセージの背景色を設定します
check-for-new-mail1 つまたはすべてのアカウントでメールの取得を実行します
extract-email-address「John Doe <[email protected]>」を名前とアドレスに解析します
Numbers(numbersmcp)— 29 個のツール

開いている Numbers スプレッドシートであれば、どれでも操作できます。

ツール説明
list-spreadsheets開いているすべての Numbers 書類を一覧表示します
create-document新しい Numbers 書類を作成します
list-sheets書類内のシートと表を一覧表示します
get-active-sheet現在アクティブなシートを取得します
read-range範囲(例:「A1:C10」)のセル値を読み取ります
read-table表全体を構造化データとして読み取ります
write-cell指定したセルに値を書き込みます
write-range範囲に複数の値を書き込みます
clear-rangeセル範囲の内容と書式を消去します
get-formulaセルの数式を取得します
set-formulaセルに数式を設定します
add-row表に行を追加します
delete-row表から行を削除します
add-column表に列を追加します
delete-column表から列を削除します
resize-row-column行の高さまたは列の幅を設定します
add-sheet書類に新しいシートを追加します
delete-sheet書類からシートを削除します
rename-sheetシートの名前を変更します
add-tableシートに新しい表を追加します
delete-tableシートから表を削除します
rename-table表の名前を変更します
sort-table列を基準に表を並べ替えます
transpose-table表の行と列を入れ替えます
merge-cellsセル範囲を結合します
unmerge-cells結合済みのセルを分割します
set-cell-formatセルの書式(数値、通貨、日付、パーセンテージなど)を設定します
set-cell-styleフォント、色、背景、太字、斜体、配置を設定します
export-documentPDF、Excel、または CSV に書き出します
Contacts(@aernoud/contactsmcp)— 15 個のツール

システムのアドレス帳にアクセスします。Contacts.app に同期されているすべてのアカウントが対象です。

ツール説明
search-contacts名前、メールアドレス、または電話番号で連絡先を検索します
search-by-modification-date指定した日付以降に変更された連絡先を検索します
read-contact連絡先の詳細情報をすべて取得します
get-my-cardユーザー自身の連絡先カードを取得します
get-vcard連絡先を vCard 3.0 テキストとして書き出します
create-contact新しい連絡先を作成します
update-contact連絡先のフィールドを更新します
delete-contact連絡先を削除します
list-groupsすべての連絡先グループを一覧表示します
create-group新しい連絡先グループを作成します
rename-group連絡先グループの名前を変更します
delete-group連絡先グループを削除します
add-to-group連絡先をグループに追加します
remove-from-group連絡先をグループから削除します
list-group-membersグループ内のすべての連絡先を一覧表示します
カレンダー(calendarmcp) — 25 個のツール

Calendar.app で設定されているすべてのカレンダー(iCloud、Google、Exchange、ローカルなど)で使用できます。

ツール説明
list-calendars名前、書き込み可能フラグ、説明を含むすべてのカレンダーを一覧表示します
get-calendar名前を指定して単一のカレンダーのプロパティを取得します(イベント数を含む)
create-calendar新しいカレンダーを作成します
update-calendarカレンダーの名前を変更するか、説明を設定します
delete-calendarCalendar.app ではサポートされていません — 内容を説明するエラーを返します。カレンダーは Calendar.app の UI から削除する必要があります
switch-viewCalendar.app の表示を日/週/月に切り替えます。日付への移動も指定できます
reload-calendarsCalendar.app にアカウントからの更新を強制します
list-events2 つの ISO 日付の間にあるカレンダー内のイベントを一覧表示します
search-events日付範囲内で概要の部分文字列を使ってイベントを検索します(デフォルト:−30 日〜+365 日)。高速化するには対象を単一のカレンダーに絞り込みます
get-eventuid を指定してイベントの詳細をすべて取得します
create-event概要、開始、終了、および任意の場所/説明/URL を指定してイベントを作成します
update-eventuid を指定してイベントの任意のフィールドを更新します
delete-eventuid を指定してイベントを削除します
move-eventイベントを別のカレンダーに移動します(削除して再作成するため、新しい uid になります)
duplicate-eventイベントを同じカレンダーまたは別のカレンダーに複製します
today-events1 つのカレンダーまたはすべてのカレンダーから今日のイベントを一覧表示します
upcoming-events今後 N 日間のイベントを一覧表示します
list-attendeesイベントの参加者を一覧表示します
add-attendeeメールアドレスと任意の表示名を指定して参加者を追加します
remove-attendeeメールアドレスを指定して参加者を削除します
list-alarmsイベントの表示、メール、サウンドのアラームを一覧表示します
add-display-alarmイベント開始の N 分前に表示アラームを追加します
add-sound-alarmイベント開始の N 分前にサウンドアラームを追加します
add-mail-alarmイベント開始の N 分前にメールアラームを追加します
remove-alarmlist-alarms の出力にある 1 から始まるインデックスを指定してアラームを削除します
リマインダー(@aernoud/remindersmcp) — 22 個のツール

Reminders.app で設定されているすべてのリマインダーリスト(iCloud、Exchange、ローカルなど)で使用できます。

ツール説明
list-accountsReminders.app のすべてのアカウントを名前と ID 付きで一覧表示します
list-lists任意で 1 つのアカウントに絞り込み、すべてのリマインダーリストを一覧表示します
get-list単一のリストのプロパティ(ID、アカウント、色、エンブレム、未完了と完了の件数)を取得します
create-list任意で特定のアカウントを指定して新しいリストを作成します
update-listリストの名前を変更します
delete-listリストを削除します(Calendar.app とは異なり、Reminders.app は AppleScript 経由での削除を直接サポートしています)
show-listReminders.app の前面にリストを表示します
list-reminders名前を指定してリスト内のリマインダーを一覧表示します(デフォルトでは完了済みを除外します)
search-reminders名前の部分文字列を使ってリマインダーを検索します。高速化するには対象を単一のリストに絞り込みます
get-reminderID を指定してリマインダーの詳細をすべて取得します
today-reminders1 つのリストまたはすべてのリストから、今日が期限のリマインダーを一覧表示します
upcoming-reminders今後 N 日間が期限のリマインダーを一覧表示します
overdue-reminders期限を過ぎていて、まだ完了していないリマインダーを一覧表示します
create-reminder本文、期限日または終日扱いの期限日、通知日時、優先度、フラグの状態を指定してリマインダーを作成します
update-reminderID を指定してリマインダーの任意のフィールドを更新します
delete-reminderID を指定してリマインダーを削除します
complete-reminderリマインダーを完了済みとしてマークします(Reminders が完了日を自動的に記録します)
uncomplete-reminder以前に完了したリマインダーを未完了としてマークします
move-reminderリマインダーを別のリストに移動します(ネイティブの move 動詞を使い、ID は維持されます)
flag-reminderフラグの状態を設定または解除します
set-priority優先度をなし/高/中/低に設定します(Reminders の 0/1/5/9 の列挙値に対応します)
show-reminderReminders.app を前面に表示し、指定したリマインダーにフォーカスします
FaceTime(facetimemcp)— 3 個のツール

open に URL スキームを渡して通話を開始します。電話をかけるには、Continuity 経由でペアリングされた iPhone が必要です(macOS が iPhone 経由で通話をルーティングできるようにするため)。

ツール説明
call-phoneペアリングされた iPhone 経由で携帯電話に発信します(tel://)
call-facetime-audio電話番号または Apple ID のメールアドレスに FaceTime オーディオ通話を開始します
call-facetime-video電話番号または Apple ID のメールアドレスに FaceTime ビデオ通話を開始します

電話番号は E.164 形式(+15551234567)に正規化され、検証されます。スペース、ハイフン、括弧は使用できます。発信前に macOS の確認プロンプトが表示される場合があります。設計上、完全に無操作で発信する方法はありません。

要件

  • macOS(AppleScript を使用するため、Linux/Windows では動作しません)
  • Node.js 18+

インストール

npm から
npm install -g mailappmcp            # Mail server
npm install -g numbersmcp            # Numbers server
npm install -g @aernoud/contactsmcp  # Contacts server
npm install -g @aernoud/calendarmcp  # Calendar server
npm install -g @aernoud/remindersmcp # Reminders server
npm install -g @aernoud/facetimemcp  # FaceTime / phone calls
ソースから
git clone https://github.com/aernouddekker/macos-mcp.git
cd macos-mcp
npm install
npm run build

設定

Claude Code

~/.claude/settings.json またはプロジェクトの .mcp.json に追加します。

{
  "mcpServers": {
    "mailappmcp":   { "command": "npx", "args": ["-y", "mailappmcp"] },
    "numbersmcp":   { "command": "npx", "args": ["-y", "numbersmcp"] },
    "contactsmcp":  { "command": "npx", "args": ["-y", "@aernoud/contactsmcp"] },
    "calendarmcp":  { "command": "npx", "args": ["-y", "@aernoud/calendarmcp"] },
    "remindersmcp": { "command": "npx", "args": ["-y", "@aernoud/remindersmcp"] },
    "facetimemcp":  { "command": "npx", "args": ["-y", "@aernoud/facetimemcp"] }
  }
}
Claude Desktop / Cowork

~/Library/Application Support/Claude/claude_desktop_config.json に追加します。

{
  "mcpServers": {
    "mailappmcp":   { "command": "npx", "args": ["-y", "mailappmcp"] },
    "numbersmcp":   { "command": "npx", "args": ["-y", "numbersmcp"] },
    "contactsmcp":  { "command": "npx", "args": ["-y", "@aernoud/contactsmcp"] },
    "calendarmcp":  { "command": "npx", "args": ["-y", "@aernoud/calendarmcp"] },
    "remindersmcp": { "command": "npx", "args": ["-y", "@aernoud/remindersmcp"] },
    "facetimemcp":  { "command": "npx", "args": ["-y", "@aernoud/facetimemcp"] }
  }
}

仕組み

各サーバーは stdio 経由でローカルに実行されます。Mail、Numbers、Contacts の各サーバーは AppleScript の文字列を作成し、osascript で実行して、構造化された出力を JSON に解析し直します。Print サーバーは CUPS(lp、lpstat、lpoptions、cancel)を呼び出します。FaceTime サーバーは tel:///facetime:// URL を open に渡します。共有パッケージ(@mailappmcp/shared)は、AppleScript ランナー、汎用コマンドランナー(runCommand)、文字列のエスケープ、区切り文字ベースの解析を提供します。

アプリのライフサイクル — 起動前の状態に戻す

Mail、Calendar、Contacts、Reminders が AppleScript に応答するには、それぞれのアプリが実行中である必要があります。アプリを開いたままにしておく必要がないよう、各サーバーは初回使用時にアプリを自動起動し、使用後に後片付けを行います。

  • アプリを操作する最初のツール呼び出し時に、サーバーは(pgrep を使用して)アプリがすでに実行中かどうかを確認します。実行中でなければ、フォーカスを奪わずにバックグラウンドで(open -g -a を使用して)起動し、ツールを実行する前にアプリが AppleEvents を受け付けるまで最大 5 秒待ちます。
  • **その状態は MCP サーバーの実行中、プロセス内に記憶されます。**同じアプリに対する以降のツール呼び出しでは、確認を省略して起動中のアプリを再利用するため、起動による遅延が繰り返されません。
  • サーバー終了時(SIGTERM/SIGINT/SIGHUP/通常終了。たとえば Claude Desktop がサーバーとの接続を切断したときやチャットが終了したとき)、サーバーは自ら起動したアプリだけを終了します。サーバーの起動前から開いていたアプリはそのまま残ります。
  • 例外的なケースとして、サーバーが強制終了(SIGKILL)された場合、終了ハンドラーは実行できないため、自動起動したアプリは実行中のままになります。サーバーが存在しなかった場合と同じ状態です。

これにより、セッション終了後に中途半端に起動したアプリが多数残る心配をせずにツールを使えます。また、使用中のアプリがサーバーによって終了されることもありません。

安全性
  • compose-message は確認用の下書きを画面に表示します。送信前に内容を確認できます。
  • send-message は独立した明示的な操作です。
  • reply-to-message と forward-message は、デフォルトで下書きモード(sendImmediately: false)です。
  • delete-messages はゴミ箱に移動します(Mail.app の標準動作)。
HTML メール

compose-message と send-message は、任意の htmlBody パラメーターを受け取ります。指定すると、メッセージはリッチテキスト/HTML メッセージとして作成され、受信者にはタグがそのまま表示されるのではなく、書式(見出し、太字、リスト、クリック可能なリンク)がレンダリングされて表示されます。プレーンな内容を読み取るクライアント向けのフォールバックとして、body も引き続き必須です。従来どおりのプレーンテキスト動作にする場合は、htmlBody を省略します。完全な後方互換性があります。

// send-message with HTML body
{
  "to": ["[email protected]"],
  "subject": "Weekly update",
  "body": "Highlights:\n- Shipped feature X\n- Fixed bug Y",
  "htmlBody": "<h2>Highlights</h2><ul><li>Shipped <b>feature X</b></li><li>Fixed bug Y — see <a href=\"https://example.com/issue/42\">#42</a></li></ul>"
}

内部では、compose-message/send-message の HTML 経路に JXA(osascript -l JavaScript)と、送信メッセージに対する Mail.app の実行時 htmlContent セッターを使用します。プレーンテキスト経路では、引き続き通常の AppleScript を使用します。

正しくスレッド化されたブランド付き返信

reply-to-message は htmlBody にも対応しており、ブランド表記があり、かつ正しくスレッド化された返信を作成できます。Mail のスクリプトモデルでは任意の RFC ヘッダーを設定できず、送信する返信のリッチテキストエディタも AppleScript の content プロパティでは書き込みできません。そのため、これまではどちらの方法を単独で使っても両方を実現できませんでした。返信ツールは次の処理を行うようになりました。

  1. Mail のネイティブな reply 動詞を呼び出し、返信を作成して In-Reply-To / References ヘッダーを設定します(これらは本文とは独立したメッセージプロパティです)。次に、
  2. ブランド付き HTML を public.html としてクリップボードに置き、自動引用されたスレッドの上に貼り付けます(Cmd-V)。

この方法では、ブランド表記がインラインで表示され、引用されたスレッドが保持されるうえ、厳密なクライアント(Outlook、Gmail web)が返信をネストするために必要なスレッド化ヘッダーも含まれます。

// reply-to-message with a branded HTML body
{
  "account": "iCloud",
  "mailbox": "INBOX",
  "messageId": "<[email protected]>",
  "body": "Thanks — see below.",       // ignored when htmlBody is set
  "htmlBody": "<p>Thanks for reaching out — here's the update:</p><ul><li><b>Status:</b> shipped</li></ul>"
}

制約:

  • 返信では htmlBody と attachments を併用できません(MIME マルチパート構成中に Mail が HTML を再解析し、レンダリングされた本文が破損します)。両方を渡すと、ツールはエラーを返します。まずブランド付きの返信を送信し、その後、別の返信でファイルを添付してください。
  • htmlBody が指定されている場合、プレーンテキストの body は無視されます。Mail は貼り付けられたリッチテキストからプレーンテキストの MIME 代替を生成します。
  • 貼り付けには Mail が一時的にフォーカスを保持している必要があります。フォーカスが失われると、スクリプトは安全に中断し、クリップボードを元に戻します。
HTML /ブランド付き返信の検証

ブランド付きの返信を作成した後、両方が実際に機能していることを確認します。

  1. レンダリングの確認 — Mail が作成した下書きを開きます。引用された元のメッセージの上に、ブランド表記が生の <tags> ではなく、書式付きリッチテキスト(見出し、太字、リンク)として表示されていることを確認します。
  2. スレッド化 / ヘッダーの確認 — 厳密なクライアント(Outlook または Gmail web)を使う受信者に返信を送信し、独立したメッセージとして表示されるのではなく、元の会話の中にネストされることを確認します。または、送信済みの返信に対して get-message-source を実行し、元の Message-ID を指す In-Reply-To: ヘッダーと References: ヘッダーが含まれていることを確認します。
  3. クリップボードの確認 — 貼り付け後に、クリップボードの内容が元の状態に戻っていることを確認します(ツールは貼り付けの前後に内容を保存・復元します)。
  4. 添付ファイルのガード確認 — reply-to-message に htmlBody と attachments の両方を指定して呼び出したとき、破損した下書きではなく、明確なエラーが返されることを確認します。

既知の制限事項

全般
  • osascript の呼び出しごとのタイムアウトは 30 秒です。
  • アプリは初回使用時に自動起動し、サーバーのシャットダウン時に、それ以前に起動していなかった場合は終了します。詳しくはアプリのライフサイクル — 元の状態に戻すを参照してください。
Mail
  • messageId または messageIds を受け取る Mail ツールでは、search-messages が返す数値文字列の id を使用してください。RFC の messageId 値も引き続き使用できますが、それらの比較ではメールボックス全体のメッセージヘッダーが読み込まれ、30 秒のタイムアウト後も Mail がビジー状態になることがあります。ローカル ID はこの Mac の Mail ライブラリに固有です。メッセージを移動した後、またはライブラリを再構築した後は、再度検索してください。
  • AppleScript の content contains 検索は、大きなメールボックスでは時間がかかることがあります。Mail サーバーはデフォルトで件名と送信者を検索します。
Numbers
  • Numbers ツールを使うには、ドキュメントを開いておく必要があります。
カレンダー

以下は Calendar.app の AppleScript インターフェース自体の制限であり、MCP サーバーの制限ではありません。

  • AppleScript ではカレンダーを削除できません。 delete calendar は、最新のすべての macOS バージョンで -10000(AppleEvent handler failed)を発生させます。delete-calendar ツールはカレンダーの存在を確認した後、内容を説明するエラーを返します。Calendar.app のサイドバーから手動でカレンダーを削除する必要があります(右クリック → 削除)。
  • カレンダーには使用可能な id/uid がありません。 Calendar.app の calendar クラスは、AppleScript で安定した id を公開しません(uid of は -10000 を発生させます)。そのため、すべてのカレンダーツールはカレンダーを名前で識別します。カレンダー名が重複しないようにしてください。
  • whose フィルターはイベント全体を O(n) で走査します。 AppleScript は whose start date ≥ X の条件を評価するため、カレンダー内のすべてのイベントを走査します。複数のカレンダーを含む予定が多い環境では、全カレンダーを対象にした空の 7 日間クエリでも 60 秒以上かかり、osascript の 30 秒のタイムアウトを超えることがあります。可能な場合は必ず list-events、search-events、today-events、upcoming-events に calendarName を渡して、走査範囲を絞ってください。 search-events では、さらに日付範囲(デフォルト:−30 日から +365 日まで)が適用されます。
  • move-event は uid を再割り当てします。 Calendar.app では、あるカレンダーから別のカレンダーへイベントを移動できません。このツールは元のイベントを削除し、移動先のカレンダーに新しいイベントを作成します。新しいイベントには新しい uid が割り当てられ(oldUid とともに newUid として返されます)。
  • 繰り返しは生の RRULE 文字列として公開されます(例:FREQ=WEEKLY;INTERVAL=1)。読み取りと書き込みのみ可能で、解析や展開はできません。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。