Echocache

io.github.kskurtveit由 GitHub 帳號 kskurtveit 發布v0.1.3更新於 Oct 24, 2026

MCP server caching expensive LLM responses: HTTP-style freshness plus semantic recall.

概覽

AI 產生的概覽

將昂貴的 LLM 結論快取到本機 SQLite,具備 HTTP 式新鮮度與語意召回,讓助理能重複使用先前的結果。

可以做什麼
Echocache 儲存的是助理得出的結論,而不是它讀過的內容。cache_get 與 cache_set 以模型、提示詞與參數為鍵,並帶有 TTL 與 stale-while-revalidate 新鮮度;cache_query 依語意尋找相關項目;cache_related 沿著相似度與 derived-from 圖邊走訪;cache_invalidate 刪除項目並可串聯到相依項目;cache_stats 回報命中率與已提供的 token 數。所有項目存放在同一個可跨專案共用的 SQLite 檔案中。
適用情境
當助理反覆重新產生昂貴的研究或判斷結論,或需要跨工作階段、跨主機重新理解某個程式庫時,值得加入。README 指出它不適合用來快取檔案讀取,而且單一使用者在同一主機的同一專案中,可能已從宿主內建記憶取得大部分價值。
執行需求
以本機 stdio 程序執行,通常用 npx -y echocache 啟動,因此需要 Node.js 與 npm。不需要帳號、API 金鑰或網路存取。選用環境變數可設定 SQLite 路徑、LRU 上限、預設 TTL、相似度門檻與加密金鑰。
安裝前請注意
它會寫入本機 SQLite 資料庫,其中可能包含敏感結論;ECHOCACHE_ENCRYPTION_KEY 可啟用 AES-256-GCM 靜態加密,而開啟或關閉加密都需要全新的資料庫。cache_invalidate 會刪除項目並可能串聯到相依項目。README 說明跨專案重用這個情境尚未經過驗證。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Echocache,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

echocache — MCP server for cached LLM responses

An MCP server for a cached LLM response — the way an HTTP cache caches an expensive server response, not the way a browser caches a static asset. Ask a question you already answered once, and the answer echoes back instead of being re-derived.

Two lookup paths, inspired by two different kinds of caching:

  • Exact-match, HTTP-style — cache_get / cache_set key on (model, prompt, params), with ttl_seconds and stale_while_revalidate_seconds behaving like Cache-Control: fresh, stale, or expired.
  • Knowledge-graph recall — every stored entry is a node in a small similarity graph. cache_query finds related entries by meaning, not just exact key; cache_related walks graph edges (auto-linked "similar" entries, or explicit "derived-from" parents) to surface everything already known before an agent redoes work from scratch. cache_invalidate can cascade through those derived-from edges when a source changes.

Runs as a standard stdio MCP server, so it works with Claude Code, Claude Desktop, Cursor, VS Code + Copilot, or any other MCP-capable host — see Install below, and AGENTS.md for the tool-use protocol any connected agent should follow.

What it's for — and what it isn't

Cache what an agent concluded, never what it read. This is the whole design, and it is worth stating plainly because the intuitive use is the wrong one: serving a cached file read costs the reader exactly the tokens that reading the file cost, since the content still has to enter the context. So caching file reads saves nothing at any hit rate, and if the agent re-emits the file to store it, that's output-rate tokens paid for zero benefit. A cache only pays when a hit stands in for regenerating something.

Where it pays, and where measurement said it does not:

  • Pays best: an expensive research or judgment call. A real 22-tool-call research chain in this project's own history cost 37,119 output tokens to reach a 255-token conclusion — a 728x gap against serving that conclusion back, weighted for output pricing. A single reuse pays for the write ~145x over. Live-validated the same way with a fresh web-search-derived design decision, correctly recalled by different wording and correctly outranking an unrelated entry sharing surface vocabulary. Not proven to recur yet in this project's own history — but the payoff on one hit is large enough that low frequency isn't disqualifying, unlike a file read.
  • Pays conditionally: re-orientation across sessions. An agent reads a codebase to understand it, the session ends, and a later session needs that understanding again. On express/lib — six files, 62KB — re-reading the source costs 15,504 tokens against 549 to serve the cached orientation, about 28× fewer. That holds when the later session genuinely needs broad understanding; if it only needs one specific answer, it will grep and read a slice for ~900 tokens, and the cache isn't competitive.
  • Does not pay: replacing reads in a parallel dispatch. Thirty subagents in one code-review dispatch pulled ~374,000 tokens of content a sibling had already read — but 127 of their 166 reads used offset/limit, so they were already taking slices rather than whole files. Substituting a shared derivation for those slices measured 27% worse than what they actually did: grep is already a cheap, precise pointer, and a cached map competes with it on its own ground and loses.

The rule all three point at: cache what grep cannot reconstruct. A conclusion, a judgement, the reason something is the way it is, a cross-file synthesis no single search reveals, a research finding, the fact that something is absent. Never a location — grep finds those for less than the cache costs to consult — and never a file.

When a cached entry does carry file paths or line numbers, that is to point a reader at exact detail, not to replace reading it. And reach for cache_query rather than cache_get when looking for a match: a later session, or another agent, will not phrase the question the way the writer did.

What this is not: a way to avoid reading files, a source of truth, or a substitute for prompt caching within one conversation, which is cheaper and needs no server. echocache is for results that must outlive the context that produced them.

