Skip to main content
Glama
marc-shade

Enhanced Memory MCP Server

by marc-shade

增强型记忆 MCP 服务器

MCP Python 3.11+ License Tools

为 AI 智能体提供持久化、可搜索的记忆,基于 模型上下文协议。实体及其观察结果存储在一个带有校验和与版本历史的压缩 SQLite 数据库中;上层是分层存储和多策略检索管道;整个系统通过 MCP 工具暴露给客户端。

工具的数量取决于你安装的内容,这种差异并非缺陷:后端缺失的工具根本不会被注册。核心安装(requirements.txt)注册 186 个;添加可选后端(requirements-optional.txt)后增至 204 个。如果你在仅执行 pip install -r requirements.txt 后数到 186,系统并未损坏。

两个数字均在 Python 3.11.11 上通过 tools/list 经 stdio 测量,且 AGENTIC_SYSTEM_PATH 未设置。最后一个条件并非吹毛求疵。如果该变量指向 GraphRAG 下描述的独立系统,则会额外注册七个工具,数字变为 193 和 211。本文件的早期草稿曾写为 188 和 206,因为测量时所在机器已导出该变量,我们中有两人在未察觉共同原因的情况下复现了相同的错误数字。重新测量前请先取消设置该变量。

核心功能全部在本地运行,无需 API 密钥,无需网络。可选的向量栈(Qdrant 加 ollama)将检索从关键词匹配升级为基于语义的检索,缺失时系统会优雅降级而非崩溃。

首先需要知道的一件事

这是两个进程,而非一个。 关于此项目的几乎所有支持问题都源于只运行了其中一半。

   your MCP client  (Claude Code, Claude Desktop, an SDK, curl)
            |
            |   stdio JSON-RPC, one server process per client session
            v
   +-------------------------------------------------------+
   |  MCP server            server.py                       |
   |  start with            setup/bin/mcp-server.sh          |
   +-------------------------------------------------------+
            |
            |   JSON over a Unix socket: $MEMORY_DB_SOCKET_PATH
            |   (default /tmp/memory-db.sock)
            v
   +-------------------------------------------------------+
   |  memory-db daemon      memory_db_service.py            |
   |  start with            setup/bin/memory-db-daemon.sh    |
   |  REQUIRED. Owns the database file exclusively so that   |
   |  several clients can share it without corrupting it.    |
   +-------------------------------------------------------+
            |
            v
     memory.db   (SQLite, default ~/.claude/enhanced_memories/)


   optional, off to the side:
     Qdrant  http://localhost:6333    vector index for semantic recall
     ollama  http://127.0.0.1:11434   local embeddings that feed that index

守护进程不是可选的,MCP 服务器不会为你启动它。没有守护进程时,服务器仍然启动、仍然响应,并返回如下对象:

{"query": "anything", "count": 0, "results": [],
 "error": "Memory-DB service error: [Errno 2] No such file or directory"}

{"error": "Memory-DB service error: ...", "entities": {"total": 0},
 "compression": {"ratio": "N/A"}}

格式正确、可解析,但内容为空。智能体读取后会认为你的记忆为空,而非失聪。./healthcheck.sh 用于区分这两种情况。

Related MCP server: Strata Memory MCP Server

前提条件

  • Python 3.11 或更新版本。在某些 macOS 机器上,裸 python3 可能仍是 3.9,因此安装程序会优先查找带版本号的名称。

  • git,以及用于虚拟环境的磁盘空间。在 macOS arm64 上使用 Python 3.11 测量:核心安装 83 MB,添加可选后端后 964 MB(因为后者会拉取 sentence-transformers 和 torch)。在 Linux x86_64 上,核心安装为 131 MB(在 python:3.11-slim 容器中测量)—— wheel 因平台而异,因此数字会随你的平台变化。代码仓库本身为 5 MB。

  • 可选:podman 或 docker,如果你需要容器路径或本地 Qdrant。

  • 可选:ollama,用于本地嵌入。

全程无需 sudo。不会在系统范围内安装任何内容。

已经在运行增强型记忆系统?

如果此机器可能已经存在一个系统(旧版本检出、第二个克隆、数月前安装的服务),请在下面的步骤 2 之前阅读此内容。默认情况下,每个安装都希望使用相同的两个东西——套接字 /tmp/memory-db.sock 和数据库 ~/.claude/enhanced_memories/memory.db——并且它们不能被共享。

