tc39-mcp

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

사용해야 할까요

품질 및 안전성

B
설명 품질
96%
스키마 완전성
72%
이름 품질
51%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

발견 사항 (18)

  • LOWTool 'spec.symbol_resolve' description lacks action verbspec.symbol_resolve에서
  • LOWTool 'spec.about' doesn't follow camelCase/snake_casespec.about에서
  • LOWTool 'clause.get' doesn't follow camelCase/snake_caseclause.get에서
  • LOWTool 'clause.list' doesn't follow camelCase/snake_caseclause.list에서
  • LOWTool 'spec.search' doesn't follow camelCase/snake_casespec.search에서
  • LOWTool 'proposal.list' doesn't follow camelCase/snake_caseproposal.list에서
  • LOWTool 'proposal.get' doesn't follow camelCase/snake_caseproposal.get에서
  • LOWTool 'spec.grammar' doesn't follow camelCase/snake_casespec.grammar에서
  • LOWTool 'spec.tables' doesn't follow camelCase/snake_casespec.tables에서
  • LOWTool 'spec.sdo_index' doesn't follow camelCase/snake_casespec.sdo_index에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~2,038토큰 (도구 정의)
~536 B일반적인 응답 크기
중간 정도의 주의 영향 (128k 컨텍스트의 1.59%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "tc39-mcp": {
      "command": "npx",
      "args": [
        "tc39-mcp"
      ]
    }
  }
}

실행 가능한 패키지

npmtc39-mcp0.6.3stdio

원격 엔드포인트

https://tc39-mcp.chicoxyzzy.workers.dev/mcpstreamable-http
https://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"
    }
  }
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 17개
검증됨버전이 기록되지 않음도구 17개
검증됨버전이 기록되지 않음도구 17개
검증됨버전이 기록되지 않음도구 17개