MCP OAuth, performance and more
Happy Friday everybody!
We're releasing some nice features for you so you can enjoy your weekend vibecoding. (Or not, stay outside ๐ and return to Crush on Monday! ๐).
MCP OAuth
That's it, it's finally here! Some of you have been asking for this for long.
This is required for some MCPs to work. Want to know to it set it up? Refer to this section into the README.
Thank @joestump and his agent @joestump-agent for this contribution. And of course, our favorite @taciturnaxolotl also helped.
Claude Channels MCP extension
@joestump (and his agent) also added an initial implementation to support the Claude Channels MCP extension, which means MCPs can now send notifications to Crush when certain events happen.
Give this a try if you're interested, and let us know how well it works for you.
Restored MCP prompts
MCP prompts were unintentionally disabled in a previous release, but they were now added back!
LSP performance boost
Another cool contrib was made by @TheJhyeFactor, who vastly improved the CPU and memory usage on handling LSP servers in large repositories!
See #3370 for a more in-depth explanation of the optimizations.
Bang mode performance boost
@TheJhyeFactor also improved performance of output streaming when running command in bang mode.
Check #3381 to see some benchmarking.
/etc/crush/crush.json
You read it right! Thank to @Muttaqin86 you can now have a system-wide Crush configuration on /etc/crush/crush.json.
The motivation for this was improving compatibility with NixOS.
Fixed Copilot + GPT-5.6
All three GPT-5.6 models (Sol, Terra and Luna) are now fixed when running via GitHub Copilot. Kudos to @nghiant03 for this!
That was a lot, but it's really fun to how much the community is enganged with Crush dev.
Keep Crushing! โข๏ธ
Charm
Changelog
New!
- 6f8a7fe: feat(client): reconnect the event stream after it drops (@meowgorithm)
- d291d9f: feat(cmd): add --channels opt-in flag for MCP channel servers (@joestump)
- 37fc995: feat(mcp): OAuth 2.1 authorization for HTTP MCP servers (@taciturnaxolotl)
- 1588ae8: feat(mcp): SSE OAuth, metadata fixups, and resource param stripping (@taciturnaxolotl)
- d338af8: feat(mcp): add OAuth support for HTTP MCP servers (@joestump)
- a1cf002: feat(mcp): detect claude/channel capability and receive channel messages (@joestump)
- b238696: feat(ui): tell a lost connection apart from an uninitialized agent (@meowgorithm)
Fixed
- fbf5934: fix(agent): close dispatch completion-boundary cancel race (@joestump-agent)
- ae9257b: fix(agent): serialize in-process run dispatch to prevent concurrent turns (@joestump)
- a09cb36: fix(backend): log channel flag mismatch on duplicate workspace creation (@joestump-agent)
- 086dc62: fix(client): add MCP prompts to ui in client-server mode (@meowgorithm)
- ca9ef6a: fix(cmd): make --channels a persistent flag so
crush runinherits it (@joestump-agent) - 213ad79: fix(config): load system-wide config from /etc/crush/crush.json (#2984) (@Muttaqin86)
- 8ccf694: fix(copilot): add additional responses models (#3416) (@nghiant03)
- 26399fc: fix(mcp): address OAuth review findings (timeout, refresh, concurrency) (@joestump-agent)
- bc8ff34: fix(mcp): buffer channel notifications during capability negotiation (@joestump-agent)
- 1f623ec: fix(mcp): filter channel events from the shared app event stream (@joestump-agent)
- 14fa1de: fix(mcp): prevent clients from inheriting channel opt-ins (@meowgorithm)
- 533fcf1: fix(mcp): prevent panic when auth signal fires twice (#3403) (@meowgorithm)
- f7c53cb: fix(mcp): route channel messages through must-deliver broker path (@joestump-agent)
- fed86b0: fix(mcp): tighten channel meta key validation for XML name safety (@joestump-agent)
- fd55b5d: fix(server): don't shut down while a workspace is being created (@meowgorithm)
- 2cb0bdb: fix(server): stop mapping channel events to spurious state changes (@joestump-agent)
- fa6ec09: fix(server): wait before shutting down so back-to-back sessions don't race it (@meowgorithm)
- 00a1843: fix(test): fix nil pointer crash in Windows CI tests (@meowgorithm)
- 1b4ef73: fix(ui): keep shell progress output from corrupting the TUI (@taciturnaxolotl)
Docs
- 7946b21: docs(mcp): add OAuth configuration guide and regenerate schema (@taciturnaxolotl)
Other stuff
- 2af939d: chore(cli): hide --channels (@meowgorithm)
- 1ba4dc4: chore(mcp): merge main; fix createTransport arity; inject browser opener (@joestump-agent)
- d2c6648: chore: auto-update files (@charmcli)
- b647ccd: chore: auto-update files (@charmcli)
- cba1ebc: chore: auto-update files (@charmcli)
- cc971bd: perf(lsp): filter servers before searching
$PATH(#3370) (@TheJhyeFactor) - e4175c5: perf(ui): avoid quadratic shell output rendering (#3381) (@TheJhyeFactor)
- 67e748e: revert: remove #3348 OAuth implementation (superseded) (@taciturnaxolotl)
- 1dad49c: style: gofmt formatting cleanup (@joestump-agent)
Verifying the artifacts
First, download the checksums.txt file and the checksums.txt.sigstore.json file files, for example, with wget:
wget 'https://github.com/charmbracelet/crush/releases/download/v0.87.0/checksums.txt'
wget 'https://github.com/charmbracelet/crush/releases/download/v0.87.0/checksums.txt.sigstore.json'Then, verify it using cosign:
cosign verify-blob \
--certificate-identity 'https://github.com/charmbracelet/meta/.github/workflows/goreleaser.yml@refs/heads/main' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--bundle 'checksums.txt.sigstore.json' \
./checksums.txtIf the output is Verified OK, you can safely use it to verify the checksums of other artifacts you downloaded from the release using sha256sum:
sha256sum --ignore-missing -c checksums.txtDone! You artifacts are now verified!
Thoughts? Questions? We love hearing from you. Feel free to reach out on X, Discord, Slack, The Fediverse, Bluesky.