首先检查:

lsof /tmp/memory-db.sock        # macOS or Linux
ss -xl | grep memory-db.sock    # Linux
pgrep -af memory_db_service.py

任何列出的内容都表示安装正在运行。在已被占用的套接字上启动第二个守护进程会被拒绝:它以非零退出码退出,并打印套接字路径和正在响应的守护进程所使用的数据库,而不是接管套接字。这是一种保护机制,而非共存——第二个守护进程根本不会运行。

要并排运行两个安装,请在 .env 中为这个安装提供其专属的一切:

ENHANCED_MEMORY_DIR=/home/you/.enhanced-memory-second
MEMORY_DB_SOCKET_PATH=/tmp/memory-db-second.sock
# Only if you want the Neural Memory Fabric somewhere else again; by default it
# follows ENHANCED_MEMORY_DIR:
# NMF_SQLITE_PATH=/home/you/.enhanced-memory-second/nmf.db
# NMF_FILES_ROOT=/home/you/.enhanced-memory-second/nmf_files

ENHANCED_MEMORY_DIR 是最容易被遗忘的变量。两个守护进程在两个套接字上共享一个 memory.db 并非共存:这是两个独占所有者操作同一个文件,而这正是守护进程要防止的情况。

快速开始

git clone <this-repo> enhanced-memory-mcp
cd enhanced-memory-mcp

# 1. venv, dependencies, .env, database directory. Idempotent, re-runnable.
setup/setup.sh

# 2. start the daemon (foreground). Leave it running, or install it as a
#    background service: setup/service/install-services.sh
setup/bin/memory-db-daemon.sh &

# 3. prove the install works before you trust it
./healthcheck.sh

健康运行以 Required checks passed. 和退出码 0 结束。其他任何情况都是真正的问题:请参阅 故障排除

设置存储在 .env 中,步骤 1 仅在 .env 不存在时从 .env.example 创建它。编辑该文件是使设置持久化的方式;重新运行 setup/setup.sh 不会覆盖它。

然后在 MCP 客户端中注册服务器。在 ~/.claude.json 中:

{
  "mcpServers": {
    "enhanced-memory": {
      "command": "/absolute/path/to/enhanced-memory-mcp/setup/bin/mcp-server.sh"
    }
  }
}

将客户端指向 启动器,而非 python server.py。启动器会应用此代码仓库的 .env,这保证了 MCP 服务器和守护进程解析到相同的数据库文件。直接执行 python 的客户端只会继承该客户端当时拥有的环境,两个进程会悄然漂移。请参阅 分裂脑陷阱

至此安装完成,工具在被调用时即可工作。但没有任何工具会自动调用:每个会话都从冷启动开始,除非智能体选择写入,否则不会写回任何内容。这不是故障,也没有检查会报告它,因此很容易将正常工作的安装误认为正常工作的记忆。docs/AUTOMATION.md 介绍了如何弥补这一差距,从每次提示时运行的回忆钩子开始。

替代方案:一个共享的 HTTP 服务器

stdio 为每个客户端会话生成一个服务器进程,这是桌面客户端所期望的。如果你更愿意通过 HTTP 运行单个共享服务器,请使用 SSE 传输:

MCP_TRANSPORT=sse setup/bin/mcp-server.sh     # or setup/bin/mcp-server-sse.sh
{
  "mcpServers": {
    "enhanced-memory": { "type": "sse", "url": "http://127.0.0.1:9106/sse" }
  }
}

该端口上没有身份验证。请将 MCP_HOST 保持为 127.0.0.1

配置

配置通过环境变量进行。setup/setup.sh.env.example 写入一个 .env,其中内联记录了每个设置。编辑 .env 是持久化机制:复制仅在 .env 不存在时发生,因此你的编辑会在每次重新运行安装程序后保留(同样,新版本的默认值不会自动生效——升级后请比较两个文件)。环境中已设置的变量会在单次调用中覆盖文件中的值:

MEMORY_DB_SOCKET_PATH=/tmp/other.sock ./healthcheck.sh

变量

默认值

用途

ENHANCED_MEMORY_DIR

~/.claude/enhanced_memories

存放 memory.db 的目录。

ENHANCED_MEMORY_DB_PATH

(未设置)

数据库文件的完整路径。覆盖目录设置。

MEMORY_DB_SOCKET_PATH

