mcpField
G
githippo

githippo

本地服务
github.com记忆与知识11 周前更新

关于 githippo

githippo 是面向 Claude 和其他 MCP 客户端的长期记忆 MCP 服务,将记忆以可读 Markdown 文件保存在用户拥有的 Git 仓库中。它结合语义搜索、可查询的知识图谱和上下文压缩检查点,帮助保留并检索上下文。

主要功能

  1. 01以 Git 跟踪 Markdown 记忆
  2. 02混合语义与图谱搜索
  3. 03检查点保留压缩前状态
  4. 04保存前检测敏感信息
  5. 05通过本地嵌入实现跨语言检索

适用场景

  1. 01跨会话保留项目事实
  2. 02上下文压缩后恢复未完成任务
  3. 03使用 Git 查看或撤销记忆变更
  4. 04用不同语言搜索笔记

MCP 相关

向 MCP 客户端提供记忆搜索、写入、检查点等能力。核心记忆可放入服务指令中,也支持远程 Streamable HTTP 连接。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
mcpbgithippo-3.9.3.mcpb3.9.3

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

githippo,AI 的海马记忆

持续集成 MCP 服务 MIT Node 20+ 你自己的仓库

上下文压缩后,Claude 就会忘掉一切。
githippo 不会。

githippo 在 Claude Code 中挺过上下文压缩

为 Claude 和任何 MCP 客户端提供长期记忆,以纯 Markdown 形式存储在由你拥有的 git 仓库中。它具备混合语义搜索、知识图谱、自动记忆和上下文压缩后续记能力,每轮工具调用开销约为 790 个 token。每条记忆都是一次 git 提交,你可以阅读、比较差异并还原。

curl -fsSL https://raw.githubusercontent.com/AnxovatomicaES/githippo/main/install.sh | sh

安装就这么简单:无需账户、令牌,也无需回答问题。它会设置本地记忆库,接入 Claude Code(钩子、MCP、状态栏),并在后台获取语义搜索。重启 Claude Code 后直接开始对话;它会记住。

想要备份并在多台设备间同步?githippo sync --github 会使用你现有的 GitHub CLI 登录创建一个私有仓库,并在每次更改后推送。只是想看看?npx -y github:AnxovatomicaES/githippo#v3.9.3 demo 会在 30 秒内展示运行效果,无需安装任何内容。

部署到 Render
一键部署 → 在 claude.ai 和手机上使用


为什么还要做另一个记忆服务?

因为现有的每个好点子都藏在不同的工具里。githippo 集各家所长,并解决最让人头疼的问题:

点子借鉴自githippo 的改进
实体 + 关系 + 观察MCP 参考记忆服务实体是 Markdown 文件,关系是 [[wikilinks]],搜索是语义搜索,而非子字符串匹配:“我偏好的语言”可以找到“TypeScript”
可编辑的 Markdown、Obsidian 图谱Basic Memory同样是易读文件,但通过 git 同步:每台设备都有完整历史记录,零云服务费用
类型化关系(works_on [[x]])Basic Memory、Dataview解析为可查询的图谱;回忆内容时会自动沿链接跳转一层
时间事实(“上个季度什么是真的?”)Graphiti / Zep被取代的事实会移至带日期的历史部分,而不是消失;此外,history at=<date> 可通过 git 精确回溯时间,无需图数据库,也无需调用大模型
固定的“核心记忆”区块Letta(MemGPT)核心记忆存放在MCP 服务指令中,这些指令位于系统提示词里,因此在每个客户端中都能挺过上下文压缩,包括 claude.ai
围绕上下文压缩的生命周期钩子claude-memPreCompact 钩子会根据对话记录确定性地生成检查点(目标、待办状态、已更改文件、停止位置)。无需大模型,零成本,绝不会产生幻觉
渐进式披露claude-memrecall mode=brief 会先返回单行引用(约 45 个 token),之后才需获取完整上下文
整合 / 去重mcp-memory-service、Mem0每次写入时基于嵌入向量检测重复项,并提供 maintain 健康报告;可选的大模型合并功能拒绝有损重写(例如丢弃链接或前置元数据)
面向 claude.ai 的远程 MCPSupermemory、Mem0可自托管的 Streamable HTTP;你的数据始终留在你的仓库和服务中
3.1 版从另外九款记忆工具中各采纳了一项最佳创意,这些创意均通过阅读其源代码了解,并已在 docs/prior-art.md 中注明出处:<private> 标签、压缩引导与摘要捕获、会话差异比较、基于活动情况的衰减、代码感知分词器、检查点中的错误、如实的状态行、插件打包和 alwaysLoad 注册。

