printmcp について
printmcpは、CUPSコマンドを通じてmacOSの印刷機能をMCPから利用するサーバーです。READMEによるとoffice-mcpへ移管されており、AppleScriptブリッジではなくシェルラッパーです。
主な機能
- 01CUPS印刷コマンドの利用
活用シーン
- 01CUPS経由でmacOSの印刷機能を利用
MCP 対応
タグでは、プリンターの検出と印刷を行うMCPサーバーとして説明され、CUPSコマンドをラップします。READMEではoffice-mcpへの移管が記されています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
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-message | Mail.app に下書きを作成します(送信はしません)。htmlBody によるプレーンテキストまたは HTML の本文と、添付ファイルに対応しています |
send-message | メールをすぐに送信します(from、添付ファイル、htmlBody によるプレーンテキストまたは HTML の本文に対応しています) |
reply-to-message | メッセージに返信または全員に返信します。正しくスレッド化され、ブランド化された htmlBody または添付ファイルに対応しています |
forward-message | 新しい宛先にメッセージを転送します |
redirect-message | メッセージをリダイレクトします(元の送信者を保持します) |
move-messages | メッセージをメールボックス間で移動します |
delete-messages | Message-ID でメッセージを削除します |
mark-as-read | メッセージを既読にします |
mark-as-junk | メッセージを迷惑メールとしてマーク、または解除します |
flag-message | 色を指定してメッセージにフラグを付ける、または解除します |
set-message-color | メッセージリスト内のメッセージの背景色を設定します |
check-for-new-mail | 1 つまたはすべてのアカウントでメールの取得を実行します |
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-document | PDF、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-calendar | Calendar.app ではサポートされていません — 内容を説明するエラーを返します。カレンダーは Calendar.app の UI から削除する必要があります |
switch-view | Calendar.app の表示を日/週/月に切り替えます。日付への移動も指定できます |
reload-calendars | Calendar.app にアカウントからの更新を強制します |
list-events | 2 つの ISO 日付の間にあるカレンダー内のイベントを一覧表示します |
search-events | 日付範囲内で概要の部分文字列を使ってイベントを検索します(デフォルト:−30 日〜+365 日)。高速化するには対象を単一のカレンダーに絞り込みます |
get-event | uid を指定してイベントの詳細をすべて取得します |
create-event | 概要、開始、終了、および任意の場所/説明/URL を指定してイベントを作成します |
update-event | uid を指定してイベントの任意のフィールドを更新します |
delete-event | uid を指定してイベントを削除します |
move-event | イベントを別のカレンダーに移動します(削除して再作成するため、新しい uid になります) |
duplicate-event | イベントを同じカレンダーまたは別のカレンダーに複製します |
today-events | 1 つのカレンダーまたはすべてのカレンダーから今日のイベントを一覧表示します |
upcoming-events | 今後 N 日間のイベントを一覧表示します |
list-attendees | イベントの参加者を一覧表示します |
add-attendee | メールアドレスと任意の表示名を指定して参加者を追加します |
remove-attendee | メールアドレスを指定して参加者を削除します |
list-alarms | イベントの表示、メール、サウンドのアラームを一覧表示します |
add-display-alarm | イベント開始の N 分前に表示アラームを追加します |
add-sound-alarm | イベント開始の N 分前にサウンドアラームを追加します |
add-mail-alarm | イベント開始の N 分前にメールアラームを追加します |
remove-alarm | list-alarms の出力にある 1 から始まるインデックスを指定してアラームを削除します |
リマインダー(@aernoud/remindersmcp) — 22 個のツール
Reminders.app で設定されているすべてのリマインダーリスト(iCloud、Exchange、ローカルなど)で使用できます。
| ツール | 説明 |
|---|---|
list-accounts | Reminders.app のすべてのアカウントを名前と ID 付きで一覧表示します |
list-lists | 任意で 1 つのアカウントに絞り込み、すべてのリマインダーリストを一覧表示します |
get-list | 単一のリストのプロパティ(ID、アカウント、色、エンブレム、未完了と完了の件数)を取得します |
create-list | 任意で特定のアカウントを指定して新しいリストを作成します |
update-list | リストの名前を変更します |
delete-list | リストを削除します(Calendar.app とは異なり、Reminders.app は AppleScript 経由での削除を直接サポートしています) |
show-list | Reminders.app の前面にリストを表示します |
list-reminders | 名前を指定してリスト内のリマインダーを一覧表示します(デフォルトでは完了済みを除外します) |
search-reminders | 名前の部分文字列を使ってリマインダーを検索します。高速化するには対象を単一のリストに絞り込みます |
get-reminder | ID を指定してリマインダーの詳細をすべて取得します |
today-reminders | 1 つのリストまたはすべてのリストから、今日が期限のリマインダーを一覧表示します |
upcoming-reminders | 今後 N 日間が期限のリマインダーを一覧表示します |
overdue-reminders | 期限を過ぎていて、まだ完了していないリマインダーを一覧表示します |
create-reminder | 本文、期限日または終日扱いの期限日、通知日時、優先度、フラグの状態を指定してリマインダーを作成します |
update-reminder | ID を指定してリマインダーの任意のフィールドを更新します |
delete-reminder | ID を指定してリマインダーを削除します |
complete-reminder | リマインダーを完了済みとしてマークします(Reminders が完了日を自動的に記録します) |
uncomplete-reminder | 以前に完了したリマインダーを未完了としてマークします |
move-reminder | リマインダーを別のリストに移動します(ネイティブの move 動詞を使い、ID は維持されます) |
flag-reminder | フラグの状態を設定または解除します |
set-priority | 優先度をなし/高/中/低に設定します(Reminders の 0/1/5/9 の列挙値に対応します) |
show-reminder | Reminders.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 プロパティでは書き込みできません。そのため、これまではどちらの方法を単独で使っても両方を実現できませんでした。返信ツールは次の処理を行うようになりました。
- Mail のネイティブな
reply動詞を呼び出し、返信を作成してIn-Reply-To/Referencesヘッダーを設定します(これらは本文とは独立したメッセージプロパティです)。次に、 - ブランド付き 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 /ブランド付き返信の検証
ブランド付きの返信を作成した後、両方が実際に機能していることを確認します。
- レンダリングの確認 — Mail が作成した下書きを開きます。引用された元のメッセージの上に、ブランド表記が生の
<tags>ではなく、書式付きリッチテキスト(見出し、太字、リンク)として表示されていることを確認します。 - スレッド化 / ヘッダーの確認 — 厳密なクライアント(Outlook または Gmail web)を使う受信者に返信を送信し、独立したメッセージとして表示されるのではなく、元の会話の中にネストされることを確認します。または、送信済みの返信に対して
get-message-sourceを実行し、元の Message-ID を指すIn-Reply-To:ヘッダーとReferences:ヘッダーが含まれていることを確認します。 - クリップボードの確認 — 貼り付け後に、クリップボードの内容が元の状態に戻っていることを確認します(ツールは貼り付けの前後に内容を保存・復元します)。
- 添付ファイルのガード確認 —
reply-to-messageにhtmlBodyとattachmentsの両方を指定して呼び出したとき、破損した下書きではなく、明確なエラーが返されることを確認します。
既知の制限事項
全般
osascriptの呼び出しごとのタイムアウトは 30 秒です。- アプリは初回使用時に自動起動し、サーバーのシャットダウン時に、それ以前に起動していなかった場合は終了します。詳しくはアプリのライフサイクル — 元の状態に戻すを参照してください。
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
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。