Semantic search + connection-discovery across your own Apple Notes (bridges, synthesis).
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.

mcp-apple-notes is an MCP server for semantic search and connection-discovery across your own Apple Notes β hybrid search, Swanson-ABC bridges, entity threads, and cited synthesis over everything you've written.
It traverses your accumulated mass of notes: semantic + BM25 hybrid search, non-obvious bridge connections, entity threads, related-notes, and grounded synthesis across everything you've ever written in Apple Notes. Embeddings, search, BM25, clustering, and bridges run on-device; only synthesis generation calls an LLM (local via LM Studio/Ollama, or cloud via OpenAI β your choice). Built on the Model Context Protocol (MCP).
Forked from RafalWilinski/mcp-apple-notes β this fork reads the SQLite store + protobuf directly and adds bridges, entities, feed, and synthesis.
This registers the MCP server and bundles the apple-notes-search agent skill. Or install the MCP server manually β see Installation below (requires macOS + bun + Full Disk Access).
Other MCP Notes servers break at scale. They use JXA (AppleScript automation) to read notes one-by-one β fine for 50 notes, unusable at 500+. At 1,800 notes, JXA takes ~49 minutes just to fetch content. On macOS Sequoia it's worse: Apple silently denies Automation permission to processes without a bundle ID, so JXA-based servers fail entirely. This fork reads the SQLite database directly, decodes the protobuf blobs for real note text, and indexes 1,800 notes in under 5 seconds.

| Feature | This fork | RafalWilinski (base) | disco-trooper | sirmews | dhravya |
|---|---|---|---|---|---|
| Notes access | SQLite (direct) | JXA | JXA | SQLite | JXA |
| Fetch 1800 notes | ~430ms | ~49 min (est.) | ~49 min (est.) | fast | slow |
| Sequoia compatible | β | β οΈ JXA denied | β οΈ JXA denied | β | β οΈ |
| Content quality | Protobuf decoded | Raw HTML | Raw HTML | Partial | Raw |
| Semantic search | β | β | β | β | β |
| Auto re-index on search | β | β | β | β | β |
| Folder-aware search | β Full path | β | β | β | β |
| Note chunking | β 1500 chars | β | β | β | β |
| Re-ranking (RRF Γ title Γ recency) | β | RRF only | RRF only | β | β |
| Non-blocking index UI | β Live progress | β | β | β | β |
| Incremental indexing | β | β | β | β | β |
| Update existing notes | β | β | β | β | β |
| Tags + wikilinks | β | β | β | β | β |
| Related notes | β Multi-signal | β | β | β | β |
JXA on macOS Sequoia: processes without a bundle ID are silently auto-denied Automation permission. This fork reads SQLite directly.
all-MiniLM-L6-v2 on-device embeddingsRRF Γ title_boost Γ recency_factorRun the server directly and open the browser UI β no MCP client needed:
Six modes, building from retrieval toward sensemaking:
~/.mcp-apple-notes/consolidated.jsonl make the same underlying move), and entity threads ("X notes across Y folders mention Z", from the entity graph). Every item shows its evidence in plain text. π/π on any item tunes the ranking: a tiny online logistic regression (pure TS, no deps) takes a few SGD steps per vote; votes append to ~/.mcp-apple-notes/votes.jsonl (with the item's feature vector) and replay on boot, so the ranking survives restarts. Diversity constraints: β€2 consecutive items of one kind, no note more than twice per page of 20; "show more" paginates. Endpoints: GET /api/feed?offset=&limit=, POST /api/vote {id, vote: 1|-1}.GET /api/clusters?k=.[n] citations back to the source notes; provenance is post-checked. Endpoint: GET /api/synthesize?q=.GET /api/bridges?limit=40.GET /api/entities?q=&limit=, GET /api/entity-notes?entity=.Bridge mining (~2 min of embedding) and clustering are computed once and persisted, keyed by a corpus fingerprint (note count + max modification date):
~/.mcp-apple-notes/bridges_cache.json β the full mined bridge pool~/.mcp-apple-notes/clusters_cache.json β cluster output per kFresh cache β served from disk instantly (<300ms). Stale (notes changed) β the stale copy is served instantly with a "recomputingβ¦" pill in the UI while ONE background job (single-flight) refreshes it. Absent β computed inline once.
Embeddings/search/clustering/bridges/entities are fully local. Only synthesis generation needs an LLM. Point at a local OpenAI-compatible server to keep notes private:
The entity layer reads ~/.mcp-apple-notes/layered_graph.db (override with LAYERED_DB) β a plain sqlite file produced by the companion exp-notes-indexing benchmark harness (layered_graph.py). No extra dependencies (bun ships bun:sqlite); if the file is absent the entity tools and tab simply report how to generate it.
Add bun (~/.bun/bin/bun) to Full Disk Access in System Settings.
Add to claude_desktop_config.json:
The same bridges/entities tools power the web UI tabs at the local app (bun index.ts β http://localhost:3741/); the entity graph db is optional, generated by the exp-notes-indexing benchmark harness.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/apple-notes)<a href="https://allmcps.com/mcp/apple-notes"><img src="https://allmcps.com/api/badge/apple-notes?style=directory" alt="Apple Notes on AllMCPs" /></a>