
Apple Notes
io.github.connerkward由 GitHub 帳號 connerkward 發布v1.0.2更新於 Oct 25, 2026
Semantic search + connection-discovery across your own Apple Notes (bridges, synthesis).
概覽
僅限 macOS 的 MCP 伺服器,在本機為 Apple Notes 建立索引,讓助理進行語意搜尋、找出筆記之間的關聯,並根據筆記產生附引用的綜合回答。
- 可以做什麼
- 索引與狀態:背景索引並顯示進度、偵測筆記變更、查看索引健康狀態,以及列出資料夾與標籤及數量。搜尋與讀取:語意加全文混合搜尋,可依資料夾與日期篩選,支援精確子字串搜尋、依標題取得全文和依時間排序列出。探索關聯:透過共用標籤、雙向連結和向量相似度找相關筆記,Swanson-ABC 橋接配對、排序後的關聯動態串,以及在可選實體圖資料庫存在時依實體查找筆記。擷取與編輯:從筆記擷取表格、建立筆記、修改既有筆記。綜合回答:跨筆記產生附引用的有依據回答,由所設定的 LLM 產生。
- 適用情境
- 適合在 Mac 上累積大量個人 Apple Notes,希望助理依語意檢索、找出筆記之間不明顯的關聯,或根據你寫過的內容回答問題。筆記很少或使用非 macOS 裝置時較不適合。
- 執行需求
- 需要 macOS 與 Apple Notes、已安裝 bun,並在系統設定中為 bun 授予完整磁碟存取權。以本機 stdio 程序方式從複製的儲存庫啟動。綜合回答需要 LLM:使用有餘額的 OPENAI_API_KEY,或將 SYNTH_BASE_URL 指向本機 OpenAI 相容伺服器並設定 SYNTH_MODEL,同時把 OPENAI_API_KEY 設為 local。實體工具需要可選的 SQLite 圖資料庫檔案,可用 LAYERED_DB 覆寫路徑。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Apple Notes,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
MCP Apple Notes
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.
Install as a Claude Code plugin
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.
Comparison
JXA on macOS Sequoia: processes without a bundle ID are silently auto-denied Automation permission. This fork reads SQLite directly.
Features
- 🔍 Semantic search via
all-MiniLM-L6-v2on-device embeddings - 📝 BM25 full-text search combined via Reciprocal Rank Fusion
- 🧠 Re-ranking:
RRF × title_boost × recency_factor - 📂 Full folder hierarchy — filter by any path segment
- 🕐 Auto re-index: every search runs ~1ms change detection and, if notes changed, kicks ONE background index job (single-flight) — search itself never blocks on indexing
- ✂️ 1500-char chunking for long notes
- 🍎 Direct SQLite + protobuf decode — real note text, not garbled HTML
- 🏃♂️ On-device — embeddings, search, BM25, clustering, and bridges run locally with no API keys; only optional synthesis generation calls an LLM (local LM Studio/Ollama, or cloud OpenAI — your choice)
Local web app — not just search, but connections & synthesis
Run the server directly and open the browser UI — no MCP client needed:
Six modes, building from retrieval toward sensemaking:
- Feed (default) — one ranked, evidence-first stream mixing three connection kinds: bridges (A ↔ C via B, with the connecting phrase mined from B as plain-text evidence), abstraction pairs (two notes whose LLM-consolidated abstractions from
~/.mcp-apple-notes/consolidated.jsonlmake 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}. - Search — the hybrid semantic + BM25 search, in a paper-themed UI with query highlighting and folder filter.
- Map — a topic map of every note: spherical k-means clusters (TF-IDF labels) over the embeddings, projected to 2D with PCA. Hover a note for the neighbor-lens — lines to its nearest-by-meaning notes, which often cross clusters (the connection-finding payload). Endpoint:
GET /api/clusters?k=. - Synthesize — "what do I think about X across everything I've written?" Query-expansion → relevance-gated retrieval (no recency bias) → MMR diversification → an LLM writes a grounded answer with inline
[n]citations back to the source notes; provenance is post-checked. Endpoint:GET /api/synthesize?q=. - Bridges — Swanson-ABC discovery over your own notes: pairs (A, C) that are not directly similar but are both strongly similar to a shared bridge note B — connections the corpus only makes through an intermediary. Pure arithmetic over the embeddings (score = sim(A,B)·sim(B,C)·(1−sim(A,C)); cross-folder, no shared tags/wikilinks; thresholds auto-relax; hub-penalized selection so no note dominates the list). No LLM, $0. Endpoint:
GET /api/bridges?limit=40. - Entities — "where else do I talk about Mercedes?" Ranked entity chips (people, orgs, concepts) → the notes that mention them, by mention weight. Reads an optional sqlite graph db (see below). Endpoints:
GET /api/entities?q=&limit=,GET /api/entity-notes?entity=.
Precomputed disk caches (instant bridges & map)
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 perk
Fresh 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.
Enabling synthesis (needs an LLM)
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 graph (optional)
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.
Installation
- Clone and install:
-
Add bun (
~/.bun/bin/bun) to Full Disk Access in System Settings. -
Add to
claude_desktop_config.json:
- Restart Claude Desktop and ask: "Index my Apple Notes".
Claude Code / CLI registration
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.
Tools
Search & Ranking
Every search detects changes (~1ms). If notes changed, ONE background incremental index job is kicked (single-flight — duplicate triggers are dropped) and the search returns immediately from the current index; results catch up when the job lands. The last-indexed watermark persists to ~/.mcp-apple-notes/index_state.json across restarts. Change detection compares the per-title set of modification dates (Apple Notes titles are not unique — "TODO" ×10 — and a title→single-date map can never converge for duplicates).
Temporal queries (recent, latest, today) automatically shift to a 1-day recency half-life at 70% weight. Normal queries use 90-day half-life at 10% so relevance stays primary.
Benchmarks
1,806 notes, Apple Silicon:
Troubleshooting
Permissions error → ensure bun (~/.bun/bin/bun) has Full Disk Access in System Settings → Privacy & Security.
🧭 ckw-skills — part of Conner K. Ward's collection of Claude Code skills & MCP servers.
來源:README.md,提交 8a399dc
工具
0版本歷史
1- v1.0.2最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分