tc39-mcp
Structured MCP server providing read-only access to ECMAScript (ECMA-262) and Intl (ECMA-402) specifications. It enables AI agents to perform clause lookups, search by AOID, analyze cross-spec references, view edition diffs, and access test262 data using deterministic, SHA-pinned JSON responses.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://mcp.xyzzylabs.ai/tc39/mcpWhat its tools do
17 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Lookup specific ECMAScript clauses by ID
- Search specifications by AOID or text
- Analyze differences between language editions
- Resolve cross-references between ECMA-262 and ECMA-402
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- tc39-mcp 0.6.5
- MCP protocol negotiated in check
- 2024-11-05
- Tools
- 17 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- 7 advertised
{
"tools": {},
"prompts": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
17 advertised
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.
{
"type": "object",
"properties": {},
"additionalProperties": false
}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.
{
"type": "object",
"required": [
"id"
],
"properties": {
"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."
},
"id": {
"type": "string"
},
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"edition": {
"type": "string"
}
}
}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.
{
"type": "object",
"properties": {
"at": {
"type": "string"
},
"kind": {
"type": "string"
},
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"edition": {
"type": "string"
},
"section": {
"type": "string"
},
"has_algorithm": {
"type": "boolean"
}
}
}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.
{
"type": "object",
"required": [
"query"
],
"properties": {
"at": {
"type": "string"
},
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"query": {
"type": "string"
},
"edition": {
"type": "string"
},
"search_steps": {
"type": "boolean"
}
}
}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).
{
"type": "object",
"properties": {
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"stage": {
"type": "string"
},
"champion": {
"type": "string"
},
"contains": {
"type": "string"
}
}
}proposal.get
Fetch one TC39 proposal by slug (exact) or name (case-insensitive).
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
}
}
}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).
{
"type": "object",
"properties": {
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"edition": {
"type": "string"
},
"contains": {
"type": "string"
},
"include_sdo": {
"type": "boolean"
},
"nonterminal": {
"type": "string"
}
}
}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.
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"filter": {
"type": "string"
},
"edition": {
"type": "string"
}
}
}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).
{
"type": "object",
"properties": {
"by": {
"enum": [
"production",
"sdo"
],
"type": "string"
},
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"filter": {
"type": "string"
},
"edition": {
"type": "string"
}
}
}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.
{
"type": "object",
"properties": {
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"depth": {
"type": "number"
},
"under": {
"type": "string"
},
"edition": {
"type": "string"
}
}
}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.
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number"
},
"query": {
"type": "string"
},
"search_steps": {
"type": "boolean"
}
}
}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.
{
"type": "object",
"properties": {
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"edition": {
"type": "string"
}
}
}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.
{
"type": "object",
"required": [
"notation"
],
"properties": {
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"edition": {
"type": "string"
},
"notation": {
"type": "string"
}
}
}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.
{
"type": "object",
"properties": {
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"filter": {
"type": "string"
},
"edition": {
"type": "string"
}
}
}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.
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"to": {
"type": "string"
},
"from": {
"type": "string"
},
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
}
}
}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).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"spec": {
"enum": [
"262",
"402"
],
"type": "string"
},
"limit": {
"type": "number"
},
"edition": {
"type": "string"
},
"direction": {
"enum": [
"in",
"out",
"both"
],
"type": "string"
},
"include_cross_spec": {
"type": "boolean"
}
}
}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`.
{
"type": "object",
"properties": {
"esid": {
"type": "string"
},
"limit": {
"type": "number"
},
"query": {
"type": "string"
}
}
}Prompts
7 advertised
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.
- id
- Clause id, e.g. sec-tonumber or sec-intl.numberformat (required)
- spec
- Spec to read: '262' (default) or '402'
- edition
- Edition alias or concrete edition (latest, main, es2026, …)
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.
- id
- Clause id to compare (required)
- spec
- Spec: '262' (default) or '402'
- from
- Before edition (default: latest)
- to
- After edition (default: main)
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.
- query
- Search string (AOID, title fragment, or symptom) (required)
- spec
- Limit to one spec ('262' or '402'). Omit to search both via spec.global_search.
- edition
- Edition for the search/read (default: latest)
- search_steps
- If 'true', also match algorithm step text (slower, broader)
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.
- id
- Clause id to start from (required)
- spec
- Spec: '262' (default) or '402'
- edition
- Edition (default: latest)
- direction
- in | out | both (default: both)
- include_cross_spec
- If 'true', also resolve 262↔402 outgoing refs
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.
- query
- Proposal slug (preferred) or name/substring, e.g. temporal or 'pipeline operator' (required)
- stage
- Optional stage filter for list: 0|1|2|2.7|3|finished|inactive|active
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.
- query
- Free-text search (feature name, path fragment, …)
- esid
- Clause id / esid prefix (e.g. sec-tonumber)
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).
- id
- Clause id to cite (required)
- spec
- Spec: '262' (default) or '402'
- edition
- Edition (default: latest)
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 396 ms
- 95th percentile latency
- 396 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 396 ms · metadata changed · 17 tool(s), 7 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http tc39-mcp-xyzzylabs https://mcp.xyzzylabs.ai/tc39/mcpCodex
codex mcp add tc39-mcp-xyzzylabs --url https://mcp.xyzzylabs.ai/tc39/mcpCursor
{
"mcpServers": {
"tc39-mcp-xyzzylabs": {
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}Cline
{
"mcpServers": {
"tc39-mcp-xyzzylabs": {
"type": "streamableHttp",
"url": "https://mcp.xyzzylabs.ai/tc39/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"tc39-mcp-xyzzylabs": {
"type": "http",
"url": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http tc39-mcp-xyzzylabs https://mcp.xyzzylabs.ai/tc39/mcpClaude Desktop
https://mcp.xyzzylabs.ai/tc39/mcpWindsurf
{
"mcpServers": {
"tc39-mcp-xyzzylabs": {
"serverUrl": "https://mcp.xyzzylabs.ai/tc39/mcp"
}
}
}Let your agent find its tools
Find servers like tc39-mcp from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.