Infinite Code Next
一个零配置 MCP 服务器,为 AI 编码代理提供持久、可验证的代码库记忆——代码背后的决策、已经尝试过并被否决的方案,以及绝不能破坏的东西——它锚定在代码上,并随代码的移动而一同携带。
快速开始 · 探索器 · 分享知识 · 代理指南 · 工作原理 · 品牌
Git blame 告诉你谁改了这一行。 它告诉代理代码为什么存在、哪些方案已被尝试并被否决,以及什 么必须保持真实——并且它知道自己什么时候已经过时。
问题
每次会话,AI 代理都是空着记忆来的。它通过读文件,推导出前一个代理已经知道的东西。然后它再次提出三个月前被否决的修复方案,因为仓库里没有任何地方记录这个方案已经被尝试过。
昂贵的那一层知识从来不在代码里:
代码说了什么 | 它从没说的 |
| 为什么——git 会继承 MCP 管道,导致每次调用卡住 20 秒 |
| 这里的 |
一个协调器类 | 先被试用的是 Redis 互斥锁,它在分区时导致死锁 |
这个服务器保存的是那一层知识,让它一直附着在代码上,并在它无法担保的时候告诉你。
Related MCP server: lore
快速开始
pip install -e .向你的 MCP 编辑器注册一次就完成了,没有第二步。不管理后台、不需要端口、不需要守护进程、也无须按仓库进行配置。
claude mcp add icn -- infinite-code-next[mcp_servers.icn]
command = 'infinite-code-next'
args = []{ "mcpServers": { "icn": { "command": "infinite-code-next" } } }服务器根据它的工作目录判断自己位于哪个仓库中,而且每个响应都会回显它解析出的根目录,因此错误的 workspace 很容易被发现。
循环
workspace(action="open") → a briefing: rules, prior failures, what is unverified
investigate("what you're doing") → code + rationale + blast radius, budgeted
... do the work ...
record(summary=..., warnings=[...], failed_attempts=[...])用两步调用就能进入状态,再用一步调用让下一个代理更聪明。
知识探索器
服务器知道的一切,都以一张互动的图来呈现——仓库、文件、符号、记忆,以及它们之间的每条边。
./explore.sh # macOS / Linux
explore.bat # Windows
icn-explore # if the package is on your PATH上面:图像的全图。
筛选 | 按节点类型、记忆严重度、锚点状态和边类型过滤——数量实时更新 |
搜索 | 按名称、路径或正文文本搜索任意节点 |
检查 | 点击节点得到它的完整文本、元数据和所有类型的连接 |
跳转 | 点击任意的连接跳过去——从警告走到它守卫的代码,再走到覆盖它的测试 |
缩放和平移 | 滚动与拖拽;节点大小体现调用度,负载攸关的代码看起来就是负载攸关 |
导出 | markdown、图 JSON、页面本身、PNG,或者仅仅当前屏幕的内容 |
自包含:一个 HTML 文件,内置所需数据。不需要 CDN,不需要构建步骤,不需要 npm。保存、发邮件、提交——它照常工作。
icn-explore --no-serve -o graph.html # just write the file
icn-explore --port 8080 # pick the port
icn-explore --include-deleted # include tombstoned code分享知识
把另一个代码库的经验传给其他人——或传给另一个代理。
从探索器
导出 按钮提供了以下全部功能,你不需要离开本页。它在浏览器里针对内嵌图离线运行——没有服务器调用,所以即使页面被保存,仍然可以导出。
Markdown | 可读性给它任何地方,并且可以重新导入 |
Graph JSON | 原始节点和边 |
本页 | 总分立的解释器,分享给别人 |
Image | 当前视图的 PNG |
Copy visible | 只要屏幕上的内容 —— 先过滤和搜索,剩下的视图变成一个可分享的子集 |
从命令行
icn-explore export -o knowledge.md # readable markdown, renders anywhere
icn-explore export -o knowledge.icn # bundle: markdown + graph
icn-explore export -o graph.json # raw graphMarkdown 是共享的标准形式,而且它独自就行——无论在编辑、diff、wiki、pull request 中都能读。如果知识库不能在工具之外阅读,那就没有人管理它。末尾的 JSON 块把导入变成无损的。
icn-explore import knowledge.icn # bring it in
icn-explore import ./team-knowledge/ # a whole directory of .md / .icn
icn-explore import shared.md --preview # look first, import nothingImport 绝不覆盖。 外来的一切都保存为 authority='imported',附带它的来历,并且只在源代码中确实存在匹配符号的位置做锚点。关于代码的记忆即使在这里没有,也值得保留——和不能要求自己描述从没见过的内容。
AI 代理向导
第一次调用之前读这一段。
1. 先打开,不要读文件去猜上下文
workspace(action="open")返回一个 briefing:本代码库的规则、已经尝试并否决的东西、当前未经验证的东西,以及知识密集的地方。只要标题和 id——正文不返回,investigate() 一次调用就能拿到。
这是基于一个测得的失败存在的。每次构建这个服务器时,都先会读文件,重新推导本来访问的知识,而 open 习惯于只报告符号数量,那并不能告诉你你要面对的到底是什么。在你知道货架上有什么之前,你提不出正确的问题。
2. 用自然语言调查——而不是 grep
investigate("I need to change refresh token rotation. What will I break?")一次调用会把词法搜索、符号查找、代码图遍历、记忆图遍历、锚点状态和 git 历史融合在一起,并在 token 预算之内返回紧凑的摘要。它同时搜索代码与知识,所以一条警告即使在你不曾提到过的文件里,它也能找到你。
参数 | 用于 |
| 用于 |
| 约的 token 上限(默认 9000) |
| 跟随契约进入其它仓库 |
| 在收窄后的子图内进行定向诊断 |
3. 删除重要代码前,先问为什么
investigate(action="why", symbol="RefreshCoordinator.acquire")decision: Use refresh-token rotation
--was followed by--> bug_history: Parallel refresh requests invalidate each other
--was followed by--> failed_attempt: Redis mutex could deadlock during a partition
--was followed by--> * invariant: All refreshes pass through RefreshCoordinator
may reintroduce: Parallel refresh requests invalidate each other
regression tests: test_parallel_refresh_regression一段干巴巴列表,你要自己拼出整个故事;链式记忆就不在同一。
4. 记录下你学到的事——尤其是那些失败的
record(
kind="bug_fix",
summary="Serialize refresh requests per session",
reasoning="Parallel requests rotated the same token.",
invariants=["All refreshes for one session pass through RefreshCoordinator"],
warnings=["Do not bypass RefreshCoordinator for new refresh entry points"],
failed_attempts=["Redis mutex deadlocks during a network partition"],
symbols=["RefreshCoordinator.acquire"],
tests=["test_parallel_refresh_regression"],
caused_by=[previous_memory_id],
)failed_attempts 是整个系统里最有价值的字段。 你的工具链里没有别的东西记录下“试过也被否掉”的事,而这也是让后来的代理重新发现贵得最多的东西。
record() 返回 primary_memory——代表这次事件的 id。把它传给下一个 caused_by。
字段 | 记录内容 |
| 必须保持真实的信息 |
| 未来的代理绝对不能做的事 |
| 试过又被否掉的方案,以及为什么 |
| 决策,以及被放弃的替代选项 |
| 其它代码依赖的假设 |
| 与安全问题相关的事实 |
| 先与性能测量相关起来 |
| 这个代码曾经引起过的 bug |
| 迁移步骤或顺序约束 |
| 值得遵循的本地惯例 |
| 为什么用这种形式写代码 |
| 覆盖这个记忆的测试——会产生 |
| 跨仓库的依赖 |
| 本事件发生前产生的前一个记忆 id |
5. 相信那些 label
每条记忆都带一个 anchor_status。任何不是 ACTIVE 的状态对应的不是与当前代码验证过的——请把它当线索,不要当作事实。
memory(action="verify", memory_id=..., reason="confirmed it still applies")
memory(action="guard", memory_id=rule_id, body=test_memory_id)
memory(action="supersede", memory_id=..., body="what is true now")工作原理
会过期重定位的锚点
记忆并不存储在 src/auth/oauth.ts:193 这一行里。行号只是渲染上的细节。每条记忆都接入一个语义锚:符号路径、AST 路径、内容指纹(结构 + 标识符)、骨架指纹(只有结构)、上下文。
当代码改变时,一级一级重新定位锚点——从便宜的检查先开始:
步骤 | 测试 | 结果 |
1 | 相同指纹,相同位置 |
|
2 | 相同指纹在其他位置,经 |
|
3a | 相同位置,骨架完全相同——重命名 |
|
3b | 相同位置,结构已改变 |
|
4 | 符号消失,存在强相似匹配 |
|
5 | 没有任何匹配达到标准 |
|
两条规则让这一机制值得信赖:
验证在导致漂移的编辑发生时触发,而不是按定时器触发。
级联只能降低信任度,绝不可能提高。 一旦进入
DRIFTED或NEEDS_REVIEW,只有显式的memory(action="verify")才能将锚点恢复到ACTIVE——否则下一轮扫描会发现其重新锚定的指纹匹配,报告"未变化", 并悄悄重新信任一条从未被任何人确认的记忆。
问题检测
investigate() 首先将范围缩小到子图,然后针对性地提问——绝不做全工作区扫描。这些检测与 linter 的区别在于它们是知识感知的:linter 只能看到某个函数没有测试;只有这个图知道该函数受一条在生产事故后记录的约束规则管辖。
发现 | 它回答的问题 |
| 哪些记忆与其描述的代码发生了漂移 |
| 是否有调用方绕过协调器或守卫直接访问 |
| 受管辖的规则是否没有任何测试可达 |
| 已弃用的符号是否仍有活跃调用方 |
| 结构相同的兄弟节点是否缺少该规则 |
| 代码是否偏离了当初的决策 |
| 两条记忆是否相互矛盾 |
| 活跃知识是否指向已删除的代码 |
| 跨仓库依赖当前是否无法检查 |
| 记忆验证之后是否出现了新的调用方 |
| 代码是否可能移动到了级联无法跟随的位置 |
检测器失败绝不会中断搜索:诊断信息只是增强答案,而不是答案的前提条件。
循环中无 LLM
record() 完全确定性——实体解析、边推导和矛盾检测都是图操作,而非模型调用。无需 API 密钥、无需网络、零 token 成本。 排序是一个静态、可检查的公式,带有按意图区分的权重,因为全新本地安装没有带标注的相关性数据来训练重排序器。
容忍用户输入习惯的搜索
精确匹配和前缀匹配优先执行;当找不到结果时,近似匹配接管,因此 subproces 仍能找到 subprocess 警告。连字符在双向都得到桥接——reanchor 能找到写着 re-anchor 的文本,反之亦然——因为 FTS5 的分词器按连字符切分,两种拼写否则无法互相匹配。
回退方案刻意作为回退存在:FTS 排序在有命中时优于任何本地计算结果,因此默认启用模糊匹配会让宽松匹配压过精确匹配。
排序从使用中学习
每条记忆都跟踪其被展示的频率以及代理完整打开它的频率。打开的权重远高于展示——被展示只意味着查询匹配了,而被打开意味着代理从所见的所有结果中选择了它。
提升上限为 0.5,并以 45 天半衰期衰减。频率是证据,不是权威:若无上限,它会将上个月的热门记忆钉在昨天记录的关键警告之上。
存储
%LOCALAPPDATA%\InfiniteCode\ (Windows)
$XDG_DATA_HOME/infinite-code/ (Linux)
~/Library/Application Support/InfiniteCode/ (macOS)
catalog.db repositories, aliases, checkouts, cross-repo edges
data/repos/<id>/repo.db DURABLE code graph, memories, anchors, events
cache/repos/<id>/ REBUILDABLE safe to delete at any time
<repo>/.agit/ agent git, gitignored
<repo>/.icn.toml optional, committed, tiny使用 INFINITE_CODE_HOME 覆盖根目录。
身份标识既不是路径也不是远程 URL——两者都是可变的。它由根提交、可选的已提交项目 ID 以及规范化后的远程地址推导而来,因此移动克隆或运行 git remote set-url 会重新挂接到已有知识。fork 共享上游的根提交,因此会被显式拆分,而不是静默继承上游的记忆。
任何内容都不会被销毁
已删除的符号变成墓碑,记录其最后已知路径和删除它的提交。
边携带
valid_from_commit/valid_until_commit,变为HISTORICAL而非消失。消失的检出目录为
MISSING;未挂载的驱动器为OFFLINE。两者都不会删除任何内容。更正会对之前的文本进行版本化;取代操作会同时保留两条记忆及它们之间的链接。
代理不能改写人类撰写的记忆——它必须取代它,让分歧保持可见。
purge是唯一的破坏性操作,且需要confirm=True。
查找通过一个永不抛异常的解析器进行:"当前无法解析"作为数据返回,并附带最后已知的信息。
品牌
该标志是产品的核心理念:一条知识(紫色)锚定在代码(绿色)上,而代码本身不会携带对它的任何记忆。圆环保持开放——知识永远处于验证之中。
笔画粗细经过设计,使图形在 16px 的 favicon 下依然清晰:记忆节点保持主导地位,三个锚点在圆环模糊消失时仍能读作一个三角形。
Hex | 含义 | |
| 记忆、锚定——知识 | |
| 符号、测试——已验证的代码 | |
| 文件——结构 | |
| 仓库、警示 | |
| 关键、因果链 | |
| 卡片表面 | |
| 底色 |
一条规则统御整个 UI:结构安静,知识响亮。
CALLS 和 DEFINES 退居背景,让锚定边和因果边——其他任何工具都无法展示的东西——承载色彩。
资源位于 assets/;资源管理器自身的源码位于
src/icn/web/:
src/icn/web/
explorer.html shell and markup
explorer.css the design system above, as custom properties
explorer.js force layout, canvas rendering, inspector
mark.svg logo
banner.svg header使用真实的 .html、.css 和 .js 文件而非字符串字面量,让编辑器按真实类型对待它们。它们在渲染时被内联,因为发布页面必须保持为单个自包含文件。
工具
工具 | 操作 |
|
|
| search · |
| 一个事件 → 多个锚定事实 |
|
|
|
|
agit 将代理检查点保存在 .agit/ 中,与用户的 .git 完全分离。为风险操作创建检查点、恢复它们,绝不触碰用户的历史记录。
测试
python -m pytest172 个测试,包括一个实时 MCP 套件——通过 stdio 启动真实服务器,并通过线协议驱动完整的代理工作流——以及一个脏工作树测试装置,用于断言未提交编辑上的级联行为——重新格式化、重命名、正文变更、跨文件移动、删除、弱迁移。
该测试体系在已发表的文献中未经验证,文献只测量事后提交历史挖掘,因此这里直接进行测量。
实时测试物有所值。它发现了进程内测试无法发现的 bug:子进程调用继承了服务器的 stdin,而 stdin 就是 MCP 协议管道。Git 在每次工具调用时都会阻塞满 20 秒超时,还可能吞掉协议字节。修复后工具延迟从 20 秒降至 0.2 秒。
在真实的 4,621 文件仓库上实测
完整索引 | 593 秒 → 34,747 个符号,58,857 条边,43,038 条调用边 |
热启动 | 0.77 秒 |
查询 | 1.48 秒 |
设计
每个决策背后的理由都放在它所管辖的代码旁边:每个模块的 docstring 都说明它做什么,更重要的是它存在是为了防止什么失败。anchors.py 解释为什么级联只能降低信任度,briefing.py 解释为什么 open 会主动提供摘要,causal.py 解释为什么因果关系是断言而非推断。
规划笔记保存在本地,不属于发布产物的一部分。
由 Ranit Bhowmick 构建
如果代理必须阅读你的代码库才能理解它,那么这些知识 随会话一起消亡。这就是解决方案。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- -licenseBqualityNot gradedmaintenanceA memory system for AI coding tools that stores and retrieves codebase context with project isolation. Enables coding assistants to maintain searchable memory of code snippets, comments, and runtime traces with full source traceability.2727
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to query project memory by linking code changes to the conversations that produced them, allowing retrieval of past decisions and constraints directly from the codebase.7Apache 2.0
- AlicenseAqualityCmaintenanceGives AI coding agents persistent, evolving knowledge about a codebase, enabling them to store and retrieve observations about architecture, conventions, gotchas, and recent work context.10291MIT
- AlicenseNot gradedqualityAmaintenanceProvides persistent, anchored memory for AI coding agents, binding every decision to specific lines of code and delivering relevant context just-in-time via the Model Context Protocol.1MIT
Related MCP Connectors
Shared debugging memory for AI coding agents
Give your AI agent a persistent map of your project's structure, dependencies, and bugs.
Persistent memory and cross-session learning for AI coding assistants (hosted remote MCP).
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Kawai-Senpai/Infinite-code-next'
If you have feedback or need assistance with the MCP directory API, please join our Discord server