它还有哪些功能:

  • 合规防护。 在内容进入永久 Git 历史记录之前,拦截私钥(包括 PGP)和 API 令牌(Anthropic、OpenAI、GitHub、AWS、Slack、Stripe、Google、SendGrid、npm、Hugging Face、JWT)、密码和机密赋值(password: …、DB_PASSWORD=…、AWS_SECRET_ACCESS_KEY=…)、嵌入密码的连接字符串、银行卡安全码、IBAN(经过 mod-97 校验,可带空格或连字符)、银行卡号(经过 Luhn 校验,即使旁边还有其他数字也能识别)、西班牙 DNI/NIE、法国 NIR(校验和)、英国国民保险号码(以大写字母书写)和美国 SSN。它能识别伪装成相似字母的字符、其他文字系统中的数字和零宽字符;而「password: required」「tokens: 128000」之类的普通文本,或「12/10/26」这样的西班牙日期,则不会被拦截。它还会捕获不透明的 Authorization: Bearer/Basic 标头、GitLab、Google OAuth、Slack 和 Discord 的 webhook 与机器人令牌、Telegram、Twilio、Mailgun、Azure、Shopify、PyPI 和 DigitalOcean 令牌、STRIPE_KEY= 这类环境变量行、PIN,以及密码以带引号的 JSON、Markdown 粗体和「the password is …」形式出现的情况。但经过 Base64 编码、拆分到多个单词中或经过 URL 编码的机密仍可能漏过:这只是后备防护,并非 DLP。
  • 从设计上防止压缩导致信息丢失,共有三种方式(见下文)。
  • 跨语言回忆。 默认的多语言嵌入模型在本地运行;用西班牙语提问,也能找到用英语写的笔记。
  • 更新绝不会被误认为重复项。 「在第一季度末发布」和「在第二季度末发布」的嵌入向量几乎相同。githippo 还会比较数字、日期和名称,因此更新会被保存,旧行会被标记,maintain 会报告可能存在的矛盾。相关测量见 docs/calibration.md。如果每条事实都包含另一条所没有的实词(「dark」/「light」、「weekly」/「monthly」、「read」/「write」),它们也绝不会被判为重复项,因为关键词重合和嵌入都无法区分同义词与反义词:新事实会被保存并标记为可能的更新,而 maintain 会将这两条列为可能存在矛盾。(实施此规则前,在关键词模式下,此类 12 对事实中有一半会被静默丢弃。)
  • 乐观并发控制。 两个会话同时编辑同一份记忆时,不会互相覆盖;冲突失败的一方会收到当前文件并进行合并。

在三层深度压缩后依然留存

Claude Code 压缩冗长会话时,对话会被总结,细节也会消失。githippo 确保重要内容不会丢失。

flowchart LR
  A[Context fills up] --> B[PreCompact hook]
  B -->|parse transcript, no LLM| C[checkpoint: goal, todos, files, where it stopped]
  C --> D[(local ~/.githippo)]
  C --> E[(repo sessions/)]
  F[Compaction] --> G[SessionStart hook, source=compact]
  D --> G
  G -->|injects the state itself, not a reminder to read it| H[Claude continues exactly where it stopped]
  I[MCP instructions + core memory] -.->|system prompt, never compacted| H
  1. 系统提示词中的核心记忆。 MCP 服务指令不属于对话,因此压缩不会影响它们。你固定的重要信息始终保留,适用于任何 MCP 客户端。
  2. 由钩子驱动的检查点(Claude Code)。常见的抱怨是:压缩后钩子如果只是提醒 Claude 重新读取状态文件,效果时好时坏。githippo 会直接注入内容。检查点上限约为 900 个 token;当会话内容超出上限时,它会优先舍弃价值最低的细节(较早的摘要、命令、较早的请求、已完成的任务),绝不会丢掉目标、未完成的任务或停下的位置。
  3. checkpoint 工具(任何客户端,包括 claude.ai)。Claude 会在关键节点保存任务、状态和下一步。上下文丢失后,不带参数调用 checkpoint 即可恢复。

