2.4.0

modelcontextprotocol/inspector2.4.0Aug 26, 2026by cliffhall

AI Summary

A milestone release focusing on OAuth enhancements, security updates, and stability improvements for the Web, CLI, and TUI clients.

Key Highlights

  • Enhanced OAuth support with per-server refresh token opt-out and scope persistence.
  • MCP App UI improvements including resource metadata handling and CSP source management.
  • Security hardening with esbuild pinning and npm audit fixes.
  • Improved TUI and Web client stability with fixes for pagination, multiline input, and SSE handling.

New Features

  • Per-server custom OAuth authorization-request parameters
  • Per-server refresh token grant opt-out
  • File-backed and in-memory SecretStore for hosts without a keychain
  • Negotiated app-rendered form elicitations
  • Complex JSON values support in request _meta

Full Release Notes

## What's Changed
* ci: drop the redundant PR-head checkout from claude.yml by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2070
* feat(apps): negotiated app-rendered form elicitations by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2083
* feat(auth): file-backed and in-memory SecretStore for hosts with no keychain by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2076
* chore(lint): fail lint on warnings (--max-warnings 0) by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2090
* fix(web): roll a failed settings write back to what actually landed by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2091
* chore: three small cleanups flagged in the v2.2.0 merge review by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2092
* feat(auth): give the secrets file a real cross-process lock by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2088
* feat: allow complex JSON values in request _meta by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2094
* fix(web): surface a failed post-write server-list reload by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2087
* fix(web): read MCP App UI resource metadata from _meta.ui by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2098
* chore: remove the Claude Code GitHub Actions workflow by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2103
* fix(proxy): route through undici's own fetch and keep undici external by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2099
* fix(auth): don't answer `token_expired` from an unknowable local expiry by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2105
* fix(web): state the expected shape when dropping a CSP source (#2064) by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2106
* fix(web): honor _meta.ui.domain with a dedicated app origin by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2100
* chore(ci): render an MCP App from the installed tarball in pack:verify (#2003) by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2107
* fix(web): let tool string arguments be typed as multiline by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2109
* fix(cli): apply a server's persisted mcp.json metadata by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2112
* chore: pin esbuild past the GHSA-g7r4-m6w7-qqqr range in web/cli/tui by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2116
* fix(auth): pass the challenge's resource_metadata URL to SDK auth() by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2113
* fix(web): open the monitoring sidebar when a connect fails during OAuth by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2115
* feat(oauth): make the refresh_token grant opt-out per server by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2114
* chore(scripts): build test-servers unconditionally from one shared helper (#2111) by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2120
* feat: flag unportable tool schemas in all three clients by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2121
* fix(oauth): persist the requested scope when the token response omits it by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2118
* fix(web): carry a landed stdio env/cwd onto the config it connects with by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2119
* fix: keep the pagination toggle on the last write across a server switch by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2131
* fix(core): carry the in-progress SSE frame across chunk boundaries by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2135
* fix(oauth): keep the server's path in the fallback authorization-server URL (#2110) by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2136
* fix(web): take the enlarge button out of the tab order by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2139
* chore: bump version to 2.4.0 by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2142
* chore: merge v2/main for the v2.4.0 milestone release by @cliffhall in https://github.com/modelcontextprotocol/inspector/pull/2145


**Full Changelog**: https://github.com/modelcontextprotocol/inspector/compare/2.3.0...2.4.0

Smoke test ledger for milestone branch: [v2/chore/milestone-merge-v2.4.0](https://claude.ai/code/artifact/900ca77c-8d1e-4c8b-b05a-e5edbde6c9e3)