Webhooks catalog, collections RBAC, and team invitations
This release introduces a typed webhooks catalog for audit log events, enforces RBAC on the collections API, normalizes risk finding identifiers across scanners, and ships a DB-backed team invitation flow with trusted domain guards.
Features
- Webhooks catalog #2905 - The webhooks feature now generates a catalog of event types and schemas. The catalog is emitted as an OpenAPI 3.1 document that is synced to Svix. (Author: @disintegrator )
- Granular per-subject audit log webhook events #2927 - Each auditable subject (deployments, projects, MCP servers, API keys, toolsets, risk policies, sessions, and more) now emits its own typed webhook event (for example,
audit_log.deployment_event_v1), enabling subscribers to filter by subject domain rather than receiving all audit activity under a single event type. (Author: @disintegrator ) - RBAC on collections API #2892 -
ListandListServersnow requireorg:read;Create,Update,Delete,AttachServer, andDetachServerrequireorg:admin. The dashboard’s sidebar, collections list, and detail pages open up toorg:readmembers, while create, edit, delete, and server attach and detach controls stay behindorg:admin. (Author: @subomi ) - Audit log collection mutations #2914 - Emits audit log entries for collection mutations:
mcp_collection:create,:update,:delete,:attach_server, and:detach_server. Update, AttachServer, and DetachServer now run in a transaction alongside the audit insert, and a newurn.McpCollectionidentifier (prefixmcp_collection) is used as the audit subject. (Author: @subomi ) - Team invitations with trusted domain guards #2896 - Adds RBAC and assigned roles on pending organization invites, lets org admins change the role before acceptance, and emits audit log entries for invite creation and role changes. Invite acceptance now uses Gram invite tokens plus WorkOS User Management Magic Auth codes — the server validates the invite token, creates and consumes the Magic Auth code for the invited email, verifies the email match, and completes provisioning. (Author: @ThomasRooney )
- Normalized risk finding identifiers #2855 -
RiskResult.rule_idandRiskResult.descriptionnow follow a consistent shape across every detection source.rule_idis lowercase, snake_case, with an optional dot-separated category prefix (for example,secret.<rule>,pii.credit_card,shadow_mcp,destructive.shell.rm_rf,prompt_injection).(source, rule_id)is the stable identifier downstream consumers should match on, anddescriptionis a short human-readable sentence that never echoes the matched value. (Author: @mfbx9da4 ) - Remote MCP interceptor payload mutation #2757 - Adds support for remote MCP interceptor payload mutation, and implements
shadowmcpandmcp:connectinterceptors. (Author: @bflad ) - Bulk install all servers in a collection #2899 - Adds an Install All button to the collection detail page for bulk server installation. (Author: @subomi )
- Improved trace session detail UX #2864 - Adds filtering and a clearer presentation for trace entries. (Author: @alx-xo )
Bug fixes
- Drop IPv6 short-form and IPv4 unspecified false positives #2915 - Drops Presidio
IP_ADDRESSfalse positives produced from short-form IPv6 strings (b::,dead::,1::) and IPv4 unspecified0.0.0.0. Analysis of prodrisk_resultsshowed these single-hex-group<hex>::matches dominatedIP_ADDRESSnoise alongside the existing::filter; they are now dropped before becoming findings. (Author: @mfbx9da4 ) - Exclude plugin download key creation from audit log #2760 - Excludes per-request plugin download API key creation from the audit log to prevent flooding with
api_key:createevents. (Author: @bradcypert ) - Skip WorkOS reads when org is linked locally #2844 - Skips WorkOS reads when the org is already linked locally, removing redundant lookups on the auth path. (Author: @bflad )
- Filter already-added toolsets from plugin add-server dialog #2904 - Filters the plugin Add Server dialog to exclude toolsets already attached to the plugin, preventing duplicate entries. (Author: @bradcypert )
- Credits-exhausted message in chat #2921 - Shows a graceful message in AI Insights and the Playground when an organization runs out of chat credits. Previously the chat would silently stop streaming on a 402 from the gateway because the AI SDK masks stream errors by default. The thread now renders a clear credit-limit message, and the new
describeStreamErrorandCREDITS_EXHAUSTED_MESSAGEexports are available on@gram-ai/elementsfor downstream consumers that want to react to the same condition. (Author: @simplesagar )