Skip to main content
Glama
donliggett

mcp-context-window

mcp-context-window

Un servidor MCP que le da a un modelo local un búfer de contexto externo: memoria de sesión duradera en la que puede escribir notas y documentos grandes que puede hojear sin cargarlos enteros.

Construido con el MCP TypeScript SDK v2 contra la revisión del protocolo 2026-07-28. Se ejecuta sobre stdio (LM Studio, Claude Desktop, cualquier cosa que lance un proceso local) o Streamable HTTP.


Léase primero: qué puede y qué no puede hacer un servidor MCP

Ningún servidor MCP puede ver ni modificar su ventana de contexto. MCP es estrictamente petición/respuesta: el host llama a una herramienta, la herramienta responde. El servidor nunca ve la conversación, no puede interceptar mensajes antes de que lleguen al modelo y no puede recortar nada. LM Studio hace su propio truncamiento internamente y no consulta a ningún servidor al respecto.

Así que esto no es una ventana deslizante automática, y cualquier cosa que se anuncie como tal le está engañando. Lo que es: un almacén contra el que el modelo pagina deliberadamente, manteniendo la mayor parte del material fuera de la ventana y recuperando solo lo que necesita. Eso es genuinamente potente con un modelo local de 8k tokens, pero funciona porque el modelo lo llama, no porque intercepte nada.

La consecuencia práctica: el modelo tiene que cooperar. Las descripciones de las herramientas aquí están escritas para ser prescriptivas, y context_guide devuelve el flujo de trabajo previsto. Si su modelo las ignora, dígalo en su mensaje de sistema.

Una nota relacionada: el Muestreo de MCP —el mecanismo que permite a un servidor pedir al LLM del cliente que genere texto— fue desaprobado en la especificación de 2026-07-28, con el consejo oficial de "integrarse directamente con las API del proveedor de LLM". Así que este servidor llama él mismo a un endpoint compatible con OpenAI. Eso es también lo que lo mantiene independiente del arnés: el mismo código funciona con LM Studio, Ollama, llama.cpp o vLLM.


Related MCP server: membot

Las dos mitades

Sesiones: memoria de trabajo a lo largo de una tarea larga

Herramienta

Propósito

context_open

Iniciar o reanudar una sesión con nombre; muestra lo que ya está almacenado

context_append

Registrar un hecho, una decisión o un callejón sin salida. Fijar lo que no debe perderse jamás

context_recall

Recuperar las entradas más relevantes, empaquetadas en un presupuesto de tokens

context_compact

Plegar entradas antiguas en un resumen para liberar presupuesto

context_status

Cuán llena está la sesión y si conviene compactar

context_update

Fijar, desfijar o eliminar una entrada

context_list_sessions

Encontrar un id de sesión de un trabajo anterior

Documentos: material demasiado grande para leerlo de una vez

Herramienta

Propósito

doc_ingest

Cargar texto o un archivo; se trocea y almacena, casi nada entra en el contexto

doc_outline

Mapa de estructura: índices de fragmento, encabezados, tamaños, resúmenes opcionales

doc_search

Encontrar los fragmentos relevantes por palabra clave y devolverlos textualmente

doc_window

Leer rangos de fragmentos en orden; el cursor avanza solo

doc_summarize

Resumir un rango, o el documento completo

doc_list / doc_forget

Gestionar lo que está almacenado

Además de context_guide, que explica el flujo de trabajo al modelo.


Inicio rápido

npm install
npm run build
npm test
node dist/index.js --ingest-root ./sources

O explórelo de forma interactiva:

npx @modelcontextprotocol/inspector node dist/index.js

LM Studio

Edite ~/.lmstudio/mcp.json (en Windows, C:\Users\<usuario>\.lmstudio\mcp.json) a través de Programa → Instalar → Editar mcp.json y, a continuación, recargue LM Studio.

{
  "mcpServers": {
    "context": {
      "command": "node",
      "args": [
        "/absolute/path/to/mcp-context-sliding/dist/index.js",
        "--ingest-root", "/absolute/path/to/your/project",
        "--budget", "4000"
      ]
    }
  }
}

