Skip to main content
Glama
Kawai-Senpai

Infinite Code Next

by Kawai-Senpai

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.

tests python mcp no llm

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

stdin=subprocess.DEVNULL

el porqué — que git hereda el pipe de MCP y hace que cada llamada se bloquee durante 20 segundos

if touched:

que or None aquí significa «resolverlo todo» y cuesta minutos

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 PATH

Arriba: 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 code

Compartir 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 graph

El 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 nothing

La 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

intent=

cuando no se aporta: locate, understand, modify, debug, audit — inferirlo si se omite

budget=

se gasta una cota aproximada de tokens (predeterminado 9000)

cross_repos=True

seguir los contratos hacia otros repositorios

find_problems=

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_regression

En 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

precondition

cosas que siempre deben seguir verdaderas

warnings

cosas que un agente futuro no debe hacer

checks

lo que se probó pero se rechazó y el porqué

padrones

decisiones tomadas y las alternativas rechazadas

contracts

fijas in condiciones de las que depende otro código

security

cosas relevantes para la seguridad

performance

hechos medidos de rendimiento

bugs

fallos que este código produjo en el pasado

migraciones

pasos o restricciones de orden de migración

convenciones

convenciones locales que merece la pena mantener

forque

por qué el código se ha materializado así

tests

coberturas de tests — crea una arista GUARDED_BY

contracts_with

dependencias entre repositorios distintos

caused_by

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

ACTIVE · 1.0

2

Misma huella en otro lugar, confirmado por git blame -C -M

ACTIVE · 0.9, movido

3a

Mismo lugar, esqueleto idéntico — un renombrado

ACTIVE · 0.8

3b

Mismo lugar, estructura cambiada

NEEDS_REVIEW

4

Símbolo desaparecido, coincidencia fuerte de similitud

DRIFTED, re-anclado

5

Nada supera el umbral

ORPHANED — conservado, nunca eliminado

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 DRIFTED o NEEDS_REVIEW, solo un memory(action="verify") explícito devuelve un ancla a ACTIVE — 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

stale_knowledge

qué memorias se desviaron del código que describen

bypassed_wrapper

¿un llamador está alcanzando más allá de un coordinador o guardia?

untested_invariant

¿una regla gobernada es alcanzable por ninguna prueba?

deprecated_with_callers

¿un símbolo obsoleto aún tiene llamadores vivos?

unguarded_equivalent

¿un hermano estructuralmente idéntico carece de la regla?

implementation_drifted_from_decision

¿el código divergió de lo que se decidió?

knowledge_conflict

¿dos memorias se contradicen entre sí?

historical_implementation

¿el conocimiento activo apunta a código eliminado?

unverifiable_contract

¿una dependencia entre repositorios es actualmente incomprobable?

unreviewed_caller

¿apareció un llamador después de que se verificó la memoria?

migration_candidate

¿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, tiny

Anula 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_commit y se vuelven HISTORICAL en lugar de desaparecer.

  • Un checkout desaparecido es MISSING; una unidad desmontada es OFFLINE. 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.

  • purge es la única operación destructiva y requiere confirm=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

#8b5cf6

memoria, anclaje — conocimiento

#34d399

símbolos, pruebas — código verificado

#4d7cfe

archivos — estructura

#fbbf24

repositorio, precaución

#f4677c

crítico, cadenas causales

#1c2340

superficie de tarjeta

#151a2e

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

workspace

open · status · list · reindex · health · reconcile · archive · detach · forget_checkout · purge

investigate

búsqueda · why · expand · verify

record

un evento → muchos hechos anclados

memory

get · list · verify · guard · correct · supersede · resolve · reanchor

agit

status · diff · commit · log · branches · switch · restore · reset · show

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 pytest

172 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.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • -
    license
    B
    quality
    Not graded
    maintenance
    A 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.
    27
    27
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    7
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Gives AI coding agents persistent, evolving knowledge about a codebase, enabling them to store and retrieve observations about architecture, conventions, gotchas, and recent work context.
    10
    29
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 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.
    1
    MIT

View all related MCP servers

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).

View all MCP Connectors

Latest Blog Posts

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