ContextForge MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ContextForge MCP Serverget context for the user login feature"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ContextForge
Pipeline determinista que convierte cualquier repo en un índice consultable por agentes IA. 94.4 % menos tokens por sesión, 17.9× compresión, ÷28× costo SDD con prompt caching — sin LLM en el pipeline, sin lock-in de agente.
214 600 tokens (todo el repo) → 11 988 tokens (lo que importa a la tarea)
El problema que resuelve
Cada vez que un agente IA (Claude Code, Cursor, OpenCode) abría el repo tenía que:
Leer TODO para entender qué existe
Recordar correr
pnpm forge contextmanualmente antes de cada tareaAdivinar qué archivos tocar sin contexto del grafo
No había gate pre-commit — specs y guardrails se saltaban fácil
Ahora todo eso es automático vía MCP + hooks.
Cómo encaja cada pieza
Dev / Agente (Claude Code · Cursor · OpenCode) escribe tarea
│
▼
[Hook UserPromptSubmit] ← automático, sin hacer nada
→ MCP: select_agent_context(task)
→ Agente recibe: skills relevantes + domains tocados
│
▼
Agente llama forge_context(task) ← MCP tool, sin pnpm, sin disco
→ ~20 archivos rankeados por PageRank + BFS
→ sabe exactamente qué leer, no el repo entero
│
▼
Agente llama forge_spec("mi-feature") ← MCP tool
→ escribe openspec/changes/mi-feature/
├── proposal.md ← motivación y alcance
├── design.md ← decisiones técnicas
├── tasks.md ← lista de tareas
├── specs/ ← Requirements + Scenarios (Given/When/Then)
├── graph.subset.json ← subgrafo FROZEN de los archivos relevantes
├── context.md ← mapa de lectura para el agente
└── agent-manifest.json ← skills filtradas SOLO para este change
│
▼
Agente/Dev llena proposal.md + specs/*.md
openspec validate mi-feature ← verifica formato Requirement + Scenario
│
▼
Agente llama forge_implement("mi-feature") ← MCP tool
→ .contextforge/implement-plan.json
allowedFiles: [solo los del context-pack]
maxLocDelta: estimado del pack
│
▼
Agente implementa código
│
▼
Agente intenta git commit
│
▼
[Hook PreToolUse] ← automático, bloquea si hay violaciones
→ node .claude/hooks/forge-pre-commit.mjs
→ forge implement --check valida git diff vs guardrails
→ archivo fuera de allowedFiles → exit 2 → COMMIT BLOQUEADO
→ Agente recibe lista de violaciones y corrige antes de reintentar
│
▼
Commit pasa → merge
│
▼
Agente corre openspec archive mi-feature
│
▼
[Hook PostToolUse(openspec)] ← automático, en background
→ forge_rebuild_graph async
→ grafo fresco para la próxima tareaContextForge no reemplaza OpenSpec — lo alimenta
OpenSpec es el framework de specs. Claude Code / Cursor / OpenCode son los agentes IA que lo usan. ContextForge le da a los agentes el contexto correcto para que OpenSpec reciba datos reales del código, no inventados.
OpenSpec hace | ContextForge aporta |
Valida formato | El contexto correcto para escribir la spec |
Archiva y mueve specs a | El subgrafo frozen que dice qué archivos aplican |
|
|
Historial de specs por feature |
|
Antes vs ahora
Sin hooks ni MCP — el dev recordaba (o no) cada paso:
pnpm forge scan
pnpm forge graph
pnpm forge context "mi tarea"
pnpm forge spec mi-feature
# llenar docs...
pnpm forge implement mi-feature
# codear...
pnpm forge implement --check # se olvidaba frecuentemente
git commit
openspec archive mi-feature
pnpm forge scan && pnpm forge graph # se olvidaba siempreAhora — los hooks y MCP tools hacen el trabajo:
# Agente recibe contexto automático al escribir el prompt (hook)
# Llama forge_context → forge_spec → forge_implement via MCP (sin pnpm)
# Dev/agente llena las specs → openspec validate confirma formato
# Agente codea
git commit # → hook bloquea si hay violaciones, las explica
openspec archive mi-feature # → hook reconstruye grafo en backgroundpnpm forge manual solo para bootstrap (forge init) o forzar reconstrucción (forge graph --force).
Instalación
npm — público, sin token:
# CLI (uso diario)
pnpm add -g @anai-raia-alex/contextforge-cli # global
# o
pnpm add -D @anai-raia-alex/contextforge-cli # por proyecto
# MCP server (para agentes vía Node)
pnpm add -D @anai-raia-alex/contextforge-mcp
# OpenSpec CLI (recomendado, activa el modo handoff)
npm i -g @fission-ai/openspecDocker — sin instalar Node, multi-arch (amd64+arm64):
docker pull ghcr.io/alejandro-cedeno-10/contextforge-mcp:latestDesde fuente (desarrollo):
git clone https://github.com/alejandro-cedeno-10/contextforge-cli.git
cd contextforge-cli
pnpm install && pnpm buildQuick start (5 comandos para empezar)
# 1. Inicializar (corre 'openspec init' si está en PATH; instala instrucciones del agente)
pnpm forge init
# 2. Indexar el repo (incremental; cache por hash)
pnpm forge scan
pnpm forge graph
# 3. Por cada tarea
pnpm forge context "fix race en tokenLedger writer"
# 4. SDD opcional (con OpenSpec)
pnpm forge spec mi-feature-id # spec-input + handoff/fallback
openspec validate mi-feature-id
# 5. Implementar con guardrails
pnpm forge implement mi-feature-id
# (trabajas con el agente)
pnpm forge implement --check # gate pre-commitLas tres capas
Capa 1 — Grafos para ahorrar tokens
En lugar de "leer todo el repo", rankeamos los archivos por relevancia a tu tarea con el grafo de dependencias real del código + Personalized PageRank.
Pipeline:
pnpm forge scan # Indexa con BLAKE3 (incremental)
pnpm forge graph # Grafo file + symbol con tree-sitter
pnpm forge context "<tarea>" # PageRank + BFS + budgetAlgoritmo:
1. resolve_seeds(task) → archivos semilla por keywords
2. personalized_pagerank() → ranking de relevancia (alpha=0.85, 50 iter)
3. bfs_expand(depth=2) → captura deps directas + transitivas
4. score_nodes() → pagerank × (1/bfs_dist) × edge_multiplier
5. greedy_pack(budget=12000) → llena hasta 12k tokens (full → excerpt → summary)Edge multipliers: tests=1.2 · defines=1.0 · calls=1.0 · imports=0.8 · references=0.6
Ahorro medido en este repo:
Sin ContextForge | Con context-pack |
214 600 tokens | 11 988 tokens |
~$0.64 / sesión (Claude Sonnet 4.6) | ~$0.036 / sesión |
128 archivos enviados | 50 archivos seleccionados |
Compresión: 17.9× · Ahorro: 94.4 %
Capa 2 — SDD apoyando a OpenSpec (no compitiendo con él)
v0.3.0+ —
forge specya no genera el spec final. Genera la entrada (spec-input.json+spec-prompt.md) para que OpenSpec o un agente IA lo escriban con todo el contexto correcto.
Tres roles separados, cada uno hace lo suyo:
┌─────────────────────┐ ┌─────────────────────┐ ┌────────────────┐
│ ContextForge │ │ OpenSpec │ │ Agente IA │
├─────────────────────┤ ├─────────────────────┤ ├────────────────┤
ROL │ Selección de │ │ Estructura + │ │ Redacción │
│ contexto │ │ validación │ │ │
├─────────────────────┤ ├─────────────────────┤ ├────────────────┤
TÉC. │ PageRank + BFS + │ │ Schemas RFC 2119 │ │ LLM │
│ budget tokens │ │ Given/When/Then │ │ │
├─────────────────────┤ ├─────────────────────┤ ├────────────────┤
INPUT │ scan + graph + │ │ spec-input.json │ │ spec-prompt.md│
│ task │ │ │ │ + context-pack│
├─────────────────────┤ ├─────────────────────┤ ├────────────────┤
OUTPUT │ context-pack + │ │ proposal/design/ │ │ .md llenos │
│ spec-input + prompt│ │ tasks/spec.md │ │ + commits │
└─────────────────────┘ └─────────────────────┘ └────────────────┘Pipeline SDD completo:
pnpm forge context "<tarea>" # context-pack + agent-manifest
pnpm forge spec mi-feature-id # spec-input + handoff/fallback
openspec list # ver changes activos
openspec validate mi-feature-id # validación oficial
pnpm forge implement mi-feature-id # plan con guardrails
# (trabajas con el agente)
pnpm forge implement --check # gate pre-commit
openspec archive mi-feature-id -y # al mergear: mueve a specs/Modo handoff vs modo fallback:
Modo | Cuándo | Qué pasa |
Handoff (default si OpenSpec CLI está) |
|
|
Fallback (sin OpenSpec CLI o | CLI ausente, CI sin instalación | ContextForge emite el scaffold con formato moderno ( |
Mismo contrato (spec-input.json), dos formas de consumirlo. Portable Mac/Linux/Windows.
Forma de cada Requirement (RFC 2119 + Given/When/Then):
### Requirement: System produces fix-token-race within budget
The system MUST implement the change `fix-token-race` while respecting
`guardrails.allowedFiles` and not exceeding `guardrails.maxLocDelta`.
#### Scenario: change is implemented within scope
- **Given** a valid `.contextforge/context-pack.json` for the task
- **When** the developer runs `pnpm forge implement fix-token-race`
- **Then** `pnpm forge implement --check` exits with code 0Guardrails de implementación (derivados del grafo):
forge implement produce implement-plan.json cuyos campos vienen del context-pack:
allowedFiles[]← exactamente los archivos del packforbiddenPaths[]— nunca tocarmaxLocDelta— derivado del tamaño del packmaxFilesChanged—allowedFiles.length + 2
forge implement --check valida tu git diff antes del commit. Si te saliste del scope, te lo dice exactamente y el commit no pasa.
Capa 3 — Solo cargar las skills/rules que aplican a la tarea
forge context ya emite 5 artefactos sin paso extra:
.contextforge/context-pack.json ← archivos relevantes
.contextforge/token-ledger.json ← métricas
.contextforge/agent-manifest.json ← NEUTRAL (validado por schema)
.claude/agent-manifest.md ← renderer Claude Code
.cursor/rules/contextforge-active.mdc ← renderer Cursor (Auto-Attached)
.contextforge/manifests/opencode-readme.md ← renderer OpenCodeReglas de matching (priorizadas):
alwaysApply: true→ siempre incluida.frontmatter
domains: [..]∩ dominios tocados → match domain.nombre
contextforge-domain-<slug>del dominio tocado → match explicit (legacyctx-<slug>aún soportado).nada matchea → skipped (con razón).
Frontmatter mal formado nunca crashea: cae en skipped con frontmatter parse error.
Activación por agente (sin pasos manuales después de setup):
Agente | Cómo se carga | Setup |
Claude Code | Hook | Pegar snippet en |
OpenCode | El agente llama tool MCP |
|
Cursor | Rule Auto-Attached con | Sin setup; |
El grafo en detalle
Esta sección explica qué genera forge graph, cómo lo genera, cómo lo visualiza, y cómo el agente lo consume. Si vienes de Understand-Anything, vas a reconocer la idea: convertir un repo en un mapa navegable. La diferencia es que aquí el pipeline es 100 % determinista (sin LLM en el loop, sin coste por correrlo), cacheable por archivo, y los outputs son JSON portables que cualquier agente puede consumir sin la app.
Pipeline de generación (qué pasa cuando corres forge graph)
┌──────────────┐ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ scan.json │ → │ per-file │ → │ graph passes│ → │ graph.json │
│ (BLAKE3) │ │ cache hit? │ │ (4 etapas) │ │ + cache.json│
└──────────────┘ └─────────────┘ └──────────────┘ └──────────────┘
│ │ │
│ │ ├─ Pass 0: file nodes
│ │ ├─ Pass 1: parse code/test (paralelo, n=cpus)
│ │ ├─ Pass 2: defines + imports + tests
│ │ ├─ Pass 3: extends / implements
│ │ ├─ Pass 3.5 (--with-calls): calls
│ │ └─ Pass 4: folder + contains
│ │
│ └─ Si `file.hash` coincide con cache, reusa el fragment parseado
│ y solo recomputa las aristas cross-file (imports/extends/calls).
│
└─ Hash global del scan: si no cambió, `forge graph` ni siquiera arranca (skip).Output canónico — .contextforge/graph.json cumple docs/schemas/graph.schema.json:
{
"schemaVersion": "0.2.0",
"project": { "name": "contextforge-cli", "root": "." },
"generatedAt": "2026-05-08T...Z",
"scanRef": { "path": ".contextforge/scan.json", "scanHash": "..." },
"parser": { "engine": "heuristic" },
"stats": {
"nodesByType": { "file": 287, "folder": 117, "symbol": 3104 },
"edgesByType": { "imports": 71, "defines": 2256, "contains": 376 }
},
"nodes": [
/* ordenados por id, JSON byte-estable */
],
"edges": [
/* ordenadas por (from,to,type) */
]
}Tipos de nodo y arista que produce
Nodo | Cuándo aparece |
| Uno por cada archivo del scan ( |
| Por cada función/clase/interface/type/var/enum exportada o interna |
| Sintético, derivado de los paths (anidación completa) |
| Por cada import externo único ( |
Arista | De qué | Cuándo se emite |
|
| Siempre que el archivo contiene un símbolo |
|
| Relativos · alias workspace (pnpm) · alias |
|
| Convención |
|
| Clase/interface extiende un símbolo del mismo file o de un import |
|
|
|
|
| Estructura de carpetas |
|
| (heurística regex, ruido aceptado) |
|
| (PascalCase, fuera de imports/defines) |
Lenguajes parseables hoy (heurística regex, no tree-sitter WASM): TypeScript, TSX, JavaScript, JSX, Python, Go, Rust, Java. El resto se incluye como file pero sin símbolos.
Incrementalidad y reproducibilidad
pnpm forge graph # 1ª vez en este repo: 112 archivos parseados
# editas un archivo
pnpm forge scan # actualiza hashes
pnpm forge graph # → "cache: 111 reutilizados, 1 reparseados"
pnpm forge graph --force # ignora ambos caches; reconstruye todo
pnpm forge graph --with-calls # añade aristas calls (heurística, opt-in)
pnpm forge graph --with-refs # añade aristas references PascalCase (opt-in)
# resolución de imports
# 1. workspace pnpm (packages/<name>)
# 2. tsconfig.paths (compilerOptions.paths con baseUrl)
# 3. relativos (./foo, ../bar)
# 4. externos → nodo type=package (react, node:fs, @scope/lib)
# export a otros formatos
pnpm forge graph --export=dot > graph.dot
pnpm forge graph --export=graphml > graph.graphml
# Render con Graphviz: dot -Tsvg graph.dot -o graph.svg
# O abrir graph.graphml directamente en Gephi.
# enriquecimiento opcional con LLM (Anthropic)
ANTHROPIC_API_KEY=sk-... pnpm forge graph --enrich
# Agrega summary / tags / complexity a los símbolos exportados.
# El default sigue siendo determinista; --enrich es la única excepción opt-in.Cache global por hash del scan: si
scan.jsonno cambió,forge graphno arranca.Cache por archivo (
.contextforge/graph.cache.json): solo se reparsean los archivos cuyo hash BLAKE3 cambió.Output byte-idéntico entre dos corridas (excluyendo
generatedAt): los nodos y aristas se ordenan al final porid/(from,to,type), así quegit diffdel JSON es revisable y el prompt cache de Claude no se invalida innecesariamente.
Visualización: forge viz
pnpm forge graph
pnpm forge viz # genera .contextforge/graph.html
# abre el archivo en cualquier navegador, no necesita servidor ni NodeEl HTML viewer es standalone (un solo archivo, Cytoscape vía CDN) y trae:
┌──────────────────────────────────────────────────────────────────────┐
│ ContextForge [Grafo] [Dominios] 287 nodos · 2703 edges · 50 pack│
├──────────────┬───────────────────────────────────────────────────────┤
│ Estadísticas │ │
│ 287 archivos │ ●─────● │
│ 3104 símbolos│ ╱ ╲ ● ← archivo en pack │
│ 2703 edges │ ●─────●───● ◇ ← símbolo exportado │
│ 50 en pack │ ╲ ╱ ◇ ← dashed = interno │
│ │ ●─● ▢ ← carpeta │
│ Tour ◀ ▶ ✕ │ │
│ 3 / 50 │ │
│ │ │
│ Leyenda nodos │ ┌──────────────┐ │
│ ● Código 128 │ │ src/ │ ← agrupación por dominio │
│ ● Test 24 │ │ ┌────┐ ┌──┐ │ (toggle "Agrupar") │
│ ● Doc 17 │ │ │a.ts│ │b │ │ │
│ ▢ Carpeta 117│ │ └────┘ └──┘ │ │
│ ◇ Interno 218│ └──────────────┘ │
│ ● En pack 50 │ │
│ │ │
│ Leyenda edges │ │
│ ─ imports │ │
│ ─ defines │ │
│ ─ tests │ │
│ ─ extends │ │
│ ─ contains │ │
│ │ │
│ Filtros │ │
│ [Solo pack] [+Sím] [+Carpetas] [Agrupar] │
│ [⊕ Centrar] [⟳ Layout] │
│ │ │
│ 🔍 Buscar... │ │
│ │ │
│ Nodo selec. │ │
│ src/main.ts │ │
│ [code][ts] │ │
│ Define 4 sím │ │
│ → importa: 3 │ │
│ ← usado por:5│ │
└───────────────┴────────────────────────────────────────────────────────┘Capacidades del viewer:
Dos vistas: grafo file/symbol/folder + vista de dominios (agregación por carpeta top-level, edges = imports cruzados entre dominios).
Tour por context-pack:
▶recorre uno por uno los archivos seleccionados por PageRank para tu tarea, centrándose y mostrando vecinos.Filtros incrementales: solo pack (default), añadir símbolos, añadir carpetas, agrupar por dominio.
Estilos diferenciados para
exported:false(símbolos internos en dashed) y nodosfolder.Búsqueda por nombre o ruta con resaltado.
Panel de nodo: kind, lang, contadores de edges entrantes/salientes, lista navegable de vecinos.
Cómo lo usa el agente
El agente nunca lee el repo a ciegas. Lee artefactos derivados, en este orden:
1. .contextforge/agent-context.md ← qué hay disponible y en qué orden leerlo
2. .contextforge/context-pack.json ← solo los archivos relevantes a la tarea
3. .contextforge/agent-manifest.json ← qué skills/rules aplican (con razón)
4. .contextforge/graph.json ← solo si necesita ver vecinos / cross-depsEl grafo no se inyecta entero al prompt. El agente lo consulta puntualmente:
Pregunta del agente | Cómo responde el grafo |
"¿Qué archivos tocan a | Edges |
"¿Quién testea esto?" | Edges |
"¿De qué hereda | Edge |
"¿En qué carpeta vive este archivo?" | Edge |
"Dame el subgrafo de mi tarea" | Lo entrega |
"Que nada se salga del scope" |
|
Vía MCP — los agentes que hablen MCP pueden llamar tools sin tocar disco:
{ "tool": "forge_neighbors", "arguments": { "path": "src/foo.ts" } }
// → { incoming: [...], outgoing: [...], symbols: [...] }
{ "tool": "forge_context", "arguments": { "task": "fix race in writer" } }
// → { files: [...], packTokens: 11988, tokenLedger: {...} }Vs. Understand-Anything (qué tomamos, qué no)
Aspecto | Understand-Anything | ContextForge |
Pipeline | Tree-sitter + LLM agents (híbrido) | Regex/tree-sitter, 0 LLM en el pipeline |
Lenguajes soportados | 10+ con WASM | 8 con heurística (TS/JS/Py/Go/Rust/Java/TSX/JSX) |
Schema de nodo | 21 tipos (con dominio + knowledge) | 4 tipos canónicos (file/symbol/folder/package) |
Schema de arista | 35 tipos | 8 tipos (los que un agente usa de verdad) |
Enriquecimiento (summary) | LLM agents enriquecen cada nodo | Determinista: contadores derivados del grafo |
Coste de regenerar | API key + tiempo + ruido | CPU-only · cache por archivo · idempotente |
Visualización | Dashboard rico, tours guiados | HTML standalone con tour + dominios + filtros |
Persistencia | knowledge-graph.json + embeddings | graph.json + graph.cache.json (BLAKE3) |
Roadmap LLM enrich | Es la base | Opt-in futuro ( |
La filosofía: el grafo de ContextForge no intenta entender el código, intenta darte un índice rápido y barato. La inteligencia semántica vive en el agente, no en el pipeline. Por eso es reproducible y por eso el output sirve de input al prompt cache de Claude (descuento del 90 % en iteraciones 2+ del SDD).
Cómo el grafo le da superpoderes a OpenSpec
El bloque clave de v0.3.0+. Sin grafo, OpenSpec hace su trabajo bien pero el agente trabaja a ciegas. Con grafo, el spec se vuelve trazable, validable y barato.
1. El spec-input.json deriva del grafo, no del repo.
Campo | Lo aporta el grafo |
| El context-pack ya filtró por PageRank → spec apunta a archivos reales |
| El grafo de imports → design.md menciona dependencias correctas |
| Inferencia por mayoría de paths del pack |
| Referencias trazables a los artefactos JSON validados |
| Inferencia determinista del nombre del archivo |
2. El agente recibe el spec-prompt, NO el repo.
forge spec genera .contextforge/spec-prompt.md con 4 secciones:
1. Contexto del repo (de ContextForge)
- Tarea, dominio inferido, archivos afectados, cross-domain deps, evidencia
2. Instrucciones canónicas de OpenSpec
- Lo que devuelve `openspec instructions proposal --change <id> --json`
3. Restricciones para tu salida
- Token budget, allowed files, formato moderno
4. Output esperado
- Editar openspec/changes/<id>/{proposal,design,tasks,specs}.mdEl agente no abre el repo. Solo lee este prompt + el context-pack si necesita más detalle.
3. El multiplicador escondido — prompt caching.
Claude descuenta 90 % del precio de tokens cacheados. ContextForge mete un boost porque su output es determinista:
Mismo
forge context→ mismocontext-pack.jsonbyte-a-byte.Mismo
forge spec→ mismospec-prompt.mdbyte-a-byte.
Entre las iteraciones 2, 3, N del SDD, el agente cachea todo el prompt. Solo paga full por el delta.
4. Ahorro doble medido.
Por iteración SDD:
Sin ContextForge 217 600 tokens $0.65
Con ContextForge 18 988 tokens $0.057 (-91%)
3 iteraciones de un feature normal:
Sin caching 3 × $0.65 = $1.96
Con caching activo $0.07 (÷28×)5. Trazabilidad auditable.
Cada path en design.md apunta a un archivo del context-pack.json. Cada commit puede verificarse con forge implement --check contra allowedFiles[] derivado del pack.
6. Subgrafo congelado dentro del change (v0.3.7+).
forge spec <id> ahora también escribe openspec/changes/<id>/graph.subset.json — un subgrafo limitado al context-pack del change + 1 hop por aristas. Eso significa:
Las skills/prompts del agente que leen
openspec/changes/<id>/tienen el grafo del momento exacto en que se autorizó el spec, sin necesidad de reabrir.contextforge/graph.json(que pudo haber mutado).design.mdincluye una sección "Context graph (subset)" con stats y la referencia al adjunto.Vía MCP:
forge_change_subgraph({ change_id: "mi-feature" })lo devuelve directo, ideal para que un agente lo cargue al inicio de una sesión de implementación.
openspec/changes/mi-feature/
├── proposal.md
├── design.md ← incluye tabla con stats del subset
├── tasks.md
├── specs/<domain>/spec.md
├── graph.subset.json ← subgrafo self-contained · validado por JSON Schema
└── graph.subset.html ← viewer interactivo standalone (Cytoscape, sin servidor)Trazabilidad real: el subgrafo es byte-stable (orden determinista), validado por JSON Schema (docs/schemas/graph-subset.schema.json), y queda commiteado con el resto del change. Si seis meses después el grafo global cambió, puedes comparar este subset con el subgrafo equivalente de hoy y ver el drift.
Tabla — qué aporta cada herramienta:
Aporte | ContextForge | OpenSpec | Agente IA |
Ranking de archivos por relevancia | ✓ | ||
Grafo de dependencias | ✓ | ||
Token budget + selección por presupuesto | ✓ | ||
Trazabilidad (cada archivo viene del pack) | ✓ | ||
Schemas estables (Requirement+Scenario) | ✓ | ||
Validación estructural ( | ✓ | ||
Templates canónicos por artefacto | ✓ | ||
Instalación de instrucciones por agente ( | ✓ | ||
Redacción de prosa | ✓ | ||
Decisiones de diseño contextual | ✓ | ||
Determinismo + cacheabilidad | ✓ | ✓ |
Documentación generada para agentes (forge init)
forge init genera .contextforge/agent-context.md — un archivo derivado que cualquier agente puede leer al iniciar sesión y entender:
Qué artefactos hay disponibles y en qué orden leerlos.
Cómo consumirlos (no leer el repo a ciegas).
La receta SDD completa (ContextForge ⊕ OpenSpec).
Política para agentes (no specs a mano, no bullets, gate pre-commit).
Tabla de comandos clave por intención.
Adicionalmente, forge init detecta si openspec CLI está en PATH y, si el directorio openspec/ no existe, ejecuta:
openspec init . --tools=claude,cursor,opencode --forceEso instala las instrucciones canónicas de OpenSpec para los 3 agentes (las que aparecen en .claude/, .cursor/rules/, opencode.json). Idempotente: si el directorio openspec/ ya existe, salta.
Comandos completos
Comando | Qué hace | LLM |
|
| No |
| Indexa con BLAKE3 (incremental) | No |
| Grafo file/symbol/folder/package con cache por archivo (BLAKE3) | No (¹) |
| PageRank + BFS + budget · auto-emite manifest | No |
| spec-input.json + handoff/fallback OpenSpec | No |
| Plan con guardrails derivados del pack | No |
| Valida diff vs guardrails | No |
| Auto-genera skills por dominio ( | No |
| Re-genera manifest sin re-rankear | No |
| Reporta delta desde un ref de git | No |
| Health check de artefactos + cobertura | No |
| Visualización HTML interactiva del grafo | No |
| Scaffold Diátaxis (tutorials/how-to/reference/explanation/adr/architecture) | No |
Política: ningún comando llama a un LLM por defecto. Todo es derivable, reproducible, auditable.
(¹) forge graph --enrich es la única excepción opt-in — agrega summary/tags/complexity a símbolos exportados vía Anthropic API. Requiere ANTHROPIC_API_KEY. Sin la flag, el pipeline sigue 100 % determinista.
Servidor MCP
packages/mcp expone 10 tools consumibles por cualquier cliente MCP (Claude Code, OpenCode, etc.).
Tool | Propósito |
| Estado de los artefactos (frescura, conteos, savings) |
| Mapa de dominios + dependencias cruzadas |
| Vecinos directos de un archivo en el grafo |
| Selección PageRank para una tarea (con o sin contenido) |
| Valida git diff contra guardrails del implement-plan |
| Subgrafo congelado de un OpenSpec change ( |
| Mapa de lectura del change ( |
| Cierra un change: |
| Runtime: computa agent-manifest en memoria para una tarea (cache mtime) |
| Offline: lee |
Wiring (Docker, recomendado):
{
"mcpServers": {
"contextforge": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-v",
"${PWD}:/project",
"-e",
"PROJECT_ROOT=/project",
"ghcr.io/alejandro-cedeno-10/contextforge-mcp:latest"
]
}
}
}Wiring (npm):
{
"mcpServers": {
"contextforge": {
"command": "node",
"args": ["./node_modules/@anai-raia-alex/contextforge-mcp/dist/index.js"],
"env": { "PROJECT_ROOT": "." }
}
}
}Artefactos generados
Todos los JSON validados con JSON Schema 2020-12 antes de escribirse.
.contextforge/
scan.json # archivos con hashes BLAKE3
graph.json # 368 nodos, 267 edges
context-pack.json # archivos seleccionados dentro del presupuesto
token-ledger.json # métricas auditables del ahorro
agent-manifest.json # skills/rules relevantes a la tarea (neutral)
spec-input.json # entrada determinista para OpenSpec / agente
spec-prompt.md # prompt copy-paste (modo handoff)
implement-plan.json # guardrails: allowedFiles, maxLocDelta, etc.
agent-context.md # documentación del repo para agentes IA
graph.html # visualización interactiva (Cytoscape.js)
manifests/opencode-readme.md # instrucciones MCP para OpenCode
.claude/agent-manifest.md # manifest renderer Claude Code
.cursor/rules/contextforge-active.mdc # rule auto-attached por dominios tocados
openspec/changes/<id>/
proposal.md # intent, scope, why, alternatives
design.md # decisiones técnicas con archivos del grafo
tasks.md # T1, T1.1, T2... checklist
specs/<dominio>/spec.md # ## ADDED Requirements + ### Requirement: + #### Scenario:Schemas
Artefacto | Schema |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Métricas reales (este repo, hoy)
Métrica | Valor |
Tests | 270 / 270 verde (26 archivos) |
Coverage | ≥ 80 % global · módulos |
Token savings | 94.4 % vs baseline |
Compresión | 17.9× por sesión · ÷28× SDD con caching |
Archivos del repo | 128 |
Archivos en context-pack | 50 |
Tokens del context-pack | 11 988 |
Tokens baseline | 214 606 |
Grafo | 368 nodos, 267 edges |
Comandos | 13 |
Tools MCP | 7 |
Distribución
Canal | Identificador |
npmjs.com (público, sin token) |
|
GitHub Container Registry |
|
Repo público |
Integración con agentes — matriz
Agente | Configuración | Selección por tarea | Estado |
Claude Code |
| Hook inyecta manifest live + JSON precomputado | Listo |
Cursor |
| Rule por glob regenerada por | Listo |
OpenCode |
| Tool MCP | Listo |
Codex / otros | Leen | Lectura directa de | Compatible |
Los .contextforge/*.json son portables. Cualquier agente futuro los puede consumir sin modificación.
Principios
Determinismo primero: ningún comando llama a un LLM. Reproducible, auditable, cacheable.
OpenSpec por defecto:
forge specdelega a OpenSpec CLI cuando está, fallback determinista cuando no.Cache por hash: si
scan.jsonno cambió,forge graphsalta el rebuild.Presupuesto explícito: cada context-pack tiene
maxInputTokenstrazable entoken-ledger.json.JSON validado: ningún artefacto se escribe sin pasar JSON Schema.
Portable: cualquier agente puede consumir
.contextforge/*.jsonsin modificación.Sin lock-in: si mañana sale otra herramienta SDD, lee los mismos JSON.
Para la exposición — los 5 puntos memorables
94 % menos tokens por sesión — verificado con
token-ledger.json, no estimado.÷28× costo SDD con prompt caching — porque el output es determinista byte-a-byte.
No competimos con OpenSpec, lo apoyamos. Tres roles separados (CF / OpenSpec / agente). Si OpenSpec evoluciona, no nos pisamos.
El agente solo carga lo de tu tarea actual — context-pack + manifest. Las 100 skills viejas no entran al contexto.
Sin lock-in. Los
.contextforge/*.jsonson neutrales. Si mañana sale otra herramienta, los puede consumir igual.
Estructura del monorepo
packages/
core/ → scanner, parser tree-sitter, graph builder, selector PageRank,
packer, schema validator, skill builder, agent-manifest, spec-input,
spec promptRenderer
cli/ → comandos forge (init, scan, graph, context, spec, implement, manifest,
skills, sync, impact, viz, docs)
mcp/ → servidor MCP con 7 tools
.claude/skills/ → 3 skills task-oriented (contextforge-*) +
N auto-generadas (contextforge-domain-*) +
agent-manifest.md (per-task)
.cursor/rules/ → contextforge.mdc (alwaysApply) +
contextforge-active.mdc (Auto-Attached, regenerada por tarea)
opencode.json → configuración MCP para OpenCode
docs/integrations/ → guías de wiring por agente
docs/explanation/ → contextforge-and-openspec.md (lectura clave)Tests
pnpm test # todos los tests
pnpm test:coverage # con cobertura
pnpm typecheck # tsc -b --force (project references)Suite actual: 270/270 tests pasando (26 archivos), coverage global ≥ 80 % · módulos manifest/ y spec/ ≥ 95 %.
Documentación
Documento | Descripción |
| Lectura clave: 3 roles (CF / OpenSpec / agente), ahorro medido, prompt caching ÷28× |
| Guía paso a paso: instalación, pipeline, integración por agente |
| Snippet copy-paste para activar manifest en runtime en Claude Code |
| Los 3 modos de rules en Cursor + estrategia recomendada |
| Ejemplo de |
| Análisis de ahorro de tokens por capas con tabla de costos |
| Walkthrough completo del pipeline con outputs reales |
| Backlog de sprints con criterios verificables |
| Historial de cambios de schemas |
| OpenSpec change del re-arquitectura v0.3.0 |
| OpenSpec change del manifest por tarea |
| OpenSpec change de las skills auto-generadas |
| Decisiones de diseño, arquitectura, roadmap |
Licencia
MIT
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.
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/alejandro-cedeno-10/contextforge-cli'
If you have feedback or need assistance with the MCP directory API, please join our Discord server