Zenod Memory

dev.zenod由 zenod.dev 发布官方发布者v0.1.0更新于 Nov 7, 2026

Memory you own: capture on WhatsApp, filed into your Markdown vault, recalled with citations.

已验证Streamable HTTP可网页运行文件与存储知识与记忆开发者工具

概览

AI 生成的概览

一个 MCP 记忆代理:把你告诉它的内容存入你自己的 GitHub Markdown 仓库,并让助手搜索、读取并带引用地提问。

可以做什么
  • 异步存储记忆、摄取媒体或附件,再轮询获取含提交 SHA 与 GitHub 链接的回执
  • 按关键词搜索仓库,并按路径读取单条笔记
  • 通过只读研究循环回答模糊的跨笔记问题,返回带引用来源的综合答案
  • 查询排队中的存储与摄取任务的状态和结果
适用场景
适合希望助手保留持久、可引用、且以纯 Markdown 形式存放在自己 git 仓库中的个人记忆,而不是放在厂商数据库里的场景。也适合已在 GitHub 上记笔记、希望回忆时附带凭据的人。
运行要求
远程 MCP 端点(streamable HTTP),或自托管的 Docker 实例。自托管需要一个你拥有的 GitHub 仓库及可推送的令牌、一个 Anthropic 或 OpenAI 的 LLM 密钥,以及 MCP 端点的 bearer 令牌(通过 ZENOD_API_TOKEN 固定,或首次启动时生成)。端点始终要求 Authorization bearer 令牌;清单声明使用 OAuth。
安装前请注意
该服务持有可推送你仓库的 GitHub 令牌和 LLM API 密钥,bearer 令牌应视同密码。写入是对你仓库的真实提交,摄取媒体会把内容发送给提取服务商。自托管需要 Docker 和环境变量;README 说明独立单元目录仍是蓝图,实际运行行为来自镜像。

安装

在 SourceWeft 中

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

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

交给智能体安装

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

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

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

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "zenod-memory": {
      "type": "http",
      "url": "https://cloud.zenod.dev/mcp"
    }
  }
}

README

Zenod — the memory unit

Zenod is a memory agent you talk to over plain MCP (streamable HTTP). You give it a GitHub repo to use as your memory vault; it stores what you tell it as immutable evidence + filed meaning with citations, and lets you search and read it back. Every write lands as a real git commit — Zenod hands you the commit SHA and GitHub URL as the receipt.

One box, one endpoint, one repo. Zenod is the only thing that holds your repo token. You never write the repo from anywhere else — attempts from another path fail loudly.


Quickstart — point a plain MCP client at a fresh Zenod

You need: Docker, a GitHub repo you own (empty is fine) + a token that can push to it, and an LLM key (Anthropic or OpenAI). No suite, no console — just this unit.

1. Run a fresh instance

From this folder (units/zenod/). Until the repo split fires, the image is the repo root image with AGENT=zenod:

bash
# from the repo rootdocker build -t zenod .
docker run --rm -p 8080:8080 \  -v "$PWD/zenod-data:/data" \  -e AGENT=zenod \  -e ZENOD_DATA_DIR=/data \  -e VAULT_REPO="your-org/your-memory-repo" \  -e GITHUB_TOKEN="ghp_xxx_a_token_that_can_push_to_that_repo" \  -e ANTHROPIC_API_KEY="sk-ant-..." \  -e ZENOD_API_TOKEN="pick-any-long-secret-string" \  zenod

