The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Apple Notes MCP listing page.
MCP server for Apple Notes with semantic search and CRUD operations. Claude searches, reads, creates, updates, and manages your Apple Notes through natural language.
JXA_TIMEOUT_MS) and cancellation actually stops the fetchlist-notes folder filtering - list-notes now queries only the requested folder instead of scanning all notes firstThe setup wizard guides you through:
Run the command after installation:
The setup wizard starts automatically on first run. Restart Claude Code after setup to use the MCP tools.
Configuration stored in ~/.apple-notes-mcp/.env:
| Variable | Description | Default |
|---|---|---|
OPENROUTER_API_KEY | OpenRouter API key (enables cloud embeddings) | - |
EMBEDDING_MODEL | Model name (local or OpenRouter) | Xenova/multilingual-e5-small |
EMBEDDING_DIMS | Embedding dimensions | 4096 |
READONLY_MODE | Block all write operations | false |
INDEX_TTL | Auto-refresh-on-search interval in seconds (disabled when unset) | - |
SEARCH_REFRESH_TIMEOUT_MS | Max time search waits for refresh before using stale index | 2000 |
INDEX_JOB_RETENTION_SECONDS | How long completed/failed index jobs remain queryable | 3600 |
EMBEDDING_BATCH_SIZE | Batch size for embedding generation | 50 |
NOTES_FETCH_BATCH_SIZE | Batch size for Notes fetch | 100 |
JXA_TIMEOUT_MS | Max time for a single Notes read in milliseconds | 120000 |
DEBUG | Enable debug logging | false |
search-notes does not force refresh on every request.INDEX_TTL is unset, auto-refresh is disabled and search uses the current index.INDEX_TTL is set, refresh runs only after TTL expiration.SEARCH_REFRESH_TIMEOUT_MS, search falls back to stale index results instead of timing out.To reconfigure:
Local (default): Uses HuggingFace Transformers with Xenova/multilingual-e5-small. Free, runs locally, ~200MB download.
OpenRouter: Uses cloud API. Fast, requires no local resources, needs API key from openrouter.ai.
See docs/models.md for model comparison.
search-notesHybrid vector + fulltext search.
list-notesList notes with sorting and filtering. Without parameters, shows index statistics.
When folder is provided, the server fetches only matching folders from Apple Notes. This keeps folder-scoped requests fast even when your vault has hundreds of notes.
Examples:
{ sort_by: "created", order: "desc", limit: 5 }{ sort_by: "modified", limit: 10 }{ sort_by: "title", order: "asc", folder: "Projects" }list-foldersList all Apple Notes folders.
get-noteGet note content by title.
get-tablesExtract structured table data from a note.
Returns:
index-notesIndex notes for semantic search.
Use mode: "full" to create the chunk index for better long-note search. First full index takes longer as it generates chunks, but subsequent searches run fast.
For large vaults, prefer background indexing:
start-index-jobReturns a job snapshot with id, status, and progress.
Progress updates in smaller steps across fetch, embed, and persist phases.
get-index-jobPoll until status is completed, failed, or cancelled.
You may see cancelling as a transitional status.
list-index-jobscancel-index-jobRequests best-effort cancellation for a running job. Cancellation is cooperative:
cancelled.reindex-noteRe-index a single note after manual edits.
create-noteCreate a note in Apple Notes.
After create, update, delete, or move, the server auto-syncs vector and chunk indexes in best-effort mode.
If sync partly fails, the tool response includes an index sync warning. Run reindex-note or index-notes.
update-noteUpdate an existing note.
delete-noteDelete a note (requires confirmation).
move-noteMove a note to another folder.
batch-deleteDelete multiple notes at once.
batch-moveMove multiple notes to a target folder.
purge-indexClear all indexed data. Use when switching embedding models or to fix corrupted index.
After purging, run index-notes to rebuild.
list-tagsList all tags with occurrence counts.
search-by-tagFind notes with a specific tag.
related-notesFind notes related to a source note.
export-graphExport knowledge graph for visualization.
Supported Formats:
json - For custom visualization (D3.js, web apps)graphml - For professional tools (Gephi, yEd, Cytoscape)The setup wizard automatically adds apple-notes-mcp to Claude Code. Run apple-notes-mcp after installation.
Add to ~/.claude.json:
For npm installation:
For source installation:
After setup, use natural language with Claude:
Use full path format Folder/Note Title when multiple notes share the same name.
Local embeddings download the model on first use (~200MB). Subsequent searches run fast.
Set READONLY_MODE=false in .env to enable write operations.
Run index-notes to update the search index. Use mode: full if incremental misses changes.
Can't get account "iCloud"This error comes from a different Apple Notes MCP implementation that uses tool search_notes and argument Keywords.
This project uses:
search-notesqueryIf your client calls search_notes with Keywords, point your MCP config to apple-notes-mcp and restart the client.
Ensure Apple Notes runs and contains notes. Grant automation permissions when prompted.
This usually means the indexing process ran out of memory. Try:
EMBEDDING_BATCH_SIZE=25 in .env to reduce memory usageindex-notes againSome notes may be skipped if they are:
The indexer will report which notes were skipped and continue with the rest.
PRs welcome! Please:
bun run check before submittingMIT