/tmp/memory-db.sock

两个进程之间的 Unix 套接字。保持简短,请参见下面的 AF_UNIX 说明。在同一台机器上的第二个安装应使用自己的路径。

NMF_SQLITE_PATH

$ENHANCED_MEMORY_DIR/nmf.db

可选。神经记忆结构(Neural Memory Fabric)数据库。它默认跟随 ENHANCED_MEMORY_DIR;仅当需要将其放在其他位置时才设置此项。

NMF_FILES_ROOT

$ENHANCED_MEMORY_DIR/nmf_files

可选。NMF 文件存储,规则同上。

MCP_TRANSPORT

stdio

stdiossestreamable-http

MCP_HOST

127.0.0.1

仅用于 HTTP 传输。不要将其暴露到网络中。

MCP_PORT

9106

仅用于 HTTP 传输。

ENHANCED_MEMORY_SURFACE

frontdoor

frontdoor 注册所有工具,并将五个标记为始终加载(search_nodessemantic_recallcreate_entitiesget_memory_statusexecute_code),其余留给客户端的工具搜索;consolidated 暴露 7 个,其余隐藏在一个调度器后面;full 注册所有工具且不标记任何工具。

MEMORY_PROFILE

full

minimal 跳过可选集成,启动更快。

MEMORY_QDRANT_URL

http://localhost:6333

可选的向量存储。

MEMORY_OLLAMA_URL

http://127.0.0.1:11434

可选的嵌入提供者。

MEMORY_EMBED_MODEL

embeddinggemma

要拉取和使用的嵌入模型。

MEMORY_LOW_CONF_THRESHOLD

0.50

低于此分数的结果被标记为低置信度。

MEMORY_TOOL_REGISTRY_FILE

(未设置)

JSON 文件,声明 execute_code 内部的代码可以调用哪些其他 MCP 服务器。未设置表示未声明任何服务器,这对于一个无法知道你的机器上运行什么的包来说是诚实的默认值。

MEMORY_LOG_STDERR

1

WARNING 及以上级别的日志同时发送到 stderr 和日志文件,以便跳过的工具组可见。如果你的 MCP 客户端将 stderr 视为错误,请设置为 0

AGENTIC_SYSTEM_PATH

(未设置)

仅启用 GraphRAG,其实现未在此处提供。设置此变量后,工具数量从 186 增加到 193,或在使用可选后端时从 204 增加到 211。

EXPECTED_TOOL_COUNT

(未设置)

固定 ./healthcheck.sh 所需的工具数量。

ENHANCED_MEMORY_SURFACEMEMORY_PROFILE 都会改变 tools/list 返回的工具数量,安装的可选依赖项也会影响该数量:缺少后端的工具不会被注册。仅核心安装与包含可选扩展的安装会从同一代码报告不同的数量。预期的工具数量只有在三者都确定的情况下才有意义。

可选服务,以及没有它们会失去什么

两者都不是必需的。但两者都值得拥有。

存在时

缺失时

Qdrant

搜索按含义排序:关于“权限门控”的查询可以找到从未使用过这些词的实体。

搜索仍然有效并返回结果,但排序退回到词汇匹配。不会报错,这就是为什么很容易被忽视。

ollama

生成 Qdrant 索引所需的嵌入。

Qdrant 没有可索引的内容,因此即使 Qdrant 在运行,召回仍然停留在词汇层面。

提供其中之一或两者:

setup/setup.sh --with-qdrant     # container on 127.0.0.1:6333, named volume
setup/setup.sh --with-ollama     # verifies ollama, pulls the embedding model

./healthcheck.sh 将两者都报告为 OPTIONAL,并且不会因它们缺失而失败。如果需要更严格的契约,请传递 --require-optional

已经在运行 Qdrant?将 MEMORY_QDRANT_URL 指向它,并完全跳过 --with-qdrant;这里不需要拥有该实例。下面容器配置文件中讨论的端口冲突仅针对该配置文件,该配置文件在 6333 端口上发布自己的容器,并且无法绑定已被其他进程占用的端口。主机安装仅发出出站请求。

GraphRAG 是可选的且外部的

GraphRAG 工具(graph_enhanced_searchget_entity_neighbors)不在此处提供。graphrag_tools.py$AGENTIC_SYSTEM_PATH/scripts/graph-rag.py 加载其实现,该文件属于一个独立的系统,不是本包的一部分。AGENTIC_SYSTEM_PATH 默认为检出目录的父目录的父目录,因此在独立安装中该路径不存在。

