Skip to content

Releases: xyzzylabs/tc39-mcp

v0.6.3

Choose a tag to compare

@github-actions github-actions released this 08 Sep 12:50

Automated PATCH refresh — upstream tc39/* moved. Same code, new spec data. See spec.about for the current SHAs.

v0.6.2

Choose a tag to compare

@github-actions github-actions released this 07 Aug 00:58

Automated PATCH refresh — upstream tc39/* moved. Same code, new spec data. See spec.about for the current SHAs.

v0.6.1

Choose a tag to compare

@github-actions github-actions released this 07 Jul 18:10

Automated PATCH refresh — upstream tc39/* moved. Same code, new spec data. See spec.about for the current SHAs.

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 29 Jun 16:05

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_refs field on the returned Clause lists 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).
  • external category on spec.crossrefs. The crossref graph now
    carries the same citations as an outgoing external category 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

Choose a tag to compare

@github-actions github-actions released this 28 Jun 12:25
23fe25d

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 via prompts/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.dev URL still serves identical data.
  • Edition aliases normalize. ES2025, 2025, es-2025, Latest,
    MAIN resolve to canonical editions instead of 404-ing on a missing
    snapshot key — the same tolerance the ecma262 / ecma402 spec
    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 at spec.search { search_steps: true }
    for "where is X invoked" queries and at test262.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 from tools/list.

v0.4.1

Choose a tag to compare

@github-actions github-actions released this 25 Jun 18:30
7555893

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 / 402 before building the snapshot key. Previously
    spec: "ecma262" produced a confusing Missing parsed spec object in R2: spec-ecma262-… error; an unrecognized spec now returns a
    clear Unknown spec … message.
  • Clean stdio stream from the documented dev launch config. The
    .mcp.json wiring 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 the server.json registry
    description.

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 06 Jun 04:03
1a1d30d

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-index spec.about already reads.

    The two tools that stay stdio-only are spec.history (shells out to
    git log against a vendored checkout) and test262.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/* (or src/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's tools/list
    registry derive their tool lists and counts from one tool_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 that clause.get / spec.search depend on.
  • The docs now mark transport availability. The tool reference
    carries a per-tool Availability line (hosted Worker vs
    stdio-only), generated from the same tool_inventory source of
    truth, and getting-started splits into self-contained Local (stdio)
    and Hosted (HTTP) walkthroughs.

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 05 Jun 09:12
79650d0

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.search on the hosted Worker now honors search_steps. It
    previously ranked only aoid / title / id matches; step-text matches
    (the steps tier) were silently dropped. The stdio server already
    did this — now both transports rank a query identically.
  • proposal.list on the hosted Worker now accepts the spec filter
    (262 / 402). It was stdio-only, so the Worker couldn't narrow
    proposals to one spec.

Changed

  • The spec/edition catalog, the spec.search ranking, and the
    proposal.list filter 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.md is identical) — this is internal consolidation plus
    the two Worker fixes above.

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 03 Jun 21:03
32c92a5

The es2026 edition lands on both specs.

Added

  • ECMA-262 and ECMA-402 add the es2026 edition. Both specs now
    cover es2016es2026 plus main. tc39/ecma262 tags es2026;
    tc39/ecma402 publishes it as an esYYYY branch. clause.get,
    spec.search, spec.diff, spec.history, and the rest of the
    edition-aware surface resolve es2026 on both specs.

Changed

  • latest now resolves to es2026 on both ECMA-262 and ECMA-402
    (previously es2025). main / draft / next continue to address
    the working draft.
  • The npm bundle tracks the new stable. The offline fallback now
    ships spec-262-es2026 + spec-402-es2026 (replacing the es2025
    pair); every other edition is fetched from the hosted Worker on
    demand.

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 03 Jun 14:07
dccd24f

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 an esYYYY branch (not a tag); the catalog
    now exposes the full es2016es2025 range plus main, where it
    previously had only es2025-candidate + main. spec.diff,
    spec.history, and edition-pinned clause.get now work across the
    402 annual line.
  • ECMA-402 proposals are indexed. proposal.list / proposal.get
    now cover the ecma402/ proposal set (~32 proposals that were
    entirely missing), and proposal.list gains a spec filter
    ({ spec: "402" }). Every proposal row carries a spec tag.

Removed

  • Dropped the transient es2025-candidate 402 pin. It predated the
    final es2025 branch, which now supersedes it. clause.get,
    spec.diff, and the other edition-aware tools no longer accept
    edition: "es2025-candidate" — use es2025.

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 (conditional If-None-Match).
  • latest on ECMA-402 now resolves to es2025 (the newest annual
    edition), matching 262's "latest = newest stable" semantics. Use
    main / draft / next for 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.
  • cheerio and @tc39/ecma262-biblio move to devDependencies.
    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 drops dist/docs and
    dist/refresh (build/CI-only code that runs from src/ via tsx,
    never at runtime).
  • Refresh decouples from the npm version. refresh.yml updates 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-biblio is 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 of main, it can lag the HTML being
    parsed (a newer main, 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 304 from the hosted Worker. The
    stdio loader sends If-None-Match when 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 bodyless 304 on 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 with TC39_MCP_BASE_URL to
    self-host or air-gap). Tool arguments and clause ids never leave the
    process — see docs/privacy.md.
  • v0.1.x installs are unaffected; this is a backward-compatible minor
    at the tool/protocol level.