tc39-mcp
Independent MCP server for the TC39 specs (ECMA-262 + ECMA-402): clauses, search, diffs, history.
我该使用它吗
质量与安全性
发现(18)
- LOW在 spec.symbol_resolve 中
- LOW在 spec.about 中
- LOW在 clause.get 中
- LOW在 clause.list 中
- LOW在 spec.search 中
- LOW在 proposal.list 中
- LOW在 proposal.get 中
- LOW在 spec.grammar 中
- LOW在 spec.tables 中
- LOW在 spec.sdo_index 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"tc39-mcp": {
"command": "npx",
"args": [
"tc39-mcp"
]
}
}
}可运行的软件包
0.6.3stdio远程端点
https://tc39-mcp.chicoxyzzy.workers.dev/mcpstreamable-httphttps://mcp.xyzzylabs.ai/tc39/mcpstreamable-http它能做什么
工具清单
工具(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.
输入模式
{
"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.
输入模式
{
"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.
输入模式
{
"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.
输入模式
{
"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).
输入模式
{
"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).
输入模式
{
"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).
输入模式
{
"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.
输入模式
{
"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).
输入模式
{
"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.
输入模式
{
"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.
输入模式
{
"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.
输入模式
{
"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.
输入模式
{
"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.
输入模式
{
"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.
输入模式
{
"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).
输入模式
{
"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`.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"esid": {
"type": "string"
},
"limit": {
"type": "number"
}
}
}社区
证据