Added
- Added MCP prompts support as Pi slash commands under the
mcp__<server>__<prompt>namespace, with capability-gated discovery, cache-backed startup registration, argument validation, lazy dispatch, and/mcp promptslisting. Thanks to Egor Egorov (@ee92) for PR #203. - Hot-loaded refreshed direct MCP tools after metadata reconnects, lazy connects, direct-tool panel changes, and MCP list-change notifications. Thanks Devin Bost (@devinbost) for PR #72.
- Migrated the MCP client and interactive visualizer to the exact-pinned MCP SDK v2 beta.5 packages, with automatic protocol negotiation and client conformance coverage. Thanks Matt Carey (@mattzcarey) for PR #210.
- Added disabled MCP server definitions plus
/mcp disableand/mcp enableproject-local overrides that preserve visibility while preventing execution. Thanks Ömer Ulusoy (@ulusoyomer) for PR #61. - Added argument completions for
/mcpsubcommands and reconnect/logout server names. Thanks @sting8k for PR #8. - Surfaced MCP connection failure reasons from bounded stdio diagnostics in status output and the
/mcppanel, with a shortcut to copy the selected failure. Thanks @parkuman for PR #197. - Added Codex MCP imports from
.codex/config.toml, with fallback to the existing JSON config. Thanks @npo-mmenke for PR #31. - Added explicit OpenCode V1 MCP imports from global and project
opencode.jsonfiles, including nested config merging and environment interpolation. Thanks @NicoAvanzDev for PR #25. - Added environment-variable interpolation for HTTP MCP server URLs, with missing URL variables failing closed before requests are sent. Thanks @ozeias for PR #206.
- Added
settings.oauthDirto store MCP OAuth credentials in a project-specific directory, withMCP_OAUTH_DIRstill taking precedence. Thanks @Termina1 for PR #105. - Added
lazy-keep-alivelifecycle mode for MCP servers that should start on first use and then stay resident with health-check reconnects. Thanks @ricardoraposo for PR #143. - Added
MCP_UI_VIEWER=none/off/disabledto suppress MCP UI browser or Glimpse windows while keeping inline tool results available. Thanks @stevekrouse for PR #172. - Surfaced MCP server
instructionsfrom the initialize handshake: captured at connect time, cached alongside tool metadata, shown as a truncated head in themcpproxy tool description, previewed inmcp({ server: "name" })listings, and available in full via the newmcp({ instructions: "name" })mode. Thanks @JeongJuhyeon for issue #188 and PR #189. - Added
createMcpAdapter({ config, configPath })for isolated SDK configuration and file-path overrides. Thanks @Cansiny0320 for PR #86.
Changed
- Removed stale hot-loaded direct tools from Pi's registry when
pi.unregisterTool()is available, while preserving active-tool deactivation fallback for older Pi hosts. - Deferred loading the regex safety checker until regex search is used, improving startup time. Thanks @kaushikgopal for PR #175.
- Declared Pi host packages as optional peer dependencies with exact development pins, reducing extension install footprint and avoiding host version conflicts. Thanks @t0dorakis for PR #200.
Fixed
- Started MCP initialization at extension load when any server is configured with
lifecycle: "eager"or"keep-alive", so hosts that drive Pi programmatically withoutsession_startstill connect startup servers. Thanks Brian Gebel (@ductiletoaster) for PR #170. - Enforced normalized standard
_meta.ui.cspand OpenAI-compatible_meta["openai/widgetCSP"]metadata with response headers while preserving provider HTML. Thanks @IdoHadar for PR #195. - Avoided MCP renderer crashes without a TUI theme and preserved status-bar updates with plain fallback text. Thanks @fankangsong for PR #183.
- Abandoned MCP initialization quietly when a session is disposed during eager or keep-alive connection setup. Thanks @luisfontes for PR #192.
- Fenced MCP runtime ownership across Pi reloads so stale callbacks and late connections cannot outlive their session. Thanks @uuunk (Paul Lorsbach) for PR #202.
- Added
toolPrefix: "mcp"support formcp__<server>_<tool>names across direct and proxy MCP tool paths. Thanks @riicodespretty for PR #99. - Sanitized dotted MCP tool names before registering them with Pi. Thanks @benjaminrickels for PR #190.
- Reconnected OAuth MCP servers automatically after successful panel or
/mcp-authauthorization, and made panel reconnect force a fresh connection like/mcp reconnect. Thanks @mightymatth for issue #171. - Recovered stale Streamable HTTP MCP sessions that report
-32000 Server not initializedafter a server restart. Thanks @vicary for issue #184. - Kept npm cache lookups working on Windows by resolving
npmthroughcross-spawn. Thanks @zeyadhost for PR #201. - Kept direct MCP tool registration working when a host TypeBox shim does not expose
Type.Unsafe. Thanks @RaviTharuma for PR #198. - Kept exact
npxpackage specs from reusing a different same-name package version from npm's_npxcache. Thanks @danhrahal for issue #178. - Kept POST-only Streamable HTTP servers on the Streamable HTTP transport when the optional GET stream returns 405. Thanks @ramhaidar for issue #204.
- Kept manual OAuth
auth-start/auth-completeflows from being invalidated by keep-alive health checks, and made reserved manual callback states show a manual completion page instead of a CSRF error. Thanks @oozle for issue #207. - Accepted object-valued
mcp.argsin addition to JSON strings, avoiding double-encoded tool arguments while preserving provider-compatible string calls. Thanks @johnny-smitherson for issue #205. - Collapsed long single-line MCP results according to terminal-wrapped visual lines. Thanks @xz-dev for PR #181 and @maxpaulus43 for PR #177.
- Recovered Streamable HTTP MCP sessions after a server restart invalidates the previous session ID. Thanks @damselem for PR #194.
- Used server-advertised OAuth protected-resource metadata during authorization so resource servers can point Pi at the correct authorization server. Thanks @jameswarren for issue #173 and PR #174.
- Dropped inherited HTTP auth when a higher-precedence MCP config repoints a server URL, while preserving explicit OAuth disable flags. Thanks @ductiletoaster for PR #182.