# jcodemunch-mcp

> The leading, most token-efficient MCP server for GitHub source code exploration via tree-sitter AST parsing

- **URL**: https://www.freshcrate.ai/projects/jcodemunch-mcp
- **Author**: jgravelle
- **Category**: MCP Servers
- **Latest version**: `v1.108.29` (2026-06-05)
- **License**: NOASSERTION
- **Source**: https://github.com/jgravelle/jcodemunch-mcp
- **Homepage**: https://j.gravelle.us/jCodeMunch
- **Language**: Python
- **GitHub**: 1,636 stars, 271 forks
- **Registry**: github
- **Tags**: `claude`, `claude-code`, `python`, `serena`, `token`, `token-savings`, `tokens`

## Description

The leading, most token-efficient MCP server for GitHub source code exploration via tree-sitter AST parsing

## Recent releases

| Version | Date | Urgency | Changes |
| --- | --- | --- | --- |
| `v1.108.29` | 2026-06-05 | High | ## 1.108.29 - WRR signal fusion was inert  Closes #324 (reported by @sektor10, with a full root-cause analysis and a clean reproduction).  ### The bug  The Weighted Reciprocal Rank fusion pipeline in `retrieval/signal_fusion.py` never applied its channel weights. Every fused score came out `0.0`, and the final ordering silently fell back to a stable sort over insertion order. The documented ranking (identity 2.0 > lexical 1.0 > similarity 0.8 > structural 0.4) was a no-op on the `fusion=True` pa |
| `v1.108.26` | 2026-05-29 | High | # 1.108.26 — get_file_outline batch mode dropped all symbols  ## Fixed  `get_file_outline` in **batch mode** (`file_paths=[...]`) returned empty outlines for every file — models saw "the outline came back empty" and either gave up or burned tokens re-querying (issue #319, reported by @MariusAdrian88, corroborated by @ImJustWeed).  The bug was confined to the MUNCH `fo1` encoder: it only understood the **singular** response shape, where `symbols` sits at the top level. Batch mode nests the data o |
| `v1.108.22` | 2026-05-22 | High | Six additive enterprise-hardening items in one release. All purely additive; no user-facing behavior changes. Full notes in [CHANGELOG.md](https://github.com/jgravelle/jcodemunch-mcp/blob/v1.108.22/CHANGELOG.md).  ## Highlights  - **Keyring credentials** (P1.3): Any credential env var can be set to `keyring:<name>` to load from the system keyring. New `jcodemunch-mcp keyring set\|get\|delete\|list` CLI. Requires `pip install "jcodemunch-mcp[keyring]"`. - **Metadata-only cache mode** (P1.4): New `ca |
| `v1.108.18` | 2026-05-17 | High | Patch release. Closes #304 — the runtime gap I flagged when shipping v1.108.17's display fix.  ## The gap  `batch_summarize.py` read every summarizer-related config key from `_GLOBAL_CONFIG` only (no `repo=` passed). So a user with `summarizer_model` in `.jcodemunch.jsonc` saw the runtime ignore it — the AI summarizer used the env-var fallback or hardcoded default instead of their configured value. Same plumbing-audit shape as #300 / #301 but in summarizer code.  ## The fix  Thread `repo` from c |
| `v1.108.7` | 2026-05-12 | High | ## v1.108.7 — Windows hook path: forward slashes + path-shape-agnostic dedup  Fixes the recurring `PreToolUse:Read hook error / command not found` loop on Windows. Two coupled bugs:  ### Bug 1: bash silently eats backslashes in hook paths  `_hook_invocation()` returned `shutil.which("jcodemunch-mcp")` raw, which on Windows yields `C:\Python314\Scripts\jcodemunch-mcp.EXE`. JSON serialisation preserves the backslashes in settings.json (`C:\\Python314\\Scripts\\jcodemunch-mcp.EXE`), but Claude Code |
| `v1.81.3` | 2026-05-07 | High | **Fixes #276** — Bare-name `repo` lookups crashing when `JCODEMUNCH_PERF_TELEMETRY=1`.  `list_repos()` globbed `*.db` indiscriminately, so `~/.code-index/telemetry.db` was treated as an indexed repo. Worse, `_connect()` auto-initialised the code-index schema on it, vandalising telemetry.db, and `_list_repo_from_db` returned a phantom entry with `repo=""`. That empty owner/name then crashed `_get_bare_name_map` (`"".split("/", 1)` → `ValueError: not enough values to unpack`), aborting the bare-na |
| `v1.80.3` | 2026-05-01 | High | Fixes #269 via PR #270 (DrHayt). The WorktreeRemove hook never actually removed worktrees from disk because two bugs in cli/hook_event.py conspired: (1) a legacy worktree_path early-return wrote the manifest and skipped git commands on remove, and (2) git worktree remove ran with cwd set to the worktree being removed, which git refuses. Fix: gate the legacy early-return on event_type=='create' and resolve the main repo via git rev-parse --git-common-dir before running removal commands. 3700 pass |
| `v1.80.1` | 2026-04-26 | High | ## Fixed - **Scala 3 symbol extraction** (#262, @irreversible-paths). The Scala language spec only matched `function_definition` nodes, silently dropping abstract defs (`function_declaration`), fields (`val_definition` / `var_definition`), and type aliases (`type_definition`). It also assumed the identifier field was named `name`, but tree-sitter-scala uses `pattern` for val/var nodes. `SCALA_SPEC` now declares the additional node types and the `pattern` name field. On a real Scala 3 + Spring Bo |
| `v1.72.0` | 2026-04-22 | High | Correctness + reach release: fixes six tier-1 MUNCH encoders that had shipped against imagined response shapes (silent data loss in `get_blast_radius`, `find_importers`, `find_references`, `get_signal_chains`, `get_tectonic_map`, `get_dependency_cycles`), and adds generic monorepo/`extends`-chain support to the tsconfig alias loader so path aliases resolve in any workspace layout.  ### Fixed - **MUNCH tier-1 encoder alignment** (#256, credit @MariusAdrian88). Six   encoders realigned to the act |
| `v1.71.0` | 2026-04-21 | High | Resolves #255 (credit @rsubr).  ## Added - **jcodemunch_guide tool.** Returns the version-current policy snippet — the same text jcodemunch-mcp claude-md --generate emits — plus the running version. Keep a single line in CLAUDE.md / AGENT.md and never hand-edit it when the tool surface changes:        Call the jcodemunch_guide tool and strictly follow its instructions.    Force-included alongside set_tool_tier / announce_model, so disabled_tools and tier filtering can't hide it. No repo context; |

## Citation

- HTML: https://www.freshcrate.ai/projects/jcodemunch-mcp
- Markdown: https://www.freshcrate.ai/projects/jcodemunch-mcp.md
- Dependencies JSON: https://www.freshcrate.ai/api/projects/jcodemunch-mcp/deps

_Generated by freshcrate.ai. Indexes github releases for AI-agent ecosystem packages._
