mcpField
M
Memora

Memora

本地服务
github.com/agentic-mcp-tools记忆与知识7461 天前更新

关于 Memora

Memora 是面向 AI Agent 的持久化协作记忆层,提供结构化存储、语义检索和图关系,适合需要跨会话保留上下文的 Agent 工作流。它通过吸收内容、去重与版本沿袭来组织记忆,并可按主题汇总记忆、待办事项及来源。

主要功能

  1. 01持久化存储与多数据库路由
  2. 02吸收内容并识别重复和更新
  3. 03保留被替代记忆的版本沿袭
  4. 04语义、全文及混合检索
  5. 05文档片段、待办事项与问题管理
  6. 06交互式知识图谱与记忆洞察

适用场景

  1. 01在多个会话间保留 Agent 上下文
  2. 02检索主题相关记忆、待办和来源
  3. 03维护知识更新及其历史版本
  4. 04搜索文档片段并查看记忆关系

MCP 相关

Memora 作为 MCP 服务向客户端提供记忆存储、吸收、检索、摘要和管理工具。可通过本地 stdio 或 HTTP 传输运行。

配置

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

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

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

详细介绍

Memora Logo Memora

“只有当某个瞬间成为回忆,你才会真正懂得它的价值。”

为 AI Agent 提供持久的集体记忆
面向 Agent 的 MCP 记忆层:提供结构化存储、语义检索、图关系,以及有来源支撑的跨会话上下文。

版本 许可证 收录于 Awesome Claude Code

Memora 吸收与摘要流程

将 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)和轮换方式见约定。

预览

Memora 记忆图谱演示 Memora 记忆交互演示

安装

有两种方式。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 前:

  1. 安装 Apple 的 container CLI(从其 GitHub Releases 下载签名 pkg)。它需要搭载 Apple 芯片且运行 macOS 26 的 Mac——Apple 不支持在较旧的 macOS 版本上使用 container。

  2. 启动运行时——这是 Apple 文档指定的首条命令;如果尚未配置内核,它也会安装内核:

    container system start
    
  3. 克隆此仓库并进入目录:

    git clone https://github.com/agentic-box/memora.git
    cd memora
    
  4. 复制实例模板。模板自带 INSTANCE=myinstance,因此后续的 build/up/proxy 命令无需重命名即可匹配。编辑 PORT 和一个后端(STORAGE_URI、VOLUME 或 MEMORA_DATABASES):

    cp instances/example.env instances/myinstance.env
    
  5. 创建凭据文件并安装 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;所有现有部署都保持逐字节不变
leader19 个Agent 集合,加上 memory_create_section、memory_store_document、memory_get_document、memory_tags、memory_delete、memory_digest、memory_list
agent12 个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_tool Python 辅助函数)运行一次验证。如果已安装的 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"}——响应正文不会列出其他名称。
/mcpMEMORA_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_BINmemora-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-transformerspip 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 安全访问

设置:

  1. 创建 D1 数据库:

    npx wrangler d1 create memora-graph
    npx wrangler d1 execute memora-graph --file=memora-graph/schema.sql
    
  2. 部署 Pages:

    cd memora-graph
    npm run deploy
    

    npm run deploy 会先运行 scripts/d1_write_guard.py --scope all,发现任何问题时都会拒绝部署。不要直接运行 wrangler pages deploy:这会绕过防护检查(docs/local-primary-implementation.md §0 P6)。

  3. 在 Cloudflare Dashboard 中配置绑定:

    • Pages → memora-graph → Settings → Bindings
    • 添加 D1:DB_MEMORA → 你的数据库
    • 添加 R2:R2_MEMORA → 你的存储桶(用于图片)
  4. 使用 D1 URI 配置 MCP:

    {
      "env": {
        "MEMORA_STORAGE_URI": "d1://<account-id>/<database-id>",
        "CLOUDFLARE_API_TOKEN": "<your-token>"
      }
    }
    

访问地址: https://memora-graph.pages.dev

使用 Zero Trust 保护:

  1. Cloudflare Dashboard → Zero Trust → Access → Applications
  2. 为 memora-graph.pages.dev 添加应用程序
  3. 创建允许指定电子邮件地址的策略
  4. Pages → Settings → 启用 Access Policy

有关详细设置和多数据库配置,请参阅 memora-graph/。

与记忆对话

直接在图形界面中询问知识库相关问题。聊天面板使用 RAG(检索增强生成)搜索相关记忆,并以流式方式返回 LLM 响应,同时支持工具调用。

  • 通过右下角的浮动聊天图标切换
  • 语义搜索会将最相关的记忆作为上下文
  • 流式响应包含可点击的 [Memory #ID] 引用,点击后会聚焦到图中的对应节点
  • 工具调用——LLM 可以直接在聊天中创建、更新和删除记忆(例如,“将此保存为记忆”、“删除记忆 #42”、“更新记忆 #10,内容为……”)
  • 本地服务和 Cloudflare Pages 部署均可使用

配置聊天模型:

后端变量默认值
本地服务CHAT_MODEL 环境变量回退到 MEMORA_LLM_MODEL
Cloudflare Pageswrangler.toml 中的 CHAT_MODELdeepseek/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。

评论

支持 Markdown

第一次接触 MCP?

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

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