Remote MCP source management and observability hook reliability
This release adds the initial UI and APIs for managing custom remote MCP sources, plus reliability fixes for the observability plugin hook flow and Claude Code plugin caching.
Features
- Remote MCP source management UI and APIs #2608 - Adds the initial Remote MCP source management UI under the
gram-remote-mcpfeature flag, with a Custom remote server entry in the Add Source dropdown, a URL-only create form, and a detail page covering Overview, MCP Servers, and Settings tabs. Also addsremoteMcp.verifyURLfor probing a candidate remote MCP server URL via an MCPinitializerequest, plusremote_mcp_server_idandtoolset_idfilter parameters onmcpServers.list. Renames the existing Third party server entry to Registry server. (Author: @bflad )
Bug fixes
- Observability hook event flags and error handling #2682 - Fixes generated observability plugin hooks not firing correctly in production. Hook events now carry explicit
asyncflags matching the public Gram plugin (falsefor blocking events likePreToolUseandUserPromptSubmit,truefor fire-and-forget events likeStopandPostToolUse). The generatedhook.shscript now captures the HTTP response body and status code separately and exits with code 2 on 4xx/5xx so an unreachable Gram server cannot silently bypass blocking policies. (Author: @bradcypert ) - Claude Code plugin caching across sessions #2697 - Fixes Claude Code plugins not loading after restart. The marketplace URL returned by
getPublishStatusnow points directly at the git proxy (/marketplace/p/{token}.git) and the install instructions emit"source": "git"in theextraKnownMarketplacessnippet, which Claude Code caches reliably between sessions. The URL-based manifest endpoint and its rewrite logic have been removed. (Author: @bradcypert ) - RBAC dev toolbar environment scope toggle #2684 - Fixes a crash in the RBAC dev toolbar when toggling
environment:readorenvironment:writefor the first time. HardenstoggleScopeandsetScopeResourcesto materialize a known-good baseline before spreading, and adds a defensive!= nullguard at the render site so legacy malformed localStorage state cannot crash either. (Author: @simplesagar )