额外功能:同一项目和分支中的新会话,如果距离上次会话不超过 24h,会收到一条简短提示,说明“你上次在做什么……”,并包含 Git 的变更情况(提交、其他人的提交、分支切换、已删除的文件)。UserPromptSubmit 钩子会在匹配置信度较高时主动展示最多三条相关记忆。其上限为 300 个 token,会跳过简单提示,并且在同一会话中不会重复展示。提示词中知识库从未见过的词会降低匹配度,因此,普通编码提示即使与某条记录共享两个常见词(如“重构”“使用”),也不会触发记忆注入:在 1,000 到 10,000 条记录的测试中,20 条无关编码提示均未触发注入,而 40 个预设问题全部触发了正确记录(test/report6-hook.test.js)。压缩前,githippo 还会告知压缩器哪些内容必须保留;压缩后,它会将压缩器的摘要与检查点一并保存。

我们如何确认这些钩子的行为与描述一致:相关契约取自 Claude Code 自身的代码(2.1.258)。PreCompact 会将每个成功钩子的标准输出作为自定义指令传给压缩器(Claude Code 也会在记录中将这段文本显示为“PreCompact … completed successfully”);PostCompact 会接收 compact_summary;每个钩子都会接收 session_id、transcript_path 和 cwd;SessionStart 的来源包括 startup、resume、clear、compact 和 fork。

Recall 还会逐渐了解你实际使用的内容:反复提供给 Claude 的记忆会获得小幅加权(关键词分数最多提高 +40%,语义分数最多提高 +10%),每连续 30 天未使用就衰减一半。加权会应用于原始分数,因此只会调整排名相近的结果:不会让明显匹配项失去第一名(早期版本在排名融合后应用加权,确实导致过这种情况,见 test/report6-ranking.test.js)。使用计数保留在你的机器上,并按用户分别记录;如果没有使用数据,排名结果与未启用加权时完全相同。

将内容放在 <private>…</private> 中,它就永远不会进入记忆。如果开标签没有闭合,之后的所有内容都会被视为私密内容;remember 会拒绝保存这条信息并说明原因,而不会悄悄保存你原本打算隐藏的部分。无需编辑文件即可关闭钩子:GITHIPPO_HOOK_PROFILE=minimal 或 GITHIPPO_DISABLED_HOOKS=prompt,steer。

质量:已测量的部分(以及尚未测量的部分)

在一个小型标注集(52 个查询)和 LongMemEval-S(500 个问题,仅检索,不使用 LLM)上进行检索测试:

关键词 + 图谱+ 本地模型
仓库内测试集:hit@564%100%
仓库内测试集:MRR0.600.89
LongMemEval-S:R@596.2%(全部 500 个)98.0%(100 个问题的样本)

运行 githippo eval 可复现第一项结果。方法、按语言划分的结果、归档和重复项准确率、内存用量及规模数据,请参阅 docs/benchmarks.md。该测试集规模较小,由作者手工编写,且属于特定领域:它是回归检查和粗略参考,并非排行榜。

**尚未测量,但这是最重要的指标:**与不使用 githippo 相比,使用它是否能改善回答,或降低会话成本。eval/qa.js 和 eval/behavior.js 专为测量这一点而构建,需要 ANTHROPIC_API_KEY;目前还没有运行。在测量之前,请这样理解“节省 token”:它会给每轮对话带来有限的成本(见下文),只有在回忆起的事实能替代重新解释或重新发现信息时,才能抵消这笔成本。如果你运行了这些测试,请将结果发布到 issue #3。