不会出现任何问题。注册被包装,服务器记录 GraphRAG integration skipped: ... 并在没有这些工具的情况下启动。如果你确实拥有该系统,请将 AGENTIC_SYSTEM_PATH 指向其根目录,它们就会注册。请注意,跳过消息会写入日志文件,而不是你的终端,因此缺失的工具看起来就像从未存在过一样。

在容器中运行

共享环境的交付路径。优先使用 Podman,兼容 Docker。

podman-compose up --build                              # core only
WITH_OPTIONAL=1 podman-compose --profile qdrant up     # with a USABLE vector store

WITH_OPTIONAL=1 对 qdrant 配置文件至关重要。 默认镜像仅安装 requirements.txt,其中不包含 qdrant-client——因此没有它而使用 --profile qdrant 会给你一个健康、可访问但完全未使用的 Qdrant:健康检查报告服务可访问(true),而服务器记录“qdrant-client not installed - vector search disabled”,每次搜索都停留在词汇层面。一个绿色信号旁边是一个无用的能力,这正是本项目旨在消除的失败模式,因此在此明确指出,而不是留给你去发现。WITH_OPTIONAL=1 构建的镜像包含 requirements-optional.txt,向量路径才会真正启用。(实测:一个核心镜像与 qdrant 配置文件一起运行时,对 /readyz 响应“all shards are ready”,但实际上并未使用它。)

使用连字符。在 Fedora 44 上,podman compose(带空格)会交给外部提供者 /usr/libexec/docker/cli-plugins/docker-compose,后者需要 Docker 兼容的 API 套接字。当 podman.socket 未激活(默认情况)时,podman compose up 会失败:

failed to connect to the docker API at unix:///run/user/1000/podman/podman.sock:
  connect: no such file or directory

systemctl --user start podman.socket 可以解决这个问题,或者直接使用 podman-compose(此处为 1.6.0),它直接驱动 podman,不需要 socket。在 Fedora 44 上使用 podman 5.8.4 实测:podman compose up 如上所述失败,podman-compose up -d 成功启动堆栈,容器报告为 healthy

该镜像在 container-entrypoint.sh 下运行两个进程,该脚本启动守护进程,等待 socket 响应,然后才在 SSE 传输上启动 MCP 服务器。如果任一进程退出,容器就会退出,因为一个活着的 MCP 服务器旁边是一个死掉的守护进程,正是那种永远返回格式良好的零的状态。

一些能节省你时间的说明:

  • podman build 会丢弃 HEALTHCHECK Podman 默认使用 OCI 镜像格式,该格式没有对应字段。它确实会在构建时警告一次:

    HEALTHCHECK is not supported for OCI image format and will be ignored.
    Must use `docker` format

    如果错过了构建输出中的那一行,就再也不会有人提及它:镜像不携带健康检查,podman ps 也永远不会显示健康状态。在 podman 5.8.4、Fedora 44 上实测:OCI 镜像的 .HealthCheck 检查为 nil,使用 podman build --format docker 重新构建会得到 [CMD /app/setup/lib/container-health.sh]

    有三种解决方法,均已验证:使用 --format docker 构建;使用 compose,其服务级健康检查在 compose.yaml 中定义,无论镜像格式如何都适用(由 compose 管理的容器从同一个检查为 nil 的镜像报告为 healthy);或者使用 podman exec <name> /app/healthcheck.sh --skip-mcp 按需检查。

  • MCP 端口仅发布在主机回环地址上(127.0.0.1:9106:9106)。在容器内部,服务器绑定 0.0.0.0,这在容器内是正确的,但在工作站上则是错误的。

  • Qdrant 的主机端口是 ${QDRANT_PORT:-6333}${QDRANT_ADMIN_PORT:-6334}。如果你已经在 6333 端口上运行 Qdrant,请在 .env 中设置它们,否则会发生绑定冲突,导致配置文件无法启动。

  • 该镜像是核心安装,因此 qdrant 配置文件本身不会做任何事情。 podman-compose --profile qdrant up 会给你一个能启动、通过健康检查并响应其端口的 Qdrant,而服务器没有 qdrant-client 可以与之通信。一切看起来都是绿色的,但没有任何内容被索引。使用可选堆栈构建以实际使用它:

    podman build --build-arg WITH_OPTIONAL=1 -t enhanced-memory:local -f Containerfile .
    # or, through compose:
    WITH_OPTIONAL=1 podman-compose up --build

    ./healthcheck.sh 区分了这两种情况:只有当客户端库可导入时,它才报告 Qdrant 既可访问又可用,并在服务已启动但没有任何东西可以使用它时发出警告。

  • 数据库位于命名卷 enhanced-memory-data 中。没有卷,你的记忆会随容器一起消亡。

  • ollama 在你的主机上运行,容器无法通过 127.0.0.1 访问它。取消注释 compose.yaml 中的 MEMORY_OLLAMA_URL(podman 使用 host.containers.internal,docker 使用 host.docker.internal)。

  • 验证正在运行的容器的方式与验证主机安装的方式相同。使用绝对路径:并非每个引擎都会将相对路径解析为相对于 WORKDIR 的路径。

    podman exec enhanced-memory /app/healthcheck.sh --skip-mcp
  • 你本地的 .env 不是容器的配置。镜像故意附带一个空的 .env,所有真实配置都来自 compose.yaml 中的运行时环境。.containerignore.dockerignore 排除了该文件,但并非每个引擎都遵守它们(Apple 的 container build 没有遵守,已于 2026-08-14 验证),因此 Containerfile 还会在一个被丢弃的构建阶段将其清空,如果填充后的文件幸存下来,则构建失败。

