TC39 Specs (ECMA-262 + ECMA-402)

Especificaciones ECMA-262 y ECMA-402 analizadas a través de MCP: cláusulas, pasos de algoritmos, referencias cruzadas, diferencias entre ediciones, búsqueda en test262 y propuestas.

Documentación

tc39-mcp

Test npm version License: MIT

📖 Documentación: mcp.xyzzylabs.ai/tc39 — Cómo empezar · Herramientas · Recetario · Ediciones · Arquitectura · Alojamiento

Proyecto independiente — no es una publicación oficial de Ecma International ni de TC39. Lee las especificaciones ECMAScript publicadas públicamente (ECMA-262 + ECMA-402).

Dale a los agentes de IA que hablan MCP acceso estructural a la especificación de JS. Cualquier cliente que hable el Protocolo de Contexto de Modelos puede llamar a clause.get sec-tonumber y recibir JSON analizado (pasos de algoritmos como arreglos discretos, referencias cruzadas como ids, firmas como valores tipados) en lugar de recibir un spec.html de 4 MB para buscar a mano. Las herramientas cubren ECMA-262 (el lenguaje central) y ECMA-402 (la API de Intl): cláusulas, pasos de algoritmos, referencias cruzadas en ambas direcciones, diferencias entre ediciones, historial de git upstream, búsqueda en test262, consulta de propuestas. Cada respuesta está fijada por SHA a un commit upstream específico, de modo que cualquier cosa que un agente cite siga siendo reproducible.

Las instantáneas se resuelven a través de una cadena de caché local → Worker alojado → respaldo incluido. El transporte stdio (npx tc39-mcp) obtiene cada instantánea del Worker de Cloudflare alojado en una caché fría, la escribe bajo ~/.cache/tc39-mcp/, y la sirve desde disco en adelante — revalidando solo cuando la copia local es más antigua que ~4 horas (una solicitud If-None-Match condicional). El paquete npm también incluye las ediciones estables más recientes + main de ambas especificaciones, además de los índices de test262 y propuestas; cuando el Worker no es alcanzable, esas se sirven directamente desde el paquete (el respaldo sin conexión — no se escriben en la caché). El Worker alojado también es la alternativa HTTP cuando quieres un endpoint de red compartido; sus datos R2 se actualizan desde upstream cada ~4 horas.

Instalación + primera llamada

Conéctalo a cualquier cliente MCP — el comando de lanzamiento stdio es el mismo en todas partes, solo cambia el archivo de configuración:

{
  "mcpServers": {
    "tc39": { "command": "npx", "args": ["tc39-mcp"] }
  }
}

Una instalación global también funciona — npm i -g tc39-mcp, luego ejecuta tc39-mcp.

La primera ejecución descarga el paquete npm (las ediciones estables más recientes + main más los índices de propuestas y test262 están incluidos). La primera llamada para una instantánea dada la obtiene del Worker alojado y la guarda en caché localmente; las llamadas posteriores se sirven desde disco, revalidadas contra el Worker solo después de la ventana de frescura de ~4 horas. Si el Worker no es alcanzable, las ediciones incluidas aún responden sin conexión. Luego en tu cliente:

usa clause.get para leer sec-tonumber y muéstrame los pasos

Deberías ver JSON estructurado de vuelta:

{
  "meta": {
    "id": "sec-tonumber",
    "aoid": "ToNumber",
    "title": "ToNumber ( argument )",
    "number": "7.1.4",
    "kind": "op"
  },
  "signatureRaw": "ToNumber ( _argument_: an ECMAScript language value, ): either a normal completion containing a Number or a throw completion",
  "algorithms": [
    { "steps": [
        { "text": "If _argument_ is a Number, return _argument_." },
        { "text": "If _argument_ is either *undefined* or a Symbol, throw a *TypeError* exception." },
        { "text": "If _argument_ is *null*, return *+0*<sub>𝔽</sub>." },
        "..."
    ]}
  ],
  "crossrefs": ["sec-tonumber-applied-to-the-string-type", "..."]
}

Recorrido de cinco minutos: docs/getting-started.md.

HTTP alojado

Apunta tu cliente al Worker de Cloudflare alojado en lugar de ejecutar un subproceso local — mismo protocolo MCP, sin instalación:

