# tc39-mcp MCP server

MCP server for the TC39 specs (ECMA-262 + ECMA-402): SHA-pinned clauses, search, diffs, history.

## Links
- Registry page: https://www.getdrio.com/mcp/io-github-xyzzylabs-tc39-mcp
- Repository: https://github.com/xyzzylabs/tc39-mcp
- Website: https://tc39-mcp.chicoxyzzy.workers.dev

## Install
- Command: `npx -y tc39-mcp`
- Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- Auth: Not captured

## Setup notes
- Package: Npm tc39-mcp v0.4.0
- Remote endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp

## Tools
- spec.about - Self-description of this MCP server: package name + version, per-snapshot pin metadata (sha, fetched_at, biblio_commit, clause_count) for every supported (spec, edition), plus test262 + proposals index headers when present. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- clause.get - Fetch a parsed TC39 clause as structured JSON. `spec` selects '262' (default) or '402'. `edition` defaults to 'latest'. `at: '<sha>'` pins to a historical main snapshot (only valid for edition='main'); omit to query the live snapshot. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- clause.list - List parsed spec clauses with optional filters (kind, section prefix, has_algorithm). `spec` selects '262' or '402'. `at: '<sha>'` queries a historical main snapshot. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.search - Search the parsed spec by clause id / aoid / title (+ step text with `search_steps`). Aoid-exact ranks first. `at: '<sha>'` searches a historical main snapshot. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- proposal.list - List TC39 proposals from the static index (tc39/proposals). Filter by spec ('262'|'402'), stage ('0'|'1'|'2'|'2.7'|'3'|'finished'|'inactive'|'active'), champion (substring), or contains (name/slug substring). Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- proposal.get - Fetch one TC39 proposal by slug (exact) or name (case-insensitive). Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.grammar - Query grammar productions captured from the spec's `<emu-grammar>` blocks. `{ nonterminal }` returns every production for that non-terminal (exact match); `{ contains }` filters by RHS / name substring; neither lists all non-terminals + their production counts. `include_sdo` folds in SDO-attached productions (off by default). Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.tables - List or fetch parsed `<emu-table>` content. `{ id }` returns exactly that table (full columns + rows); otherwise list table summaries, optionally narrowed by a `filter` substring over the caption or id. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.sdo_index - Index Syntax-Directed Operations by the grammar production they're defined on. `by: 'production'` (default) groups SDOs under each production; `by: 'sdo'` groups productions under each SDO title. `filter` narrows to keys containing a substring (case-insensitive). Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- clause.outline - Return the section tree (table of contents) for a parsed (spec, edition). `depth` caps how deep the tree descends (1 = top-level only); `under` limits the tree to descendants of one clause id. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.global_search - Run spec.search across both ECMA-262 and ECMA-402 in one call and interleave hits by score. Each hit is tagged with the spec it came from. Use it when you don't know which spec defines a symbol. `search_steps` also matches algorithm step text. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.snapshots - List the live (spec, edition, sha, fetched_at) snapshots the hosted Worker is serving from R2. Filter by `spec` ('262'|'402') or `edition` (e.g. 'main', 'es2026'). Historical SHA-pinned copies are reachable via `at:` on clause.get / spec.search but aren't enumerated here. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.symbol_resolve - Resolve spec notation like `[[Prototype]]` (internal slot), `%Object.prototype%` (well-known intrinsic), or `~number~` (sigil enum): return clauses that mention or define it, ranked by occurrence with a bump for definition-y sections. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.well_known_intrinsics - Enumerate the well-known intrinsics in a spec with their probable defining clauses. Driven from the canonical §6.1.7.4 WKI table when present (ECMA-262), else a `%X%` prose scan (e.g. ECMA-402). `filter` narrows by bare-name substring. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.diff - Clause-level diff of one clause across two editions of a spec. Reports identical / modified / added / removed plus a field-level breakdown (title, signature, step count, reworded step indices, notes, crossrefs). `from` defaults to the latest stable release, `to` to main. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- spec.crossrefs - For a clause id, return its outgoing references (clauses it cites) and/or incoming references (clauses that cite it — the back-reference index the parse alone doesn't expose). The reverse index is AOID-densified from step text. `direction`: 'in' | 'out' | 'both' (default). Outgoing also carries an `external` category: the clause's citations to external specs (Unicode, IETF, WHATWG) as resolvable URLs. Set `include_cross_spec: true` to also resolve outgoing references from ECMA-262 → ECMA-402 (or vice versa). Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp
- test262.search - Search the tc39/test262 conformance suite from its indexed front-matter. `query` AND-matches whitespace tokens (case-insensitive) across each test's description + path; `esid` prefix-matches the front-matter esid. Returns ranked hits (path, GitHub url at the indexed SHA, esid, description, features, flags), capped at `limit` (default 20). Supply at least one of `query` / `esid`. Endpoint: https://tc39-mcp.chicoxyzzy.workers.dev/mcp

## Resources
Not captured

## Prompts
- explain-clause - Explain a clause Walk through a TC39 clause: call spec.about for pins, clause.get for the full clause, then explain the algorithm steps in plain language with citations. Arguments: id, spec, edition
- compare-editions - Compare editions Diff one clause across two editions via spec.diff, then optionally clause.get on each side for full step text. Summarize what changed and why it might matter. Arguments: id, spec, from, to
- find-and-read - Find and read Search for a clause by name/symptom (spec.search or spec.global_search), pick the best hit, then clause.get and summarize. Arguments: query, spec, edition, search_steps
- trace-crossrefs - Trace cross-references Map who a clause cites and who cites it via spec.crossrefs, then spot-check key neighbors with clause.get. Arguments: id, spec, edition, direction, include_cross_spec
- proposal-status - Proposal status Look up TC39 proposal stage/champions via proposal.list and/or proposal.get, then summarize maturity and where to read more. Arguments: query, stage
- test262-for-feature - test262 for a feature Find test262 coverage via test262.search (and test262.get on stdio for full source). Summarize how the feature is tested. Arguments: query, esid
- cite-reproducibly - Cite reproducibly Produce a citation block with SHA pins: call spec.about, then clause.get, and format a reproducible reference (spec, edition, sha, clause id/number/title). Arguments: id, spec, edition

## Metadata
- Owner: io.github.xyzzylabs
- Version: 0.4.0
- Runtime: Npm
- Transports: STDIO, HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jun 6, 2026
- Source: https://registry.modelcontextprotocol.io