作为后台服务运行

setup/service/install-services.sh              # daemon only
setup/service/install-services.sh --with-sse   # and a shared SSE server
setup/service/uninstall-services.sh

macOS 上的 launchd 用户代理(~/Library/LaunchAgents),Linux 上的 systemd 用户单元(~/.config/systemd/user)。不需要 root,不需要系统单元。所有路径都根据此检出位置渲染,因此如果你给它们不同的 --label-prefix 值、不同的 MEMORY_DB_SOCKET_PATH以及不同的 ENHANCED_MEMORY_DIR,两个检出可以共存。三个都要,而不是前两个:仅使用不同的 socket 会导致两个守护进程打开同一个 memory.db,而每个守护进程都应该独占该文件。

安装程序会等待 socket,如果服务未启动,则会大声失败并显示日志尾部。日志位于 ~/Library/Logs/enhanced-memory${XDG_STATE_HOME:-~/.local/state}/enhanced-memory/log,故意不在检出目录中:launchd 无法在生成时在外部卷上创建日志文件,作业会在你的代码运行之前以退出码 78 死亡。

在 Linux 上,除非你启用 lingering,否则用户单元会在注销时停止:

loginctl enable-linger $USER

验证你的安装

两个门槛,按此顺序。

./healthcheck.sh                 # the post-install gate
python3 comprehensive_test.py    # the functional suite (needs the daemon running)

第三个面向开发者的套件位于 tests/ 下,需要先执行 pip install -r dev-requirements.txt —— pytest 故意不包含在任何运行时需求文件中,上述两个门槛仅依赖标准库即可运行。

根据 comprehensive_test.py 的退出代码来判断,而不是通过计数。检查次数取决于它选择的模式:如果没有设置 ENHANCED_MEMORY_*MEMORY_DB_* 变量,它会构建自己的沙箱并运行所有内容;如果设置了这些变量,它会针对你的部署运行,并跳过描述它未创建的沙箱的检查。在一台机器、一次提交上实测:106 个隔离检查和 102 个操作员导向检查,均退出码为 0。运行时会打印自己的模式并说明跳过了什么。

安装可选后端会使该计数改变,两种方式都实测过。此文件的早期修订版说后端是原因。它们不是,而且在任何人测试之前,同样的错误猜测也被附加到了 pytest 跳过计数上;有关实际影响该计数的内容,请参阅 RELEASE_NOTES.md 中的测试套件部分。

./healthcheck.sh 的设计使其可能失败。它通过守护进程 socket 写入一个探针实体,搜索回来,然后删除它。它将任何响应中的 errordaemon 键视为失败,无论其余负载如何,并将守护进程报告的数据库路径与你的环境解析的路径进行比较。它检查:

  1. venv、解释器版本、.env、socket 路径长度、源文件存在性

  2. 守护进程往返(状态、数据库一致性、写入、读回、清理)以及模式检查:拥有此数据库的两个文件中的每个字面 INSERT 都与实时表定义进行比较,因为模式缺少的列会导致每次写入失败,而守护进程会逐行报告失败而不是抛出异常

  3. 通过 stdio 的 MCP 握手、工具数量,以及 stdout 没有被污染

  4. Qdrant 和 ollama,标记为 OPTIONAL,绝不致命

