tc39-mcp is a remote MCP server that gives an AI agent 17 tools, among them clause.get, clause.list, clause.outline. It answers at https://mcp.xyzzylabs.ai/tc39/mcp over streamable HTTP, and it listed its tools to an anonymous client, so no sign-in was needed for that. Our probes reached it 6 of 6 times since 11 September 2026; the last check, on 24 October 2026, succeeded.
Independent MCP server for the TC39 specs (ECMA-262 + ECMA-402): clauses, search, diffs, history.
Description as the publisher wrote it.
| Tool | What it does |
|---|---|
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. Inputs: id, spec, edition, at |
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. Inputs: spec, edition, at, kind, section, has_algorithm |
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. Inputs: spec, edition, depth, under |
proposal.get | Fetch one TC39 proposal by slug (exact) or name (case-insensitive). Inputs: name |
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). Inputs: spec, stage, champion, contains, limit |
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. |
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`: Inputs: id, spec, edition, direction, include_cross_spec, limit |
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 lates Inputs: id, spec, from, to |
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 te Inputs: query, search_steps, limit |
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 + the Inputs: nonterminal, contains, include_sdo, spec, edition, limit |
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 substr Inputs: spec, edition, by, filter, limit |
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. Inputs: query, spec, edition, at, limit, search_steps |
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.se Inputs: spec, edition |
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. Inputs: notation, spec, edition, limit |
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. Inputs: id, filter, spec, edition, limit |
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. Inputs: spec, edition, filter, limit |
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, Inputs: query, esid, limit |
Every block below points at https://mcp.xyzzylabs.ai/tc39/mcp. Pick your client and copy.
claude mcp add --transport http tc39-mcp https://mcp.xyzzylabs.ai/tc39/mcp
{
"mcpServers": {
"tc39-mcp": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.xyzzylabs.ai/tc39/mcp"]
}
}
}{
"mcpServers": {
"tc39-mcp": {
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}{
"servers": {
"tc39-mcp": {
"type": "http",
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}{
"context_servers": {
"tc39-mcp": {
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}{
"mcpServers": {
"tc39-mcp": {
"serverUrl": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}{
"mcpServers": {
"tc39-mcp": {
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}name: tc39-mcp
version: 0.0.1
schema: v1
mcpServers:
- name: tc39-mcp
type: streamable-http
url: https://mcp.xyzzylabs.ai/tc39/mcp{
"mcpServers": {
"tc39-mcp": {
"httpUrl": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}{
"mcpServers": {
"tc39-mcp": {
"type": "http",
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}{
"mcpServers": {
"tc39-mcp": {
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}goose://extension?url=https%3A%2F%2Fmcp.xyzzylabs.ai%2Ftc39%2Fmcp&type=streamable_http&id=tc39-mcp&name=tc39-mcp
It answered our last check on 24 October 2026 in 138 ms. Over 6 checks since 11 September 2026 it answered 6. Status here comes from Neuronto's own probes, not from the publisher.
17, as returned by the server's own tools/list on 22 September 2026: clause.get, clause.list, clause.outline, proposal.get, proposal.list, spec.about, spec.crossrefs, spec.diff, and 9 more.
It answered our last check on 24 October 2026 in 138 ms. Over 6 checks since 11 September 2026 it answered 6.
Put the server under mcpServers in ~/.cursor/mcp.json with the URL https://mcp.xyzzylabs.ai/tc39/mcp. The exact JSON is above, with the same setup for Claude Code, Claude Desktop, VS Code, Windsurf, Zed, Gemini CLI and the rest.
It listed its tools to an anonymous client, so reading the tool list needs no key. Individual tools can still ask for credentials in their own inputs.
Publisher: io.github.xyzzylabs. Endpoint host: mcp.xyzzylabs.ai. ARD identifier: urn:air:io.github.xyzzylabs:mcp:tc39-mcp.
First indexed 10 September 2026. The tools are exactly what the server returned; nothing on this page
is inferred from its name. Ranking in Neuronto search is never for sale.