agentcairn MCP Server
官方本地優先的代理記憶:以純 Markdown 的 Obsidian 筆記庫作為真實來源,並搭配可重建的 DuckDB 索引,實現混合 BM25、向量與圖形檢索。
文件
🪨 agentcairn
為 AI 代理提供本地優先的記憶——而且你真的能讀、能改、能擁有。
cairn /kɛən/ · 名詞 — 一堆石頭,用來標記路徑或值得記住的地方,留給後來的旅人。
agentcairn 賦予你的程式開發代理持久且高品質的記憶——但不同於鎖在不透明的資料庫或雲端服務中,你的記憶會以純 Markdown 形式存在你擁有的 Obsidian 知識庫裡。 上方則架設一個快速、可重建的 DuckDB 索引來進行檢索。打開你的知識庫,閱讀代理記住了什麼,手動修正錯誤的事實,或放入你自己的筆記——代理都會一併接收。
agentcairn 有何不同
大多數代理記憶系統將資料庫或雲端儲存視為真相來源,並將檔案(如果有的話)視為單向匯出。agentcairn 則反其道而行:
- 📂 你的知識庫是真相來源——不是匯出結果。 記憶是人類可讀的 Markdown,包含 frontmatter 與
[[wikilinks]]。在 Obsidian 中編輯它;索引會尊重你的編輯。 - ♻️ 索引是可拋棄的。 DuckDB 是一個可重建的快取(
cairn reindex)。你的記憶能承受模型升級、索引損毀、結構變更或解除安裝工具——零資料遺失,因為真相就只是磁碟上的檔案。 - 🧠 建構上即為無損。 完整筆記永遠會被保留。蒸餾只會新增連結回來源的衍生筆記——它永遠不會在寫入時,悄悄丟棄它沒想到要提取的事實。
- 🔒 每次寫入前都會進行遮蔽。 在任何內容——內文、標題或標籤——進入明文知識庫之前,機密資訊都會被清除(正則表達式 + 熵 + URL 憑證偵測)。我們寫出你能讀的檔案,因此我們將憑證外洩視為最嚴重的失敗模式。
- 🕸️ 一個免費、確定性的知識圖譜。 你的
[[wikilinks]]和 frontmatter 就是圖譜——無需 LLM 提取,沒有虛構的實體。 - 🪶 無守護程序,零外部資料庫。 一個嵌入式 DuckDB 檔案就能進行語義向量搜尋、BM25 全文檢索和圖譜遍歷。無需常駐伺服器、無需 Neo4j/Postgres/Qdrant、無需強制性的雲端金鑰——只有一個
cairnCLI 和一個隨選即用的 MCP 伺服器。 - 🔍 誠實的評測。 一個可重現的 LongMemEval-S + LoCoMo 測試框架隨附在
benchmarks/中——附有真實數據、消融實驗和明確的注意事項,而非一個精心挑選的頭條數字(見下文)。
安裝
使用 agentcairn 最簡單的方式是透過 Claude Code 或 Codex 的外掛程式——一次安裝即可接上 MCP 伺服器、環境記憶(工作階段開始時回想,結束時擷取)、記憶技能以及斜線指令(Claude Code):
# Claude Code
claude plugin marketplace add ccf/agentcairn
claude plugin install agentcairn@agentcairn
# Codex (from the Codex plugin marketplace)
codex plugin marketplace add ccf/agentcairn
codex plugin add agentcairn@agentcairn
安裝時你會選擇一個知識庫路徑(預設為 ~/agentcairn);它會在第一次工作階段時自動建立——無需設定 Obsidian。從那時起,agentcairn 會在每個工作階段開始時浮現相關記憶,將每個工作階段蒸餾到你的知識庫中,並提供你 /agentcairn:recall、/remember、/memory、/savings 和 /ingest。無需 pip 安裝——外掛程式透過 uvx 執行已發布的套件。
不是使用 Claude Code 或 Codex?agentcairn 也是一個獨立的 MCP 伺服器 + CLI,適用於任何主機——請參閱直接使用。
運作方式
flowchart LR
T["Session transcripts<br/>(out-of-band)"]
H["You · Obsidian<br/>(hand edits)"]
V["📂 Obsidian vault<br/>Markdown + frontmatter + wikilinks<br/><b>source of truth</b>"]
I["♻️ DuckDB index<br/>vector + BM25 + graph<br/><b>rebuildable cache</b>"]
M["MCP tools<br/>remember · recall · search · build_context · recent"]
T -- "redact → judge → distill → consolidate" --> V
H -- "edit" --> V
V -- "parse / reconcile-on-spawn" --> I
I -- "READ_ONLY hybrid recall" --> M
M -. "remember (redacted write)" .-> V
classDef truth fill:#eaf1ff,stroke:#317cff,color:#191919;
classDef cache fill:#f5f5f3,stroke:#999999,color:#191919;
class V truth
class I cache
- 擷取 以帶外方式讀取你的代理框架的工作階段記錄(僅附加,已在磁碟上)——設計上強固,沒有脆弱的即時掛鉤——然後進行遮蔽 → 去重 → 判斷(語義持久性;透過
CAIRN_JUDGE=anthropic進行可選的 LLM 蒸餾)→ 把關 → 無損地蒸餾到知識庫中。cairn sweep會自動偵測每個存在的框架(Claude Code、Codex、Antigravity CLI 和 Cursor 都支援,背後是HarnessAdapter接合層),因此你無需任何額外設定,就能在所有四個框架間獲得統一的記憶。在 LLM 層級,它還會整合:與現有記憶重複的新記憶會被跳過,而演進中事實的較新版本會將舊筆記標記為superseded_by(保留並在回想時降級,絕不刪除)——具備失效安全機制,因此錯誤的呼叫永遠不會丟棄獨特的記憶(使用CAIRN_CONSOLIDATE=0停用)。另外還有一個代理驅動的remember工具,用於策劃高價值的記憶。 - 檢索 將 BM25 + 語義向量與 Reciprocal Rank Fusion 融合,套用可選的圖譜增強,並在沒有嵌入模型可用時優雅降級到僅限關鍵字——因此回想功能永遠不會悄然失效。一個可選的跨編碼器重新排序器則能增加精確度。
- 混合智慧: 開箱即用離線本地嵌入(預設為 FastEmbed /
nomic-embed-text-v1.5)——本身就很強大,而且在混合融合中表現出色(使用nomic時,僅向量的表現甚至在短輪次上略勝 BM25;請參閱基準測試)。設定CAIRN_EMBED_MODEL來選擇另一個 FastEmbed 模型,或執行CAIRN_EMBEDDER=ollama/ 雲端層級以更上層樓。 - 時間記憶: 筆記可以帶有
valid_from/valid_until/superseded_byfrontmatter。回想具有有效性感知能力——它會在不隱藏(無損)的情況下,軟性降級被取代和過期的事實(當前事實勝出),並為每個結果標註狀態(current/superseded/expired/not_yet_valid)以及一個as_of錨點,以便代理能隨時間進行推理。對於沒有有效性欄位的筆記則無作用。 - 來源感知回想: 筆記帶有
project/harness來源資訊,回想時會提升你當前專案的記憶(無損——跨專案的命中結果仍會浮現,並標記為[from: <project>])。傳遞--project <repo>來鎖定另一個儲存庫,或傳遞--scope project來強制篩選僅限當前專案的記憶。
直接使用
外掛程式是最簡單的途徑,但 agentcairn 只是一個套件——透過隨選即用的 MCP 伺服器(適用於任何 MCP 主機)或 cairn CLI,無需 Claude Code 也能使用:
uvx agentcairn # on-demand MCP server for any MCP host
cairn ingest --vault ~/vault # distill recent agent sessions into the vault
cairn sweep --vault ~/vault # ingest + reindex in one pass (cron-friendly)
cairn schedule install --vault ~/vault # run sweep automatically every 30 min (launchd on macOS, crontab on Linux)
cairn recall "how did we fix the auth bug?" # hybrid recall from the CLI
cairn savings # how much context recall has saved you
cairn reindex ~/vault # rebuild the index from Markdown (always safe)
cairn doctor # health-check the index
設定
所有設定都存在一個檔案中——~/.agentcairn/config.toml——並以環境變數作為覆寫(優先順序:CLI 旗標 > 環境變數 > 設定檔 > 預設值):
cairn config --init # scaffold a fully-commented template (chmod 600)
cairn config # show every setting's effective value and where it came from
例如,啟用 LLM 記憶判斷器只需取消兩行註解——無需匯出 shell 變數(外掛程式的背景掃描會直接讀取該檔案):
judge = "anthropic"
anthropic_api_key = "sk-ant-..."
支援的代理
agentcairn 在兩個層面上運作。外掛主機(Claude Code、Codex 和 Antigravity)獲得一流的外掛程式——一個捆綁的 MCP 伺服器(回想/搜尋/remember)、一個記憶技能,以及(在 Claude Code 和 Codex 上)環境工作階段掛鉤;cairn install <host> 透過呼叫主機自身的 CLI 來安裝外掛程式。MCP 主機(其他所有項目)則透過可攜式 MCP 伺服器獲得相同的回想/搜尋/remember 工具;cairn install <host> 會以非破壞性方式寫入 MCP 伺服器設定(你其他的伺服器會被保留,原始設定會備份到 <config>.bak)。知識庫保持為單一全域的 ~/agentcairn,因此記憶在所有主機之間是共享的。
| 主機 | 支援 | 設定方式 | 環境擷取 |
|---|---|---|---|
| Claude Code | 🟢 外掛 | cairn install claude-code | ✅ 開始時回想 + 結束時擷取 |
| Codex | 🟢 外掛 | cairn install codex | ◐ 回想/remember 即時;環境掛鉤已捆綁(驗證中)1 |
| Cursor | 🔌 MCP 伺服器 + 技能 + 汲取 | cairn install cursor | ◐ cairn sweep 自動偵測記錄 2 |
| Claude Desktop | 🔌 MCP 伺服器 | cairn install claude-desktop | — |
| VS Code (Copilot) | 🔌 MCP 伺服器 | cairn install vscode | — |
| Gemini CLI 3 | 🔌 MCP 伺服器 | cairn install gemini | — |
| Antigravity | 🟢 外掛 + 汲取 | cairn install antigravity | ◐ cairn sweep 自動偵測記錄 4 |
| 任何其他 MCP 主機 | 🔌 MCP 伺服器 | uvx agentcairn(貼上 cairn install … --print 片段) | — |
cairn install 會自動根據主機類型進行路由:
cairn install # detect installed hosts + preview (writes nothing)
cairn install codex # install the Codex plugin (shells to `codex plugin …`; strips any stale MCP block from ~/.codex/config.toml)
cairn install antigravity --source ./plugin # install the Antigravity plugin from a local checkout (see note)
cairn install cursor # write MCP config + install the memory skill for Cursor
cairn install --all # configure every detected host
cairn install codex --source /path/to/agentcairn # use a local checkout instead of the marketplace
MCP 主機需要一個 JSON mcpServers 條目(VS Code 使用其 servers 鍵)。外掛主機(Claude Code、Codex、Antigravity)則透過主機 CLI 安裝外掛——MCP 伺服器已捆綁在外掛中,不需要單獨的設定條目。如果你先前使用 cairn install antigravity 將 MCP 條目寫入 ~/.gemini/config/mcp_config.json,重新執行 cairn install antigravity 會自動移除該過時條目。
基準測試實測
我們以我們希望記憶系統被評測的方式來對 agentcairn 進行基準測試——可重現、附帶消融實驗,且沒有單一精心挑選的頭條數字。 測試框架(benchmarks/)透過版本鎖定的下載器執行 LongMemEval-S 和 LoCoMo(資料集絕不內嵌),以確定性方式對檢索進行評分(recall/nDCG@k、MRR——無需 API 金鑰,可在 CI 中使用合成固定裝置執行),並提供一個可選的 LLM 判斷問答層。
檢索 — LoCoMo
完整 LoCoMo 資料集,輪次層級,宏觀平均,FastEmbed nomic-embed-text-v1.5(預設嵌入器):
| 組別 | recall@5 | recall@10 | MRR |
|---|---|---|---|
| 僅 BM25 | 0.527 | 0.604 | 0.459 |
| 僅向量 | 0.536 | 0.637 | 0.433 |
| 混合 (RRF) | 0.562 | 0.648 | 0.477 |
| 混合 + 圖譜增強 | 0.562 | 0.648 | 0.477 |
| 混合 + 重新排序器 | 0.662 | 0.735 | 0.608 |
我們從中解讀到的——並且大聲說出來:
- 混合模式勝過任何單一組別——RRF 融合是值得的。
- 跨編碼器重新排序器是最大的槓桿(相較於混合模式,recall@5 提升 +0.10);「ms-marco 領域轉移可能有害」的擔憂在對話資料上並未成真。
- 預設嵌入器現在已能發揮作用——使用
nomic時,僅向量的表現略勝 BM25(0.536 vs 0.527);從舊的bge-small預設值(落後於 0.483)切換過來,已彌補了差距。經過 5 個模型的 FastEmbed 掃描後確定了選擇——nomic(768 維)在每維度品質上勝出;更大的 1024 維模型並未擊敗它。完整表格:benchmarks/README.md。 - 圖譜增強在這些語料庫上無作用——LoCoMo/LongMemEval 沒有原生的
[[wikilink]]圖譜,因此增強無從發揮。它是為真實的相互連結知識庫設計的,而非聊天記錄,我們不會假裝它是別的東西。
檢索 — LongMemEval-S
完整 500 個實例集 — 一個較簡單的任務,證據會話區分明確。會話層級是先前研究報告的粒度;回合層級則是更細緻、能揭示語料庫特性的切片:
| 方案 | 會話 r@5 | 會話 MRR | 回合 r@5 | 回合 r@10 | 回合 MRR |
|---|---|---|---|---|---|
| 僅 BM25 | 0.920 | 0.918 | 0.680 | 0.791 | 0.638 |
| 僅向量 | 0.936 | 0.916 | 0.507 | 0.692 | 0.454 |
| 混合 (RRF) | 0.954 | 0.938 | 0.640 | 0.798 | 0.544 |
| 混合 + 重排序器 | 0.969 | 0.963 | 0.788 | 0.891 | 0.716 |
如實解讀:
- 我們的 0.969 會話 recall@5 與先前研究在相同完整 500 題集上的 ≈0.95 相當 — 且在全規模下它具有區分力(BM25 的 0.920 → 重排序器的 0.969),而非像小樣本那樣趨於飽和。
- 重排序器再次成為最大的提升槓桿 — 回合 r@5 從 0.640 → 0.788,會話 r@5 從 0.954 → 0.969。
- 回合層級能揭示語料庫特性: 此處僅 BM25(0.680)優於 RRF 混合(0.640),因為純向量在這些單回合證據跨度上表現較弱(0.507);重排序器才是讓預設方案脫穎而出的關鍵。(對比 LoCoMo,純向量略勝 BM25。)
上下文效率
agentcairn 召回的上下文比原本需帶入模型的完整歷史小多少?預設配置(混合 + 重排序器,k=10):
| 資料集 | 查詢數 | 平均 haystack | 平均召回 (k=10) | 上下文縮減倍數 |
|---|---|---|---|---|
| LoCoMo (3 段對話) | 497 | 25,646 tok | 529 tok | 平均 51.1 倍 / 中位數 50.3 倍 |
| LongMemEval-S (完整 500) | 470 | 136,552 tok | 2,207 tok | 平均 64.7 倍 / 中位數 61.6 倍 |
此為估算值(~4 字元/token),非計費成本;"haystack" = 完整索引歷史,"recalled" = 回傳的前 k 個區塊。它衡量的是上下文大小,與檢索品質無關。
QA 準確度
QA 準確度數據(由 LLM 評判)也已提供,但使用的是 Anthropic 評判器而非論文的 GPT-4o,因此無法與已發表的排行榜比較 — 僅對相對消融訊號有效。關於如何執行及解讀這些數字,請參閱 benchmarks/README.md。
路線圖
- v1 — 已完成。 核心迴圈:對話紀錄攝取 → 去識別化 → Markdown → 可重建的 DuckDB 索引 → 混合召回;MCP 伺服器 + CLI;機密去識別化;本地嵌入;可重現的基準測試工具。
- v1.1 — 下一步,依上述基準測試排序優先級:
- ✅ 預設啟用重排序器 — 實測最大的檢索提升槓桿;使用
CAIRN_RERANK=0停用。(已發布) - Ollama 嵌入層級 — ✅ 透過
CAIRN_EMBEDDER=ollama使用本地模型(CAIRN_EMBED_MODEL/OLLAMA_HOST);雲端(OpenAI/Voyage)仍待完成。 - ✅ 雙時態有效性 — 前置資料
valid_from/valid_until/superseded_by;召回時軟性降級已取代/已過時的事實(非破壞性 — 永不隱藏),並為每個結果標註其時效性及一個as_of錨點,讓當前事實勝出,代理人能隨時間推理。(已發布) - 針對大型知識庫檢索延遲的記憶體內 HNSW。
- ✅ 預設啟用重排序器 — 實測最大的檢索提升槓桿;使用
- v2 — ◐ Obsidian 外掛 (agentcairn-obsidian) — 一個知識庫原生的記憶檢視(列表 + 來源 + 時效性 + 圖譜),用於在 Obsidian 中閱讀/導航你的記憶;(MVP 已發布;語義召回仍保留在 CLI/MCP 中)。MotherDuck 雲端同步、可選的 LLM 實體提取仍待完成。
開發
agentcairn 僅使用 uv 進行依賴管理與工具操作。
請勿使用 pip、poetry 或全域虛擬環境。
# First-time setup
uv sync # create .venv and install all deps (including dev)
uv run pre-commit install # install git hooks (ruff + pytest run on every commit)
# Daily use
uv run pytest # run the test suite
uv run cairn --help # run the CLI
uvx agentcairn # run the installed tool ephemerally (as the MCP server does)
# Formatting and linting
uv run ruff format . # format all Python files
uv run ruff check --fix . # lint with auto-fix
uv run pre-commit run --all-files
# Benchmarks (offline retrieval metrics need no API key)
uv run pytest benchmarks/tests/ # offline synthetic-fixture suite
PYTHONPATH=benchmarks uv run --group bench python -m cairn_bench.run --dataset locomo
MCP 伺服器透過 uvx agentcairn 啟動 — 無需全域安裝。
授權條款
Apache License 2.0 — 寬鬆授權,附帶明確的專利授權。版權所有 © 2026 Charles C. Figueiredo。
Footnotes
-
The Codex 外掛安裝及其捆綁的 MCP 伺服器(回想/搜尋/
remember)已在 Codex 中即時驗證。環境工作階段掛鉤(開始時回想,結束時擷取)隨外掛提供,並使用 Codex 已記錄的掛鉤結構,但其在 Codex 上的行為尚未端到端確認;無論如何,擷取也會透過cairn sweep以帶外方式進行。 ↩ -
Cursor 沒有外掛掛鉤,因此環境擷取是透過
cairn sweep以帶外方式進行(來源:Cursor 的全域globalStorage/state.vscdbSQLite 資料庫,cursorDiskKV表格,使用者 "bubbles")。Cursor 在輸出方面仍是一個 MCP 主機(cairn install cursor→~/.cursor/mcp.json);沒有 Cursor 外掛。cairn install cursor也會將using-agentcairn-memory技能(回想/記憶指引)安裝到~/.cursor/skills/using-agentcairn-memory/SKILL.md。 ↩ -
Gemini CLI(消費者)記錄汲取不受支援——Google 正在淘汰 Gemini CLI(消費者截止日 2026-06-18),轉而支援 Antigravity CLI,agentcairn 改為汲取後者。
cairn install gemini(MCP 伺服器連接)對於任何支援 MCP 的 Gemini 主機仍然有效。 ↩ -
The Antigravity 外掛捆綁了 MCP 伺服器 + 記憶技能;
cairn install antigravity --source <dir>透過agy plugin install安裝它,並從~/.gemini/config/mcp_config.json中移除任何過時的mcpServers.agentcairn條目。注意:agy plugin install接受本地目錄或已註冊的市集(而非 git 儲存庫),因此目前請將--source指向已複製檢出的plugin/目錄。Antigravity 沒有公認的外掛掛鉤,因此環境擷取是透過cairn sweep以帶外方式進行(路徑:~/.gemini/antigravity-cli/brain/<uuid>/.system_generated/logs/transcript.jsonl)。 ↩