关于 Memora
Memora 是面向 AI Agent 的持久化协作记忆层,提供结构化存储、语义检索和图关系,适合需要跨会话保留上下文的 Agent 工作流。它通过吸收内容、去重与版本沿袭来组织记忆,并可按主题汇总记忆、待办事项及来源。
主要功能
- 01持久化存储与多数据库路由
- 02吸收内容并识别重复和更新
- 03保留被替代记忆的版本沿袭
- 04语义、全文及混合检索
- 05文档片段、待办事项与问题管理
- 06交互式知识图谱与记忆洞察
适用场景
- 01在多个会话间保留 Agent 上下文
- 02检索主题相关记忆、待办和来源
- 03维护知识更新及其历史版本
- 04搜索文档片段并查看记忆关系
MCP 相关
Memora 作为 MCP 服务向客户端提供记忆存储、吸收、检索、摘要和管理工具。可通过本地 stdio 或 HTTP 传输运行。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Memora
“只有当某个瞬间成为回忆,你才会真正懂得它的价值。”
为 AI Agent 提供持久的集体记忆
面向 Agent 的 MCP 记忆层:提供结构化存储、语义检索、图关系,以及有来源支撑的跨会话上下文。
将 Agent 的工作吸收到持久化图记忆中,然后使用 memory_digest(topic) 检索相关记忆、待办事项/问题、相关边和来源 ID。
功能 · 预览 · 安装 · 用法 · 配置 · 多数据库 · 容器 · 实时图 · 云端图 · 聊天 · 语义搜索 · 文档 · 大模型去重 · 关联 · Neovim
## 功能核心存储
- 💾 持久化存储 - SQLite,支持可选的云同步(S3、R2、D1)
- 🗄️ 多数据库路由 - 一个进程服务多个存储;工作区通过
/mcp/<name>访问自己的存储(参见多数据库路由) - 📂 分层组织 - 支持章节/子章节结构,并自动分配层级
- 📦 导出/导入 - 通过合并策略进行备份和还原
吸收与沿袭
- 🧬 吸收 - 输入事实;大模型会将每条事实与存储中的内容进行分类比对(重复/更新/矛盾/相关/新增),跳过重复项、关联相关内容并整合相关事实——支持使用
dry_run预览 - 🌱 取代沿袭 - 更新会取代旧知识,而不是将其删除;默认情况下,检索会沿着沿袭链追踪到当前版本(
follow模式:active、latest、full_history)- 删除任意版本都会使整条沿袭失效(已删除的事实不会以旧版本的形式重新出现):
follow=latest/active会隐藏所有版本;对某个版本调用memory_get会返回not_found,并以retired: true说明删除原因(“因删除 #N 而失效”);follow=all仍可读取该版本;向已失效的 ID 添加supersedes边不会恢复它。 memory_absorb不会取代条目记录(metadata.kind = "item-record"或标签item-record):事实会被写入,并通过related_to建立关联。待办事项和 issue 受类型边界保护(普通事实永远不会取代带类型的条目)。
- 删除任意版本都会使整条沿袭失效(已删除的事实不会以旧版本的形式重新出现):
- 🗞️ 主题摘要 -
memory_digest(topic)会将相关记忆、未完成的待办事项/issue、相关边和来源 ID 整合为一次检索结果
搜索与智能
- 🔍 语义搜索 - 向量嵌入(TF-IDF、sentence-transformers、OpenAI)
- 🎯 高级查询 - 全文、日期范围、标签筛选(AND/OR/NOT)、混合搜索
- 🔀 交叉引用 - 根据相似度自动关联相关记忆
- 🤖 大模型去重 - 通过 AI 驱动的比对查找并合并重复项
- 🔗 记忆关联 - 支持类型化边、重要性提升和集群检测
文档存储
- 📄 结构化文档 - 将 Markdown 文档存储为可搜索的片段树(声明、计划项、参考资料、风险)
- 🔒 片段完整性 - 防止意外删除、合并或吸收文档片段
- 🔍 细粒度搜索 - 可对单条声明和发现进行语义搜索,同时仍可将完整文档作为整体检索
工具与可视化
- ⚡ 记忆自动化 - 为待办事项、issue 和章节提供结构化工具
- 🕸️ 知识图谱 - 支持 Mermaid 渲染和集群叠加层的交互式可视化
- 🌐 实时图谱服务 - 内置 HTTP 服务,并提供云托管选项(D1/Pages)
- 💬 与记忆对话 - 由 RAG 驱动的聊天面板,借助大模型工具调用,通过流式聊天搜索、创建、更新和删除记忆
- 📡 事件通知 - 基于轮询的 Agent 间通信系统
- 📊 统计与分析 - 标签使用情况、趋势和关联洞察
- 🧠 记忆洞察 - 活动摘要、过时检测、整合建议和大模型驱动的模式分析
- 📜 操作历史 - 跟踪所有记忆操作(创建、更新、删除、合并、提升、关联),并以分组时间线形式展示
JSON API(/api/v1)
服务器可以在 /api/v1/<store>/{health,search,absorb} 下提供纯 JSON API
(线协议约定见 contracts/memora-api/v1/)。除非设置了 MEMORA_API_TOKENS_FILE,否则该 API 默认关闭;此变量必须指向绝对路径。未设置该变量是有意为之,日志级别为 INFO,而非 ERROR(问题 1131)。
该文件保存的是 sha256 摘要,绝不保存令牌。服务器以
O_RDONLY | O_NOFOLLOW | O_CLOEXEC 打开该文件,并要求它是普通文件、没有组用户或其他用户权限位、大小不超过 4 KiB,且由服务器用户拥有;其父目录不得是符号链接,也不得对组用户或所有用户可写。在只读挂载上(例如部署时的只读 secrets 挂载,此时以 root 身份运行的 docker 会以 root 身份读取运维人员的文件,且 statvfs 会报告 ST_RDONLY),不要求文件及其只读父目录的所有者匹配;其他检查仍然适用。重新加载失败时会保留上一次有效的令牌集。
scripts/mint_api_token.sh 会在新建的 0600 文件中生成令牌,并将其摘要添加到 api-tokens.json;如果该文件位于 secrets 目录中,scripts/deploy-memora-all.sh 会设置
MEMORA_API_TOKENS_FILE。请求语义(401/403/404)和轮换方式见约定。
预览
安装
有两种方式。pip 会由客户端启动一个本地 stdio 子进程。容器则是一个通过 up 启动的分离式 HTTP 服务;设置 MEMORA_DATABASES 后,它可以通过一个进程为多个存储提供服务。LaunchAgent 负责监管代理,而不是容器——主机重启后,监听器可能会恢复运行,但其上游仍可能处于停止状态。如果你将 memora 作为服务运行,容器方式就是安装方式。
pip(本地 / stdio)
pip install memora-mcp
PyPI 软件包名为 memora-mcp(PyPI 上单独的 memora 是无关项目)。开箱即支持云存储(S3/R2)和 OpenAI 嵌入。
# Optional: local embeddings (offline, ~2GB for PyTorch)
pip install "memora-mcp[local]"
# Latest development version straight from git
pip install "git+https://github.com/agentic-box/memora.git"
然后在 .mcp.json 中通过 "command": "memora-server" 启动它(参见配置)。
容器(HTTP 服务)
默认运行时为 Apple 的 container CLI。scripts/memora-instance.sh 执行的每项容器操作(build、up、status、logs、down)都会使用 $MEMORA_CONTAINER_BIN(默认为 container)。生成的代理进程不会使用它;该进程将 container list 硬编码为命令。
首次执行 build 前:
-
安装 Apple 的
containerCLI(从其 GitHub Releases 下载签名 pkg)。它需要搭载 Apple 芯片且运行 macOS 26 的 Mac——Apple 不支持在较旧的 macOS 版本上使用container。 -
启动运行时——这是 Apple 文档指定的首条命令;如果尚未配置内核,它也会安装内核:
container system start -
克隆此仓库并进入目录:
git clone https://github.com/agentic-box/memora.git cd memora -
复制实例模板。模板自带
INSTANCE=myinstance,因此后续的build/up/proxy命令无需重命名即可匹配。编辑PORT和一个后端(STORAGE_URI、VOLUME或MEMORA_DATABASES):cp instances/example.env instances/myinstance.env -
创建凭据文件并安装 LaunchAgent 将运行的代理。
cred_args()要求.mcp.json中的mcpServers.memora.env包含CLOUDFLARE_API_TOKEN(D1 访问令牌)以及嵌入/大模型密钥——如果缺少该文件,up就会失败。除非实例文件将CRED_SOURCE设为其他路径,否则脚本会查找~/.config/memora/credentials.mcp.json;没有其他回退路径。另请注意,proxy会生成一个 plist,其可执行文件为$MEMORA_PROXY_BIN(默认为~/.local/libexec/memora/memora_proxy.py),日志位于$MEMORA_LOG_DIR(默认为~/.local/var/log)——全新克隆时,这两个路径都不会自动创建。mkdir -p ~/.config/memora ~/.local/libexec/memora ~/.local/var/log cp scripts/memora_proxy.py ~/.local/libexec/memora/ # real values; any key is fine, an absent file is not # the default umask is permissive -- chmod 600 keeps other local accounts out cat > ~/.config/memora/credentials.mcp.json <<'JSON' {"mcpServers":{"memora":{"env":{"CLOUDFLARE_API_TOKEN":"REPLACE","OPENAI_API_KEY":"REPLACE"}}}} JSON chmod 600 ~/.config/memora/credentials.mcp.json该 JSON 是正确的最简配置:大模型和嵌入都使用默认的 OpenAI 主机,并使用有效的 OpenAI 密钥。不要在没有来自嵌入的嵌入配置组合时添加指向 OpenRouter 的
OPENAI_BASE_URL——OpenRouter 没有嵌入端点,每次嵌入调用都会返回 404,而 memora 会悄然回退到 TF-IDF 关键词袋,同时看起来一切正常。
然后:
./scripts/memora-instance.sh build myinstance # tags IMAGE from myinstance.env (memora-pilot if IMAGE is unset)
./scripts/memora-instance.sh up myinstance # runs that same IMAGE
./scripts/memora-instance.sh proxy myinstance # render the LaunchAgent; run the printed launchctl
up 不会发布主机端口。工作区连接的监听器是代理。proxy 只会生成 macOS LaunchAgent 并打印 launchctl 命令——它不会加载服务。请运行打印出的命令。
打印出的工作区 URL 始终为 http://127.0.0.1:<PORT>/mcp(注册表默认值)。如果使用非默认存储,请自行追加 /<name>——在注册表中,单独使用 /mcp 会悄然绑定到 MEMORA_DEFAULT_DB:
{"mcpServers": {"memora": {"type": "http", "url": "http://127.0.0.1:<PORT>/mcp/<store>"}}}
代理的设计缘由、凭据、实例文件和 MEMORA_CONTAINER_BIN:容器部署。
用法
在 Claude Code 中完成配置后,服务器会自动运行。手动调用:
# Default (stdio mode for MCP)
memora-server
# With graph visualization server
memora-server --graph-port 8765
# HTTP transport (alternative to stdio)
memora-server --transport streamable-http --host 127.0.0.1 --port 8080
配置
Claude Code
将以下内容添加到项目根目录的 .mcp.json:
本地数据库:
{
"mcpServers": {
"memora": {
"command": "memora-server",
"args": [],
"env": {
"MEMORA_DB_PATH": "~/.local/share/memora/memories.db",
"MEMORA_ALLOW_ANY_TAG": "1",
"MEMORA_GRAPH_PORT": "8765"
}
}
}
}
云数据库(Cloudflare D1)——推荐:
{
"mcpServers": {
"memora": {
"command": "memora-server",
"args": ["--no-graph"],
"env": {
"MEMORA_STORAGE_URI": "d1://<account-id>/<database-id>",
"CLOUDFLARE_API_TOKEN": "<your-api-token>",
"MEMORA_ALLOW_ANY_TAG": "1"
}
}
}
}
使用 D1 时,请使用 --no-graph 禁用本地可视化服务器。请改用 Cloudflare Pages URL 上托管的图谱(参见云端图谱)。
如果主数据库为 d1://,则除非禁用该数据库的读取复制,否则不会启动(启用时,会话书签无法通过 REST 实现读取后写入)。设置 MEMORA_D1_ALLOW_READ_REPLICATION=1 可继续启动,但会记录警告。
云数据库(S3/R2)——同步模式:
{
"mcpServers": {
"memora": {
"command": "memora-server",
"args": [],
"env": {
"AWS_PROFILE": "memora",
"AWS_ENDPOINT_URL": "https://<account-id>.r2.cloudflarestorage.com",
"MEMORA_STORAGE_URI": "s3://memories/memories.db",
"MEMORA_CLOUD_ENCRYPT": "true",
"MEMORA_ALLOW_ANY_TAG": "1",
"MEMORA_GRAPH_PORT": "8765"
}
}
}
}
Codex CLI
将以下内容添加到 ~/.codex/config.toml:
[mcp_servers.memora]
command = "memora-server" # or full path: /path/to/bin/memora-server
args = ["--no-graph"]
env = {
AWS_PROFILE = "memora",
AWS_ENDPOINT_URL = "https://<account-id>.r2.cloudflarestorage.com",
MEMORA_STORAGE_URI = "s3://memories/memories.db",
MEMORA_CLOUD_ENCRYPT = "true",
MEMORA_ALLOW_ANY_TAG = "1",
}
环境变量
| 变量 | 说明 | |----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `MEMORA_DB_PATH` | 本地 SQLite 数据库路径(默认:`~/.local/share/memora/memories.db`) | | `MEMORA_STORAGE_URI` | 存储 URI:`d1:///`(D1)或 `s3://bucket/memories.db`(S3/R2)。当未设置 `MEMORA_DATABASES` 时使用。 | | `MEMORA_DATABASES` | JSON 对象 `{name: uri}`,用于映射此进程提供服务的各个存储。名称必须是一个 URL 路径段(`/mcp/`):仅允许字母、数字、`-`、`_`、`.`。重复键、空值、不安全名称或非对象都会导致启动失败,而不会静默选择某个存储。未设置 = 单存储(旧版行为)。参见[多数据库路由](#multi-database-routing)。 | | `MEMORA_DEFAULT_DB` | 裸 `/mcp` 使用的注册表名称。注册表中有多个数据库时必填;只有一个名称时,该名称即为默认值。值不在注册表中会导致启动失败。 | | `CLOUDFLARE_API_TOKEN` | D1(`d1://` URI)的 API 令牌。`CF_API_TOKEN` 也可用作别名。 | | `MEMORA_D1_ALLOW_READ_REPLICATION` | 设为 `1`,即可在启用读取复制或无法读取其模式时启动 `d1://` 主库。其他任何值仍会导致启动失败。每次启动都会记录警告。 | | `MEMORA_CLOUD_ENCRYPT` | 上传到 S3/R2 前加密本地文件。未设置/`false` = 关闭;`1`/`true`/`yes` = 开启。 | | `MEMORA_CLOUD_COMPRESS` | 上传到 S3/R2 前压缩本地文件。未设置/`false` = 关闭;`1`/`true`/`yes` = 开启。 | | `MEMORA_CACHE_DIR` | S3/R2 同步数据库的本地缓存目录。未设置:由后端选择缓存路径。 | | `MEMORA_ALLOW_ANY_TAG` | 允许使用任何标签,不对照允许列表进行验证(设为 `1` 启用) | | `MEMORA_TAG_FILE` | 包含允许标签数组的 JSON 文件路径,例如 `["plan", "memora/issues"]` | | `MEMORA_TAGS` | 以逗号分隔的允许标签列表 | | `MEMORA_HOST` | HTTP 传输的绑定地址(默认 `127.0.0.1`)。可通过 `--host` 覆盖。 | | `MEMORA_PORT` | HTTP 传输的绑定端口(默认 `8000`)。可通过 `--port` 覆盖。 | | `MEMORA_GRAPH_PORT` | 知识图谱可视化服务的端口(默认:`8765`) | | `MEMORA_TRANSPORT` | `stdio`(默认)、`sse` 或 `streamable-http`。未知的 **环境变量** 值会回退到 `stdio`;`--transport` 仍会拒绝未知值。多数据库路由和会话保护仅在 `streamable-http` 上运行。 | | `MEMORA_TOOL_PROFILE` | 向客户端公开的工具子集:`full`(默认,全部 44 个)、`leader`(19 个)、`agent`(12 个)。未设置/为空 = `full`;未知值会导致启动失败。参见[工具配置](#tool-profiles)。 | | `MEMORA_MAX_SESSIONS` | 并发 MCP 会话数的硬上限(默认 `128`)。`0` 表示禁用。创建速率加空闲超时并不能构成上限——只要客户端持续保留会话 ID,会话数就能按创建速率无限增长。无效值会导致启动失败。仅适用于 Streamable HTTP。 | | `MEMORA_MAX_INIT_PER_MIN` | 每分钟允许创建的新会话数(默认 `120`)。`0` 表示禁用。无效值会导致启动失败。仅适用于 Streamable HTTP。 | | `MEMORA_MAX_INIT_BODY_BYTES` | 可接受/缓冲的初始化请求正文最大字节数(默认 `65536`,最小 `1024`)。更大的请求会收到 `413`。无效值会导致启动失败。仅适用于 Streamable HTTP。 | | `MEMORA_SESSION_IDLE_TIMEOUT` | 废弃的有效会话被回收前的秒数(默认 `1800`)。`0` 表示禁用。无效值会导致启动失败。仅适用于 Streamable HTTP。 | | `MEMORA_HEALTH_TOKEN` | `/health/db` 详细响应正文(名称、计数、错误文本)的 Bearer 令牌。未设置:只有来自回环地址的对端能看到详细信息;其他所有人只能看到汇总状态。即使配置了 MCP 身份验证,FastMCP `custom_route()` 也未经身份验证。仅适用于 HTTP 传输(`memora.health` 会为 SSE/streamable-http 导入,不会为 stdio 导入)。 | | `MEMORA_ADMIN_TOKEN` | `/admin/*` 运维路由(`memora/admin.py`)的 Bearer 令牌,至少 32 个字符,且不能与 `MEMORA_HEALTH_TOKEN` 相同;否则服务器会拒绝启动。未设置:所有 `/admin/*` 路由均返回 403。无回环地址豁免。实例启动器会生成并传入该令牌(`~/.config/memora/.admin-token`)。仅适用于 HTTP 传输。 | | `MEMORA_DATA_VOLUME` | 挂载到 `/data` 的卷名称,由启动器设置。将状态保存在数据目录(`MEMORA_DATA_DIR`,默认 `/data`)中的存储——包括其下的本地 SQLite 路径,以及所有 `d1://` 存储(其写入门控和意图日志位于此目录)——除非满足以下条件,否则会被拒绝:此变量已设置且不是匿名的 64 位十六进制卷 ID;该目录是挂载点;并且能在该目录及其 `intent/` 中写入、同步并删除探测文件。拒绝按存储逐个执行;`/health/db` 会说明原因。 | | `MEMORA_HEALTH_TTL` | 就绪状态快照可提供服务、无需刷新的秒数(默认 `10`,上限 `3600`)。必须 `> 0`。无效值会导致启动失败。仅适用于 HTTP 传输——格式错误的值不会中止 stdio。 | | `MEMORA_HEALTH_TIMEOUT` | 单次刷新及每个存储探测的超时时间上限(默认 `15`,上限 `300`)。必须 `> 0`。仅适用于 HTTP 传输。 | | `MEMORA_HEALTH_REFRESH_INTERVAL` | 服务器自行刷新就绪状态的间隔(默认 `15`,上限 `3600`)。`0` = 仅轮询。如果未设置,代理部署中没有回环调用方,即使所有数据库正常,告警状态也会保持为 `unknown`。启用定期刷新时,`interval + timeout` 必须 `< MEMORA_HEALTH_MAX_STALE`。仅适用于 HTTP 传输。 | | `MEMORA_HEALTH_MAX_STALE` | 缓存的单数据库结果超过此时长后,不再报告为就绪(默认 `60`,上限 `3600`)。必须 `>= MEMORA_HEALTH_TTL`。仅适用于 HTTP 传输。 | | `MEMORA_STALE_DAYS` | 两个使用方、两个默认值,却共用同一个名称:`memory_insights` 会将未完成的 TODO/issue 在 **14** 天后视为过期;图谱 UI 会在 **30** 天后将已关闭项显示为灰色。设置此变量可覆盖两者。 | | `MEMORA_EMBEDDING_MODEL` | 嵌入后端:`openai`(默认)、`sentence-transformers` 或 `tfidf` | | `SENTENCE_TRANSFORMERS_MODEL` | sentence-transformers 使用的模型(默认:`all-MiniLM-L6-v2`) | | `MEMORA_EMBEDDING_API_KEY` | 嵌入提供商的 API 密钥(与基础 URL 需成对设置——见下文) | | `MEMORA_EMBEDDING_BASE_URL` | 嵌入提供商的基础 URL(与 API 密钥需成对设置——见下文) | | `MEMORA_EMBEDDING_STRICT` | **建议设为 `1`。** 嵌入出错时直接失败,而不是静默回退到 TF-IDF。否则,即使端点故障,服务仍会继续响应,但每个向量都会退化为关键词集合(曾有 756 条记忆在无人察觉的情况下因此退化)。 | | `OPENAI_API_KEY` | 当设置了 `MEMORA_EMBEDDING_*` 时,仅用于 **LLM**(去重/聊天)。只有在 `MEMORA_EMBEDDING_API_KEY` 和 `MEMORA_EMBEDDING_BASE_URL` **都**未设置时,嵌入才会回退使用此密钥。 | | `OPENAI_BASE_URL` | **LLM** 基础 URL(OpenRouter、Azure 等)。与密钥采用相同的成对回退规则——使用拆分配置时,它不会作为嵌入 URL。 | | `OPENAI_EMBEDDING_MODEL` | openai 嵌入后端的模型 ID。该模型必须存在于**嵌入**主机上(默认的 `text-embedding-3-small` 仅适用于 OpenAI;Cloudflare 需使用例如 `@cf/baai/bge-m3` 的模型) | | `MEMORA_LLM_ENABLED` | 启用由 LLM 驱动的去重比较(`true`/`1`/`yes`;默认:`true`) | | `MEMORA_LLM_MODEL` | 用于去重比较的模型;如果未设置,也用于查询重写和本地聊天(默认:`gpt-4o-mini`)。请选择普通聊天/指令模型,而非推理模型——实测中,推理模型每次吸收分类调用需要 12-17 秒(生成 1000-1700 个推理令牌,OpenRouter 的 `reasoning.effort`/`reasoning.max_tokens` 无法限制),而同样的调用使用 `gpt-4o-mini` 只需 3-4 秒。 | | `MEMORA_ABSORB_CONCURRENCY` | `memory_absorb` 并发分类阶段的工作线程数(默认 `4`;非数字或 `<1` 时回退到 `4`;`1` 会禁用线程池并按顺序分类)。只有针对单条事实的 LLM 分类调用会并行化——嵌入和搜索仍按顺序执行(开销小,而且 `conn` 不能在线程中安全访问:默认情况下 sqlite3 连接与线程绑定,`D1Connection` 则持有可变的会话令牌状态)。 | | `MEMORA_LLM_TIMEOUT` | OpenAI 客户端等待的秒数(默认 `60`,最低为 `1`)。非数字值会回退到 `60`。 | | `MEMORA_REWRITE_MODEL` | 图谱聊天面板中用于 RAG 查询重写的模型。未设置/为空时使用 `MEMORA_LLM_MODEL`。 | | `MEMORA_VECTOR_SCAN_PAGE_SIZE` | 从 D1 加载嵌入时每页的行数(默认 `1000`;非数字或 `<1` 时回退到 `1000`;硬上限 `10000`)。采用默认值时,行数不足 1000 的存储会在一次 D1 响应中返回**整个语料及其全部嵌入**;这曾与 Cloudflare 的每请求 30 秒上限竞争,并导致 `memory_absorb` 直接失败。**在 D1 上使用 `100`**(实例脚本已自动注入该值)。分页只是缓解措施,并非根本解决方案:每次调用时,吸收操作都会读取一次语料,并复用一个以数据库单调递增的 `embedding_change_epoch` 为键的进程本地缓存。 | | `MEMORA_REBUILD_CHUNK_SIZE` | `memory_rebuild_embeddings` 每批处理的行数(默认 `32`;非数字或 `<1` 时回退到 `32`)。每批调用一次 `compute_embeddings_batch` 并执行一次 `conn.commit()`,而不是每行调用一次嵌入并提交一次——在 D1 上,这会将租约心跳往返次数从每行两次降为每批两次;相比之下,每行提交的耗时影响小得多(D1 的 `commit()` 本身已经是空操作)。 | | `CHAT_MODEL` | 本地图谱聊天面板使用的模型。未设置/为空时回退到 `MEMORA_LLM_MODEL`。(默认的 `deepseek/deepseek-chat` 配置在 Cloudflare Pages 的 `wrangler.toml` 中,而非此进程。) | | `MEMORA_CLOUD_GRAPH_ENABLED` | 设为 `true`/`1`/`yes`,在写入时通知托管图谱(默认关闭)。 | | `MEMORA_CLOUD_GRAPH_WORKER_URL` | 这些广播使用的 Worker 基础 URL(`POST /broadcast`)。未设置:跳过广播。 | | `MEMORA_CLOUD_GRAPH_DEBOUNCE` | 将快速连续的写入合并后再广播的秒数(默认 `1.0`)。 | | `MEMORA_CLOUD_GRAPH_SYNC_SCRIPT` | 启动时记录的路径(默认:如果该文件存在,则为 `memora-graph/scripts/sync.sh`)。当前写入路径**不会**执行此脚本——D1 是事实来源,且只会运行 Worker 广播。 | | `AWS_PROFILE` | 来自 `~/.aws/credentials` 的 AWS 凭据配置文件(对 R2 很有用) | | `AWS_ENDPOINT_URL` | R2/MinIO 的 S3 兼容端点 | | `R2_PUBLIC_DOMAIN` | R2 图片 URL 使用的公共域名 |工具配置(MEMORA_TOOL_PROFILE)
所有 44 个 MCP 工具都会无条件注册,因此每个 Agent 会话都会注入完整的约 12,700 个 token 的工具架构,即使大多数工具从未被调用。MEMORA_TOOL_PROFILE 可按部署配置工具子集,使受限工具真正不存在——既不会出现在 tools/list 中,也无法调度(call_tool 返回 unknown-tool,而不是隐式执行)。配置会在启动时应用并通过验证;活动配置和公开的工具数量会记录到 stderr。
| 值 | 工具 | 用途 |
|---|---|---|
full(默认) | 全部 44 个 | 直接使用 stdio;所有现有部署都保持逐字节不变 |
leader | 19 个 | Agent 集合,加上 memory_create_section、memory_store_document、memory_get_document、memory_tags、memory_delete、memory_digest、memory_list |
agent | 12 个 | Worker Agent 所需的读取/创建接口:memory_absorb、memory_semantic_search、memory_hybrid_search、memory_list_compact、memory_get、memory_related、memory_link、memory_stats、memory_create、memory_create_issue、memory_create_todo、memory_update |
- 未设置/为空 =
full。 现有部署的行为不会改变。 - 未知值会中止启动,并显示列出有效值的消息。绝不会静默回退到
full——拼写错误不能让所有 Worker 重新获得破坏性维护工具(memory_rebuild_embeddings、memory_delete_batch)。必须以失败关闭。 memory_list属于leader,但不属于agent。此前它的运行时间为 163-174 秒,而memory_list_compact在 D1 存储上只需 0.22 秒,因此从两者中移除了它;#973 修复了这一问题(现在约为 1.1 秒)。它仍不属于agent,因为 Worker 的读取接口有意保持精简,而不是为了速度。- leader/agent 边界是
memora/tool_profile.py中的数据(两个 frozenset)。修改只需一行,无需检查 44 个装饰器。 - 清理操作会从 FastMCP 的私有
_tool_manager._tools字典中删除工具,因此memora固定使用mcp>=1.27,<1.28(已审计的小版本),并在启动时通过底层已注册的 MCP 请求处理器(_mcp_server.request_handlers[ListToolsRequest]/[CallToolRequest]——实际客户端请求使用的调度可调用对象,而不是FastMCP.list_tools/call_toolPython 辅助函数)运行一次验证。如果已安装的 SDK 将列表查询/调度路由到别处(私有实现发生变化),就会拒绝启动。版本固定是静态保护;验证是运行时保障。提高上限版本前,必须重新运行tests/test_tool_profile.py。 - 在容器部署中,配置针对每个容器,而角色针对每个Agent。为某个工作区的 leader 和 Worker 提供服务的单个容器需要使用
leader超集;使用agent会从 leader 中移除create_section/store_document/delete/digest/tags。 memora-server(即memora.server.main())是唯一受支持的配置化服务路径。直接导入memora.server.mcp并自行调用mcp.run()的嵌入方会完全绕过配置(全局mcp仍包含全部 44 个工具);需要使用配置的嵌入方必须自行调用apply_tool_profile,或使用main()。
# Leader deployment — exposes 19 tools
MEMORA_TOOL_PROFILE=leader memora-server
# Agent worker — exposes 12 tools
MEMORA_TOOL_PROFILE=agent memora-server
# Full (default) — all 44 tools, existing behaviour
memora-server
# Typo refuses to start:
# MEMORA_TOOL_PROFILE=agnt memora-server
# Error: unknown MEMORA_TOOL_PROFILE='agnt'; valid values: full, leader, agent
多数据库路由
一个 memora 进程即可为所有工作区提供服务。MEMORA_DATABASES 是一个 {name: storage URI} 的 JSON 注册表;客户端通过 /mcp/<name> 访问其存储。选择器是 .mcp.json 中已有的 URL,而不是工具参数——每个工具都添加可选的 db 参数,就有 44 次机会可能忘记设置,而且每次遗漏都会把内容写入别人的存储。
**未设置 MEMORA_DATABASES 时保持旧形式:**使用 MEMORA_STORAGE_URI
/MEMORA_DB_PATH 指定一个后端,并提供一个 /mcp。现有 stdio 部署不会改变。
路由(仅 streamable-http):
| URL | 解析到 |
|---|---|
/mcp/<name> | 对应的注册表条目。未知名称会返回 404 {"error":"unknown database"}——响应正文不会列出其他名称。 |
/mcp | MEMORA_DEFAULT_DB。当注册表中有多个数据库时必须设置;如果注册表只有一个名称,则使用该名称。 |
数据库绑定是按 MCP 会话固定的,而非按请求绑定。会话在
/mcp/alpha 上打开后,即使改用 /mcp/beta,仍会解析到 alpha。客户端
无法在对话中途切换数据库。
配置格式错误时会拒绝启动(不会回退到旧数据库):JSON 无效、内容不是对象、键重复、URI 为空、名称不是单个 URL 路径段,或者注册表中列出多个数据库时未设置 MEMORA_DEFAULT_DB 或其值未知。
示例组合——运行此项,连接到此项。 这是一个可流式传输的 HTTP 监听器,而不是
MCP command 条目(后者会启动一个无法通过 stdio 使用 MCP 的子进程)。凭据存放在服务器进程中。
MEMORA_DATABASES='{"memora":"d1://<account-id>/<memora-db-id>","alpha":"d1://<account-id>/<alpha-db-id>"}' \
MEMORA_DEFAULT_DB=memora \
CLOUDFLARE_API_TOKEN='<token>' \
MEMORA_VECTOR_SCAN_PAGE_SIZE=100 \
memora-server --transport streamable-http --host 127.0.0.1 --port 8000 --no-graph
{
"mcpServers": {
"memora": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp/alpha"
}
}
}
容器 / 代理变体(此主机常用的启动方式,而非上述命令):scripts/memora-instance.sh up myinstance 会在容器中启动同一个 HTTP 服务,并将 scripts/memora_proxy.py 放在 127.0.0.1:<PORT>
(memora 实例使用 8910)。此时工作区 URL 为
http://127.0.0.1:8910/mcp/alpha。请参阅容器部署。
注册表可以混用 d1://、s3:// 和本地路径;parse_backend_uri
会根据方案进行分派。
memory_stats 会报告绑定的数据库。 它会返回 database(此会话实际解析到的名称)和 database_source(path、
registry_default 或 unconfigured)。.mcp.json 中名称有效但错误时,其他方式无法察觉:所有工具都能正常工作,读取成功,写入却会悄然落入其他项目的存储区。请调用 memory_stats,并检查 database 是否与目标工作区一致。
多数据库进程的健康状态:GET /health 用于存活检测(不进行数据库 I/O
——这是监督程序唯一可以据此重启进程的信号)。GET /health/db 用作告警接口(始终返回 HTTP 200;status 为 ok、degraded、unknown——尚无快照、刷新超时或证据已超过最大陈旧时间——或者在注册表本身不可用时为 error)。GET /health/db/{name} 是针对特定工作区的探测接口(返回 200 或 503)。因为一个存储区状态降级就撤下整个进程,会连带影响健康的存储区。
容器部署
未设置 MEMORA_DATABASES 时,进程在其生命周期内仍只绑定一个数据库(MEMORA_STORAGE_URI / MEMORA_DB_PATH)。这就是原有的一个存储区、一个容器、一个端口的模式。
设置 MEMORA_DATABASES 后,一个容器可服务所有工作区,客户端通过 URL 路径(/mcp/<name>)选择存储区。请参阅
多数据库路由。scripts/memora-instance.sh
要求每个实例文件设置 STORAGE_URI、VOLUME 或 MEMORA_DATABASES 之一(load() 至少要求其中一项)。如果设置了多项,cmd_up 会依次使用
MEMORA_DATABASES、STORAGE_URI,然后是 VOLUME。
Dockerfile 会构建一个不含凭据的镜像;scripts/memora-instance.sh 会从 instances/myinstance.env(或其他具名文件)部署一个实例。该脚本的运行时 CLI 为
$MEMORA_CONTAINER_BIN(默认为 container——Apple 的 CLI)。脚本执行的每项容器操作都会遵循此覆盖值(build、up、status、
logs、down)。生成的 memora_proxy.py 进程会将
container list 写死,这也是代理存在的原因:该运行时会在每次启动时重新分配容器的 IP。
./scripts/memora-instance.sh build myinstance # build the image
./scripts/memora-instance.sh up myinstance # run the container
./scripts/memora-instance.sh proxy myinstance # render a LaunchAgent + print install commands
./scripts/memora-instance.sh status # every instance at a glance
然后将工作区指向它——完整的客户端配置,不包含任何密钥。
注册表实例需要在路径中指定存储区(/mcp/<name>);单独的 /mcp 则使用注册表默认值:
{"mcpServers": {"memora": {"type": "http", "url": "http://127.0.0.1:8910/mcp/alpha"}}}
凭据不会进入镜像、实例文件或工作区的 HTTP 配置。 凭据会在运行时从单独的凭据配置中读取($CRED_SOURCE——该文件本身是一个 .mcp.json,仅包含 mcpServers.memora.env 块),并通过 -e 注入。如果实例文件未设置 CRED_SOURCE,脚本会使用 ~/.config/memora/credentials.mcp.json(若该文件不存在,up 会拒绝运行;没有其他回退方式)。请传入该文件定义的所有变量,而不是只挑几个:如果容器只启动并传入嵌入相关的密钥,memory_absorb 的 LLM 整合功能会悄无声息地失效,而不会明确报错。
代理存在的原因——决定不需要它之前,请先阅读。 默认运行时(Apple 的 container)会在容器每次启动时(不只是重新创建时)重新分配 IP。MCP 客户端只会在启动时读取一次配置,因此地址变更不会报错,而是导致永久的无声挂起。scripts/memora_proxy.py 会在不断变化的地址前提供稳定的 127.0.0.1:<PORT>,并在每次连接时重新解析地址。
它可以区分以下两种故障模式;我们曾付出一次服务中断的代价才弄清楚这一点:
- 查询成功运行,但列表中没有该容器 → 容器确实已不存在。拒绝运行。
- 查询无法运行(主机内存压力下超时)→ 没有新的信息。继续使用上次已知的正常地址,但最长不超过
MEMORA_PROXY_STALE_GRACE(300s)。将这两种情况混为一谈,曾导致所有工作区离线,而容器仍在原地址正常响应。
请按实例设置 MEMORA_TOOL_PROFILE(参见 工具配置)。请注意,配置是针对容器的,而角色是针对Agent的:如果一个容器同时服务于某个工作区的负责人和工作节点,就需要包含负责人的完整工具集。
部署时使用的脚本变量(不是 memora-server 环境变量——它不会传入容器内的进程):
| 变量 | 含义 |
|---|---|
MEMORA_CONTAINER_BIN | memora-instance.sh 的每项容器操作(build、up、status、logs、down)使用的 CLI(默认值为 container)。生成的 memora_proxy.py 进程不会遵循此设置;它会将 container list 写死在代码中。 |
instances/README.md 介绍配置字段,launchd/README.md 介绍受监管的代理。REVERT.md 介绍如何将工作区恢复为直接使用 stdio 服务端。
语义搜索与嵌入
Memora 支持三种嵌入后端:
| 后端 | 安装 | 质量 | 速度 |
|---|---|---|---|
openai(默认) | 已包含 | 高质量 | API 延迟 |
sentence-transformers | pip install memora[local] | 良好,可离线运行 | 中等 |
tfidf | 已包含 | 基础关键词匹配 | 快 |
嵌入和 LLM 分开配置。
| 角色 | 变量 |
|---|---|
| LLM(去重、聊天) | OPENAI_API_KEY + OPENAI_BASE_URL |
| 嵌入 | MEMORA_EMBEDDING_API_KEY + MEMORA_EMBEDDING_BASE_URL(必须同时设置或同时不设置——成对配置) |
| 回退 | 如果 MEMORA_EMBEDDING_* 均未设置,嵌入会使用完整的 OPENAI_* 配置对 |
仅设置一个 MEMORA_EMBEDDING_* 变量的部分分离配置会被拒绝,以免将某个提供商的密钥发送到其他主机。
注意:OpenRouter 没有嵌入端点。 OpenRouter 的目录仅包含聊天和多模态功能(没有嵌入模型)。不要通过 OPENAI_BASE_URL(或 MEMORA 基础 URL)将嵌入路径指向 OpenRouter。这样会导致所有嵌入调用都返回 404;如果未设置 MEMORA_EMBEDDING_STRICT=1,Memora 会回退到 TF-IDF 并继续响应,因此存储中会填满关键词集合,但系统看起来仍正常。OpenRouter 仍然可以只用于 LLM。
示例(通过 OpenRouter 使用 LLM,通过 Cloudflare Workers AI 生成嵌入):
@cf/baai/bge-m3 的维度为 1024。Token 需要拥有 Workers AI 权限。端点格式:
https://api.cloudflare.com/client/v4/accounts/<account_id>/ai/v1
{
"env": {
"MEMORA_EMBEDDING_MODEL": "openai",
"OPENAI_API_KEY": "<openrouter-key>",
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"MEMORA_LLM_MODEL": "deepseek/deepseek-chat",
"MEMORA_EMBEDDING_API_KEY": "<cloudflare-api-token-with-workers-ai>",
"MEMORA_EMBEDDING_BASE_URL": "https://api.cloudflare.com/client/v4/accounts/<account_id>/ai/v1",
"OPENAI_EMBEDDING_MODEL": "@cf/baai/bge-m3",
"MEMORA_EMBEDDING_STRICT": "1"
}
}
此修复的作用(不夸大):嵌入和 LLM 可以使用不同的提供商;不完整的拆分会被拒绝;严格模式会将静默降级转为明确命名的硬性失败。
自动: 执行 memory_create、memory_update 或 memory_create_batch 时,会自动计算嵌入和交叉引用。
需要手动重建的情况:存储指纹发生变化时——不只是 MEMORA_EMBEDDING_MODEL,还包括:
- 嵌入端点(
MEMORA_EMBEDDING_BASE_URL/ 主机) - 实际模型 ID(
OPENAI_EMBEDDING_MODEL,例如切换到@cf/baai/bge-m3) - 向量类型或维度(词键 TF-IDF 袋与密集型 1024 维向量;或 384 维与 1024 维)
- 混合存储(部分行是密集型,部分是稀疏型)——余弦相似度只比较相同的键,因此混合类型会导致旧行的召回率为 0.0
指纹格式:backend|model|repr(例如 openai|@cf/baai/bge-m3|dense:1024)。旧版元数据值 openai 会被视为不匹配。
# After changing embedding model/endpoint, rebuild all embeddings
memory_rebuild_embeddings
# Then rebuild cross-references to update the knowledge graph
memory_rebuild_crossrefs
实时图谱服务
内置 HTTP 服务会随 MCP 服务自动启动,提供交互式知识图谱可视化。
![]() 详情面板 | ![]() 时间线面板 |
本地访问:
http://localhost:8765/graph
通过 SSH 远程访问:
ssh -L 8765:localhost:8765 user@remote
# Then open http://localhost:8765/graph in your browser
配置:
{
"env": {
"MEMORA_GRAPH_PORT": "8765"
}
}
要禁用此功能:在 MCP 配置的 args 中添加 "--no-graph"。
图谱 UI 功能
- 详情面板 - 查看记忆内容、元数据、标签和相关记忆
- 时间线面板 - 按时间顺序浏览记忆,点击即可在图谱中高亮显示
- 历史记录面板 - 所有操作的日志,连续条目会分组显示,记忆引用可点击(已删除的记忆以删除线显示)
- 聊天面板 - 使用 RAG 驱动的 LLM 聊天功能提问记忆,支持流式响应和可点击的
[Memory #ID]引用 - 时间滑块 - 按日期范围筛选记忆,拖动以浏览历史
- 实时更新 - 记忆发生变化时,图谱、时间线和历史记录会通过 SSE 更新
- 筛选器 - 标签/章节下拉菜单、缩放控件
- Mermaid 渲染 - 将代码块渲染为图表
节点颜色
- 🟣 标签 - 按标签使用不同深浅的紫色
- 🔴 问题 - 红色(未解决)、橙色(处理中)、绿色(已解决)、灰色(不予修复)
- 🔵 待办事项 - 蓝色(未开始)、橙色(处理中)、绿色(已完成)、红色(已阻塞)
节点大小反映连接数量。
云端图谱(推荐用于 D1)
使用 Cloudflare D1 作为数据库时,图谱可视化托管在 Cloudflare Pages 上,无需本地服务。
优势:
- 随时随地访问(无需 SSH 隧道)
- 通过 WebSocket 实时更新
- 通过
?db=参数支持多个数据库 - 使用 Cloudflare Zero Trust 安全访问
设置:
-
创建 D1 数据库:
npx wrangler d1 create memora-graph npx wrangler d1 execute memora-graph --file=memora-graph/schema.sql -
部署 Pages:
cd memora-graph npm run deploynpm run deploy会先运行scripts/d1_write_guard.py --scope all,发现任何问题时都会拒绝部署。不要直接运行wrangler pages deploy:这会绕过防护检查(docs/local-primary-implementation.md§0 P6)。 -
在 Cloudflare Dashboard 中配置绑定:
- Pages → memora-graph → Settings → Bindings
- 添加 D1:
DB_MEMORA→ 你的数据库 - 添加 R2:
R2_MEMORA→ 你的存储桶(用于图片)
-
使用 D1 URI 配置 MCP:
{ "env": { "MEMORA_STORAGE_URI": "d1://<account-id>/<database-id>", "CLOUDFLARE_API_TOKEN": "<your-token>" } }
访问地址: https://memora-graph.pages.dev
使用 Zero Trust 保护:
- Cloudflare Dashboard → Zero Trust → Access → Applications
- 为
memora-graph.pages.dev添加应用程序 - 创建允许指定电子邮件地址的策略
- Pages → Settings → 启用 Access Policy
有关详细设置和多数据库配置,请参阅 memora-graph/。
与记忆对话
直接在图形界面中询问知识库相关问题。聊天面板使用 RAG(检索增强生成)搜索相关记忆,并以流式方式返回 LLM 响应,同时支持工具调用。
- 通过右下角的浮动聊天图标切换
- 语义搜索会将最相关的记忆作为上下文
- 流式响应包含可点击的
[Memory #ID]引用,点击后会聚焦到图中的对应节点 - 工具调用——LLM 可以直接在聊天中创建、更新和删除记忆(例如,“将此保存为记忆”、“删除记忆 #42”、“更新记忆 #10,内容为……”)
- 本地服务和 Cloudflare Pages 部署均可使用
配置聊天模型:
| 后端 | 变量 | 默认值 |
|---|---|---|
| 本地服务 | CHAT_MODEL 环境变量 | 回退到 MEMORA_LLM_MODEL |
| Cloudflare Pages | wrangler.toml 中的 CHAT_MODEL | deepseek/deepseek-chat |
需要兼容 OpenAI 的 API(本地服务需要 OPENAI_API_KEY + OPENAI_BASE_URL,Cloudflare 需要 OPENROUTER_API_KEY 密钥)。聊天模型必须支持工具使用(函数调用)。
LLM 去重
使用 AI 语义比较查找并合并重复的记忆:
# Find potential duplicates (uses cross-refs + optional LLM analysis)
memory_find_duplicates(min_similarity=0.7, max_similarity=0.95, limit=10, use_llm=True)
# Merge duplicates (append, prepend, or replace strategies)
memory_merge(source_id=123, target_id=456, merge_strategy="append")
LLM 比较会分析记忆对并返回:
verdict:“duplicate”、“similar”或“different”confidence:0.0-1.0 的置信度分数reasoning:简要说明suggested_action:“merge”、“keep_both”或“review”
可通过 OPENAI_BASE_URL 搭配任何兼容 OpenAI 的聊天 API(OpenAI、OpenRouter、Azure 等)使用。此 LLM 流程可以使用 OpenRouter;但它不提供嵌入模型——请单独配置嵌入模型(参见“语义搜索与嵌入”)。
文档存储
将结构化文档(研究报告、架构决策、事后分析)存储为可搜索的片段树:
# Store a markdown document — auto-parsed into typed fragments
memory_store_document(
content="# Research Report\n\n## Evidence Table\n| Claim | Confidence |\n...",
document_key="research/memora-enhancements-2026-04-08",
tags=["memora/research"]
)
# Returns: {root_id: 230, fragment_count: 100, node_map: {claim: [...], plan_item: [...], ...}}
# Retrieve the full document or specific fragment types
memory_get_document(document_key="research/memora-enhancements-2026-04-08")
memory_get_document(document_key="...", node_kinds=["claim"], content_mode="full")
# Delete a document and all its fragments
memory_delete_document(document_key="research/memora-enhancements-2026-04-08")
**工作原理:**解析器会按结构拆分 Markdown——表格会拆分为单条声明,编号列表会拆分为计划条目,URL 列表会拆分为引用,风险章节会拆分为风险片段。每个片段都可以通过 memory_semantic_search 独立搜索,同时也可以将完整文档作为一个整体检索。
片段类型:claim、plan_item、reference、section_chunk、risk
**完整性保护:**文档片段受到保护,避免意外修改:
- 对片段调用
memory_delete时必须设置force=True memory_merge拒绝合并片段memory_absorb不会将片段纳入相似度匹配memory_find_duplicates和memory_detect_supersessions会跳过片段- 图形界面会隐藏片段,只显示文档根节点
记忆自动化工具
用于常见记忆类型的结构化工具:
# Create a TODO with status and priority
memory_create_todo(content="Implement feature X", status="open", priority="high", category="backend")
# Create an issue with severity
memory_create_issue(content="Bug in login flow", status="open", severity="major", component="auth")
# Create a section placeholder (hidden from graph)
memory_create_section(content="Architecture", section="docs", subsection="api")
记忆洞察
分析已存储的记忆并提取可执行的洞察:
# Full analysis with LLM-powered pattern detection
memory_insights(period="7d", include_llm_analysis=True)
# Quick summary without LLM (faster, no API key needed)
memory_insights(period="1m", include_llm_analysis=False)
返回:
- 活动摘要——该时间段内创建的记忆,按类型和标签分组
- 未完成事项——未完成的 TODO 和问题,并检测长期未处理的事项(可通过
MEMORA_STALE_DAYS配置;memory_insights默认为 14,图形界面默认为 30——两个使用方共用同一变量) - 整合候选项——可能适合合并的相似记忆对
- LLM 分析——主题、重点领域、知识缺口和摘要(需要
OPENAI_API_KEY)
记忆关联
管理记忆之间的关系:
# Create typed edges between memories
memory_link(from_id=1, to_id=2, edge_type="implements", bidirectional=True)
# Edge types: references, implements, supersedes, extends, contradicts, related_to
# Remove links
memory_unlink(from_id=1, to_id=2)
# Boost memory importance for ranking
memory_boost(memory_id=42, boost_amount=0.5)
# Detect clusters of related memories
memory_clusters(min_cluster_size=2, min_score=0.3)
知识图谱导出(可选)
如需离线查看,可将记忆导出为静态 HTML 文件:
memory_export_graph(output_path="~/memories_graph.html", min_score=0.25)
此功能为可选项——实时图谱服务可通过实时更新提供相同的可视化效果。
Neovim 集成
使用 Telescope 直接在 Neovim 中浏览记忆。将插件复制到配置中:
# For kickstart.nvim / lazy.nvim
cp nvim/memora.lua ~/.config/nvim/lua/kickstart/plugins/
用法: 按 <leader>sm 打开记忆浏览器,使用模糊搜索和预览。
需要在 Python 环境中安装 telescope.nvim、plenary.nvim 和 memora。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。