That is Option B: configure by hand — the three env vars above are all Zenod needs. (In the full suite the keyring/Console mints the MCP token and pushes VAULT_REPO + GITHUB_TOKEN + LLM key to /api/provision instead; a stranger self-hosting doesn't need that path.)

Zenod is now serving MCP at http://localhost:8080/mcp. Check it is up:

bash
curl -s http://localhost:8080/api/health

2. Point any MCP client at it

The endpoint is vanilla MCP over streamable HTTP. Any MCP client works — e.g. Claude Desktop / claude with a custom connector, or the reference @modelcontextprotocol/inspector:

bash
npx @modelcontextprotocol/inspector# transport: Streamable HTTP# URL:       http://localhost:8080/mcp# header:    Authorization: Bearer <token>

Your token. /mcp always requires a bearer token — there is no tokenless mode. You control it two ways:

  • Pin it (recommended): set ZENOD_API_TOKEN in the run command above to any long secret string. That IS your bearer token — use it directly.
  • Don't pin it: if ZENOD_API_TOKEN is unset, Zenod generates a token on first boot and prints it once to the container logs (docker logs <container> | grep 'MCP bearer'). Copy it from there.

Send it as Authorization: Bearer <token> on every MCP call. (Treat it like a password. Note: GET /api/token is itself auth-gated — you need the token to call it — so use one of the two paths above to learn it in the first place.)

Run tools/list. You should see store_memory, ingest_memory, search_memory, get_memory, ask_brain, and get_task_result (full surface in SEAM-SURFACE.md).

Codex Desktop bearer-token setup

Codex Desktop's MCP server settings have two separate concepts:

  • URL: paste the Zenod MCP URL, for example https://<host>/mcp.
  • Bearer token env var: enter the environment variable name, for example ZENOD_MCP_TOKEN.

Do not paste the token itself into the Bearer token env var field. Codex reads that field as the name of an environment variable, then reads the actual bearer token from the Codex process environment.

For Codex CLI, this works when codex is launched from the same shell:

bash
export ZENOD_MCP_TOKEN="<token>"codex mcp add zenod --url https://<host>/mcp --bearer-token-env-var ZENOD_MCP_TOKEN

A normal shell export is temporary: it lasts only for that shell session and child processes. It does not survive a machine restart, and it does not affect an already running macOS GUI app launched from Finder, Dock, or Spotlight. For Codex Desktop, set the variable in the environment before starting Codex Desktop, or use a literal Authorization: Bearer <token> header in the MCP server settings.

3. Store / search / get

Store (mutating, async — returns a jobId, then poll):

jsonc
// tools/call store_memory{ "content": "My home insurance renews on March 3rd every year." }// -> returns { jobId: "..." }  (status: queued)
// tools/call get_task_result{ "jobId": "..." }// -> when done:// { status: "done", result: {//     evidenceRef: "Log/2026-07-05.md#^e-7f3a2c",//     pagesTouched: ["Areas/Insurance.md"],//     commitSha: "a1b2c3d...",              // <- your receipt: a real git commit//     githubUrls: ["https://github.com/your-org/your-memory-repo/blob/main/Areas/Insurance.md"]// } }

Open the githubUrls link — the memory is a committed file in your repo.

Ingest media/artifacts (mutating, async — returns a jobId, then poll):

jsonc
// tools/call ingest_memory{  "mediaType": "screenshot",  "artifactUrl": "https://example.test/screen.png",  "filename": "screen.png",  "sourceHint": "Claude upload",  "contentHint": "remember the renewal date visible in this screenshot",  "hints": ["insurance"]}// -> returns { jobId: "...", kind: "media_ingest", status: "queued" }
// tools/call get_task_result{ "jobId": "..." }// -> when done, result includes:// {//   status: "done",//   rawArtifact: { handle, archiveUrl, sha256 },//   extraction: { handle, ocrHandle, transcriptHandle, archiveUrl, provider },//   digest: { evidenceRef, pagesTouched, commitSha, githubUrls }// }// Opaque handles that Zenod cannot resolve still return a loud// media_ingest_processor_unavailable receipt instead of fake success.

Search (read, fast, no LLM):

jsonc
// tools/call search_memory{ "query": "insurance renewal" }// -> hits: [{ path, snippet, score, githubUrl }], or the explicit text//    "No memories match 'insurance renewal'." when there are none.

Get (read one note by path from a search hit):

jsonc
// tools/call get_memory{ "path": "Areas/Insurance.md" }// -> { path, frontmatter, body, githubUrl }

For fuzzy or cross-note questions ("what do I know about X?"), call ask_brain instead of search_memory — it runs a read-only research loop and returns a synthesized answer with cited sources.


What you can rely on (the contract)

  • The endpoint is standard MCP — nothing custom on the wire. tools/list + tools/call is all a caller needs to know. See ../../docs/SEAM-SPEC.md.
  • Every write returns a receipt. store_memory gives you a commitSha + GitHub URL (via get_task_result). ingest_memory gives an async media receipt with raw artifact, extraction/transcript archive, digest, commit, and archive fields. A read returns data or an explicit "none". No silent acks; failures error loudly with { code, message }.
  • Only Zenod holds your repo token. It is supplied to this one box (env or /api/provision) and read in exactly one place internally. Nothing else in the suite can write your repo. Any write attempt down another path fails loudly.
  • Your memory is just a git repo. Clone it, read it, leave — no lock-in.

Files in this unit

FileWhat it is
README.mdthis quickstart (an acceptance item)
SEAM-SURFACE.mdthe MCP tool surface + receipt shapes
EXTRACTION-MAP.mdfile-level extraction map (blueprint, RD-4 staged)
Dockerfileroot-image-reuse note (staged; build from repo-root Dockerfile)
docker-compose.zenod.ymldeploy stub

Status honesty: this folder is the seam of record for Zenod-as-a-unit. The physical extraction from the fused Console is STAGED behind the RD-4 split trigger and has not fired — see EXTRACTION-MAP.md. The running behavior above is real today (image with AGENT=zenod); the standalone folder is blueprint.

来源:units/zenod/README.md,提交 0d25720

工具

0
该服务器需要登录,因此 SourceWeft 无法在没有账号的情况下读取其工具,也未收录。已连接账号所能看到的内容可能因账号及其权限而异。

版本历史

1
  1. v0.1.0最新Nov 7, 2026

评分

已满足适用检查项的 85%

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

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分