你该使用 githippo 吗?

  • Claude 内置记忆是无需设置的选择。如果你希望记忆以文件形式保存,方便阅读、比较差异、在 Obsidian 中编辑并自行备份;希望 Claude Code、Claude Desktop、claude.ai 和其他 MCP 客户端共享同一份记忆;或希望记忆在 Claude Code 压缩上下文后仍然保留,请使用 githippo。
  • basic-memory 是最接近的替代方案:同样使用 Markdown,兼容 Obsidian,项目更成熟,采用 Python,许可证为 AGPL。githippo 的不同之处在于 Git 历史和时间回溯、上下文压缩钩子、带文件夹权限的 OAuth 团队保险库,以及机密信息防护。
  • mem0 和其他托管服务会使用 LLM 提取事实并将其存储在云端,无需你运行任何程序。githippo 保存事实时从不调用 LLM,并会将所有内容保存在你拥有的仓库中。
  • 它还很新。 githippo 是一个由单人维护的项目(首次提交于 2026 年 10 月),陌生用户尚未在大规模场景下使用过它。这里提供了基准测试、200 多项测试、每晚运行的带种子模糊测试器、五轮审计问题记录(test/report*.test.js:每项问题都先复现,再通过回归测试修复)和发行说明,供你评估;但请做好遇到不完善之处的准备。

Claude 原生功能(选择启用,已测量)

功能说明状态
Anthropic memory 工具后端githippo 会在你的知识库上提供 Claude 原生的 memory_20250818 工具(view、create、str_replace、insert、delete、rename),包含参考返回字符串、路径遍历防护、机密信息防护,以及以 git 提交形式写入且可通过 recall 搜索的内容。在工具调用循环中使用 src/memorytool.js 中的 createMemoryTool(brain)。已根据文档中的命令集完成测试
时间感知召回“去年春天”“3 月”“3 天前”“第一季度”等英文和西班牙文表达会转换为日期范围;来自该时间段的事实排名更高,关于过去的问题也能查到已被取代的事实。LongMemEval 时间 MRR 从 86.7 提升至 88.9
投毒防护每条事实都会记录其来源(user、inferred、external);外部事实会以 [external] 标记传给 Claude;看起来像是给 AI 下指令的文本会被拒绝;GIT_SIGN=1 会使用你自己的密钥签署每次记忆提交。在评估数据上零误报;已在 CI 中验证签名
人工确认对于外部来源(网页、文件、工具输出)的事实、固定到核心记忆的操作和删除操作,都会先通过 MCP elicitation 征求你的确认(Claude Code 声明支持该功能;已在其二进制文件中确认)。GITHIPPO_CONFIRM=auto(默认值)会在客户端支持时请求确认;strict 会拒绝未经你确认的这些写入;off 则从不请求确认。你陈述的普通事实不会被打断。已使用官方 MCP SDK 客户端完成测试
晋升建议maintain 会建议将经常召回、且被多个不同问题召回的事实加入核心记忆(灵感来自 OpenClaw 的“dreaming”门控机制)。不会自动晋升:接受建议需要执行 remember pin=true,并会请求你的确认。已测试
快速静态嵌入EMBEDDINGS=static:使用查找表嵌入,速度比默认模型快 70–100 倍。已在 CI 中测量(参见 docs/configuration.md)
睡眠时整合githippo consolidate(或在每个会话后设置 CONSOLIDATE=1):小型 Claude 模型会审阅会话,并在 git 分支上提出记忆更新;如果知识库位于 GitHub 上,则会创建拉取请求。合并前不会有任何内容进入你的记忆;提案会通过机密信息防护和注入筛查。需要 ANTHROPIC_API_KEY;已使用替代模型完成测试
上下文检索githippo contextualize:小型模型会为每个文本块撰写一句话,说明其在笔记中的上下文位置(Anthropic 的技术),并在索引前将其置于文本块之前。需要 ANTHROPIC_API_KEY;已使用替代模型完成测试
记忆是否有助于回答?eval/qa.js(LongMemEval 问答:无记忆、使用 githippo、使用黄金会话三种情况)和 eval/behavior.js(Claude 使用 githippo 的工具时会保存什么、会保存什么无用内容、在全新会话中如何回答);llm-eval 工作流会运行这两项评估。需要设置 ANTHROPIC_API_KEY 仓库密钥;尚未运行

