Infinite Code Next
Un servidor MCP de cero configuración que aporta a los agentes de desarrollo de IA una memoria persistente y verificable de una base de código: las decisiones que hay detrás, lo que ya se intentó y se rechazó, y lo que jamás debe romperse; anclada al código y transportada con él a medida que el código se mueve.
Inicio rápido · Explorador · Compartir · Para agentes · Cómo funciona · Marca
Git blame te dice quién cambió una línea. Esto le dice a un agente por qué existe el código, qué se intentó ya y se rechazó, y qué debe seguir siendo verdad — y además sabe cuándo su propio conocimiento ha quedado obsoleto.
El problema
Cada sesión, un agente de IA llega sin memoria. Lee archivos para volver a deducir lo que el último agente ya sabía. Luego vuelve a proponer la corrección que se rechazó hace tres meses, porque nada en el repositorio registra que fue probada.
El conocimiento costoso nunca está en el código:
Lo que dice el código | Lo que nunca dice |
| el porqué — que git hereda el pipe de MCP y hace que cada llamada se bloquee durante 20 segundos |
| que |
una clase de coordinador | que un mutex de Redis se probó primero y se interbloquea al hacer una partición |
Este servidor almacena ese conocimiento, lo mantiene unido al código y te avisa en el momento en que ya no puede responder por él.
Related MCP server: lore
Inicio rápido
pip install -e .Regístralo una vez con tu cliente MCP — no hay segundo paso. Ningún panel de administración, ningún puerto, ningún demonio, ninguna configuración por repositorio.
claude mcp add icn -- infinite-code-next[mcp_servers.icn]
command = 'infinite-code-next'
args = []{ "mcpServers": { "icn": { "command": "infinite-code-next" } } }El servidor deduce en qué repositorio se encuentra a partir de su directorio de trabajo, y cada respuesta hace eco de la raíz que resolvió, de modo que un espacio de trabajo equivocado se hace evidente al instante.
El bucle
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=[...])Con dos llamadas para volverse productivo. Con una para dejar al siguiente agente mejor preparado.
El explorador de conocimiento
Todo lo que sabe el servidor — repositorio, archivos, símbolos, memorias y cada arista entre todos ellos — como un único grafo interactivo.
./explore.sh # macOS / Linux
explore.bat # Windows
icn-explore # if the package is on your PATHArriba: el menú de exportación abierto sobre el grafo completo.
Filtrar | por tipo de nodo, gravedad de la memoria, estado del ancla o tipo de arista — los recuentos se actualizan en vivo |
Buscar | cualquier nodo por nombre, por ruta o por el texto de su cuerpo |
Inspeccionar | haz clic en un nodo para ver su cuerpo completo, sus metadatos y cada conexión tipada; el nodo es el centro de la "graph", |
Navegar | haz clic en cualquier conexión para saltar a otro nodo — avanza de un aviso a su código y de allí al test que lo cubre |
Zoom y desplazamiento | rueda del ratón y arrastra; el tamaño del nodo es el grado de llamidas, así que el código con más peso se ve a simple vista |
Exportar | markdown, JSON del grafo, la propia página, un PNG o solo lo que está en ese momento en la pantalla |
Autocontenido: un solo archivo HTML con los datos incrustados. Sin CDN, sin paso de construcción, sin instalación. Lo sea guardar, enviar por correo o enviarlo a un commit — sigue funcionando.
icn-explore --no-serve -o graph.html # just write the file
icn-explore --port 8080 # pick the port
icn-explore --include-deleted # include tombstoned codeCompartir conocimiento
Comparte el conocimiento costosamente ganado de otro código base con otra persona — o con otro agente.
Desde el explorador
El botón Exportar ofrece todas las siguientes opciones sin tener que salir de la página. Todo se hace sin conexión, en el navegador, contra el grafo incrustado — no hay llamada al servidor, por lo que una página guardada sigue exportando.
Oportunidad | |
Markdown | legible en cualquier lugar y reimportable |
JSON del grafo | nodos y aristas, tal cual |
Esta página | El explorador autocontenido, para enviarlo a alguien |
Imagen | PNG de la vista actual |
Visibles en pantalla | solo lo que está en pantalla — primero filtra y busca, y la vista filtrada se convierte en un subconjunto compartible |
Desde la CLI
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 graphEl markdown es la forma canónica de compartir, y es legible por sí solo — en un editor, en un diff, en un wiki, en un pull de una solicitud. Una base de conocimiento que sin la herramienta nadie puede leer es una base de conocimiento que nadie consulta. Un bloque JSON al final hace que la importación no pierda nada.
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 nothingLa importación nunca sobrescribe. Todo lo que viene de fuera se guarda como authority='imported', con su origen en esté exacto, y se ancla solo donde existe un símbolo que coincida aquí. Una memoria sobre código que no se tiene sigue mereciendo la pena conservarla — pero eso no significa que deba afirmar que describe un fragmento que nunca ha visto.
Guía para agentes de IA
Lee esta sección antes de tu primera llamada.
1. Intente abrir primero — no lea archivos para orientarse
workspace(action="open")Devuelve un informe: las reglas que rigen ese código, qué se ha probado ya y se ha rechazado, qué se ha quedado sin verificar y dónde se concentra el conocimiento. solo gastos de los datos y — la información no los contenidos; investigate() está en una llamada de distancia.
Esto existe porque a partir de un fallo comprobado: para construir este servidor, cada sesión comenzaba leyendo archivos para re-derivar un conocimiento que ya existía. open se utilizaba para informar de contadores de símbolos, no dice nada de la tarea. No se puede formular la pregunta correcta hasta que se sabe lo que hay en el estante.
2. Investiga con el lenguaje natural, no con grep
investigate("I need to change refresh token rotation. What will I break?")Una sola llamada pone juntos la búsqueda léxica, la resolución de símbolos, el recorrido del grafo de código, el recorrido del grafo del conocimiento, el estado de los anclajes y el historial de git, para devolver cápsulas compactas bajo un presupuesto fijo. Busca en el código y el conocimiento de igual a igual, por lo que un aviso te alcanza incluso si nunca has designado el archivo en el que duerme.
Argumento (argumento) | Úsalo para |
| cuando no se aporta: |
| se gasta una cota aproximada de tokens (predeterminado 9000) |
| seguir los contratos hacia otros repositorios |
| diagnósticos específicos sobre el subgrafo reducido |
3. Antes, antes de borrar nada que sostenga la estructura, pregunta por qué
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_regressionEn esa lista plana, cinco memorias te obligan a reconstruir el porqué. Una cadena lo entrega todo hecho.
4. Documenta lo aprendido — especialmente los fallos
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 es el campo de mayor valor de todo el sistema. No hay nada en tu cadena de herramientas que registre lo que se probó y se rechazó, y es lo que los agentes futuros encontrarán más caro redescubrir.
record() devuelve primary_memory — el id que representa este evento. Pásalo como el siguiente caused_by.
Campo | Registra |
| cosas que siempre deben seguir verdaderas |
| cosas que un agente futuro no debe hacer |
| lo que se probó pero se rechazó y el porqué |
| decisiones tomadas y las alternativas rechazadas |
| fijas in condiciones de las que depende otro código |
| cosas relevantes para la seguridad |
| hechos medidos de rendimiento |
| fallos que este código produjo en el pasado |
| pasos o restricciones de orden de migración |
| convenciones locales que merece la pena mantener |
| por qué el código se ha materializado así |
| coberturas de tests — crea una arista |
| dependencias entre repositorios distintos |
| identificadores de memoria de los que este evento procede |
El nuevo tag termina la memoria... — a partir de la propuesta de caused_by.
5. Confía en las etiquetas
Toda memoria tiene un anchor_status. Cualquier cosa que no sea ACTIVE no está verificada contra el código actual — trátala como una pista, no como un hecho.
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")Cómo funciona
Anclas saben cuando quedan desactualizadas
La memoria no se almacena en src/auth/oauth.ts:193. Los números de línea son un detalle de display. Cada memoria se ancla a un ancla semántica: el path del símbolo, un path del AST, una huella del contenido (estructura + identificadores), una huella esqueleto (solo la estructura) y su contexto circundante.
Cuando el código cambia, una cascada reubica el ancla — con la prueba más barata delas quiebras:
Paso | Prueba | Resultado |
1 | Misma huella, mismo lugar |
|
2 | Misma huella en otro lugar, confirmado por |
|
3a | Mismo lugar, esqueleto idéntico — un renombrado |
|
3b | Mismo lugar, estructura cambiada |
|
4 | Símbolo desaparecido, coincidencia fuerte de similitud |
|
5 | Nada supera el umbral |
|
Dos reglas hacen que esto sea fiable:
La verificación se dispara en la edición que causó la deriva, no en un temporizador.
La cascada solo puede bajar la confianza, nunca subirla. Una vez
DRIFTEDoNEEDS_REVIEW, solo unmemory(action="verify")explícito devuelve un ancla aACTIVE— de lo contrario, la siguiente pasada encontraría su huella recién re-anclada coincidiendo, informaría "sin cambios" y volvería a confiar silenciosamente en una memoria que nadie confirmó jamás.
Detección de problemas
investigate() primero reduce a un subgrafo y luego hace preguntas específicas
sobre él — nunca un escaneo de todo el espacio de trabajo. Lo que las distingue de un
linter es que son conscientes del conocimiento: un linter ve que una función no
tiene pruebas; solo este grafo sabe que la función está gobernada por un invariante
registrado después de un incidente de producción.
Hallazgo | Pregunta que responde |
| qué memorias se desviaron del código que describen |
| ¿un llamador está alcanzando más allá de un coordinador o guardia? |
| ¿una regla gobernada es alcanzable por ninguna prueba? |
| ¿un símbolo obsoleto aún tiene llamadores vivos? |
| ¿un hermano estructuralmente idéntico carece de la regla? |
| ¿el código divergió de lo que se decidió? |
| ¿dos memorias se contradicen entre sí? |
| ¿el conocimiento activo apunta a código eliminado? |
| ¿una dependencia entre repositorios es actualmente incomprobable? |
| ¿apareció un llamador después de que se verificó la memoria? |
| ¿el código se movió plausiblemente donde la cascada no lo seguiría? |
Un detector que falla nunca rompe la búsqueda: un diagnóstico mejora una respuesta, no es una condición previa para obtenerla.
Sin LLM en el bucle
record() es totalmente determinista: la resolución de entidades, la derivación de
aristas y la detección de contradicciones son operaciones de grafo, no llamadas a
modelos. Sin clave de API, sin red, sin costo de tokens. La clasificación es una
fórmula estática e inspeccionable con pesos por intención, porque una instalación
local nueva no tiene datos de relevancia etiquetados para entrenar un re-ranker.
Búsqueda que tolera cómo escribe la gente
La coincidencia exacta y por prefijo se ejecuta primero; cuando no encuentra nada,
una pasada aproximada toma el control, de modo que subproces aún encuentra la
advertencia de subprocess. La separación con guiones se une en ambas direcciones —
reanchor encuentra texto que dice re-anchor y viceversa — porque el tokenizador
de FTS5 divide en guiones y ninguna de las dos grafías llegaría a la otra de otro modo.
El respaldo es deliberadamente un respaldo: la clasificación de FTS supera cualquier cosa calculada localmente cuando tiene coincidencias, así que ejecutar coincidencia difusa por defecto permitiría que coincidencias sueltas superen a las exactas.
La clasificación aprende del uso
Cada memoria rastrea con qué frecuencia se mostró y con qué frecuencia un agente la abrió por completo. Abrir se pondera mucho más alto — que se muestre solo significa que la consulta coincidió, mientras que abrir significa que un agente la eligió entre todo lo que vio.
El impulso está limitado a 0.5 y decae con una vida media de 45 días. La frecuencia es evidencia, no autoridad: sin límite, fijaría la memoria popular del mes pasado por encima de una advertencia crítica registrada ayer.
Almacenamiento
%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, tinyAnula la raíz con INFINITE_CODE_HOME.
La identidad nunca es la ruta ni la URL remota — ambas son mutables. Se deriva del
commit raíz, un id de proyecto opcional confirmado y remotos normalizados, de modo que
mover un clon o ejecutar git remote set-url vuelve a conectar con el conocimiento
existente. Un fork comparte el commit raíz de upstream, por lo que se divide
explícitamente en lugar de heredar silenciosamente las memorias de upstream.
Nada se destruye jamás
Los símbolos eliminados se convierten en tumbas con su última ruta conocida y el commit que los eliminó.
Las aristas llevan
valid_from_commit/valid_until_commity se vuelvenHISTORICALen lugar de desaparecer.Un checkout desaparecido es
MISSING; una unidad desmontada esOFFLINE. Ninguno elimina nada.Las correcciones versionan el texto anterior; la supersedencia conserva ambas memorias y el vínculo entre ellas.
Un agente no puede reescribir una memoria escrita por humanos — debe superarla, dejando visible el desacuerdo.
purgees la única operación destructiva y requiereconfirm=True.
Las búsquedas pasan por un resolvedor que nunca lanza excepciones: "no se puede resolver actualmente" se devuelve como dato, con lo último que se conocía.
Marca
La marca es la única idea del producto: una pieza de conocimiento (violeta) anclada a código (verde) que de otro modo no llevaría memoria de ella. El anillo se deja abierto — el conocimiento nunca termina de verificarse.
Los grosores de trazo están configurados para que la forma sobreviva hasta un favicon de 16px: el nodo de memoria sigue siendo dominante y los tres anclajes se leen como un triángulo incluso cuando el anillo se desdibuja.
Hex | Significado | |
| memoria, anclaje — conocimiento | |
| símbolos, pruebas — código verificado | |
| archivos — estructura | |
| repositorio, precaución | |
| crítico, cadenas causales | |
| superficie de tarjeta | |
| fondo |
Una regla gobierna toda la interfaz: la estructura es silenciosa, el conocimiento es
ruidoso. CALLS y DEFINES se retiran al fondo para que las aristas de anclaje y
causales — lo que ninguna otra herramienta puede mostrarte — lleven el color.
Los recursos viven en assets/; el código fuente del explorador está en
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 y .js reales en lugar de literales de cadena, para que un editor los
trate como lo que son. Se incrustan en tiempo de renderizado, porque la página publicada
debe seguir siendo un único archivo autocontenido.
Herramientas
Herramienta | Acciones |
|
|
| búsqueda · |
| un evento → muchos hechos anclados |
|
|
|
|
agit mantiene los puntos de control del agente en .agit/, completamente separados
del .git del usuario. Haz checkpoint del trabajo arriesgado, restáuralo, nunca toques
su historial.
Pruebas
python -m pytest172 pruebas, incluida una suite MCP en vivo que inicia el servidor real sobre stdio y ejecuta un flujo de trabajo completo de agente a través del protocolo de cable, y un arnés de árbol de trabajo sucio que verifica el comportamiento de la cascada en ediciones sin confirmar — reformateo, renombrado, cambio de cuerpo, movimiento entre archivos, eliminación, migración débil.
Ese régimen no está validado por la literatura publicada, que solo mide minería de historial de commits post-hoc, por lo que se mide aquí directamente.
La prueba en vivo se justifica. Encontró un error que las pruebas en proceso no pueden ver: las llamadas a subprocesos heredaban el stdin del servidor, que es el pipe del protocolo MCP. Git se bloqueaba en él durante todo su tiempo de espera de 20 segundos en cada llamada de herramienta y podía tragarse bytes del protocolo. Arreglarlo redujo la latencia de las herramientas de 20s a 0.2s.
Medido en un repositorio real de 4,621 archivos
Índice completo | 593s → 34,747 símbolos, 58,857 aristas, 43,038 aristas de llamada |
Apertura en caliente | 0.77s |
Consulta | 1.48s |
Diseño
El razonamiento detrás de cada decisión vive junto al código que gobierna: el docstring
de cada módulo establece qué hace y, más importante, qué fallo existe para prevenir.
anchors.py explica por qué la cascada solo puede bajar la confianza, briefing.py
por qué open ofrece un resumen voluntariamente, causal.py por qué la causalidad se
afirma y nunca se infiere.
Las notas de planificación se mantienen localmente y no forman parte del artefacto publicado.
Construido por Ranit Bhowmick
Si un agente tuviera que leer tu código base para entenderlo, ese conocimiento murió con la sesión. Esto es la solución.
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