{
  "mcpServers": {
    "tc39": {
      "type": "http",
      "url": "https://mcp.xyzzylabs.ai/tc39/mcp"
    }
  }
}

El tráfico está limitado a 30 solicitudes/min por IP.

Para qué es bueno

  • Permitir que un agente razone sobre la especificación sin alucinar. Las respuestas JSON estructuradas fundamentan el modelo en texto real de la especificación: numeración de pasos, objetivos de referencias cruzadas, formas de firmas, diferencias entre ediciones, pruebas de conformidad. Cualquier cosa citada se resuelve a un id de cláusula específico en un SHA específico — fácil de verificar, fácil de reproducir.
  • Encontrar la cláusula que quieres a partir de una pista. spec.search clasifica las coincidencias exactas de AOID primero; spec.symbol_resolve decodifica [[Prototype]] / %Object.prototype% / ~enumerate~.
  • Seguir referencias en ambas direcciones. spec.crossrefs devuelve lo que una cláusula cita Y quién la cita. Densificado con AOID para que las menciones simples en el texto de pasos cuenten, no solo los hrefs de <emu-xref>. include_cross_spec resuelve saltos 262 ↔ 402. (Receta 1 del recetario.)
  • Comparar ediciones y rastrear la deriva del texto. spec.diff entre dos ediciones cualesquiera hasta ES2016; spec.history recorre el registro de git upstream mediante búsqueda pickaxe. (Receta 2 del recetario.)
  • Encontrar cobertura test262 para una cláusula. test262.search con esid: de coincidencia de prefijo captura sec-tonumber Y sec-tonumber-applied-to-the-string-type en una sola llamada.
  • Mapear propuestas a la especificación. proposal.list / proposal.get desde un índice estructurado de tc39/proposals, que cubre tanto propuestas de ECMA-262 como de ECMA-402 (Intl) — filtra por spec. Se actualiza con la misma cadencia de 4 horas que las especificaciones.
  • Caché local, respaldo incluido (stdio). Una vez que una instantánea está en caché bajo ~/.cache/tc39-mcp/, las llamadas a herramientas se sirven desde disco y solo se revalidan contra el Worker alojado después de la ventana de frescura de ~4 horas (una solicitud If-None-Match condicional que lleva la clave de objeto R2, nunca un id de cláusula). Las ediciones incluidas responden sin conexión cuando el Worker no es alcanzable. El Worker alojado es la alternativa HTTP para uso compartido / multiinquilino.

Herramientas (19 en 5 espacios de nombres)

ObjetivoHerramienta(s)
Verificar lo que se está sirviendospec.about · spec.snapshots
Leer una cláusula específicaclause.get
Encontrar una cláusula por nombre / síntomaspec.search · spec.global_search
Resolver notación [[X]] / %X% / ~X~spec.symbol_resolve
Navegar / esquematizarclause.list · clause.outline
Comparar ediciones / historial de commitsspec.diff · spec.history
Recorrer referencias (entrantes y salientes)spec.crossrefs
Leer tablas estructuradasspec.tables
Inspeccionar la gramáticaspec.grammar · spec.sdo_index
Enumerar intrínsecos bien conocidosspec.well_known_intrinsics
Encontrar pruebas de conformidadtest262.search · test262.get
Consultar una propuestaproposal.list · proposal.get

Referencia completa (esquemas de entrada, tipos de salida, llamadas de ejemplo por herramienta): docs/tools.md — generada automáticamente desde los esquemas para que nunca se desactualice.

Especificaciones + ediciones

Cada herramienta de lectura de especificaciones acepta spec ("262" o "402", por defecto "262") y edition (por defecto "latest").

  • ECMA-262: es2016 – es2026, main. (ES5 / ES5.1 / ES6 no tienen etiquetas upstream y no son compatibles.)
  • ECMA-402: es2016 – es2026, main. (402 publica cada edición anual como una rama esYYYY en lugar de una etiqueta; el paso de obtención resuelve una rama o una etiqueta de la misma manera.)
  • Alias: latest es consciente de la especificación (cada especificación → su versión estable actual, es2026 hoy). draft / next → main en ambas.

Tabla completa + cómo agregar nuevas versiones: docs/editions.md.

Autoalojamiento de instantáneas