有用的标志:--skip-mcp 用于快速的仅守护进程检查,--expect-tools N 用于固定数量,--require-optional 用于要求向量堆栈。

日志在哪里

/tmp/enhanced-memory-mcp.log,始终如此,适用于主机上的所有安装。

MCP 服务器在启动时清除所有日志处理程序,并将所有内容发送到该单个轮转文件(50 MB,两个备份),因为在 stdio 传输上,stdout 上的任何内容都会破坏协议。常规 INFO 仅存在于那里,路径是固定的,因此一台机器上的两个检出会交错写入同一个文件,时间戳和 pid 是你唯一的区分方式。

WARNING 及以上级别还会额外发送到 stderr,除非你设置 MEMORY_LOG_STDERR=0。这是故意的:每个 ... integration skipped: <reason> 行都是一个未加载的功能,仅将它们路由到 /tmp 下的文件意味着没有人会阅读它们。如果你的 MCP 客户端将任何 stderr 输出视为错误,请将该变量设置为 0 并改为读取文件。

./healthcheck.sh 也会报告这些,作为 WARN mcp-startup 行列出不同的警告,因此缺失的功能会出现在门槛中,而不仅仅是在日志中。在此分支上实测:核心安装产生 11 个(numpy、qdrant-client、sentence-transformers、redis、neo4j 等),完整安装产生 3 个。它们都不会导致门槛失败。它们是你的安装所没有的内容清单,值得读一次然后忽略。

验证此版本的签名

提交使用 SSH 签名。Git 在你告诉它信任哪些密钥之前不会验证它们,并且该配置不会随克隆一起传播:

git config gpg.ssh.allowedSignersFile .allowed_signers
git log --show-signature -1

没有第一行,git log --format=%G? 会为每个提交报告 N,这意味着“无法验证”,而不是“未签名”。签名无论哪种方式都存在:git cat-file commit HEAD 会显示 gpgsig 块。

故障排除

每个工具都返回零,或返回 error 字段

守护进程未运行。这是绝大多数情况。

{"count": 0, "results": [], "error": "Memory-DB service error: ..."}
setup/bin/memory-db-daemon.sh          # foreground, watch it
./healthcheck.sh --skip-mcp            # confirm the round trip

服务器和守护进程对数据库的看法不一致

症状:写入似乎成功,但搜索永远找不到它们,或者 get_memory_status 报告的计数与你存储的不匹配。两个进程解析了不同的文件,并且两者都没有报错。

./healthcheck.sh 直接检测到这一点:

FAIL db-agreement  SPLIT BRAIN: daemon holds /path/A/memory.db,
                   this environment resolves /path/B/memory.db

原因:某个进程以与另一个进程不同的 ENHANCED_MEMORY_DIRENHANCED_MEMORY_DB_PATHHOME 启动。通常是 MCP 客户端配置为直接执行 python server.py,绕过了应用 .env 的启动器。修复客户端配置以使用 setup/bin/mcp-server.sh,然后重新启动两个进程。

内容查询返回零,而名称查询正常

e9ca30c 起,这不会静默发生:当搜索无法看到观察内容时,响应会说明这一点——

{"count": 0, "results": [], "degraded": "name-only (observations_fts missing)"}

degraded 表示数据库早于全文索引,并且自升级以来没有守护进程对其初始化。重新启动守护进程:init_database() 现在会创建索引并回填所有现有行。另一个值 name-only (FTS query error) 是每个查询的,表示查询文本在清理后破坏了 FTS 语法;名称/类型匹配仍然运行。

重新导入种子会追加重复的观察

已在 e9ca30c 中修复:create_entities 会跳过该实体已存在完全相同内容的观察,并在其响应中将跳过报告为 observations_deduped,因此重复的种子导入是幂等的。真正的新观察仍然会追加。修复前重新导入创建的重复项不会为你删除——issue #8 中有一次性清理 SQL。

