关于 Midas
Midas 是面向长周期 AI Agent 的本地记忆层,适合希望跨会话保留决策、约束和事实的开发者。它不在摄取时调用 LLM,回忆可追溯到原始对话,并通过守卫阻止基于过期或未确认记忆的危险操作。
主要功能
- 01本地 SQLite 共享记忆
- 02无需 LLM 的记忆摄取与检索
- 03回忆内容可追溯至原始对话
- 04修订过期信念并选择性遗忘
- 05危险操作需有效确认
适用场景
- 01让编码 Agent 延续跨会话项目决策
- 02查看当前事实及会话间变化
- 03在破坏性操作前检查记忆确认
MCP 相关
Midas 提供标准 MCP 服务,客户端可通过 midas-mcp 或 HTTP MCP URL 连接。midas init 可配置检测到的 MCP 客户端,使其共享同一记忆库。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx midas-memory-mcpMIDAS_MCP_DBPath to a SQLite file to persist memory across restarts (default: in-memory)MIDAS_MCP_EMBEDDEREmbedding backend: 'local' (bge ONNX, offline) or 'hashing' (default: local)MIDAS_MCP_MAX_RECORDSCap the store; above it the lowest-value memories are auto-forgotten (no LLM)MIDAS_MCP_MIN_IMPORTANCERelevance floor 1-5 for auto-capture; turns scoring below it are skipped本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Midas
面向长周期 AI Agent 的本地记忆层——跨会话记住信息,保持内容最新,不会依据过时记忆采取行动。
摄取时不使用大模型 · 每条消息成本为 $0 · 完全本地运行 · 每次召回都能追溯到来源。
你的 AI 助手会在会话之间忘掉一切。Midas 是与你的助手并肩运行、驻留在你电脑上的记忆层。你的编码 Agent 能记住三次会话之前的决策、约定和错误——无需将每条消息都交给大模型“提取”事实。每条消息都无需付费,任何内容都不会离开你的电脑,每条记忆都能追溯到它所源自的确切轮次,并且不会让 Agent 根据过时或未经确认的记忆采取行动。
uv tool install "midas-memory[mcp,local]" # install
midas init # create the shared memory + wire up your MCP clients
# or, no Python: npx -y midas-memory-mcp # TypeScript port
# or, as a library: pip install "midas-memory[local]"
uv tool upgrade midas-memory # Update Midas
在你的 Agent 中安装 · 查看基准测试 · 完整概览 · 路线图
为什么选择 Midas
大多数记忆工具都会调用大模型总结每次会话——这意味着你要一直付出 Token 成本、增加延迟、将每轮对话发送给服务提供商,并得到无法审查的改写后事实。Midas 选择了相反的做法,而这正是它低成本、私密且可信的原因:
- **成本为 $0,设计上保护隐私。**摄取或查询时不使用大模型 → 无 API 费用,内容不会离开你的电脑,本地操作快速(约几十毫秒,无需每轮都进行网络往返)。
- 你可以信任它召回的内容。召回会返回逐字一致的源对话轮次,而不是大模型改写的内容——因此没有任何提取步骤会悄悄编造你从未说过的“事实”。
- **内容会自动保持最新。**类型化信念修订会用新值取代旧值,而不是不断堆积重复项;选择性遗忘则能控制记忆规模——这一切都不需要大模型。
- 可以安全地基于它构建功能。来源防护机制允许记忆辅助规划,但会阻止以记忆为依据的外部操作或破坏性操作,除非你明确确认——而且,已被取代的记忆根本无法授权任何操作。
- **一个文件,多种工具。**让 Claude Code、Cursor 和你的聊天应用指向同一个 SQLite 文件,它们就能共享一份实时记忆。
- **有实证,不空谈。**每项主张都有可复现的基准测试——包括失败的实验。
Midas 对比
以下每项 Midas 数据均在此仓库中测得且可复现;“摄取时调用大模型”一栏反映了这类设计的结构性特点(Mem0、Zep、Hindsight),相关数据记录在 BENCHMARKS.md 中。
| Midas | 摄取时调用大模型的系统(Mem0、Zep、Hindsight) | |
|---|---|---|
| 摄取时的大模型调用次数 | 0 | 每个会话 ≥1 次 |
| 每条消息的成本 | $0 | 按 token 计费的 API 支出,永久持续 |
| 摄取时的数据外传 | 无 | 每轮对话都会离开本机 |
| 摄取延迟 | ~16–116 ms,本地,受嵌入速度限制 | ~668 ms + API 往返 |
| 检索返回内容 | 原文来源对话轮次,可追溯 | 经大模型改写的事实(无法计算来源的 recall@k) |
| 确定且可复现 | 是——每个数据都能用一条命令复现 | 否 |
| 完全离线运行 | 是(使用本地 Ollama 阅读器端到端测量) | 否 |
LongMemEval-s 判定答案(gpt-4o) | 0.84 | 0.84——Observational Memory,摄取时调用大模型 |
| 整段对话聚合 / 总结 | ❌ 按设计如此——top-k 检索无法覆盖(文档说明) | ✅ 它们的结构性优势 |
最后一行是有意为之:Midas 以整段对话处理能力换取 $0 成本、隐私和可审计性,并公开测量数据,准确展示这种取舍的影响。
不止于检索:可治理的记忆
找到埋藏的事实只是基本要求。长期运行的编码 Agent 需要能够安全地采取行动并顺畅地恢复工作的记忆——而这正是单靠相似度搜索力有不逮之处:
| 你问…… | Midas 给出的回答 | 为什么 top-k 检索做不到 |
|---|---|---|
| “我可以运行这个破坏性迁移吗?” | Guard:只有在你确认过,且该确认仍然有效时才允许执行 | 来源信息 + 时效性无法通过相似度匹配 |
| “Apollo 项目的当前状态是什么?” | memory_state:当前有效、未被取代的决策 / 约束 / 事实 | 宽泛的“当前状态”查询无法匹配到单个对话轮次 |
| “自上次会话以来有什么变化?” | memory_diff:新增的信念,以及修订过的信念(旧 → 新) | “有什么新内容”根本不是内容查询 |
| “怎样加快交易列表的速度?” | 重新找到之前的修复方案,让 Agent 不必重新诊断 | — |
这些特性经过了测量,而非仅仅宣称——agent-memory 基准测试套件评估了行动安全性、决策遵循度、避免重复犯错、恢复保真度、冲突检测 / 精确率(找出 Agent 之间实际存在的矛盾而不过度标记),以及脚本化多会话项目中的对抗性记忆安全性。安全评估成功拦截 10 / 10 次对抗攻击(ASR 0.00)——包括在禁令旁植入一条确认信息、针对不同操作的确认、通过来源洗白进行取代,以及跨命名空间审批——同时没有过度拦截(良性通过率 1.00)。确定性、$0、无需大模型。用一条命令复现所有数据:
uv run python -m eval.benches # the whole governance suite — or `midas bench` from a checkout
基准测试表现如何
确定性、不受读者影响的检索(recall@k——被提取到上下文中的黄金支撑轮次占比),在完整公开数据集上的表现,与近期窗口基线对比:
| 基准(完整数据集) | 基线 | Midas |
|---|---|---|
LongMemEval-s — 500 个问题,246,750 轮 | 0.01 | 0.92 |
| LoCoMo — 10 段对话,n=1,540 | 0.05 | 0.73 |
| BEAM — 前沿基准,100K → 10M 个 token | 0.00 | 0.56 → 0.32 |
以及跨系统指标:评审判定的回答率(使用排行榜采用的同一 gpt-4o 评审器):
| 评审判定的回答 | 基线 | Midas |
|---|---|---|
LongMemEval-s(gpt-4o 阅读器,追平 LLM 摄取 SOTA,摄取成本 $0) | — | 0.84 |
| BEAM-100K(gpt-4o 评审器,原始轮次基线,摄取成本 $0) | 0.05 | 0.40 |
摄取时全部实现 0 次 LLM 调用、$0 成本和 0 数据外传。完整数据、分类明细、复现命令,以及与 Mem0/Zep/Mastra 的正面对比,详见 BENCHMARKS.md。
以评测为先,意味着我们也会公布失利之处。 混合检索、重排序、线程多样化、双粒度索引和朴素蒸馏都经过测量,结果表明它们没有帮助(或反而有害),我们也如实记录了这些结果。坦诚正是重点——请参阅 BENCHMARKS.md 和
docs/frontier-2026.md。
将其连接到你的编码 Agent
一条命令即可完成所有配置:
midas init # creates the shared memory + configures every MCP client it finds
midas status # check what's wired · run `midas init --dry-run` to preview first
两种方式都支持使用 --json 输出机器可读的 客户端连接配置回执——记录每个客户端连接到哪份记忆、采用何种范围/策略,以及跳过了哪些客户端(仅包含配置路径,绝不包含记忆内容)。将其粘贴到错误报告中,或让其他 Agent 在不抓取文本说明的情况下验证配置。
midas init 会创建一份共享记忆(~/.midas/memory.sqlite3),并将其连接到检测到的 MCP 客户端——Claude Code、Codex、Grok Build、Cursor、Claude Desktop、Windsurf、VS Code、Gemini CLI、Cline、Zed。这样,所有 Agent 都能自主读写同一份记忆,无需维护各客户端各自的路径。
希望使用单个端点,而不是为每个客户端单独启动?运行一个服务,并向客户端提供 MCP URL:
midas serve --http # → http://127.0.0.1:7077/mcp (one server, one memory, every client shares it)
midas serve --http --token <secret> # require `Authorization: Bearer <secret>` on every request
使用 midas update 保持 Midas 为最新版本。随时使用 midas inspect 查看记忆。
已经将 Agent 记忆保存在文件中?运行 midas import --from claude-md CLAUDE.md(或
--from cursorrules、--from jsonl、--from mem0、--from zep),即可将这些规则和导出内容转化为一等公民、可供回忆和治理的记忆——标记其来源,重复运行也不会重复导入。
希望即使 Agent 从未调用 capture,也能保存记忆?运行 midas init --claude-hook,安装 Claude Code SessionEnd 钩子,将每个会话中的用户发言交由记忆系统处理——Midas 的无 LLM 策略仍会决定实际保留哪些内容。
手动配置 — 适用于任意客户端,或用于自定义(点击展开)
Midas 是一个标准的 MCP 服务:将任意客户端指向 midas-mcp 命令即可。默认使用共享存储,无需指定路径。通用配置块:
{ "mcpServers": { "midas": { "command": "midas-mcp", "env": { "MIDAS_MCP_EMBEDDER": "local" } } } }
| 客户端 | 配置位置 |
|---|---|
| Claude Code | claude mcp add midas -s user -e MIDAS_MCP_EMBEDDER=local -- midas-mcp |
| Cursor | ~/.cursor/mcp.json — 粘贴 JSON 配置块 |
| Claude Desktop | Settings → Developer → Edit Config (claude_desktop_config.json) — 粘贴并重启 |
| Codex CLI | codex mcp add midas -- midas-mcp |
| Grok Build | grok mcp add --scope user midas -e MIDAS_MCP_EMBEDDER=local -e MIDAS_MCP_CLIENT=grok-build -- midas-mcp |
| Windsurf | ~/.codeium/windsurf/mcp_config.json — 粘贴配置块 |
| VS Code | 用户级 mcp.json(servers 键,"type": "stdio")— midas init 会写入配置 |
| Gemini CLI | ~/.gemini/settings.json(mcpServers 键)— midas init 会写入配置 |
| Cline | VS Code 全局存储中的 cline_mcp_settings.json — midas init 会写入配置 |
| Zed | settings.json → context_servers — midas init 会写入配置 |
| 其他客户端 | 将其指向命令 midas-mcp |
| 没有 Python | npx -y midas-memory-mcp — TypeScript 移植版(实验性;可通过可选的 @huggingface/transformers 实现语义嵌入) |
通过环境变量按客户端覆盖设置:MIDAS_MCP_DB(默认值为 ~/.midas/memory.sqlite3;:memory: = 临时)
· MIDAS_MCP_MAX_RECORDS · MIDAS_MCP_MIN_IMPORTANCE · MIDAS_MCP_NAMESPACE。
⚠️ GUI 应用不会共享 shell 的
PATH。 如果客户端提示 “command not found”,请使用which midas-mcp获取的绝对路径。在 Windows 上,请在 JSON 路径中使用正斜杠。
连接后,Midas 会向 Agent 注入一段简短策略(先回忆,再记录持久事实/决策/偏好/约束/更正)。Agent 可以自由捕获内容;由 Midas 决定保留什么——它会为重要性打分(不使用 LLM)、丢弃琐碎内容、跳过重复项、修订过时的认知,并忘记低价值内容以保持记忆规模受限。在执行任何以记忆为依据的外部操作或破坏性操作之前,Agent 都会调用 check_memory_use;除非你已确认,否则该操作会被阻止(且确认仍须有效)。
一份记忆,多个客户端
默认情况下,每个客户端共享一份实时记忆(~/.midas/memory.sqlite3)——每个客户端都会检测其他客户端的写入(SQLite data_version)并刷新,因此你在 IDE 中捕获的信息,几秒后就能从聊天应用中检索到,无需重启。
想要按项目分别隔离吗?运行 midas init --project-scoped(或设置 MIDAS_MCP_NAMESPACE=auto),即可让每个项目在同一存储中拥有独立分区——作用域根据服务运行时所在的 git 仓库 / cwd 确定。也可以通过 MIDAS_MCP_NAMESPACE 按项目 / Agent / 用户手动设置作用域。
真实运行,重构的界面——捕获 / 检索的行是两个独立进程共享同一文件时的原样输出。
所有工具和环境变量选项
工具: remember、capture(受策略控制的自动存储)、recall(可追溯来源)、build_context
(精简、带日期、以今天为锚点的提示词块)、resume(一次调用即可完成会话引导的组合包:固定内容 +
状态 + 变更 + 未完成事项 + 冲突)、memory_state(当前项目状态)、memory_diff
(自上次以来的变更)、memory_conflicts(相互矛盾的当前认知,按优先级排序)、
open_loops / remember_commitment / close_loop(可跨会话保留的承诺工作)、
check_memory_use(守卫)、memory_policy、maintain(TTL + 去重 + 遗忘,并返回删除
审计记录)、stats、forget(保证链完整)、forget_matching(按主题擦除,默认先试运行)、
forget_all。提示词:memory_session、distill。
环境变量: MIDAS_MCP_DB · MIDAS_MCP_EMBEDDER(local / hashing / multilingual / 任意 fastembed id)·
MIDAS_MCP_MAX_RECORDS · MIDAS_MCP_MIN_IMPORTANCE · MIDAS_MCP_NAMESPACE(=auto → 按项目设置作用域)· MIDAS_MCP_ANN=1(用于超大型存储的
次线性 IVF)· MIDAS_MCP_SUPERSEDE · MIDAS_MCP_NLI=1(由 NLI 控制的修订)·
MIDAS_MCP_AUTO_MAINTAIN=<min>(空闲时维护)· MIDAS_MCP_PINNED(固定常驻指令)·
MIDAS_MCP_TTL(按类型设置保留期限,例如 chat=30,note=90)· MIDAS_MCP_TOKEN(HTTP bearer 身份验证)·
MIDAS_MCP_KEY(静态数据使用 SQLCipher 加密——pip install "midas-memory[encrypted]")。
故障排除
配置哪里没接好?midas doctor 可通过一条命令进行诊断——它会检查 midas-mcp 是否位于
PATH 中、存储能否打开、本地嵌入器是否可用,以及哪些客户端已实际接入;每项失败的检查都会附带修复提示。它只读取配置路径和版本——不读取记忆内容,
因此其输出可安全地粘贴到错误报告中。
midas doctor # ✓/⚠ per check, with a hint for each failure
midas status # what's wired + the store's record count
| 症状 | 可能原因及修复方法 |
|---|---|
| 客户端提示 "command not found" | GUI 应用不会继承你的 shell PATH。在客户端配置中使用 which midas-mcp 返回的绝对路径。 |
| 检索效果差 / 偏向词面匹配 | 当前使用的是离线 hashing 嵌入器。安装本地嵌入器:uv tool install "midas-memory[mcp,local]"(或 pip install "midas-memory[local]")。midas doctor 会指出这一点。 |
| 一个客户端看不到另一个客户端的记忆 | 确认两者指向同一存储——midas status 会显示路径;接入凭据(midas status --json)会显示每个客户端的确切命令和环境变量。 |
| MCP 服务无法启动 | 已安装 SDK,但未安装 [mcp] 附加组件——运行 pip install "midas-memory[mcp]"。midas doctor 会对此进行明确提示。 |
仍然无法解决?请提交错误报告
(其中会预先填入 midas doctor 信息),或在讨论区提问。
在 Python 中使用(SDK)
from midas import Memory, LocalEmbedder
mem = Memory(embedder=LocalEmbedder()) # fully local. (Or Memory() for a zero-setup offline embedder.)
mem.remember("Decision: the primary database is PostgreSQL.", kind="constraint", importance=5)
mem.remember("The launch date moved to September 14.", kind="fact", importance=5)
mem.capture("lol ok cool") # filler — auto-scored below the floor, skipped (no LLM)
mem.assemble("when do we launch?", token_budget=128) # prompt-ready, dated, source-traceable
for hit in mem.recall("which database did we pick?", limit=3):
print(f"{hit.score:.2f} {hit.record.content}") # each hit traces to its source
项目状态与差异 · 信念修订 · 遗忘 · 命名空间 · 双时态 · LangGraph
from midas import Memory, LocalEmbedder
from midas.nli import LocalNLI
from midas.sqlite_store import SQLiteStore
from midas.state import memory_state, memory_diff # the control-plane views
# Durable, shareable, no native extension. Safe across threads & processes (live data_version refresh).
mem = Memory(store=SQLiteStore("memory.db"), embedder=LocalEmbedder(),
supersede=True, nli=LocalNLI()) # a turn that CONTRADICTS an old belief supersedes it
# Control-plane: the current state of a project, and what changed since a point in time (no LLM):
memory_state(mem, scope={"project": "apollo"}) # live, non-superseded decisions/constraints/facts
memory_diff(mem, since=last_session_epoch) # {added: [...], revised: [(old, new), ...]}
mem.forget_decayed(max_records=50_000) # evict lowest value (importance × recency); protects facts
mem.recall("when is the launch?", as_of=1_700_000_000) # bitemporal: "what did we believe on date X"
# Right-to-be-forgotten — preview, then erase, with an audit trail:
mem.forget_matching("the user's home address", dry_run=True)
mem.forget_matching("the user's home address")
# Back LangGraph's long-term memory with Midas:
from midas.integrations.langgraph_store import MidasStore
store = MidasStore(); store.put(("user", "123"), "pref", {"text": "prefers dark mode"})
查看并管理你的记忆 — midas inspect
大多数记忆都是由大模型改写事实而成的黑箱。Midas 是玻璃箱:在你的存储上运行本地检查器,准确查看 Agent 记住了什么、为什么记住,以及信息来自何处——然后进行更正、固定或遗忘。
midas inspect --db ~/.midas/memory.sqlite3 # opens http://localhost:7777 — local only, zero egress
# before install: python -m midas.inspector --db <your.sqlite3> --embedder hashing
- 概览 — 计数、可归因性、30 天活动图表,以及按类型/来源/新近度的细分;每种类型和来源在所有视图中始终使用相同颜色(固定的分类调色板,并已验证两种主题下的色彩对比对色盲用户安全——绝不只靠颜色传达信息,每个值都保留标签)。
- 浏览与搜索所有记忆(原文显示,附带来源和信息源),可按类型、来源和排序方式筛选。
- 信念历史与时间回溯 — 你曾相信什么、被什么取代,以及发生的时间。
- 项目状态(决策/Bug/禁止事项)以及自某个日期以来的变更内容。
- 治理 — 记忆是否会授权某项操作,以及原因(审计轨迹);遗忘并生成回执。
- 冲突和未结事项 — 与
memory_conflicts/open_loops相同的控制平面视图,并可在 UI 中一键解决/关闭。 - 审计日志 — 哈希链的验证状态及最新条目。
- 亮色与暗色主题(真正的第二种主题,而非反转后的暗色主题)、键盘快捷键(⌘K 可跳转到任意位置或搜索,/ 可聚焦搜索框),以及适配至手机屏幕宽度的响应式布局。
每次变更(写入/修订/遗忘)都会在存储中追加到防篡改、哈希链式审计日志——仅保存哈希,从不保存内容。midas audit 可查看日志;midas audit --json 会验证整条链,并在有人篡改历史记录时报告首个被破坏的条目。
无需大模型、无需账户,直接在你的文件上运行。这正是黑箱记忆无法展示的内容。
免费且开源
Midas 完全免费,并基于 MIT 开源——包括记忆引擎、守卫、MCP 服务、CLI、检查器、TypeScript 移植版,以及完整的 基准测试套件。 没有付费层级、功能限制、遥测或账户。你可以使用、分叉,并将其嵌入商业产品——许可证允许这一切。
如果 Midas 对你有帮助,最好的回馈方式是给一个 ⭐、提交一个复现的基准测试结果、报告 Bug,或提供一项经过测量的贡献——请查看路线图,了解哪些方面最需要帮助。
坦诚说明现状
Midas 尚处早期,但专注于狭窄范围,并以测量为先。当前进展如下:
- 检索是它的强项,在无大模型设计中已基本达到上限——这既得到我们自己的 A/B 测试确认,也得到前沿论文的印证(检索器并非瓶颈)。上面的基准测试结果正是如此。
- 前沿领域的额外突破点在于保留结构的提取——这需要能力足够强的模型,而 Midas 刻意不会在写入时运行这类模型。我们构建了经过评测的测试框架,并在 BEAM 的摘要类别上进行了测量:小型本地提取器并无帮助(原始方案的评分标准覆盖率为 0.28,替换方案为 0.07),而效果提升取决于强大的模型——因此,这项能力应属于Agent 的模型,而非 Midas。可选的蒸馏选项默认关闭;我们不宣称它带来了优势。(详情:
docs/frontier-2026.md§2b。) - 发展方向:从回忆走向受治理的记忆控制平面——
memory_state/memory_diff、不会基于过时或未经确认的记忆采取行动的来源守卫,以及用于衡量这些特性的 Agent Continuity Bench。保持本地可运行、可审计,并如实说明已验证的内容。
评测框架
eval/(仅供开发使用)使用合成数据 / LoCoMo / LongMemEval / 多日数据 / conflicts-v1 / BEAM 对 Midas 和竞品进行评测,提供确定性的 recall@k + precision@k、成本 / 延迟监测、简易读取器消融实验(证明结果并非由读取器夸大),以及可选的本地或托管 LLM 评判器。防作弊检查清单(不重写查询、摄取时不使用 LLM、不泄露标注答案、使用带种子的抽样)、冲突处理、失败追踪和 MCP 政策原文详见
docs/methodology.md。
python -m eval.runner --dataset longmemeval --variant s --local --midas-no-rerank --max-questions 40
python -m eval.runner --dataset beam --beam-tier 100K --local --dumb-reader # frontier benchmark
python -m eval.continuity # Agent Continuity Bench
隐私与许可证
本地优先:每条记忆都保存在你设备上的 SQLite 文件中,回忆会返回完全一致的已存储文本,且捕获 / 回忆 / 忘记操作不会发起网络请求。无需账号、API 密钥或遥测。唯一的出站流量是一次性下载嵌入模型(适用于 local 后端)以及安装软件包。
可选的静态加密:通过 [encrypted] 附加组件设置 MIDAS_MCP_KEY 后,存储库将成为 SQLCipher 数据库——没有密钥就无法读取(Midas 会默认拒绝写入,而不会悄悄写入明文)。完整详情见 PRIVACY.md · MIT。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。