最后三项每次运行都会消耗 API 额度,因此它们需要选择启用,结果目前也尚未列入此 README。

令牌预算(使用 githippo bench 测得)

githippo v2(我们的第一个版本)现在的 githippo
工具128
每轮对模型可见的架构~1,380 tok~790 tok
指令~340 tok~202 tok + 你的核心记忆
典型召回响应~190 tok(JSON)~117 tok 摘要包 / ~47 tok 简报

实现方式:精简架构,从 tools/list 中移除冗余的 $schema URL,以紧凑的文本响应替代格式化 JSON,将维基链接呈现为普通文字,移除 frontmatter,使用 8 字符版本句柄,默认不在召回时包含 History/index/sessions/core,并为每个摘要包设置令牌预算。

每轮最坏情况下的代价:工具架构约 790 + 指令约 200 + 核心记忆最多 400(CORE_BUDGET_TOKENS),总计约 1,400 个令牌;如果每提示词钩子找到高置信度匹配,则相关提示词还会额外增加最多 300 个令牌;此外还有 recall 返回的内容(mode=brief 约 47 个令牌,默认情况下摘要包最多 1,000 个令牌)。架构、指令和核心记忆构成稳定前缀,因此使用提示词缓存的客户端实际消耗会低于原始计数。githippo 并不会因为存在本身就节省令牌:只有当召回的事实替代了重复解释或重新发现信息时,才会节省令牌。

时间开销方面:钩子会在每次提示前运行,状态行也会持续运行,因此启动开销尽量保持精简(它们不会加载任何服务端代码)。在开发机器上,githippo bench 报告钩子耗时约 57 毫秒,状态行耗时约 60 毫秒,而单独运行 node 耗时 39 毫秒;在服务端导入改为惰性加载之前,耗时为 125 毫秒。运行 githippo bench 查看你自己的数据。

工具

工具功能
recall混合搜索(BM25 + 嵌入,使用倒数排名融合)+ 单跳图扩展 → 按令牌预算生成上下文摘要包。mode=brief 仅返回引用
remember保存事实。自动路由到正确实体、去重、自动关联人物/项目,并标记可能被取代的内容。replaces= 用于取代旧内容,pin= 用于添加到核心记忆(唯一能通过工具将内容加入核心记忆的方式)
forget移除准确匹配的事实:只有完全相同的词语才会匹配(数字不同、from 与 to 不同或出现否定词时都不会匹配)
graph查看实体周围的类型化关系
history查看提交时间线,或某个日期时的文件内容
checkpoint保存或恢复工作状态
maintain检查重复项、可能的矛盾、孤立项和失效链接;为收件箱事实建议存放位置(tidy=true 会移动它们);重建索引;根据活动情况衰减;使用大模型合并
files原始列表/读取/写入/编辑/删除,并检查版本(无法写入 core.md:必须通过 pin 操作)

设置

平台:Linux 和 macOS 会在每次变更时通过 CI 测试;暂不支持 Windows(失败情况及原因见 docs/platforms.md),WSL 的行为应与 Linux 一致。

Claude Code(完整体验:钩子 + MCP)

curl -fsSL https://raw.githubusercontent.com/AnxovatomicaES/githippo/main/install.sh | sh

想看看实际运行的内容?这是一个简短的 shell 脚本:检查 Node 20+,运行 npm i -g github:AnxovatomicaES/githippo#v3.9.3,然后运行 githippo setup。setup 可重复执行,不会影响已有的状态行,并会在修改 ~/.claude/settings.json 前备份该文件。之后,githippo doctor 会检查所有项目(如果某项检查失败,则以非零状态码退出)。githippo uninstall 会移除钩子、状态行和 MCP 条目,但保留你的记忆;githippo <command> --help 会说明任意命令的用法,输入错误的选项时会给出建议,而不会执行命令。

