Releases: xyzzylabs/tc39-mcp
Release list
v0.6.3
v0.6.2
Automated PATCH refresh — upstream tc39/* moved. Same code, new spec data. See spec.about for the current SHAs.
v0.6.1
Automated PATCH refresh — upstream tc39/* moved. Same code, new spec data. See spec.about for the current SHAs.
v0.6.0
Surfaces a clause's citations to external specs (Unicode, IETF, WHATWG)
as structured, resolvable URLs.
Added
- External-spec citations on
clause.get. A new optional
external_refsfield on the returnedClauselists a clause's outward
links to normative external specs — Unicode TRs, IETF RFCs, WHATWG — as
{ url, text }, filtered to a normative-host allowlist. Present only
when the clause cites something external (e.g.
sec-string.prototype.normalize→ the Unicode Normalization Forms
reference). externalcategory onspec.crossrefs. The crossref graph now
carries the same citations as an outgoingexternalcategory alongside
the internal in/out hits, so tracing a clause's references surfaces both
internal targets and outward spec links in one call. Present on
direction: "out"/"both".
Changed
- Install + run docs are now agent-agnostic. The setup instructions
present the two transports — stdio (npx) and hosted HTTP
(mcp.xyzzylabs.ai/tc39) — for any MCP client, instead of leading with
one specific client's config.
v0.5.0
Adds the MCP prompts capability and moves the hosted deployment to its
own domain.
Added
- MCP prompts (workflow templates). Seven reusable prompts —
explain-clause,compare-editions,find-and-read,
trace-crossrefs,proposal-status,test262-for-feature,
cite-reproducibly— that steer an agent through the right tool
sequence. Pure string templates (no execution); advertised on both the
stdio server and the hosted Worker viaprompts/list+prompts/get.
Changed
- Hosted deployment moved to
mcp.xyzzylabs.ai/tc39. The docs site,
the registry MCP endpoint, and the npm package's R2-fetch origin point
there now. The old*.workers.devURL still serves identical data. - Edition aliases normalize.
ES2025,2025,es-2025,Latest,
MAINresolve to canonical editions instead of 404-ing on a missing
snapshot key — the same tolerance theecma262/ecma402spec
aliases got in 0.4.1. A well-formed but out-of-range edition (es2015)
still reports "unsupported". - Discoverability: step-text + test262 linkage. The server
instructions now point agents atspec.search { search_steps: true }
for "where is X invoked" queries and attest262.search { esid }for a
clause's conformance tests (a clause id is its esid), and drop the
hard-coded tool list — the live set comes fromtools/list.
v0.4.1
A bug-fix and polish release.
Fixed
- Spec aliases now resolve instead of 404-ing. Tools accept the
long spec names agents commonly pass —ecma262/ecma402(plus
ECMA-262,es,intl) — and normalize them to the canonical
262/402before building the snapshot key. Previously
spec: "ecma262"produced a confusingMissing parsed spec object in R2: spec-ecma262-…error; an unrecognized spec now returns a
clearUnknown spec …message. - Clean stdio stream from the documented dev launch config. The
.mcp.jsonwiring that runs the server from local source now passes
npm run --silent mcp, so npm's lifecycle banner can't leak onto
stdout and corrupt the JSON-RPC stream a stdio MCP client reads.
Changed
- Reworded the project disclaimer from "unofficial / community
project" to "independent project — not an official Ecma International
or TC39 publication," across the README, docs landing page,
agent-facing instructions, and theserver.jsonregistry
description.
v0.4.0
The hosted Cloudflare Worker grows from 6 to 17 of the 19 tools. Every
newly-hosted tool shares its logic with the stdio server through a
dependency-free src/spec/* (or src/index/*) module, so the two
transports answer identically and can't drift.
Added
-
Eleven more tools on the hosted Worker, each reading the
parsed-spec JSON or index it already loads from R2:spec.grammar,spec.tables,spec.sdo_index— grammar
productions from<emu-grammar>,<emu-table>content, and the
Syntax-Directed-Operation-by-production index.clause.outline,spec.global_search— the section tree, and one
search across both ECMA-262 and ECMA-402.spec.snapshots— the live(spec, edition, sha, fetched_at)
snapshots the Worker serves from R2.spec.symbol_resolve,spec.well_known_intrinsics— resolve
notation ([[Slot]],%Intrinsic%,~enum~) and enumerate
well-known intrinsics with their defining clauses.spec.diff— clause-level diff across two editions of a spec.spec.crossrefs— incoming / outgoing references, with the
AOID-densified reverse index and the opt-in 262 ↔ 402 cross-spec
pass.test262.search— ranked search over the tc39/test262 index,
served from the same R2 side-indexspec.aboutalready reads.
The two tools that stay stdio-only are
spec.history(shells out to
git logagainst a vendored checkout) andtest262.get(reads each
test's full source from the vendored test262 corpus, which isn't in
R2).
Changed
- Every ported tool's logic now lives in a shared, dependency-free
src/spec/*(orsrc/index/*) module imported by both the stdio
server and the bundled Worker, replacing what would otherwise be a
hand-maintained second copy. The stdio tool surface — every schema and
result shape — is unchanged; this extends the 0.3.1 consolidation
across every newly-hosted tool. - The hosted-vs-stdio tool split is a single source of truth. Both
transports' server instructions and the Worker'stools/list
registry derive their tool lists and counts from onetool_inventory
module, so a tool crossing over updates every surface at once. spec.about's metadata scan no longer evicts the Worker's hot
parsed-spec cache. The introspection scan that reads every snapshot
for its pin now uses a parse-and-discard path instead of thrashing
the capacity-4 LRU thatclause.get/spec.searchdepend on.- The docs now mark transport availability. The tool reference
carries a per-tool Availability line (hosted Worker vs
stdio-only), generated from the sametool_inventorysource of
truth, and getting-started splits into self-contained Local (stdio)
and Hosted (HTTP) walkthroughs.
v0.3.1
The hosted Cloudflare Worker reaches feature parity with the stdio
server, and the stdio ↔ Worker code is unified so the two can't drift
apart again.
Fixed
spec.searchon the hosted Worker now honorssearch_steps. It
previously ranked only aoid / title / id matches; step-text matches
(thestepstier) were silently dropped. The stdio server already
did this — now both transports rank a query identically.proposal.liston the hosted Worker now accepts thespecfilter
(262/402). It was stdio-only, so the Worker couldn't narrow
proposals to one spec.
Changed
- The spec/edition catalog, the
spec.searchranking, and the
proposal.listfilter are now single shared modules used by both
the stdio server and the Worker, replacing hand-maintained copies
that had drifted. The stdio tool surface is unchanged
(docs/tools.mdis identical) — this is internal consolidation plus
the two Worker fixes above.
v0.3.0
The es2026 edition lands on both specs.
Added
- ECMA-262 and ECMA-402 add the
es2026edition. Both specs now
coveres2016–es2026plusmain. tc39/ecma262 tagses2026;
tc39/ecma402 publishes it as anesYYYYbranch.clause.get,
spec.search,spec.diff,spec.history, and the rest of the
edition-aware surface resolvees2026on both specs.
Changed
latestnow resolves toes2026on both ECMA-262 and ECMA-402
(previouslyes2025).main/draft/nextcontinue to address
the working draft.- The npm bundle tracks the new stable. The offline fallback now
shipsspec-262-es2026+spec-402-es2026(replacing thees2025
pair); every other edition is fetched from the hosted Worker on
demand.
v0.2.0
The data model moves
from "ship every snapshot in the tarball" to
"cache on first use, fetch from the hosted Worker, fall back to a
bundled subset." The npm version stops tracking spec data and starts
meaning code again.
Added
- ECMA-402 reaches edition parity with ECMA-262. 402 publishes
each annual edition as anesYYYYbranch (not a tag); the catalog
now exposes the fulles2016–es2025range plusmain, where it
previously had onlyes2025-candidate+main.spec.diff,
spec.history, and edition-pinnedclause.getnow work across the
402 annual line. - ECMA-402 proposals are indexed.
proposal.list/proposal.get
now cover theecma402/proposal set (~32 proposals that were
entirely missing), andproposal.listgains aspecfilter
({ spec: "402" }). Every proposal row carries aspectag.
Removed
- Dropped the transient
es2025-candidate402 pin. It predated the
finales2025branch, which now supersedes it.clause.get,
spec.diff, and the other edition-aware tools no longer accept
edition: "es2025-candidate"— usees2025.
Changed
- Snapshots are sourced through a cache → hosted Worker → bundled
fallback chain (loadSnapshot). The stdio server caches each
snapshot under~/.cache/tc39-mcp/on first network fetch and serves
it from disk thereafter, revalidating against the Worker only after a
~4-hour freshness window (conditionalIf-None-Match). lateston ECMA-402 now resolves toes2025(the newest annual
edition), matching 262's "latest = newest stable" semantics. Use
main/draft/nextfor the working draft.- The npm tarball shrinks ~70%. It now bundles only the offline
fallback —spec-262-es2025,spec-262-main,spec-402-es2025,
spec-402-main, and the proposals + test262 indexes — instead of
every parsed edition. All other editions are fetched from the Worker
on demand. cheerioand@tc39/ecma262-bibliomove todevDependencies.
They're only used by the parser at build time (npm run parse); the
running server reads pre-parsed JSON and never imports them. A
consumer install no longer pulls cheerio's ~20-package HTML-parsing
tree (~2.4 MB). The published tarball also dropsdist/docsand
dist/refresh(build/CI-only code that runs fromsrc/via tsx,
never at runtime).- Refresh decouples from the npm version.
refresh.ymlupdates R2
every ~4 hours (live freshness for networked users) and re-bakes the
npm bundle at most monthly, ending the ~2000-PATCH-bumps-per-year
flood. A new annual edition still publishes immediately via the
normal code-release path. @tc39/ecma262-bibliois pinned to an exact version (per its
README's "pin a precise version" guidance), so the parse metadata
layer is reproducible alongside the SHA-pinned spec HTML.- The 262 parser gained an HTML-discovery fallback: since the
pinned biblio is a snapshot ofmain, it can lag the HTML being
parsed (a newermain, or an older edition carrying clauses since
dropped). Any<emu-clause>the biblio doesn't list is now still
captured, with metadata synthesized from the element — so a stale or
mismatched biblio can no longer silently drop a clause.
Fixed
- Conditional revalidation returns
304from the hosted Worker. The
stdio loader sendsIf-None-Matchwhen re-checking a live snapshot
past its ~4-hour freshness window; the/r2/proxy previously ignored
it and re-sent the full body. It now returns a bodyless304on an
etag match, so a revalidation costs a header round-trip instead of a
tens-of-MB re-download.
Notes
- stdio now makes HTTPS requests to source non-cached snapshots
(by default the hosted Worker; override withTC39_MCP_BASE_URLto
self-host or air-gap). Tool arguments and clause ids never leave the
process — seedocs/privacy.md. - v0.1.x installs are unaffected; this is a backward-compatible minor
at the tool/protocol level.