tc39-mcp
Independent MCP server for the TC39 specs (ECMA-262 + ECMA-402): clauses, search, diffs, history.
Should I use this
Quality & Safety
Findings (18)
- LOWin spec.symbol_resolve
- LOWin spec.about
- LOWin clause.get
- LOWin clause.list
- LOWin spec.search
- LOWin proposal.list
- LOWin proposal.get
- LOWin spec.grammar
- LOWin spec.tables
- LOWin spec.sdo_index
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"tc39-mcp": {
"command": "npx",
"args": [
"tc39-mcp"
]
}
}
}Runnable packages
0.6.3stdioRemote endpoints
https://tc39-mcp.chicoxyzzy.workers.dev/mcpstreamable-httphttps://mcp.xyzzylabs.ai/tc39/mcpstreamable-httpWhat it can do
Tool inventory
Tools (17)
โช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.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}๐ขclause.get(id, spec, edition, at)
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.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"at": {
"type": "string",
"description": "Optional historical SHA pin (hex, 4-40 chars). Only valid when edition='main'; released editions have no per-SHA history to address."
}
},
"required": [
"id"
]
}๐ขclause.list(spec, edition, at, kind, section, ...)
List parsed spec clauses with optional filters (kind, section prefix, has_algorithm). `spec` selects '262' or '402'. `at: '<sha>'` queries a historical main snapshot.
Input Schema
{
"type": "object",
"properties": {
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"at": {
"type": "string"
},
"kind": {
"type": "string"
},
"section": {
"type": "string"
},
"has_algorithm": {
"type": "boolean"
},
"limit": {
"type": "number"
}
}
}๐ขspec.search(query, spec, edition, at, limit, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"at": {
"type": "string"
},
"limit": {
"type": "number"
},
"search_steps": {
"type": "boolean"
}
},
"required": [
"query"
]
}๐ขproposal.list(spec, stage, champion, contains, limit)
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).
Input Schema
{
"type": "object",
"properties": {
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"stage": {
"type": "string"
},
"champion": {
"type": "string"
},
"contains": {
"type": "string"
},
"limit": {
"type": "number"
}
}
}๐ขproposal.get(name)
Fetch one TC39 proposal by slug (exact) or name (case-insensitive).
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": [
"name"
]
}๐ขspec.grammar(nonterminal, contains, include_sdo, spec, edition, ...)
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).
Input Schema
{
"type": "object",
"properties": {
"nonterminal": {
"type": "string"
},
"contains": {
"type": "string"
},
"include_sdo": {
"type": "boolean"
},
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"limit": {
"type": "number"
}
}
}๐ขspec.tables(id, filter, spec, edition, limit)
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.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"filter": {
"type": "string"
},
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"limit": {
"type": "number"
}
}
}โชspec.sdo_index(spec, edition, by, filter, limit)
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).
Input Schema
{
"type": "object",
"properties": {
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"by": {
"type": "string",
"enum": [
"production",
"sdo"
]
},
"filter": {
"type": "string"
},
"limit": {
"type": "number"
}
}
}โชclause.outline(spec, edition, depth, under)
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.
Input Schema
{
"type": "object",
"properties": {
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"depth": {
"type": "number"
},
"under": {
"type": "string"
}
}
}๐ขspec.global_search(query, search_steps, limit)
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.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"search_steps": {
"type": "boolean"
},
"limit": {
"type": "number"
}
},
"required": [
"query"
]
}๐ขspec.snapshots(spec, edition)
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.
Input Schema
{
"type": "object",
"properties": {
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
}
}
}โชspec.symbol_resolve(notation, spec, edition, limit)
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.
Input Schema
{
"type": "object",
"properties": {
"notation": {
"type": "string"
},
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"limit": {
"type": "number"
}
},
"required": [
"notation"
]
}โชspec.well_known_intrinsics(spec, edition, filter, limit)
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.
Input Schema
{
"type": "object",
"properties": {
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"filter": {
"type": "string"
},
"limit": {
"type": "number"
}
}
}โชspec.diff(id, spec, from, to)
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.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"from": {
"type": "string"
},
"to": {
"type": "string"
}
},
"required": [
"id"
]
}๐กspec.crossrefs(id, spec, edition, direction, include_cross_spec, ...)
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).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"spec": {
"type": "string",
"enum": [
"262",
"402"
]
},
"edition": {
"type": "string"
},
"direction": {
"type": "string",
"enum": [
"in",
"out",
"both"
]
},
"include_cross_spec": {
"type": "boolean"
},
"limit": {
"type": "number"
}
},
"required": [
"id"
]
}๐ขtest262.search(query, esid, limit)
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`.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"esid": {
"type": "string"
},
"limit": {
"type": "number"
}
}
}Community
Evidence