重新措辞的重新导入(同一种子文件稍作编辑)也会被检测到,通过确定性 simhash——不涉及 LLM。默认情况下,它们会存储并报告near_duplicates 响应字段中,指明每个相似于哪个现有行:在此层,更正(“62Gi” → “125Gi”)与重新措辞无法区分,而记忆存储绝不能静默丢弃更正。知道自己在重新导入的导入管道可以设置 ENHANCED_MEMORY_NEAR_DUP_POLICY=skip 来丢弃它们;该变量的任何其他值都会回退到安全的存储并报告。距离阈值和测量的校准带位于 simhash_dedup.py 中。

守护进程启动时出现 OSError,没有有用的消息

socket 路径太长。AF_UNIX 在 macOS 上将路径字符串限制为 104 字节,在 Linux 上为 108 字节,bind() 会失败,并出现一个既不提及限制也不提及路径的错误。深层检出在 socket 放置在其中时立即遇到此问题。

保持 MEMORY_DB_SOCKET_PATH 简短并在检出目录之外,例如 /tmp/em-myproject.socksetup/setup.sh 会测量它,如果太长则拒绝继续。

macOS:服务安装但守护进程从未启动

如果日志在启动器路径上显示 Operation not permitted,则检出位于 launchd 不允许执行的位置。已于 2026-08-14 验证:在 /Volumes 下的外部卷上的检出可以正常安装和加载,然后每次生成都会因 EPERM 失败,因为 launchd 在没有你的终端所具有的磁盘访问权限的情况下运行。

将检出移动到你的主目录或其他本地路径并重新安装,或者如果位置不可协商,则授予 launchd 完全磁盘访问权限。安装程序会暴露这一点而不是隐藏它:它等待 socket,30 秒后失败,并打印错误日志的尾部。

ConnectionRefusedError 而 socket 文件存在

被终止的守护进程留下了这个文件。重新启动守护进程后,它会自行删除该文件,并记录 removed stale socket <path>;启动器在执行前也会执行相同操作。不要养成手动删除套接字文件的习惯——一个仍在服务的文件看起来与过时的文件完全一样,删除它会切断该守护进程所有客户端的连接。

REFUSING TO START: another daemon is already serving ...

这是预期行为:其他进程正在该套接字路径上响应。消息会指明套接字名称,以及当另一个守护进程回复状态请求时,它所持有的数据库。要么停止那个守护进程,要么为当前守护进程指定自己的 MEMORY_DB_SOCKET_PATH ENHANCED_MEMORY_DIR——请参阅已在运行增强型内存系统?

MCP 客户端在握手时因 JSON 解析错误而失败

有内容打印到了 stdout,而 stdout 在 stdio 传输上专属于 JSON-RPC 流。./healthcheck.sh 的检查 3 会将其报告为 FAIL mcp-stdout,并附上违规行。

python3 是 3.9 版本

这在 macOS 上很常见。安装一个受支持的解释器(brew install python@3.11),然后重新运行 setup/setup.sh,该脚本会优先使用带版本号的名称。要强制指定一个:setup/setup.sh --python /path/to/python3.11

差距与已知问题

这些内容编写出来是为了重新检查,而非完全信任。

  • 健康检查未测试 SSE 传输,未调用单个工具(仅列出它们),未测试多个客户端的并发访问,也未测量有无向量栈时的召回质量。

  • 本 README 旧版本中引用的性能数据未在此处复现,已被删除而非重复。本文件中的任何内容均不声称吞吐量、延迟或压缩比。

  • 容器路径已在 Fedora 44、linux/amd64 上使用 podman 5.8.4 验证:构建、运行,内部完整健康检查通过,监督测试产生 Exited (1),入口点指明了哪一半失败,并且 podman-compose 使整个栈健康运行。开发期间也在 Apple 的 container 和 macOS/arm64 上的 Docker 下构建并运行。未涵盖:除 Fedora 44 外的任何发行版,以及 rootful podman(上述所有操作均为 rootless)。

  • 服务单元由安装程序安装并启动,安装程序会等待套接字,如果套接字未出现则会大声报错。未测试在真实重启或注销后的存活能力。

  • 工具数量因界面、配置文件以及安装的可选依赖项而异。任何单一数字都应视为特定于某台机器的配置。

许可证

MIT

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
1hResponse time
Release cycle
Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.

  • Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.

  • Universal memory for AI agents and tools. Save, organize and search context anywhere.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/marc-shade/enhanced-memory-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server