从官方参考记忆服务迁移?运行 githippo import ~/path/to/memory.jsonl,即可将其中的实体、观察和关系转换为笔记和类型化链接(会应用密钥防护和去重,因此可以安全地重复运行)。 插件方式:运行上面的安装命令(用于 githippo 命令),然后执行 /plugin marketplace add AnxovatomicaES/githippo 和 /plugin install githippo。该插件提供钩子和 MCP 服务,而 githippo setup / githippo install 会检测到它,不会重复安装(以前这会导致每个钩子运行两次)。如果两者都已安装,请运行 githippo uninstall,并保留插件。或者,将 INSTALL_FOR_AGENTS.md 交给你的 Agent。

Claude Desktop(一键式扩展)

从最新版本下载 githippo-<version>.mcpb 并双击(或将其拖入“设置” → “扩展”)。它使用 Claude Desktop 内置的 Node 运行,因此无需安装其他内容,并且使用与 CLI 和 Claude Code 相同的保险库。它也已列入官方 MCP Registry,名称为 io.github.AnxovatomicaES/githippo。

跨设备备份与同步
githippo sync --github            # creates a private repo "githippo-memory" with your gh login

每次更改都会在后台推送;服务每 5 分钟拉取其他设备上的更改。在第二台设备上:将仓库 git clone 到 ~/.githippo/vault,然后运行安装程序。任何位置都不会存储令牌:git 使用你现有的 GitHub CLI、SSH 或密钥链登录信息。

claude.ai、iOS 和 Android(远程、OAuth 2.1、多用户)

手机和 Web 应用无法访问你的笔记本电脑,因此此模式会从 GitHub 读取保险库:

  1. 运行 githippo sync --github(如上所述)。
  2. 点击顶部的 Deploy to Render。设置 MEMORY_REPO(例如 you/githippo-memory)、GITHUB_TOKEN(细粒度令牌,仅限该仓库,并授予 Contents: Read and write 权限)和 PUBLIC_URL(你的服务的 https URL)。系统会为你生成 MCP_SECRET。Render 默认套餐有 512 MB 内存,因此服务会以关键词搜索模式启动(EMBEDDINGS=none);在 2 GB 或更高套餐上,设置 EMBEDDINGS=local 以使用多语言模型。该蓝图还会在 /var/data 挂载一个 1 GB 磁盘,用于存放 OAuth 状态文件(已用过的登录码和刷新令牌):没有持久磁盘时,每次重启都会丢失重放检测所需的数据。令牌仍会过期;这是纵深防御措施,每月费用约为 $0.25。
  3. 在 claude.ai 中:前往“设置” → “连接器” → “添加自定义连接器” → https://<your-app>.onrender.com/mcp。Claude 会自行注册并打开登录页面;输入一次 MCP_SECRET。这是标准的 OAuth 2.1(PKCE、动态客户端注册、受众绑定令牌),因此机密信息绝不会出现在 URL 中。

团队共享保险库。 授予成员文件夹级访问权限;每个人都使用自己的密码登录:

githippo users add john --acl "shared/:write,people/:read"   # prints his password once
githippo users list

每条规则对应一个文件夹(shared/,也可写作 shared)或一条确切的笔记(people/ada.md),绝不是字符串前缀:shared:read 不会开放 shared-secret/。路径会以统一的规范形式进行检查:首尾空格、制表符、不可见字符和 .. 都会被拒绝,而不会自动修正;授权仅适用于规则中指定的精确拼写(因此,在大小写不敏感的磁盘上,Users/bob 不等同于 users/bob)。匹配的规则中,路径最长的规则优先(none、read、write)。每个人还会获得一个私有的 users/<id>/ 文件夹,用于存放自己的收件箱、会话和置顶核心记忆;任何通配规则都无法开放该文件夹。用户无法在通常适合的位置写入的事实,会改存到该用户自己的收件箱。每次提交都会记录提交者。更改密码或 ACL 后,该用户的令牌会立即失效。对于没有磁盘的主机,请将 ~/.githippo/users.json 粘贴到 USERS_JSON 变量中。

Cursor、Windsurf、VS Code 和任何 MCP 客户端

本地:运行命令 githippo serve。远程:URL 为 https://host/mcp;支持 MCP OAuth 的客户端会自行登录,其他客户端可发送 Authorization: Bearer <MCP_SECRET>(这是一个标头,因此不会出现在 URL 日志中)。

