Skip to main content
Glama

Apocrypha

Apocrypha 是 Jensen 的单用户、仅追加的远程 MCP 记忆,用于存储助手判断不应放入其常规内置记忆中的有用个人上下文。Claude 和 ChatGPT 共享同一个标准 Streamable HTTP 端点 /mcp。它为 Claude 等客户端支持基于标准的 OAuth 2.1,同时为可以直接设置授权头的客户端保留独立的静态 bearer 令牌。

范围:仅限例外记忆

Apocrypha 遵循 OptMem 的通用记忆和压缩语义,但有一个专门化:它不是第二个通用记忆存储。一个助手只应在下述情况下写到这里:个人上下文值得记住,但助手判断该上下文不应保存到自己的个人记忆库中——例如住房、收入、资金储备、社会经济状况,或相关工作流程上下文。有资格进入普通内置记忆的事实属于其所在的系统,不应同时复制到 Apocrypha。这种隔离避免了记忆跨系统时的重复或冲突。

LOG.txt 是权威记录。它使用 OptMem 的 320 字节定长记录(每条记录以换行符结尾存一条记忆),而 TREE/<size> 使用其 288 字节定长二进制合并记录。更正体现为之后的日志条目;原始记忆永不编辑或删除。Google Drive 只是一个手机可读的镜像。

Related MCP server: JauMemory MCP Server

工具

  • apocrypha_wake: 强制性的常驻上下文读取,按客户端响应限制分页;只要有压缩任务未完成就拒绝请求。

  • apocrypha_note: 只记录其他情况下不被允许记入的持久上下文,折叠空白字符,追加一条带日期的记忆,镜像到 Drive,并返回下一个新可执行的压缩任务。

  • apocrypha_sleep: 取得或处理下一个合并树压缩任务。

  • apocrypha_recall: 对完整原始日志进行不区分大小写的正则表达式搜索。

  • apocrypha_forget: 截断某个错误摘要及其上方的所有摘要,但不会触碰日志。

Wake 在日志仍然适配其 96 行渲染预算时会刻意返回每一条原始记录。一旦日志超出该预算,它就用已存储的树摘要铺满当前历史,越向过去越概括,越靠近现在越精细。一次 note 只返回一个最新可执行的压缩;每次 sleep 响应返回这个级联中的下一项。在 wake 之前把这个级联全部排空是有意为之,因为 wake 永远不会从部分构建的树渲染内容。

压缩遵循 OptMem 的类别中立规则:保留具有持续影响的内容,丢弃不具备的内容,不虚构任何东西。原始日志免除摘要的任何省略仍然保持权威性。

本地验证

npm install
npm test

这里包括一次 2,000 条记忆的 OptMem 压力运行、定长记录和树的恒长不变量、分页、向现在方向逐步细致、遗忘/重建字节的一致性、重启持久性、MCP 模式以及 Drive batchUpdate 请求。

开发与部署工作流

C:\Users\Jensen\code\apochrypha 是开发检出的工作副本。GitHub 的公共 main 分支是发布源,Alpha 部署的是已发布分支,而不是尚未发布的本地文件。

  1. 在本地工作副本中修改并运行 npm test。

  2. 提交变更并将 main 推送到 GitHub。

  3. 从 PowerShell 运行 ./scripts/deploy-alpha.ps1。

部署脚本会拒绝对一个脏工作树、非 main 分支或与 origin/main 不一致的本地提交进行部署。在 Alpha 上,它执行仅允许冲突并执行中继号的 executor,安装锁定的生产依赖,重启服务,并验证本地健康端点。运行时状态保持独立:凭据放在 /etc/apocrypha.env,仅追加日志、摘要树和 OAuth 状态放在 /var/lib/apocrypha;它们都不属于 Git 管理。

Google 授权(一次性,在笔记本上)

  1. 在 Google Cloud 中,启用 Google Docs API,并创建一个 Desktop OAuth 客户端。

  2. 配置 OAuth consent screen,并将其发布为 Production。如果保留在 Testing 下,刷新令牌会在七天后过期。

  3. 如果客户端配置要求提供 authorized redirect URI,则添加 http://127.0.0.1:53682/oauth2callback。

  4. 运行:

    GOOGLE_CLIENT_ID='...' GOOGLE_CLIENT_SECRET='...' npm run oauth:google

该助手请求 access_type=offline、prompt=consent,并且只用 https://www.googleapis.com/auth/documents 范围。将打印出的刷新令牌放入 /etc/apocrypha.env;不要提交它。

镜像的目标是 GOOGLE_DOC_ID,而不是文档标题。重命名 Google 文档不会中断同步,也不应该被替换为基于标题的查找。

在 Alpha 上部署

将该文件复制作到 /srv/apocrypha,然后以 root 身份运行:

cd /srv/apocrypha
npm ci --omit=dev
useradd --system --home /var/lib/apocrypha --shell /usr/sbin/nologin apocrypha || true
chown -R apocrypha:apocrypha /var/lib/apocrypha
install -o root -g root -m 600 deploy/apocrypha.env.example /etc/apocrypha.env
install -o root -g root -m 644 deploy/apocrypha.service /etc/systemd/system/apocrypha.service
systemctl daemon-reload
systemctl enable --now apocrypha

在启动服务之前,编辑 /etc/apocrypha.env,填入真实、独立的 MCP_BEARER_TOKEN 和 OAUTH_ACCESS_KEY。进程始终只绑定到 127.0.0.1;nginx 是唯一的公开监听者。

连接 Claude

在 Claude 的自定义连接器对话框中,输入 https://mcp.jensenabler.com/mcp,并将可选的 OAuth Client ID 和 Client Secret 保留空白。Claude 会发现 Apocrypha 的 OAuth 元数据并动态注册自身。当 Apocrypha 授权页面打开时,粘贴私有的 OAUTH_ACCESS_KEY,并批准访问。不要在这里使用 Google 的 OAuth 客户端凭据。

该批准密钥仅在授权页使用。Claude 会收到一个带作用域、过期的访问令牌,以及一个轮换的刷新令牌;它永远不会收到批准密钥或静态 bearer 令牌。

连接 bearer 令牌客户端

对于支持自定义请求头的 MCP 客户端,请使用 https://mcp.jensenabler.com/mcp 上的 Streamable HTTP,并携带头部 Authorization: Bearer <MCP_BEARER_TOKEN>。静态令牌与 Claude 的 OAuth 凭据相互独立。

验收调用

curl https://mcp.jensenabler.com/healthz
curl -i -X POST https://mcp.jensenabler.com/mcp

若要通过协议层进行检查,可使用 MCP Inspector 配合 Streamable HTTP,URL 为 https://mcp.jensenabler.com/mcp,并选择其 OAuth 流程或自定义请求头 Authorization: Bearer <MCP_BEARER_TOKEN>。

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers