mcp-apple-notes
README.md
<!--
Copyright 2026 santiago_migoni
Licensed under the GNU Affero General Public License v3.0 (the "License");
you may not use this file except in compliance with the License.
See the LICENSE file in the repository root for the full license text,
or https://www.gnu.org/licenses/agpl-3.0.html
-->
# mcp-apple-notes
An MCP (Model Context Protocol) server that exposes Notes.app on macOS as tools for LLM agents — list, read, create, update, delete, and search notes.
## Requirements
- macOS (uses JXA/`osascript` to automate Notes.app — there's no other public API for Notes)
- Node.js 18+
- A single iCloud account in Notes.app (multi-account is not supported)
## Install
```sh
npm install
npm run build
```
## Tools
| Tool | Description |
|---|---|
| `list_notes` | List notes (`id`, `title`, modification date), no body. Optional `limit`. |
| `read_note` | Read a note's full content (Markdown) by `id`. |
| `create_note` | Create a note from Markdown `content`. The first line becomes the title (that's how Notes.app derives it). Optional `folder` (defaults to "Notes"). |
| `update_note` | Replace a note's entire `content` by `id`. |
| `delete_note` | Delete a note by `id`. Moves it to "Recently Deleted", same as the UI — recoverable for ~30 days. |
| `search_notes` | Case-insensitive substring search over title + content. Optional `limit`. |
Notes:
- Content is exchanged as **Markdown**, not HTML. Notes.app stores bodies as HTML internally; this server converts both ways.
- Images embedded in a note's body are replaced with a `[imagen adjunta]` placeholder instead of being inlined as base64 — attachments are out of scope.
- "Recently Deleted" is excluded from `list_notes`/`search_notes` results.
## Running it from Claude Desktop
Add it to your Claude Desktop MCP config with a local path (this package isn't published to npm):
```json
{
"mcpServers": {
"apple-notes": {
"command": "node",
"args": ["/absolute/path/to/mcp-apple-notes/dist/index.js"]
}
}
}
```
The first call that touches Notes.app triggers a macOS Automation permission prompt. If it's denied or the process runs non-interactively, grant access manually in System Settings → Privacy & Security → Automation, then retry.
## Development
```sh
npm run build # compile TypeScript (tsc) to dist/
npm test # run unit tests (node --test) against dist/**/*.test.js
npm start # run the compiled server directly (stdio transport)
```
Only pure logic (Markdown↔HTML conversion, error formatting) has automated tests. Anything that touches Notes.app itself is verified manually, since it requires real macOS automation and mutates real data.
See [CLAUDE.md](CLAUDE.md) for architecture notes.
## License
GNU AGPLv3 — see [LICENSE](LICENSE) for details.
TDQS
A4.2/5.0
Scored across 6 tools
Disambiguation5/5
Each tool has a clear and distinct purpose: create, delete, list, read, search, and update notes. No overlapping functionalities.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern (e.g., create_note, list_notes), with only a minor variation in pluralization (list_notes vs others singular).
Tool Count5/5
6 tools is well-scoped for a note-taking server, covering basic CRUD operations plus search without unnecessary redundancy.
Completeness4/5
Covers all core note operations (create, read, update, delete, list, search). Missing a tool to restore from 'Recently Deleted' or manage folders, but not critical for basic usage.
Maintenance
ActivityStale
ResponsivenessNo issues