Skip to main content
Glama
tszaks
by tszaks
README.md
# Apple Notes MCP

Comprehensive Apple Notes MCP server for local macOS note management.

## Scope

This server exposes a full practical Apple Notes toolset across accounts, folders, notes, search, attachments, and destructive actions with explicit confirmation fields.

- Account discovery
- Folder listing/create/delete
- Note listing/read/search/recent
- Note create/update/append/move/delete
- Attachment metadata listing

## Prerequisites

- macOS with Apple Notes app
- Node.js 20+
- Apple Notes content synced locally (iCloud/IMAP)

## Setup

1. Install dependencies and build:

```bash
cd /Users/tyler/Projects/MCP-Servers/apple-notes-mcp
npm install
npm run build
```

2. Add to MCP config (`~/.mcp.json` or your client MCP config):

```json
{
  "mcpServers": {
    "apple-notes": {
      "command": "node",
      "args": [
        "/Users/tyler/Projects/MCP-Servers/apple-notes-mcp/dist/index.js"
      ]
    }
  }
}
```

3. First run permission prompt:

On first use, macOS will prompt for Automation access so `osascript` can control Notes. Approve access.

## Run

```bash
node /Users/tyler/Projects/MCP-Servers/apple-notes-mcp/dist/index.js
```

## Available Tools

- `notes_list_accounts` `{}`
- `notes_list_folders` `{ account_id?, account_name? }`
- `notes_list_notes` `{ account_id?, account_name?, folder_id?, folder_name?, limit?, include_body? }`
- `notes_get_recent_notes` `{ days?, limit?, include_body? }`
- `notes_get_note` `{ note_id }`
- `notes_search_notes` `{ query, account_id?, account_name?, folder_id?, folder_name?, limit?, include_body?, case_sensitive? }`
- `notes_create_folder` `{ name, account_id?, account_name?, parent_folder_id?, parent_folder_name? }`
- `notes_delete_folder` `{ folder_id?, folder_name?, account_id?, account_name?, confirm, reason }` (destructive)
- `notes_create_note` `{ title?, body?, body_format?: "plain"|"html", account_id?, account_name?, folder_id?, folder_name? }`
- `notes_update_note` `{ note_id, title?, body?, body_format?: "plain"|"html" }`
- `notes_append_to_note` `{ note_id, content, content_format?: "plain"|"html", insert_blank_line? }`
- `notes_move_note` `{ note_id, target_folder_id?, target_folder_name?, account_id?, account_name? }`
- `notes_delete_note` `{ note_id, confirm, reason }` (destructive)
- `notes_list_attachments` `{ note_id }`

## Destructive Safety

Destructive operations require both:

- `confirm: true`
- non-empty `reason`

This applies to:

- `notes_delete_note`
- `notes_delete_folder`

## Notes

- The server uses native Apple Notes scripting via `osascript -l JavaScript` (JXA).
- Apple Notes does not need to be manually open. macOS auto-launches it when tools are called.
- `note_id`, `folder_id`, and `account_id` are stable identifiers from Apple Notes and are recommended over names.
- Attachment file export is not provided by Notes scripting directly. This server returns attachment metadata.

## License

MIT

## Quickstart TL;DR

```bash
npm install
npm run build
node dist/index.js
```

Add to MCP config:

```json
{
  "mcpServers": {
    "apple-notes": {
      "command": "node",
      "args": ["/absolute/path/to/apple-notes-mcp/dist/index.js"]
    }
  }
}
```

## How It Works (TL;DR)

- MCP client calls tool -> Node MCP server receives request
- Server invokes native macOS JXA (`osascript -l JavaScript`) against Apple Notes
- Response is normalized into JSON and returned to the MCP client
- Destructive operations require `confirm: true` and `reason`

## LLM Quick Copy

Use the copy button on this code block in GitHub.

```txt
Repo: apple-notes-mcp
Goal: Local Apple Notes MCP server for macOS.
Setup:
1) npm install
2) npm run build
3) Add MCP config entry pointing to dist/index.js
4) Start your MCP client and call notes_list_accounts
How to use:
- Discover: notes_list_accounts, notes_list_folders, notes_list_notes
- Read/search: notes_get_note, notes_search_notes, notes_get_recent_notes
- Write: notes_create_note, notes_update_note, notes_append_to_note, notes_move_note
- Destructive: notes_delete_note / notes_delete_folder require confirm=true and reason
How it works:
- Node MCP wrapper -> JXA via osascript -> Apple Notes automation API
```

TDQS

A3.5/5.0

Scored across 14 tools

Disambiguation4/5

Most tools have clearly distinct purposes: accounts, folders, notes, and attachments are separate concerns. There is mild overlap between list_notes, search_notes, and get_recent_notes, but the descriptions scope them well enough for an agent to choose correctly.

Naming Consistency5/5

All tools share the notes_ prefix and follow a verb_noun pattern: list_, get_, search_, create_, update_, delete_, move_, append_to_. The naming is highly predictable and consistent across the entire set.

Tool Count5/5

14 tools is well within the ideal range for a domain-specific MCP server. Each tool covers a meaningful operation on Apple Notes without unnecessary redundancy or bloat.

Completeness4/5

The core note lifecycle is well covered: create, read, update, append, move, search, list, and delete. Minor gaps exist around folder rename/update and attachments being metadata-only, but these are not severe dead ends.

Maintenance

ActivityInactive
ResponsivenessNo issues