v1.108.283 — A config in the wrong shape is a client that reports success and registers nothing
A config in the wrong shape is a client that reports success and registers nothing
jcodemunch-mcp init goes from 5 auto-configured clients to 10. Codex CLI, opencode, Gemini CLI, Cline and VS Code / GitHub Copilot join Claude Code, Claude Desktop, Cursor, Windsurf and Continue.
Four of the five needed their own writer, and the reason is worth stating plainly: no schema mismatch here produces an error. Write the wrong key and the host parses the file, registers nothing, and reports success. The user gets an agent with no jCodeMunch tools and no reason to suspect the config. Three distinct JSON schemas plus one TOML:
- Codex — TOML at
~/.codex/config.toml - opencode — top-level
mcp, an explicit"type": "local", andcommandas a single array - VS Code / Copilot — top-level
servers, notmcpServers - Gemini CLI and Cline — the generic
mcpServersshape
Every shape was read out of vendor documentation rather than inferred.
Codex refuses rather than falling back
Codex's rmcp transport is strict about the first JSON-RPC frame on stdout, and uvx's cold-run install chatter poisons the handshake. The documented symptom is a silent multi-hour hang, not an error.
So init resolves a real binary or declines, telling you to run uv tool install jcodemunch-mcp first. A uvx fallback would look like a successful install and then hang the first time you used it.
Install now leads with uv tool install
uv tool install jcodemunch-mcp
jcodemunch-mcp initThe zero-friction path already existed and was buried — init has always written uvx into every client config, so for most setups nothing is installed persistently. The instructions still said pip install.
Not bare uvx, for two independent reasons: enforcement hooks are spawned by a minimal-PATH subshell and resolve the executable by name, and Codex cannot use uvx at all.
Also in this release
- The dispatcher no longer eats its caller's
formatargument (#482).arguments.pop("format")mutated the caller's own dict, so an in-process caller reusing one args object got JSON on the first call and something else on every call after. Unreachable over the wire; the exposed path is the Counter front door re-dispatching. - The test suite runs under
pytest-xdist— 599s serial to 183s parallel on a 24-core box. Doing it surfaced two tests that only passed because of the file that ran before them. - The
src.jcodemunch_mcppackage twin is retired across 14 modules and 140 references. It was a different module object carrying its own config that the isolation guard never reset. - Per-database perf-trim counters (#476, reported by @rknighton) — one telemetry database was spending another's trim.
- Relative storage paths resolved before they become cache keys (#475, fixed by @mikemikimike in #479).
Verification
7,883 passed / 17 skipped / 0 failed on 3.12, and the 3.13 CI-environment reproduce returns the identical totals and skip split. uv run ruff check src/ clean. CI green on the released SHA before anything was published.
Full detail: CHANGELOG.md