Estas dos rutas deben ser absolutas. El host lanza el servidor como un proceso hijo con un directorio de trabajo impredecible, por lo que una ruta relativa no se resolverá. En la línea de comandos, donde usted controla el directorio de trabajo, las rutas relativas como --ingest-root ./sources son correctas.

En Windows, escriba barras diagonales (C:/Users/usuario/projects) o duplique las barras invertidas, ya que una sola \ es un carácter de escape dentro de una cadena JSON.

Establezca --budget en aproximadamente la mitad de la longitud de contexto de su modelo. Es el objetivo en el que este servidor empaqueta las recuperaciones, no un límite que LM Studio imponga.

--ingest-root es lo que permite a doc_ingest leer archivos. Si lo omite, el servidor solo acepta texto en línea, que es el valor predeterminado seguro, ya que un servidor que abra rutas arbitrarias por orden de un modelo es un lastre.

Docker

docker build -t mcp-context-window:latest .
{
  "mcpServers": {
    "context": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm", "--init",
        "-v", "mcp-context-data:/data",
        "-v", "/absolute/path/to/your/project:/ingest:ro",
        "-e", "CTX_INGEST_ROOTS=/ingest",
        "--add-host", "host.docker.internal:host-gateway",
        "mcp-context-window:latest", "--stdio"
      ]
    }
  }
}

Dos cosas que pican aquí: -i es obligatorio o el apretón de manos JSON-RPC nunca ocurre, y el volumen con nombre es obligatorio o cada reinicio descarta silenciosamente todas las sesiones almacenadas. Desde dentro de un contenedor, localhost es el contenedor, por lo que la URL base del LLM por defecto es host.docker.internal. Docker también requiere que el lado del host de un enlace de montaje -v sea una ruta absoluta.


Cómo transcurre una sesión realmente

context_open        session_id "refactor-auth"
context_append      "Goal: replace session cookies with JWT" (pinned)
context_append      "auth/middleware.ts:42 assumes a cookie is present"
context_append      "Decision: keep cookie support behind a flag for one release"
...
context_status      → 3200/4000 tokens — approaching budget
context_compact     → folds 14 old entries into one 380-token summary
context_recall      "cookie flag decision" → returns the pinned goal + the decision

Y un documento:

doc_ingest      file_path "logs/build-failure.log"  → doc_kx91, 240 chunks
doc_search      "OutOfMemory"                       → 3 chunks, 1400 tokens
doc_window      from 118 to 121                     → the surrounding context

El registro nunca entró en el contexto del modelo. Tres lecturas específicas sí lo hicieron.


Configuración

Indicador

Entorno

Predeterminado

Significado

--data-dir <dir>

CTX_DATA_DIR

directorio de datos de la plataforma

Dónde vive el estado

--ingest-root <dir>

CTX_INGEST_ROOTS

(ninguno)

Permite que doc_ingest lea archivos aquí. Repetible.

--llm-base-url <url>

CTX_LLM_BASE_URL

http://localhost:1234/v1

Endpoint compatible con OpenAI

--llm-model <id>

CTX_LLM_MODEL

(modelo cargado)

Déjelo vacío para usar lo que esté cargado

--llm-timeout <ms>

CTX_LLM_TIMEOUT_MS

120000

Los modelos locales pueden ser lentos

--no-llm

CTX_LLM_ENABLED=false

habilitado

Solo resúmenes extractivos

--budget <n>

CTX_BUDGET

4000

Presupuesto de recuperación/ventana predeterminado

--chunk-tokens <n>

CTX_CHUNK_TOKENS

800

Tamaño de fragmento objetivo

--chunk-overlap <n>

CTX_CHUNK_OVERLAP

80

Solapamiento entre fragmentos

--token-ratio <n>

CTX_TOKEN_RATIO

0.27

Estimación de tokens por carácter en frío

--stdio / --http

CTX_TRANSPORT

stdio

Transporte

--host / --port

CTX_HTTP_HOST / CTX_HTTP_PORT

127.0.0.1 / 3001

Enlace HTTP

--audit / --no-audit

CTX_AUDIT

activado

Registro JSON por llamada en stderr


Notas de diseño

El recuento de tokens está calibrado con su modelo real. No existe un tokenizador universal —Llama, Qwen y GPT dividen de forma diferente— e incluir uno sería grande e incorrecto para lo que sea que haya cargado. En su lugar, el servidor estima de forma económica y luego mide la verdad: envía dos muestras de diferentes longitudes a su endpoint con max_tokens: 1 y toma la pendiente de los usage.prompt_tokens notificados entre ellas. La pendiente anula la sobrecarga fija de la plantilla de chat y produce el coste marginal real por carácter. El resultado se almacena en caché, por lo que solo la primera ejecución no está calibrada, y se ejecuta en segundo plano para que el arranque nunca se bloquee por un modelo que quizás aún no esté cargado.

Las estimaciones tienden deliberadamente a ser altas. Subestimar desborda la ventana y trunca precisamente el contexto que este servidor existe para proteger.

La generación de resúmenes se degrada en lugar de fallar. Si su endpoint es inalcanzable o no hay ningún modelo cargado, se recurre a la generación de resúmenes extractiva —puntuación de oraciones TF-ISF— que es instantánea, determinista y estructuralmente incapaz de alucinar, ya que solo puede seleccionar oraciones que realmente estaban allí. Perder el acceso al contexto almacenado es un resultado peor que un resumen más tosco del mismo. Tras un fallo, el cliente se retira brevemente, por lo que un documento de 200 fragmentos no espera 200 tiempos de espera TCP separados.

El almacenamiento es JSONL de solo añadidura. Un fallo puede corromper como mucho la última línea, que se omite al cargar en lugar de ser fatal. Haga tail al archivo para ver cómo se acumula la memoria. La compactación marca los originales como reemplazados en lugar de eliminarlos, por lo que una compactación que haya descartado algo importante sigue siendo recuperable desde el registro.

La división en fragmentos sigue la estructura del documento, no compensaciones fijas: los encabezados, los párrafos y los bloques de código delimitados permanecen intactos, y cada fragmento lleva la ruta de encabezados bajo la que se encuentra. Solo un bloque genuinamente más grande que un fragmento completo se divide a la fuerza.

La recuperación es BM25 más actualidad, sin modelo de incrustación. Eso no requiere nada cargado, no cuesta VRAM junto a su modelo principal y es determinista, lo que importa cuando el objetivo es la previsibilidad sobre lo que ve el modelo. Los identificadores se indexan enteros y divididos, por lo que getUserName se puede encontrar como "user name".

Límites

  • El modelo debe llamar realmente a estas herramientas. Nada es automático.

  • La búsqueda por palabras clave no detecta paráfrasis que un modelo de incrustación sí detectaría.

  • Los recuentos de tokens son estimaciones hasta que la primera calibración tiene éxito.

  • Ningún transporte autentica; HTTP se vincula a loopback por esa razón.

  • doc_ingest lee texto UTF-8. No es un extractor de PDF o DOCX.

Licencia

MIT

Install Server
F
license - not found
A
quality
C
maintenance

Maintenance

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

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides persistent session memory for AI assistants, enabling them to store, search, and retrieve conversation summaries across sessions via the Model Context Protocol.
    10
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides a persistent, versioned, and searchable context store for AI agents with local embedding and hybrid search.
    114
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Local-first, cross-session context store that reduces token usage by saving facts, decisions, and preferences, and recalling them in later sessions with token-efficient ranking and compression.
    2
    MIT

View all related MCP servers

Related MCP Connectors

  • Universal memory for AI agents and tools. Save, organize and search context anywhere.

  • Your portable context layer — load it into any AI.

  • Persistent memory for AI agents. Search, store, and recall across sessions.

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/donliggett/mcp-context-sliding'

If you have feedback or need assistance with the MCP directory API, please join our Discord server