Skip to content

v1.108.283 — A config in the wrong shape is a client that reports success and registers nothing

Choose a tag to compare

@jgravelle jgravelle released this 17 Aug 19:12
· 244 commits to main since this release

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", and command as a single array
  • VS Code / Copilot — top-level servers, not mcpServers
  • Gemini CLI and Cline — the generic mcpServers shape

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 init

The 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 format argument (#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_mcp package 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