Skip to content

MCP integration silently skipped on all JSON-config agents: 'json5' grammar no longer exists in tree-sitter-language-pack 1.6.2 #239

Description

@Mudit-Lal

On semble 0.5.2, semble install reports the MCP server integration as skipped for every agent whose config is JSON:

Claude Code
  – IntegrationType.MCP (skipped) — JSON5 grammar unavailable — add manually (see README) → C:\Users\...\.claude.json
  ✓ IntegrationType.INSTRUCTIONS (updated) → C:\Users\...\.claude\CLAUDE.md
  ✓ IntegrationType.SUBAGENT (created) → C:\Users\...\.claude\agents\semble-search.md

So the two integrations that describe the MCP tools land, but the MCP server itself is never registered — the generated CLAUDE.md tells the agent to call mcp__semble__search, and that tool does not exist. The install looks like it succeeded (Done!, exit 0).

Root cause

semble/installer/config.py::_json5_parser does:

try:
    download(["json5"])
    _json5_parser_cache = get_parser(cast(SupportedLanguage, "json5"))
except Exception:
    _json5_parser_cache = None

with the comment "json5 ships in tree-sitter-language-pack but isn't in its typed language list". On the pinned tree-sitter-language-pack==1.6.2 that is no longer true:

>>> from tree_sitter_language_pack import get_parser
>>> get_parser("json")
<OK>
>>> get_parser("json5")
LanguageNotFoundError: Language 'json5' not found
>>> get_parser("jsonc")
LanguageNotFoundError: Download error: Language 'jsonc' not available for download. Available groups: ["all"]

json5 is not bundled and is not downloadable — the name isn't known to the pack at all (note it doesn't even produce the "not available for download" message that jsonc does).

Impact

This is not Windows-specific and not network-specific. On any OS, any install resolving tree-sitter-language-pack==1.6.2, the JSON5 parser is None, _json5_object returns "skipped", and merge_mcp never writes. That covers every agent using the JSON path — Claude Code, Cursor, VS Code, Windsurf, opencode. Codex is unaffected because it takes the TOML text path.

Worth confirming on CI: if the test suite has a pinned or cached grammar it may not surface there.

Workaround

Register the server manually. For Claude Code:

claude mcp add semble -s user -- uvx --from "semble[mcp]" semble

(I pointed it at the already-installed executable instead — claude mcp add semble -s user -- /path/to/semble — which avoids a uvx resolve on every launch, since bare semble with no subcommand starts the MCP server.)

Suggested fixes

  1. Don't require a JSON5 grammar for this. These config files are JSON with occasional comments/trailing commas. A json5/pyjson5 pure-Python dependency, or json.loads with a comment-stripping fallback, would remove a tree-sitter grammar download from the install path entirely.
  2. If the grammar approach stays, fall back to plain json when json5 is unavailable — .claude.json is valid strict JSON in practice, so the merge would succeed for most users.
  3. Don't swallow the cause: except Exception hides LanguageNotFoundError, and the user-facing string "JSON5 grammar unavailable" reads like a transient download problem rather than a permanent dependency mismatch. Logging the exception would have made this a one-minute diagnosis.
  4. Exit non-zero, or at minimum print a prominent warning with the exact claude mcp add command, when MCP is skipped but instructions/subagent were written — the current combination produces a config that references tools that don't exist.

Possibly the same underlying area as #224 (grammar download failures reported misleadingly and silently degrading behaviour), but the blast radius here is the MCP install path rather than chunking.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions