@rnto1/apple-notes-mcp
v0.3.0
Published
MCP server for Apple Notes on macOS (local stdio)
Maintainers
Readme
Apple Notes MCP
Local-only MCP server for Apple Notes on macOS. It is designed for stdio clients such as Claude Desktop, Codex, Cursor, Continue, and similar local MCP hosts.
This server is built around a simple rule set:
- read Apple Notes using normalized plaintext plus optional raw Apple Notes HTML
- mutate notes and folders only through explicit tools
- block destructive deletes by default unless the process is started with delete permission or the client supports MCP elicitation confirmation
- avoid brittle formatting helpers that depend on string surgery over Notes HTML
Requirements
- macOS
- Node 22+
- Apple Notes enabled locally
- Automation permission for
osascript/ your MCP host to control Notes
Install
npm install
npm run buildRun
node dist/index.jsRun with npx
Once published to npm, you can launch it directly:
npx @rnto1/apple-notes-mcpThe package exposes the apple-notes-mcp bin and ships prebuilt dist/ output in the tarball.
For local verification before publishing:
npm pack
npx -y ./rnto1-apple-notes-mcp-0.3.0.tgz --helpFor GitHub-based installs, prepare and prepack rebuild the package automatically so the CLI entrypoint still resolves.
CLI flags
--help--version
Environment
NOTES_MCP_ALLOW_WRITES=0|1- Default:
1 - Set to
0for read-only mode.
- Default:
NOTES_MCP_ALLOW_DELETES=0|1- Default:
0 - Set to
1to allownotes_deleteandfolders_deletewithout an interactive MCP confirmation flow.
- Default:
Client configuration
Claude Desktop example:
{
"mcpServers": {
"apple-notes": {
"command": "node",
"args": ["/absolute/path/to/apple-notes-mcp/dist/index.js"]
}
}
}For development, you can point a client at tsx instead:
{
"mcpServers": {
"apple-notes": {
"command": "node",
"args": [
"/absolute/path/to/apple-notes-mcp/node_modules/tsx/dist/cli.js",
"src/index.ts"
]
}
}
}Public MCP surface
Tools
server_statusaccounts_listfolders_listfolders_getfolders_ensurefolders_renamefolders_deletenotes_listnotes_searchnotes_getnotes_createnotes_updatenotes_movenotes_delete
Resources
applenotes://policyapplenotes://accountsapplenotes://foldersapplenotes://notes/{id}
Prompts
review-noterewrite-note
Content contract
Reads return note metadata with canonical content:
idtitleaccountIdaccountNamefolderIdfolderPathcreatedAtmodifiedAtcontent.textcontent.formatcontent.htmlonly when explicitly requested
Write operations are explicit:
notes_create- accepts
title - accepts
contentas either{ "format": "plain_text", "text": "..." }or{ "format": "apple_html", "html": "..." } - accepts
folderIdorfolderPath
- accepts
notes_update- accepts
title - accepts exactly one of
replaceText,replaceHtml, orappendText
- accepts
notes_move- accepts
toFolderId
- accepts
Safety model
- writes are enabled by default for trusted local use
- destructive deletes are not enabled by default
- if your client supports MCP elicitation, the server can request confirmation for deletes
- if your client does not support elicitation, deletes require
NOTES_MCP_ALLOW_DELETES=1
Testing
npm test
npm run lint
npm run typechecknpm test builds the server first, then runs Node’s native test runner.
Limitations
- This server is
stdio-only in this release. - Apple Notes automation is limited by the Notes scripting interface.
- Rich range-based formatting, attachments, collaboration controls, locking, and other UI-only behaviors are intentionally out of scope.
- Folder paths are slash-delimited; if the same path exists in multiple accounts, provide
accountId.
Troubleshooting
- On first use, macOS may ask for Automation permission to control Notes.
- If the server starts but tools fail, open Notes.app once and let sync finish.
- If a delete is rejected, either confirm it through a client that supports MCP elicitation or restart with
NOTES_MCP_ALLOW_DELETES=1.