What Claude Code already does for free

If your only host is Claude Code, its own persistent memory already does the core of this: write a conclusion to a memory file instead of the files it came from, and a later session reads it back before redoing the work. That's the same rule this project converged on, running for free, with no server to register. This project's own findings and measurements from building it are stored there, not in echocache itself — worth noticing, since it means the tool wasn't used to cache the very research that produced it.

What's actually different, in order of how much it matters:

  • Cross-project sharing. Claude Code's memory is scoped to one project directory. echocache is one SQLite file any project on the machine can register against, so a conclusion reached in one repo is queryable from another. Real, but unproven: this project's own history shows zero instances of a conclusion actually getting reused across sessions, and cross-project reuse is a narrower bar than that.
  • Semantic recall. cache_query finds a match by meaning, independent of how it was phrased or which file it's filed under. Memory is retrieved by an always-loaded index plus the agent's own judgment about what to open — no vector search.
  • Host-agnostic. Works from Cursor, VS Code, Claude Desktop, or any other MCP client — memory is native to Claude Code specifically.
  • Explicit freshness. TTL/stale-while-revalidate freshness and hash-based derived_from invalidation catch a source going stale automatically. Memory has neither; staleness is caught only if an agent happens to notice.

For a single user on a single host in one project, memory already captures most of the value here for free. What's left as echocache's actual case is narrower than "a cache for LLM responses": it's specifically sharing a derivation across projects or hosts that don't already share a memory store — and that narrower case is unproven, not just untested, until it's been measured the way everything else in this document has.

Install

No clone or build needed — register it straight from npm.

Claude Code

sh
claude mcp add echocache -- npx -y echocache

Claude Desktop / Cursor / VS Code — add a stdio entry to the host's MCP config (claude_desktop_config.json, .cursor/mcp.json, .vscode/mcp.json):

json
{  "mcpServers": {    "echocache": {      "command": "npx",      "args": ["-y", "echocache"]    }  }}

OpenCode — add an entry to opencode.jsonc (global: ~/.config/opencode/opencode.jsonc, or project-level in the repo root):

jsonc
{  "$schema": "https://opencode.ai/config.json",  "mcp": {    "echocache": {      "type": "local",      "command": ["npx", "-y", "echocache"],      "enabled": true    }  }}

Any other MCP-capable host takes the same launch command; only the config file differs. Then point your agent at AGENTS.md so it knows when to reach for the cache — the protocol matters more than the wiring, since caching the wrong things costs tokens rather than saving them.

The usage protocol also ships as skills (echocache-cache, echocache-gain), plus a codebase-orienter subagent for Claude Code. Inside a clone of this repo they are discovered automatically from .claude/skills/ and .opencode/skills/. The npm package carries them too, but a host only discovers skills in its own skills directory, so install them once after npm install -g echocache:

sh
# Claude Codemkdir -p ~/.claude/skills ~/.claude/agentscp -r "$(npm root -g)"/echocache/.claude/skills/echocache-* ~/.claude/skills/cp "$(npm root -g)"/echocache/.claude/agents/codebase-orienter.md ~/.claude/agents/
# OpenCodemkdir -p ~/.config/opencode/skillscp -r "$(npm root -g)"/echocache/.opencode/skills/echocache-* ~/.config/opencode/skills/

Configuration

Every setting is an environment variable, all optional:

VariableDefaultMeaning
ECHOCACHE_DB_PATH~/.echocache/cache.dbSQLite file location
ECHOCACHE_MAX_ENTRIES10000LRU ceiling on retained entries
ECHOCACHE_MAX_BYTES268435456 (256MB)LRU ceiling on retained response bytes
ECHOCACHE_DEFAULT_TTL_SECONDSunset (never expires)Freshness lifetime when a caller omits one; entries are still bounded by the LRU ceilings
ECHOCACHE_SIMILARITY_THRESHOLD0.25Similarity floor for auto-linking entries
ECHOCACHE_LINK_CANDIDATE_POOL500Recent entries a new write is compared against
ECHOCACHE_ENCRYPTION_KEYunset64 hex chars (32 bytes); enables AES-256-GCM at rest

The database directory is created 0700 and its files 0600. Set an encryption key to also encrypt entry contents at rest:

sh
export ECHOCACHE_ENCRYPTION_KEY=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")

Turning encryption on or off requires a fresh database — there is no in-place migration, and a key/database mismatch is refused at startup rather than failing on some later read.

Tools

ToolPurpose
cache_getExact-match lookup with fresh / stale / expired freshness
cache_setStore a result; auto-links it into the similarity graph
cache_querySemantic search across all cached entries
cache_relatedGraph traversal from one entry to entries linked to it
cache_invalidateDelete an entry, optionally cascading to its dependents
cache_statsExact-match hit rate, queryHits/queryMisses, and tokens served

One SQLite file backs all of them, shared across every project that registers the server — a conclusion reached in one repo is queryable from another. Concurrent readers and writers from separate processes are the expected case, not an edge case.

Developing

sh
git clone https://github.com/kskurtveit/echocache && cd echocachenpm installnpm run check        # typecheck + testsnpm start            # or: npm run dev

See CLAUDE.md for architecture and the module reference.

License

MIT

來源:README.md,提交 285892b

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.3最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分