## 记忆格式

纯 Markdown,兼容 Obsidian。将仓库作为知识库打开,即可直接使用图谱视图。

---
name: billing-v2
title: Billing v2
type: project
description: Billing rewrite
aliases: [billing rewrite]
---

## Decisions
- Use idempotency keys on every write endpoint
- owner:: [[sam-okafor]]
- Launch target is end of Q1

## History
- ~~Launch target is end of Q4~~ (until 2026-09-30)

目录结构:core.md(固定)、index.md(目录)、inbox.md(未分类的事实)、people/、projects/、topics/、decisions/、sessions/(检查点)。参见 examples/memory。

笔记名称可以包含空格、重音符号和任何文字体系(my notes.md、café.md、笔记.md),因此从 Obsidian 同步的知识库可以直接使用。只有在任何地方都不安全的名称会被拒绝(控制字符、\ < > : " | ? *、隐藏名称)。Frontmatter 会被视为不可信内容:异常值(title: []、超大字段、__proto__)无法破坏搜索;若某篇笔记无法读取,系统会跳过它并发出警告,而不会导致记忆功能崩溃。包含未解决 git 冲突标记的笔记绝不会被索引或写入;合并或变基尚未完成时,githippo 会拒绝写入。

配置

所有配置都遵循同一规则:先读取环境变量,再读取 ~/.githippo/config.json,最后使用默认值。大多数人会设置的选项包括:VAULT_DIR(默认 ~/.githippo/vault)、EMBEDDINGS(local、static、voyage 或 none)、GITHIPPO_CONFIRM(auto、strict 或 off),以及 PROMPT_RECALL=0(关闭每个提示词的钩子)。其他所有配置,包括远程服务和团队知识库相关变量,都列在 docs/configuration.md。

坦诚说明安全模型

  • 你的文件,你的数据。 githippo 没有后端。记忆保存在你机器上的一个文件夹中;备份会推送到你拥有的私有仓库。githippo 会匿名询问 GitHub,确认备份远程仓库是否可公开读取:如果可以,githippo doctor 会失败,githippo sync 不会向其推送,后台推送也会拒绝(可通过 GITHIPPO_ALLOW_PUBLIC_BACKUP=1 主动覆盖)。它只能检查 GitHub 远程仓库;如果使用其他托管平台,请自行检查仓库的可见性。
  • **本地使用时不存储令牌。**同步使用 git 已有的登录方式(GitHub CLI、SSH 或密钥链)。只有远程服务需要令牌:请创建一个细粒度令牌,仅限一个仓库,并且只授予 Contents 读取/写入权限。
  • 远程身份验证采用 OAuth 2.1(仅支持 PKCE S256、动态客户端注册、一次性授权码,以及绑定到 /mcp 资源和用户当前密码及 ACL 的令牌)。刷新令牌会轮换:每个令牌只能使用一次;如果再次提交已使用过的令牌(这表明令牌可能已被复制),该次登录的所有令牌都会被撤销,包括访问令牌;重复使用授权码也会产生同样结果。签名采用无状态方式(HMAC),因此重启不会让任何人退出登录。旧版 URL 中的密钥方式(/mcp/<secret>)默认关闭,因为 URL 会出现在代理日志中;只有设置 LEGACY_SECRET_URL=1 才会启用。服务器会以 400 错误响应格式错误的请求,而不会崩溃;会验证每个请求正文、限制重复登录失败的频率、限制并统计每次调用中的 JSON-RPC 批量请求数量,并按套接字地址限流。
  • **防护措施只是最后一道防线,并非 DLP。**它能识别常见的密钥和 ID 格式。forget 会从当前文件中删除一行,但 git 历史中仍会保留;要彻底清除,必须重写历史记录。
  • **文件夹权限能抵御各种绕过手段。**团队知识库路径只会规范化一次,权限检查与存储使用同一路径,因此空格、不可见字符、.. 以及(在大小写不敏感的磁盘上)大小写变更都无法绕过规则,其中也包括 macOS 和 Windows 对 ſ、ß 和 fi 的折叠方式。index.md 只会向每位读者显示其有权读取的笔记;如果两个可读笔记声明了同一个名称,系统会将事实发送到你的收件箱,而不会自行猜测。其他用户的 users/<id>/ 文件夹不会受通配规则影响。
  • **核心记忆是最受信任的文本,因此只有一个写入入口。**通过工具写入核心记忆只能使用 pin(如果你的客户端支持,会先向你确认;来自外部来源的事实则会被拒绝),不能使用 remember about:"core" 或 files 工具;来自外部来源的内容绝不会加载到核心记忆中,且其令牌预算会严格限制可加载的内容。
  • **远程会话无法请求确认。**确认功能使用 MCP elicitation,而无状态 HTTP 请求没有用于确认的通道,因此远程服务上的 GITHIPPO_CONFIRM=auto 不会发起确认。如果你希望拒绝未经确认、来自外部来源的事实、写入核心记忆的固定内容和移除操作,请在远程服务上设置 GITHIPPO_CONFIRM=strict。
  • **任何人都可以用任意名称注册 OAuth 应用。**动态客户端注册是开放的(claude.ai 正是通过这种方式连接),因此登录页面会显示浏览器接下来将跳转到哪里,并提示只有在连接由你发起时才继续。
  • **外部文本始终只是数据。**网页、文件或工具输出中的事实会标记为 [external],在移动、改写和整合过程中都会保留该标记。看起来像是向 AI 发出指令的文本会被拒绝(适用于所有写入途径:remember、files 工具、记忆工具和大模型改写;检查时既会检查原文,也会检查回忆时显示的内容,因此注释、链接别名或不可见字符都无法将其隐藏)。这种检查针对常见措辞,属于启发式机制,并非万无一失:改写后的文本可能会通过检查,因此核心记忆有独立的写入入口,外部事实也会被标记。检查点会中和这类文本,且无法伪造章节内容。
  • **尊重 Git 状态。**githippo 不会干扰你发起的合并或变基,不会提交冲突标记,并会将 bisect、分离的 HEAD 或关联工作树视为“忙碌”状态并明确提示。
  • **钩子不会中断会话,也不需要在 PATH 中找到 githippo。**所有失败路径都会在短超时后以 0 退出。在 macOS 和 Linux 上,setup 会将 node 和 githippo 的绝对路径写入钩子、状态行和 MCP 条目,因此当 Claude Desktop 或 IDE 启动 Claude Code 时,即使其 PATH 比你的 shell 短,这些配置仍能正常工作;如果 node 的路径发生变化,钩子会先尝试从 PATH 查找 node,再查找 githippo;如果两者都无法运行(例如 githippo 已卸载),钩子就不会执行任何操作。移动或重新安装后再次运行 githippo setup,会更新已有配置;githippo doctor 会提示固定路径是否已失效。(Claude Code 插件的钩子仍会通过 PATH 查找 githippo。)
  • 已知限制。.mcpb 包尚未进行代码签名;删除的事实会继续保留在 git 历史中,直到你重写历史记录;对回答质量的提升效果尚未测量(见上文)。

开发

npm ci && npm test      # 200+ tests: unit, hooks, adopted features, bug regressions, local vault, setup, end-to-end over Streamable HTTP with the official MCP client
npm run fuzz            # seeded fuzzing of every entry point (FUZZ_SEED=<n> FUZZ_ITERATIONS=<k> to reproduce or go deeper); runs nightly in CI with a fresh seed
npm run bench           # token cost of the tool surface
node scripts/versions.mjs   # every version string and pinned tag agrees (CI and the release check this)

路线图

签名的 .mcpb 发布版本 · SSO(GitHub/Google)作为团队保险库的 OAuth 身份提供商 · 为远超 50,000 条笔记的保险库提供可选的派生 SQLite 索引 · Claude Code 默认支持 MCP Apps(聊天内存浏览器)后再推出 · 如果 Claude 的客户端有朝一日声明支持 MCP sampling,则支持 MCP sampling(Claude Code 2.1.302 只声明支持 roots 和 elicitation,因此整合与上下文检索仍需要 ANTHROPIC_API_KEY)

采用 MIT 许可证。欢迎提交 PR。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。