polymnemo
概览
作者提供的说明(英文原文)
Shared cross-LLM long-term memory over MCP: semantic recall, sessions, and media (pgvector).
PopNx MCP 的三大支柱
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
- 用户评价i暂无评价评价功能将在后续阶段与账户功能一起开放
- 我们的基础检查i3 项中通过 3 项依据公开信息检查;尚未扫描代码
- 使用情况i非常新★ –
它能帮你做什么
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
- 连接方式: 在云端运行
- 传输方式: Streamable HTTP
- 分类: 搜索与 AI 记忆
- 你需要填写:Authorization
安装
选择你使用的 AI 应用,然后复制设置。
安装之前
- 基础检查:3 项中通过 3 项
- 在作者的服务器上运行:你向它提出的内容会经过他们的服务器。
- 需要你自己填写:
Authorization
标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
- 在云端运行无需安装任何东西,通过互联网连接
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
在终端中运行这条命令
claude mcp add --transport http polymnemo https://polymnemo.purpleground-26f6d744.westus2.azurecontainerapps.io/mcp --header 'Authorization: your-value'运行前请先填写空着的值。
或者自己复制设置
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"polymnemo": {
"url": "https://polymnemo.purpleground-26f6d744.westus2.azurecontainerapps.io/mcp",
"headers": {
"Authorization": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
或者自己复制设置
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"polymnemo": {
"type": "http",
"url": "https://polymnemo.purpleground-26f6d744.westus2.azurecontainerapps.io/mcp",
"headers": {
"Authorization": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
你的选择通过 Cookie 保存在这台设备上,无需账户。
需要你填写的值
Authorization机密 必填 HTTP headerBearer . Keys are per-user; request one from the maintainer.
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它能做什么
服务器要求先登录,才会列出它的工具。
基础检查i
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月9日
- ✓ 通过
作者与仓库一致
注册名称已通过 GitHub 账户 PCBZ 验证,该账户拥有此仓库
- … 尚未检查
仍在维护
我们还没有从 GitHub 读取这个仓库
- … 尚未检查
有许可证
我们还没有从 GitHub 读取这个仓库
- ✓ 通过
端点有响应
在 479 毫秒内响应(HTTP 401)
- ✓ 通过
使用 OAuth 登录
声明支持 OAuth 登录,你的 AI 应用可以带你去登录
- … 尚未检查
工具描述中没有隐藏指令
尚未检查;我们会在检查端点时读取工具列表
与“搜索与 AI 记忆”中的其他服务器比较i
- 星标数多于此分类中其他 5755 个服务器的 0%
- 发布到注册中心的时间比此分类中其他 5755 个服务器的 75% 更新
- 基础检查结果等于或优于此分类中其他 5755 个服务器的 100%
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
常见问题
polymnemo 安全吗?
它在 3 项适用的基础检查中通过了 3 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
它需要哪些密钥或代码?
你需要填写:Authorization
它在我的电脑上运行还是在云端?
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
它还在维护吗?
GitHub 仓库最后更新于–,最新版本(1.5.0)于12天前进入注册中心。
哪些应用可以使用它?
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
有什么可以替代它?
同一分类中有:Context7, Codebase Memory, Exa
替代选择
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
Codebase Memory
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Exa
Connect AI agents to Exa for web search, content fetching, and multi-step research.
作者的 README
打开 README
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
polymnemo
A shared long-term memory across any LLM, over [MCP](https://modelcontextprotocol.io).
Point Claude Desktop, an MCP-capable IDE, or any MCP client at one polymnemo endpoint and they share the same memories — stored in your own Postgres. Store a fact with one assistant, recall it from another; save whole sessions and reload them; even attach files, images, or video. Embeddings run locally (no embedding API key), and the server makes no generative-LLM calls.
Status: active development. Semantic memory + pgvector store, session
save/reload, and multimedia memories all work; deployable to Azure Container
Apps (or Cloud Run) via Terraform.
Features
- 🔗 Cross-LLM shared — point any MCP client at one endpoint; they share the same memory.
- 🧠 Semantic recall — vector search over Postgres + pgvector by default, with exact-text and fused (RRF) modes when you need to find an ID or a name.
- 💬 Sessions — save a full transcript and reload it verbatim, or recall across it.
- 🖼️ Multimedia — attach files, images, or video; bytes go to object storage, only a searchable description is embedded.
- 🔒 Local & private — embeddings run locally (ONNX): no embedding API key, and no generative-LLM calls, ever.
- 👥 Namespaces — "born-shared" collections readable by everyone, vs. private-to-owner; writes are always owner-scoped.
- 🧩 Pluggable layers — store, embedder, auth, retriever, blob store, and rate limiter are all swappable
Protocols. - ☁️ Multi-cloud deploy — one Terraform stack to Azure Container Apps or Cloud Run, scale-to-zero.
- 🚦 Rate limiting — optional global token bucket.
How it works
flowchart LR
Clients["MCP clients (Claude Desktop, IDEs, …)"] -->|"/mcp · Bearer key"| P["polymnemo (MCP server)"] P --> DB[("Postgres + pgvector text + pointers")] P -. "large files (presigned URLs)" .-> OS[("Object storage S3 / R2")]
A request carries a bearer key (which resolves to a user_id); the tool passes the rate-limit gate, then delegates to a MemoryService that chunks + embeds text and stores the vectors in pgvector — large files go to object storage via presigned URLs, with only a searchable description embedded.
Every layer is a typing.Protocol, wired together by a composition root (context.py), so you can swap an implementation without touching the tools:
| Layer | Default | Swap for |
|---|---|---|
| Store | PostgresStore (pgvector) | InMemoryStore (dev/tests) |
| Embedder | fastembed (local ONNX) | StubEmbedder (offline) |
| Auth | GitHub OAuth + API tokens | static bearer keys (dev) |
| Retriever | VectorRetriever | your own ranker |
| BlobStore | S3 / R2 | off |
| RateLimiter | global token bucket | off |
The ping tool returns the active layers, so you can see how a running server is wired.
Quickstart
Requires Python 3.11+.
1. Install
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -e . # add ".[dev]" for the test + lint tooling
2. Provision Postgres (pgvector)
The durable store is Postgres + pgvector; the easiest hosted option is Neon (use the pooled connection string). Apply the schema once:
psql "<your-connection-string>" -f scripts/schema.sql
3. Configure
Copy .env.example to .env and set the database URL and at least one API key:
POLYMNEMO_DATABASE_URL=postgresql://user:pass@host/db?sslmode=require
POLYMNEMO_API_KEYS=sk-alice-secret:alice,sk-bob-secret:bob # "key:user_id" pairs
Each key maps a bearer token to a user_id; writes are scoped to that user.
4. Run
polymnemo # Streamable HTTP at http://127.0.0.1:8000/mcp
Or with Docker:
docker build -t polymnemo .
docker run -e POLYMNEMO_DATABASE_URL="..." -e POLYMNEMO_API_KEYS="sk-alice-secret:alice" \ -e PORT=8080 -p 8080:8080 polymnemo
5. Connect an MCP client
Any client that supports remote (HTTP) MCP servers with custom headers needs two things:
- Endpoint:
http:// : /mcp - Header:
Authorization: Bearer
For clients that read an mcpServers config:
{
"mcpServers": { "polymnemo": { "url": "http://127.0.0.1:8000/mcp", "headers": { "Authorization": "Bearer sk-alice-secret" } } } }
Or verify with the inspector:
npx @modelcontextprotocol/inspector
Transport: Streamable HTTP · URL: http://127.0.0.1:8000/mcp
Header: Authorization: Bearer sk-alice-secret → call ping / remember / recall
Concepts
- Users & keys — sign in with GitHub, or present a bearer token. Either way the request resolves to a
user_id, and writes are owner-scoped (you can only edit or delete your own memories). - Headless clients — CI, cron jobs and server-side agents can't complete a browser sign-in, so they use an API token instead. Sign in with GitHub at ` /tokens` to create, list and revoke them; a new token is shown once and stored only as a SHA-256 hash. Deliberately *not* MCP tools — a secret must never travel an LLM channel.
- Namespaces — memories live in namespaces. A *shared* namespace (default
shared) is readable by everyone ("born shared"); everything else is private to its owner. Sessions and media default to private namespaces. - Chunking — long content is split into chunks on write (one vector each), so
remembermay return several ids andrecallreturns the closest chunks. - Secret scanning — optional, and off unless you turn it on: set
POLYMNEMO_RSP_CONFIGto a scanner config (the image ships one at/app/plugins/rsp.toml). Unset, every write goes through a no-op guard and nothing is scanned. When on, the text of a memory is scanned before it is embedded or stored, so a refused write was never written rather than deleted afterwards. It coversremember,save_session,updateand a media memory's description. The contents of uploaded files are not scanned and are stored as you sent them: the bytes go straight to object storage under a presigned URL and never pass through this server. A file's description is scanned; the file is not.
Tools
polymnemo exposes MCP tools for storing, searching, and managing memories:
- Memory —
remember,recall,list_memories,get_memory,update,forget
recall takes a mode:
| mode | finds | good for | not for |
|---|---|---|---|
similarity (default) | by meaning, across languages | "what do I know about coffee?" | exact IDs, names, error strings |
keyword | rows containing every word, case-insensitively | order 88312, a project codename, an error message | synonyms; may return fewer than limit or nothing |
rrf | both, fused by rank | when you are unsure which kind of query it is | — |
keyword is an exact substring match. rrf fuses the top 50 candidates from each leg, so paging through it reaches at most about 100 results. score is only comparable within one mode, and total is the size of the namespace searched, not the number of matches.
- Sessions —
save_session,load_session - Media —
create_upload,confirm_upload,get_download_url
Plus a ping health check and a memory://{namespace} resource for auto-injecting a collection. Media bytes go to object storage via presigned URLs — never through the MCP channel — with only a searchable description embedded (needs the blob extra).
Full arguments and return shapes live in the dedicated MCP tools reference *(coming soon)*. See Concepts for how keys, namespaces, and chunking work.
Configuration
POLYMNEMO_* environment variables (or .env) — full list in .env.example. The essentials:
| Variable | Default | Purpose |
|---|---|---|
POLYMNEMO_DATABASE_URL | *(unset)* | Postgres+pgvector DSN. Required in production; unset → in-memory (dev/tests). |
POLYMNEMO_API_KEYS | *(empty)* | "key1:alice,key2:bob" — required for bearer auth. |
POLYMNEMO_SHARED_NAMESPACES | shared | Namespaces readable by every user. |
POLYMNEMO_HOST / POLYMNEMO_PORT / POLYMNEMO_MCP_PATH | 127.0.0.1 / 8000 / /mcp | Transport. |
POLYMNEMO_RATELIMIT_ENABLED / _PER_MIN | false / 600 | Optional global rate limit (ops per minute). |
POLYMNEMO_BLOB_BACKEND (+ _BUCKET / _ENDPOINT_URL / _ACCESS_KEY_ID / _SECRET_ACCESS_KEY) | none | Object storage for media memories; s3 = Cloudflare R2 / S3-compatible. |
POLYMNEMO_RSP_CONFIG | *(unset)* | Path to a scanner config; unset means no scanning. The image ships one at /app/plugins/rsp.toml. |
Development
pip install -e ".[dev]"
pytest # fast, offline (stub embedder, in-memory store) ruff check . && ruff format --check . # lint + format (enforced in CI)
Postgres tests run when TEST_DATABASE_URL points at a pgvector Postgres. CI (.github/workflows/ci.yml) runs lint + the suite with coverage and posts a pass/fail/coverage table to each run's summary.
Deploy
polymnemo is stateless (all state in Neon + object storage), so it runs on Azure Container Apps (primary) or Google Cloud Run with scale-to-zero. Everything is Terraform in deploy/terraform/: shared neon/ (Postgres) and r2/ (media bucket) roots own the durable state, and a compute root deploys a service that reads both — so memories *and* media are shared across clouds.
The Azure path deploys from CI in one click: set the GitHub secrets (scripts/setup-github-secrets.sh), bootstrap the state backend (scripts/bootstrap-tfstate-azure.sh), then run the deploy (azure) workflow (neon → schema → r2 → build → app). GCP is a manual failover. Full walkthrough in docs/deploy.md.
License
MIT — see LICENSE.