mcpField
M
Midas

Midas

本地服务
github.com/vornicx记忆与知识1513 周前更新

关于 Midas

Midas 是面向长周期 AI Agent 的本地记忆层,适合希望跨会话保留决策、约束和事实的开发者。它不在摄取时调用 LLM,回忆可追溯到原始对话,并通过守卫阻止基于过期或未确认记忆的危险操作。

主要功能

  1. 01本地 SQLite 共享记忆
  2. 02无需 LLM 的记忆摄取与检索
  3. 03回忆内容可追溯至原始对话
  4. 04修订过期信念并选择性遗忘
  5. 05危险操作需有效确认

适用场景

  1. 01让编码 Agent 延续跨会话项目决策
  2. 02查看当前事实及会话间变化
  3. 03在破坏性操作前检查记忆确认

MCP 相关

Midas 提供标准 MCP 服务,客户端可通过 midas-mcp 或 HTTP MCP URL 连接。midas init 可配置检测到的 MCP 客户端,使其共享同一记忆库。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"vornicx-midas": {
"command": "uvx",
"args": [
"midas-memory-mcp"
],
"env": {
"MIDAS_MCP_DB": "<MIDAS_MCP_DB>",
"MIDAS_MCP_EMBEDDER": "<MIDAS_MCP_EMBEDDER>",
"MIDAS_MCP_MAX_RECORDS": "<MIDAS_MCP_MAX_RECORDS>",
"MIDAS_MCP_MIN_IMPORTANCE": "<MIDAS_MCP_MIN_IMPORTANCE>"
}
}
}
}
启动命令uvx midas-memory-mcp
需要配置的环境变量
MIDAS_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypimidas-memory-mcp0.0.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Midas

面向长周期 AI Agent 的本地记忆层——跨会话记住信息,保持内容最新,不会依据过时记忆采取行动。
摄取时不使用大模型 · 每条消息成本为 $0 · 完全本地运行 · 每次召回都能追溯到来源。

测试 PyPI npm Python 3.11+ 许可证:MIT

你的 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.840.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.010.92
LoCoMo — 10 段对话,n=1,5400.050.73
BEAM — 前沿基准,100K → 10M 个 token0.000.56 → 0.32

以及跨系统指标:评审判定的回答率(使用排行榜采用的同一 gpt-4o 评审器):

评审判定的回答基线Midas
LongMemEval-s(gpt-4o 阅读器,追平 LLM 摄取 SOTA,摄取成本 $0)—0.84
BEAM-100K(gpt-4o 评审器,原始轮次基线,摄取成本 $0)0.050.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 Codeclaude mcp add midas -s user -e MIDAS_MCP_EMBEDDER=local -- midas-mcp
Cursor~/.cursor/mcp.json — 粘贴 JSON 配置块
Claude DesktopSettings → Developer → Edit Config (claude_desktop_config.json) — 粘贴并重启
Codex CLIcodex mcp add midas -- midas-mcp
Grok Buildgrok 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 会写入配置
ClineVS Code 全局存储中的 cline_mcp_settings.json — midas init 会写入配置
Zedsettings.json → context_servers — midas init 会写入配置
其他客户端将其指向命令 midas-mcp
没有 Pythonnpx -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 / 用户手动设置作用域。

两个运行中的进程共享同一个 Midas SQLite 文件:一次检索未找到内容,另一个进程进行捕获,随后同一个未重启的会话再次检索并找到内容

真实运行,重构的界面——捕获 / 检索的行是两个独立进程共享同一文件时的原样输出。

所有工具和环境变量选项

工具: 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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。