Synap Memory

ai.maximem由 maximem.ai 发布官方发布者v0.1.0更新于 Oct 24, 2026

Persistent memory for AI agents — log and recall conversation context over MCP.

已验证Streamable HTTP可网页运行知识与记忆AI 与机器学习

概览

AI 生成的概览

托管的 Synap 记忆服务器,让助手记录对话往来并回忆已掌握的关于某位用户的信息。

可以做什么
  • 记录每条用户消息与助手回复,由 Synap 提取并保存其中重要的内容
  • 在回复前按用户最新消息检索过往上下文
  • 列出近期记住的内容,用于调试或确认记忆是否生效
  • 查询某次记录是否处理完成,以及提取出多少条记忆
适用场景
适合希望智能体跨对话保留终端用户记忆、又不想自建存储的场景,尤其是只接受 MCP 地址和令牌的无代码平台。B2C 与 B2B 部署下的按用户回忆都适用。
运行要求
远程 MCP 端点,无需本地安装。需要一个 Synap API 密钥,以 Authorization Bearer 令牌形式发送,可在 Synap 控制台获取。若服务多个终端用户,记录与回忆时需传入相同的 user_id;B2B 实例还需 customer_id。
安装前请注意
API 密钥会被转发至 Synap 后端并代表你的账户,应视为机密。记录会把用户消息和助手回复发送给 Synap 并加以存储和提取,请勿提交不希望被保留的敏感内容。写入是异步的;作用域用错(B2C 实例传 customer_id,或 B2B 实例只传 user_id)会被拒绝或把记忆归错人。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Synap Memory,将其添加到工作区。
  2. 连接 Authorization token 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/ai.maximem%2Fsynap/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "synap-memory": {
      "type": "http",
      "url": "https://synap-mcp.maximem.ai/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

README

synap-mcp-server

[Maximem Synap MCP connector – tool definition quality and endpoint health on Glama]

Hosted remote MCP server (Streamable HTTP) that re-fronts the existing Synap public REST operations as MCP tools, so no-code platforms (Gumloop, n8n) can give their agents persistent memory with nothing but a pasted MCP URL and a Bearer token.

It is a stateless adapter — no new backend, storage, or pipeline. Each tool call maps to one existing REST operation, and the incoming Bearer synap_<key> token is forwarded verbatim to synap-cloud, which owns auth.

  • Public endpoint (prod): https://synap-mcp.maximem.ai/mcp
  • Health: https://synap-mcp.maximem.ai/health

Tools

ToolREST operationNotes
log_exchangePOST /api/v1/memories/create (mode=long-range)Forward every turn; extraction decides what persists. user_id scopes per end-user, customer_id is B2B only (see Scoping); optional conversation_id.
recall_contextPOST /v1/context/{client|user|customer}/fetch (mode=fast)Hot path; no IDs ⇒ client scope. customer scope is B2B only.
list_recent_memoriesbroad /v1/context/.../fetch (no query)Debug / "test my memory". Same scoping rules.
check_memory_statusGET /api/v1/memories/status/{id}Takes no scope ids: the ingestion_id already identifies the write.

Scoping: one contract, two modes

The REST API enforces this. It is not advice, and it has been live on production since 2026-08-26 07:07 UTC.

Instance mode (user_context_isolation)What to sendWhat happens otherwise
equals_customer (B2C)user_id and nothing else. The user id is the whole identity.Any customer_id is rejected with HTTP 400. /v1/context/customer/fetch is not available at all.
strict (B2B)customer_id is required, alongside user_id.A user_id on its own is an error. Unchanged by this contract.

GET /api/v1/auth/whoami reports the mode as user_context_isolation. This server reads it once per token and refuses a customer_id locally on a B2C instance, so a model gets a sentence telling it what to send instead of a status code it cannot act on. If the mode cannot be read, nothing is refused and the API stays authoritative.

Pass no IDs at all ⇒ client scope (shared per credential), which is valid in both modes. Note: client-scope writes are not surfaced on the dashboard Memories page (relational), so per-user scoping is recommended when dashboard visibility matters. Fill user_id from an n8n expression / Gumloop input, and pass the same value on log_exchange and recall_context so writes and reads address the same person.

Host header. The server disables the MCP transport's DNS-rebinding check (it sits behind a proxy + Bearer auth), so any reverse proxy can forward the real Host — no Host-rewrite hack needed.

Run locally

bash
pip install -e ".[dev]"SYNAP_API_URL=http://localhost:8000 uvicorn synap_mcp_server.server:app --port 8090curl http://localhost:8090/health        # {"status":"ok",...}

Reporting the turn to the anticipation agent

An MCP server is not an agent. It exposes tools to somebody else's agent and is handed one stateless HTTP call at a time, so most of what an agent does is invisible here: the caller's tool calls, its tool results and its reasoning never reach this process, and nothing tells a stateless server that a conversation has ended. Those are not reported, because there is nothing to report.

The turn does exist. log_exchange is handed the user's message and the assistant's reply as arguments. Set MCP_STREAM_EVENTS=true and each logged exchange is also reported as a conversation turn on POST /v1/events/batch, the HTTP door onto the same listening path the gRPC stream feeds, so the anticipation agent sees the turn and not only the memory extracted from it. This server does not use the SDK's gRPC stream, as the other integrations do: it holds no SDK, keeps no state between requests, and every request can carry a different tenant's key, so a stream per key would be an unbounded pool of connections that nothing closes. Moving it onto the SDK would be a rewrite of its transport for a caller that has no use for what the stream brings back.

Nor does it replace anything of Synap's compaction: the caller's agent keeps its own history and no tool here returns a conversation.

It is off by default, on purpose. Turning it on adds a second backend call per log_exchange, writes the turn to conversation history in addition to the long-range document, and runs the anticipation agent, which bills model calls.

It is not on by default for a second reason. Synap extracts from a conversation when it is compacted, which starts once ten messages have been recorded. Recording every exchange as turns instead of the long-range document would hold the memory back until then (the next recall_context finds nothing, and there is no ingestion_id to check); recording them as well extracts each exchange twice.

What does not change either way: log_exchange still queues the long-range document and still returns the ingestion_id that check_memory_status and wait_for_processing are built on. A turn report is best effort and can never alter what a tool answers. A turn with no user_id or no conversation_id is not reported at all, because the events route requires both.

Test

bash
pip install -e ".[dev]"pytest -q

Config (env)

VarDefaultMeaning
SYNAP_API_URLhttp://synap-cloud:8000Backing REST API base URL (internal docker hostname in prod).
MCP_PORT8090Listen port.
MCP_RECALL_TIMEOUT_S10Recall (read) timeout.
MCP_INGEST_TIMEOUT_S8Log/ingest (write) timeout.
MCP_DEFAULT_MAX_RESULTS10Default recall result count.
MCP_STREAM_EVENTSfalseAlso report a logged exchange as a conversation turn for anticipation. See above before enabling.
MCP_EVENTS_TIMEOUT_S4Turn-report timeout. Best effort; a miss never changes a tool's answer.
LOG_LEVELINFOLog level.
ENVIRONMENTproductionReported in /health.

No Synap API key is configured on the server — the end user's key arrives per-request as a Bearer token.

See the Synap MCP documentation for platform setup guides (Gumloop, n8n) and deployment details.

来源:packages/mcps/synap-mcp-server/README.md,提交 d56bd9c

工具

4

log_exchange

After each user message, send the exchange here so it can be remembered. You do not need to decide what is important, just forward the user message (and your reply, if you have one) and Synap will keep what matters. If your app serves more than one end-user, pass that person's stable id as user_id so each person's memory stays separate; if every conversation is the same single user, omit it. SCOPING: customer_id is B2B ONLY. On a B2B instance (user_context_isolation=strict) it is REQUIRED and a user_id on its own is an error. On a B2C instance (user_context_isolation=equals_customer) it is NOT accepted: the API rejects it with HTTP 400, customer-scoped retrieval does not exist there, and user_id is the whole identity. If you do not know which mode this instance is in, send user_id only and no customer_id; GET /api/v1/auth/whoami reports the mode as user_context_isolation. Logging is fire-and-forget by default; set wait_for_processing=true only when you need to confirm the memory finished extracting before continuing.

输入参数user_idcustomer_iduser_message必填conversation_idassistant_messagewait_for_processing

check_memory_status

Check whether a logged exchange has finished processing. Pass the ingestion_id returned by log_exchange. Returns the processing status and how many memories were extracted. Useful to confirm a save completed (extraction is asynchronous). Takes no user_id or customer_id: an ingestion_id already identifies the write, so the identifier contract does not apply here.

输入参数ingestion_id必填

recall_context

Before replying, call this to recall anything already known about this user from past conversations. Use the user's latest message as the query. If you serve multiple end-users, pass the same user_id you log with so you recall the right person's memory. SCOPING: customer_id is B2B ONLY. On a B2B instance (user_context_isolation=strict) it is REQUIRED and a user_id on its own is an error. On a B2C instance (user_context_isolation=equals_customer) it is NOT accepted: the API rejects it with HTTP 400, customer-scoped retrieval does not exist there, and user_id is the whole identity. If you do not know which mode this instance is in, send user_id only and no customer_id; GET /api/v1/auth/whoami reports the mode as user_context_isolation.

输入参数query必填user_idcustomer_idmax_results

list_recent_memories

List recent things remembered about this user. Useful for debugging or to confirm that memory is working. Pass user_id to scope to one person. SCOPING: customer_id is B2B ONLY. On a B2B instance (user_context_isolation=strict) it is REQUIRED and a user_id on its own is an error. On a B2C instance (user_context_isolation=equals_customer) it is NOT accepted: the API rejects it with HTTP 400, customer-scoped retrieval does not exist there, and user_id is the whole identity. If you do not know which mode this instance is in, send user_id only and no customer_id; GET /api/v1/auth/whoami reports the mode as user_context_isolation.

输入参数user_idcustomer_idmax_results

版本历史

1
  1. v0.1.0最新Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分