El servidor stdio obtiene instantáneas del Worker alojado público en https://mcp.xyzzylabs.ai/tc39/r2/<key> (caché → Worker → respaldo incluido), por lo que en una red de egreso estricto cae al respaldo de las ediciones incluidas y no puede alcanzar las demás. Anula la URL base mediante TC39_MCP_BASE_URL para apuntar a un espejo privado — útil para redes de egreso estricto, entornos aislados, o para ejecutar contra un Worker autoalojado:

TC39_MCP_BASE_URL=https://my-mirror.example.com npx tc39-mcp

El endpoint solo necesita servir la misma estructura de claves (spec-<spec>-<edition>.json, test262-index.json, proposals-index.json) — un servidor de archivos estático simple funciona. Si devuelve ETags, el servidor revalida con If-None-Match (304s baratos); sin ellos solo vuelve a obtener el objeto completo cuando una copia en caché se vuelve obsoleta. Para poblar un espejo, ejecuta npm run parse contra un checkout local (ver abajo) y sube build/*.json a tu bucket de elección.

La caché vive en $XDG_CACHE_HOME/tc39-mcp (o ~/.cache/tc39-mcp cuando XDG_CACHE_HOME no está configurado).

Compilar desde el código fuente (colaboradores)

Los usuarios finales no necesitan esto — el paquete npm y el Worker alojado son las superficies compatibles anteriores. Esto es para trabajar en el servidor mismo.

git clone https://github.com/xyzzylabs/tc39-mcp
cd tc39-mcp
npm install
npm run fetch-spec               # ~2 min, ~150 MB — both specs at every supported edition
npm run parse                    # spec.html → build/spec-<spec>-<edition>.json
npm run fetch-test262            # optional, enables test262.* (~300 MB)
npm run build-test262-index
npm run fetch-proposals          # optional, enables proposal.* (~50 MB)
npm run build-proposals-index
npm run mcp                      # start the stdio MCP server against your source

Apunta tu cliente MCP a tu código fuente local en lugar del binario publicado:

{
  "mcpServers": {
    "tc39": {
      "type": "stdio",
      "command": "npm",
      "args": ["run", "--silent", "mcp"],
      "cwd": "/abs/path/to/tc39-mcp"
    }
  }
}

--silent mantiene el banner de ciclo de vida de npm fuera de stdout, para que el cliente MCP reciba un flujo JSON-RPC limpio.

Documentación

Alojada en mcp.xyzzylabs.ai/tc39 — buscable, compatible con modo oscuro, reconstruida automáticamente en cada actualización para que /snapshots siempre refleje los SHAs en vivo.

En el repositorio (también navegable en GitHub):

  • docs/getting-started.md — instalación → conexión → primera llamada → verificación. Cinco minutos.
  • docs/tools.md — cada herramienta, cada campo, cada ejemplo. Generado automáticamente desde el código fuente.
  • docs/cookbook.md — recetas multiherramienta: consultas entre especificaciones, seguimiento de deriva de texto, referencias cruzadas de gramática/SDO, cobertura test262, mapeo de propuesta a cláusula.
  • docs/editions.md — ediciones compatibles + resolución de alias.
  • docs/architecture.md — canalización de datos, analizador, caché, modelo de memoria.
  • docs/deployment.md — stdio local, CLI npm, Worker de Cloudflare alojado, modelo de actualización, observabilidad.
  • CONTRIBUTING.md — qué tipos de cambios se implementan fácilmente, cuáles no.
  • SECURITY.md — modelo de amenazas + divulgación responsable.
  • CHANGELOG.md — historial de versiones + convención de actualización automática.

Política de privacidad

tc39-mcp es un servicio de consulta de especificaciones de solo lectura. El transporte stdio (npx tc39-mcp) no envía telemetría y nunca transmite tus consultas — las instantáneas se obtienen del Worker alojado en una caché fría u obsoleta y se sirven desde el disco local en caso contrario; esas obtenciones llevan claves de objeto R2, nunca ids de cláusula o argumentos de herramientas. El Worker de Cloudflare alojado recopila solo metadatos de solicitud estándar (IP para limitación de velocidad, marcas de tiempo, encabezados de solicitud); no registra cuerpos de solicitud, no establece cookies ni comparte datos con terceros.

Política completa: mcp.xyzzylabs.ai/tc39/privacy

Para preguntas sobre privacidad, abre un issue con la etiqueta privacy en GitHub.

Licencia

MIT