Releases: julianbei/jade
Release list
v0.0.11
Jade 0.0.11
Theme: one click from more places. Claude Desktop can install Jade from a
single bundle file, the MCP Registry listing is published by the release
itself, and the tool descriptions say what agents were missing.
Install or update
curl -fsSL https://raw.githubusercontent.com/julianbei/jade/main/install.sh | shRun the same command again to update, then reconnect your MCP client so it
picks up the new tool descriptions. go install github.com/julianbei/jade/cmd/jade-mcp@v0.0.11 and the container image
ghcr.io/julianbei/jade-mcp:v0.0.11 work as before. macOS and Linux; Windows
isn't supported (issue #2).
Highlights
An MCP bundle for Claude Desktop
The release carries jade-mcp_v0.0.11.mcpb: the macOS and Linux binaries for
Intel and ARM, a launcher that picks the right one, and a manifest that asks
which repository Jade should work on. Open it with Claude Desktop and Jade runs
with the core tools, no terminal and no Docker. Language servers still come
from jade-mcp install.
The registry listing publishes itself
The release workflow publishes io.github.julianbei/jade to the
MCP Registry, logging in with
GitHub OIDC. The listing now offers two packages, the container image and the
MCP bundle, with version, image tag and the bundle's checksum taken from the
tag. docs/mcp-registry.md has the details.
Tools that say what they do
Prompted by Glama's review of
every tool description:
- Annotations.
read_range,findandgrepare marked read-only and
delete_filedestructive, so hosts can auto-approve reads. delete_filerefuses directories, fails on a missing path, and says
that reverting to an earlier checkpoint recreates the file.run_testssays when to use it: a failing test, a test file, or the
tests of changed files, withcheckfor the full suite.create_filemakes missing parent directories, and its refusal no
longer points at tools the core profile does not include.declare_commandsays that declaring an existing name replaces it.
Jade is also listed on Glama, and in the awesome-mcp-servers list once
its pull request
is merged.
Known limitations
- The bundle is new in this release. If Claude Desktop does not start it,
please open a bug;
the install script works in the meantime. - The container image has no git, gopls or build tools inside;
referencesandrenamefall back to text andchanges/diffare off. - Windows isn't supported. Upvote
issue #2 if you'd like it to be.
Full details: CHANGELOG.md · Planned work:
release-plan-0.1.0.md
Full Changelog: v0.0.10...v0.0.11
v0.0.10
Jade 0.0.10
Theme: easier to find. Jade is listed in the official MCP Registry, and
the repository has what a first-time visitor looks for: a clear headline, a
contributing guide, a security policy and a place for questions.
Install or update
curl -fsSL https://raw.githubusercontent.com/julianbei/jade/main/install.sh | shRun the same command again to update. go install github.com/julianbei/jade/cmd/jade-mcp@v0.0.10 and the container image
ghcr.io/julianbei/jade-mcp:v0.0.10 work as before. macOS and Linux; Windows
isn't supported (issue #2).
No tool, argument or response changed in this release, so an MCP client does
not need to reconnect for anything new.
Highlights
In the official MCP Registry
Jade is published as io.github.julianbei/jade in the
MCP Registry, through its container
image. The image now carries the io.modelcontextprotocol.server.name label
the registry uses to verify that the image belongs to the listing, and
server.json describes it. The steps for each release are
in docs/mcp-registry.md.
A repository that explains itself
- "The IDE for agents" heads the README, the repository description and
llms.txt. - CONTRIBUTING.md: feedback first, then how to
build, test and pass the release gate. - SECURITY.md: report privately through GitHub's
security advisories, and what is in scope. - Discussions are open for questions and ideas, and pull requests get a
short checklist.
Known limitations
- The registry listing runs the container image, which has no git,
gopls or build tools inside;referencesandrenamefall back to text and
changes/diffare off. For the full tool set, install the binary with the
install script instead. - Windows isn't supported. Upvote
issue #2 if you'd like it to be.
Full details: CHANGELOG.md · Planned work:
release-plan-0.1.0.md
Full Changelog: v0.0.9...v0.0.10
v0.0.9
Jade 0.0.9
Theme: easy to install, easy to keep current. One command installs Jade on
macOS or Linux, a menu installs the language servers you
want, and Jade says when a newer release is out without getting in your way.
Install or update
curl -fsSL https://raw.githubusercontent.com/julianbei/jade/main/install.sh | shRun the same command again to update. go install github.com/julianbei/jade/cmd/jade-mcp@v0.0.9 and the container image
ghcr.io/julianbei/jade-mcp:v0.0.9 work as before.
Reconnect your MCP client afterwards. The tool catalog and server
instructions are read at connection time.
Changes you should know about
- Jade looks up the latest release tag on GitHub at most once a day, in the
background with a three-second timeout. The request carries nothing about
your workspace.JADE_UPDATE_CHECK=0turns it off; it is off in CI and for
development builds. capabilitiesnow starts with the running version, followed by an
update notice when a newer release exists.
Highlights
Install script
Picks the release binary for the OS and CPU, verifies it against
checksums.txt, and installs it without sudo to /usr/local/bin or
~/.local/bin. Run again, it replaces the jade-mcp on PATH where it is,
and does nothing when that one is already current. JADE_VERSION pins a
release, JADE_INSTALL_DIR picks the directory.
jade-mcp install
A menu of the language servers Jade can use — gopls, jdtls, metals,
typescript-language-server, pyright, rust-analyzer, ruby-lsp — showing which
are installed and the exact command that would install the rest. It asks
which, confirms, and runs them; a server with no installer on the machine gets
instructions for installing it by hand. --list, --servers go,java,scala
and --all work without questions. The install script opens it after a first
install. Plugins are meant to join the menu later.
Installable by an agent
No terminal, no menu: jade-mcp install --list --json reports each server's
state and install command, --dry-run previews what --servers or --all
would run, curl … | JADE_SERVERS=go,java sh installs Jade and those servers
in one go, and capabilities ends a missing server's line with the command
that installs it. Installing is not an MCP tool: global package installs go
through the agent's shell, where you approve them.
jade-mcp found after installing
When the install directory is not on PATH — ~/.local/bin on most Macs —
the script offers to add it to your shell profile (JADE_ADD_TO_PATH=1 without
asking), and prints the absolute path to put in your MCP client config.
Update notice
jade-mcp --version and capabilities mention a newer release, with the
command that installs it. Nothing else does: not the server instructions, not
other tool responses.
For testers
The README opens with a tester guide: setup for Go, Java and Scala, what to
try in the first sessions, and issue templates for feedback, bugs, friction
and feature wishes.
Known limitations
- Windows isn't supported. If you'd like it to be, please upvote
issue #2 or tell us why there. - jdtls is installed through Homebrew only; without it the menu gives
manual steps. metals needs coursier. - The menu installs globally with each ecosystem's own tool (
npm -g,
gem install); where those need sudo, the install fails and says how to
install by hand.
Full details: CHANGELOG.md · Planned work:
release-plan-0.1.0.md
Full Changelog: v0.0.8...v0.0.9
v0.0.8
Jade 0.0.8
Theme: a smaller catalog, and what the 0.0.7 benchmark rerun taught. The
five tools deprecated in 0.0.7 are gone, validation reports what actually ran,
and the core profile can now run the commands a repository declares.
Upgrade
go install github.com/julianbei/jade/cmd/jade-mcp@v0.0.8
# or
docker pull ghcr.io/julianbei/jade-mcp:v0.0.8Reconnect your MCP client afterwards. The tool catalog and server
instructions are read at connection time.
Changes you should know about
- Breaking: five tools removed.
search,search_nudge,
repository_map,read_symbolandreplace_rangenow fail as unknown
tools. Usefindorread_rangeforread_symbol,findorgrepfor
search,retrieveforrepository_map, andreplace_text(orapply
with areplace_rangeedit) forreplace_range. The catalog is 31 tools. --tools corelistsrun_commandanddeclare_commandin place of
outlineandworkspace_tree. It stays at twelve tools; the two removed
from the list remain callable by name.- A timed-out
check,run_testsorrun_commandsays to call the same
tool again, and that call waits on the running job instead of starting a
second one. The old hint namedjob_status, which the core profile does not
list. applywithcheck: "tests"runs the edited files' tests, not the
whole suite, and says so on a pass.checkwith kindtestsstill runs
everything.checkwith a target inside a Cargo workspace runs-p <crate>instead
of--workspace.
Highlights
Test results that say what ran
check, run_tests and apply read go test, cargo test, pytest, jest,
vitest and ava output. A pass reports counts (596 passed, 2 skipped); a
failure reports counts, the first failing test and its assertion or panic
line, and names missing Playwright browsers or PySocks when the output shows
them.
Declared commands in the core profile
Without a shell an agent had no way to run a reproduction or a benchmark.
declare_command writes a named command to .jade/commands.json — reviewed
like any change — and run_command runs it in this and every later session.
Verified hosts
Live sessions in Codex CLI 0.154, goose 1.50 and OpenCode 1.18
used only Jade's tools to find, edit and check. The README has the
configuration for each.
Measured
The pilot benchmark was re-run twice on the core profile
(results). At 0.0.7 Jade solved 11 of 12 tasks
against 10 for a shell trimmed to Bash, Read, Edit and Write, with 14% fewer
tokens. With this release's validation fixes it held its tokens and ran 21%
faster.
Known limitations
- The new core profile is not benchmarked. Every benchmark task starts
from a fresh clone, where declaring a command never pays back; the change
is aimed at repositories worked in for longer. - Still no throwaway reproduction without a shell. A one-off script has to
be declared before it can run. - Cline and Gemini CLI unverified, no Java repository in the benchmark, no
Serena comparison. - One run per task. Per-repository results flip sign between runs; only
the totals are worth quoting.
Full details: CHANGELOG.md · Planned work:
release-plan-0.1.0.md
Full Changelog: v0.0.7...v0.0.8
v0.0.7
Jade 0.0.7
Theme: a surface an agent can route, predictable across environments, and a
change transaction that holds. This release covers release-plan phases
0.0.5, 0.0.6 and 0.0.7, which were built one after the other without a tag in
between.
Upgrade
go install github.com/julianbei/jade/cmd/jade-mcp@v0.0.7
# or
docker pull ghcr.io/julianbei/jade-mcp:v0.0.7Reconnect your MCP client afterwards. The tool catalog and server
instructions are read at connection time.
Changes you should know about
- Five tools are deprecated and will be removed before 0.1.0:
search,
search_nudge,repository_map,read_symbolandreplace_range. They
still work; each description names its replacement. - Large reads, patches and logs come in pages instead of losing their
middle.read_rangepast 20,000 bytes, anddiff,job_outputand
historypast a few thousand, used to cut out the middle with
… bytes omitted …. They now return whole lines up to a budget of the same
size and acontinue=<handle>for the rest. referencesleads with its summary, which used to come last.- First lines carry provenance —
exact · gopls · complete,
approximate · text index · may be incomplete— onreferences,grep,
find,search,retrieve, outlines,repository_mapandcontext. - A revert is a new revision. It used to reset the counter to the
checkpoint's. It now also restores files first changed after the
checkpoint, recreates deleted ones, removes created ones, and fails as a
whole instead of skipping a file it cannot write. check kind: "lint"runs the declared lint commands when the repository
declares any; with none it runs the typecheck, as before.- A backgrounded or out-waited declared command is no longer killed at the
caller's wait timeout. grep's glob reaches below the directory it names:internal/*now
selectsinternal/core/state.go.
Highlights
Responses sized and labelled
budgetandcontinueongrep,find,references,read_range
(and itsranges),read_symbol,workspace_tree,history,diffand
job_output. Cut at whole items; a handle is refused after an edit.- Provenance from closed sets — certainty, source, completeness — so an
approximate answer is never mistaken for a compiler-resolved one.
Knowing what works here
capabilities: per language, grammar or text scan, the language server
running, indexing, failed or not installed, the formatter, what a
referencesanswer would carry, and each capability's providers. Also git,
the build and test commandscheckwould run, and declared commands.- The opening instructions carry a one-line brief of the workspace's
languages and their servers. - Language servers: restarted once after dying, then reported failed with
the reason; answers from a still-indexing server say so, for how long, and
what to do. - Providers behind a registry: references, rename and edit diagnostics are
answered by registered providers, strongest first.
The change transaction
- One write path. Every edit, the command registry and checkpoint restore
write atomically through one package; a multi-file rename lands in every
file or none. expectedDigest. Reads return a content digest; an edit given it is
refused if the file changed since that read — by Jade, you, a formatter or
another agent.- The edit contract in tool-contract.md lists 24
guarantees, each naming the test that holds it, and a scripted session test
runs the whole transaction through the MCP transport. - Two sessions on one workspace keep each other's work;
changesmarks
files this session did not edit and lists the validation that ran.
Validation
check targetfor a repository with several projects, and a listing of
the projects when the root has no command.- Declared commands by kind (
lint,codegen) as validation steps, and a
documented chain — tests, thensemgrep scan --error— in one declared
command. apply check: "impact"runs only the tests covering the declarations an
edit touched or deleted, their callers and the edited files.- Long work without polling: progress notifications while a call runs, and
a notification when a backgrounded job completes. - Discovery returns plans, executed by one runner.
Measured
- Conformance runs every language with its server and without, and fails
when a server's first answer gets markedly slower than the 2026-09-14
baseline (Go 1.6s to Scala 22.3s).
Known limitations
- Not re-benchmarked yet. The pilot benchmark (0.0.4) is being re-run on
this release's core profile; results follow indocs/benchmark-results.md. - Host integrations unverified. OpenCode, goose, Cline, Codex CLI and
Gemini CLI sessions have not been verified. - No Java repository in the benchmark, no Serena comparison.
- Revisions count one session's own edits. Another session's or an
outside change is seen byexpectedDigestand bychanges, not by the
revision counter, andchangescannot name which other session made it. - Formatters are external processes and write outside the write path,
after the checkpoint has recorded the file.
Full details: CHANGELOG.md · Planned work:
release-plan-0.1.0.md
Full Changelog: v0.0.4...v0.0.7
v0.0.4
Jade 0.0.4
Theme: evidence before features. Jade was measured against the shell on
real issues in four outside repositories, and everything the transcripts
showed it doing badly was fixed. Results: benchmark-results.md.
Upgrade
go install github.com/julianbei/jade/cmd/jade-mcp@v0.0.4
# or
docker pull ghcr.io/julianbei/jade-mcp:v0.0.4Reconnect your MCP client afterwards. The tool catalog and server
instructions are read at connection time.
What the benchmark found
Claude Code on Sonnet 5, 12 real issues in cobra (Go), ky (TypeScript),
requests (Python) and ripgrep (Rust):
| Tools | Solved | Tokens per run | Time per run |
|---|---|---|---|
| Claude Code's built-in tools | 10 of 12 | 1.38M | 215s |
| Built-in tools trimmed to Bash, Read, Edit, Write | 10 of 12 | 0.90M | 213s |
| Jade only, core profile | 12 of 12 | 0.68M | 163s |
| Both | 11 of 12 | 1.50M | 191s |
A rerun after this release's fixes: Jade alone and the trimmed shell both
solved 11 of 12; Jade used 18% fewer tokens, 14% fewer turns and 24% less time.
Use Jade in place of the built-in tools, not beside them. Most of the
saving over Claude Code's defaults is the shorter tool list; given both, the
agent sends half its calls to Bash and pays for both lists. The README's
Let Jade replace the built-in tools
has the invocation.
Changes you should know about
- Single edits no longer start a background whole-repository typecheck.
Diagnostics still come back with the edit;checkandapply'scheck
validate when asked. read_rangeadvertiseslines: "280-400"instead ofstartLineand
endLine, which still work.- Searches skip what git ignores, as ripgrep does, plus paths a project
config declares generated. - Validation commands run in the project's environment: its
.venvor
venvactivated andnode_modules/.binonPATH. They are killed after 10
minutes instead of 60 seconds. - A test run that matched no test answers
no test matched, notpass.
Highlights
.jade/project.json
A committed file that says how the repository builds and tests: areas with a
path, a language and build, typecheck, test, testFile and testName
commands, an interpreter and variables, generated paths, and notes for the
agent. check and run_tests use it before discovery. jade-mcp init drafts
one from what discovery finds.
A smaller tool list
jade-mcp --tools core lists the twelve tools agents called in the benchmark
— 10 KB of schema instead of 23 KB, resent on every turn. The others stay
callable.
Tests in every ecosystem
run_testswith a file or test name uses the project's runner: vitest, jest,
ava or mocha fromnode_modules, pytest,cargo test -pfor the nearest
package.- Failure summaries say why: the assertion difference, the error message,
pytest'sElines, a Rust panic's values — without code frames or stacks. check typecheckrunstsc --noEmitfor a TypeScript project with no
typecheck script.
Checks without a language server
When no server runs, TypeScript, JavaScript, Python, Rust, Ruby, Java and Scala
edits are parsed with tree-sitter and syntax errors come back with the edit:
checked: tree-sitter (syntax only; <why the server did not run>).
Dependency source
grep and find take dependency, and read_range reads
dep:<name>/<path>: the crate, module or package at the version the lock file
pins, from the Cargo registry, the Go module cache, node_modules or the
virtual environment. Read only.
Fewer failed calls
- A missing edit anchor says where the file differs:
line 1482 reads "return c.Name()" where the anchor has "return c.displayName()". grepretries a query that found nothing under its other reading — pattern
as regex, regex as text — and accepts grep's\|alternation.insertdrops a copy of its anchor from the inserted text;findaccepts a
declaration as written (func (c *Command) Name).- Edits return the edited region, so the result needs no second read.
telemetry reports tool confusion
Same-target tool switches, retries after ambiguous or not_found, and tools
never called — still without arguments or responses.
jade-bench agent
The external benchmark: any checkout and task file, four arms, success by the
task's own hidden tests, a fixed scorecard and a hard budget. See
benchmark.md.
Known limitations
- No Java repository in the benchmark yet, and one run per task; per-task
differences under about 30% are noise. - Jade was tuned on the benchmark's repositories. 0.1.0's rerun adds
repositories nobody tuned for. - ripgrep shows no lead over the trimmed shell after the fixes (−2%
tokens). - Syntax checks are not type checks. Install the language server for type
errors.
Full details: CHANGELOG.md · Planned work:
release-plan-0.1.0.md
Full Changelog: v0.0.3...v0.0.4
v0.0.3
Jade 0.0.3
Theme: a good tenant, cheaper calls, honest checks. Nothing Jade writes or
says should be something the caller did not ask for or cannot act on.
Upgrade
go install github.com/julianbei/jade/cmd/jade-mcp@v0.0.3
# or
docker pull ghcr.io/julianbei/jade-mcp:v0.0.3Reconnect your MCP client afterwards. The tool catalog and server
instructions are read at connection time.
Changes you should know about
These change what Jade does in your repository or what you see, not just how
well it does it.
- Formatters now run for TypeScript, JavaScript, Python and Scala — if your
repository declares one. A prettier config plusnode_modules/.bin/prettier,
[tool.black]or[tool.ruff.format]inpyproject.toml, or a
.scalafmt.conf. In such a repository, a file Jade edits is now reformatted
to your project's rules. Repositories that declare nothing are unaffected. - Jade adds one line to
.git/info/excludebefore it first writes its
telemetry log, so the log never appears as untracked. That file is local to
your clone and never committed;.gitignoreis not touched. Skipped if git
already ignores the log. SetJADE_STATE_DIRto keep the log out of the
workspace entirely. - Responses are shorter. Reads no longer print
drifted: N files; edits no
longer printjobs: job-N. Both are still inJADE_JSON=1output. If you
parsed either line, stop — response wording is not a stable format. revertrefuses once a commit has landed since the checkpoint. It used
to restore the snapshot anyway, writing pre-commit content over committed
files. Undoing a commit is git's job; Jade says so and names both commits.- Paths outside the workspace are refused. An absolute path elsewhere, a
..climb, or a symlink pointing out of the repository now gets an error
naming the workspace root, for every tool.grepandfindno longer read
through such symlinks. If you passed absolute paths inside the workspace,
they still work. - Validation results lead with one of five words:
pass,FAIL,
unavailable,runningortimed out. A check that outlives its wait
saystimed outinstead ofrunning; a missing tool saysunavailable
instead ofFAIL. JSON output gains anOutcomefield. - Edit responses name what checked the file —
checked: gopls, or
not checked: app.py: pyright-langserver is not installed.
Highlights
Edits report diagnostics in every language with a server
Before 0.0.3, only Go edits came back with type errors. Now every language
with a running language server does, and every response says which checker
ran, so an empty result can be read as "nothing wrong" rather than "nothing
looked".
Verified against real servers in the conformance container:
| Language | Checker | Example error returned with the edit |
|---|---|---|
| Go | gopls | undefined: undefinedThing |
| TypeScript | typescript-language-server | Cannot find name 'undefinedThing'. |
| JavaScript | typescript-language-server | Variable declaration expected. |
| Python | pyright | "undefined_thing" is not defined |
| Rust | rust-analyzer | Syntax Error: expected R_PAREN |
| Java | jdtls | The method undefinedThing() is undefined… |
| Ruby | ruby-lsp | unexpected end-of-input; expected a ')' to close the parameters |
| Scala | metals (with JADE_METALS_IMPORT=1) |
identifier expected but '=' found. |
A server that has not looked at the change yet says so instead of reporting a
broken file as clean: metals is still working (Importing build), or
metals needs a build import to report errors.
Scala needs your permission. metals reports errors only after importing
the sbt build, and importing runs sbt and creates .bloop/ and .metals/ in
your repository. Jade declines by default. Set JADE_METALS_IMPORT=1 to let
it import; a repository an editor already imported works without it.
JSON and YAML are checked too
No server needed. A stray comma in package.json or a broken indent in a CI
workflow comes back with the edit — error package.json:2:19 invalid JSON: …
— instead of in the next CI run. tsconfig.json comments are not flagged.
Language servers answer correctly the first time
- Jade waits for a server to finish indexing before
referencesor
rename. An indexing server does not answer slowly, it answers wrongly —
ruby-lsp returnednullfor a class rename it got right two seconds later. - Rename falls back to an alternative server when the primary declines.
ruby-lsp cannot rename methods; withsolargraphalso installed, Ruby
method rename now works across files.
A good tenant in someone else's repository
Harnesses that commit a worker's worktree wholesale were committing Jade's
telemetry log as part of the agent's change. The .git/info/exclude entry and
JADE_STATE_DIR above fix that, and a call with an unknown tool name no longer
creates the log at all.
A first call that works
- The server instructions name the seven tools to load first and say when to
batch withapply. Hosts that load tool schemas lazily no longer spend the
agent's first turn searching for one. jade_findis accepted as well asjade.find— the spelling hosts display.replace_textandinsertpoint atapplyfor multi-site edits.serverInfo.versionreports the real version instead of0.1.0.
check names its command
Every result says what ran — pass build · ran: go build ./... — and
check dryRun: true says what would run without running it. A workspace Jade
cannot identify is told so instead of getting a job that can only fail.
Fewer calls to read what you need
findtakesqueries— several names in one call.read_rangetakesranges— several files or ranges in one call; a range
that fails does not fail the others.- An end line past the end of the file reads to the end and says so
(lines 190-312 of 312) instead of being rejected.
New settings
| Variable | Effect |
|---|---|
JADE_STATE_DIR |
Directory for Jade's telemetry log, outside the workspace. One subdirectory per workspace. |
JADE_METALS_IMPORT=1 |
Let metals import an sbt build so Scala edits get diagnostics. Runs sbt; creates .bloop/ and .metals/. |
Known limitations
- Ruby method rename needs
solargraphalongside ruby-lsp. - Java and Ruby files are not formatted. No safe opt-in signal for Java yet;
rubocop's autocorrect changes behaviour, not just layout. - Every edit still starts a background whole-repository typecheck whose
result is no longer shown. Scoping or removing it is planned for 0.0.4.
Full details: CHANGELOG.md · Planned work:
ROADMAP.md
Full Changelog: v0.0.2...v0.0.3
v0.0.2
v0.0.1
What's Changed
- Fix release image publish target in
imagejob (ghcr.io/<owner>/jade-mcp) by @julianbei with @Copilot in #1
New Contributors
- @julianbei with @Copilot made their first contribution in #1
Full Changelog: https://github.com/julianbei/jade/commits/v0.0.1