Repository navigation
server@2.20.0
Minor Changes
-
1ae1678: The Access Hub catalog now offers Claude Tag. Its card opens a page listing the access allowed under the platform, and Register new access opens a guided setup that asks only for the Anthropic organization ID, an agent and optional tags, then trusts the platform and allows every channel in that organization in one step. Catalog platforms and their setup steps are YAML files shipped with the server, validated when loaded, and served by the new
workloadIdentities.listPlatformsmethod, which requiresworkload:read.The Claude Tag setup links to Claude Tag's federated access settings and to where the Anthropic organization ID is found, can create an agent inline (named Claude Tag by default), and walks through the two Anthropic console dialogs as a checklist: each console field with the value to paste or what to do, and a checkbox to tick off as the operator goes. Definitions place these rows with the new
checklist_itemblock. The setup no longer warns that the access rule admits more than one identity, since the operator cannot change that for a catalog platform. -
31aacf8: Staff can see every paying customer's estimated usage on one admin page. Customer usage, under Platform management, shows each customer's estimated cost over time in a grid of cards, bucketed by that customer's own billing cycle, with this cycle's spend, the change against the same point last cycle, and the product breakdown. Search, plan filter, sort, product selection, interval, and the cumulative toggle apply to every card and are kept in the URL.
-
1ae1678: The Access Hub's guided setup now shows the token endpoint, issuer and MCP host an external platform is pointed at. A dropdown lists every user session issuer in shared mode, at the organization level and in each project, by slug, and the values shown are that issuer's
/oauth/usi/{id}authorization server. They come from the newworkloadIdentities.listTokenEndpointsmethod, which requiresworkload:readand derives them exactly as the shared authorization server's own metadata does. -
48217fd: Add
remoteMcp.getServerScopesandremoteMcp.setServerScopePinso a remote-backed MCP server's protected resource scope pin can be read and set, including servers whose resource was never discovered. The pin is shared by every server in the project with the same upstream URL, so both endpoints require write access to all of them. The read reports what a login through each bound client would request now and whether the pin applies to it.Add a "Pinned scopes" picker under the connected identity provider on a Remote MCP server's Identity settings, showing whether the pin is used for that connection; it is read-only for organizations without resource scope discovery unless a pin needs clearing. Saving only header or pin edits no longer re-commits the connected client.
-
3ee542c: Organization admins can set a remote identity provider to send no scope instead of its whole supported list when a sign-in has no other scope source. The provider's Overview, Settings and the admin issuer and server health views show the setting. The issuer scope override is now chosen from a picker of the provider's supported scopes.
-
ef793bd: Added
hooks.getStatus, a project-read endpoint that reports whether hook telemetry is configured for the project: an active hooks-scoped API key bound to the project or organization-wide, or an enabled Anthropic inference hooks integration for the project. It reads configuration only and never hook traffic, so the dashboard can consult it on every policy edit. -
ddd2073: Okta connections installed from the Okta Integration Network can authenticate with a client ID and client secret. Admins can choose the installation method, submit credentials, and replace the secret from the dashboard. A pending connection can switch between the two methods until its client ID is submitted, reusing one signing key. Token acquisition respects credential revocation and preserves observed DPoP binding across worker restarts.
-
dfe18bd: Rename the request headers and environment variables customers set to Speakeasy AI names. Every Gram name keeps working as a deprecated alias.
- Request headers: the API accepts
Speakeasy-AI-Key,Speakeasy-AI-Project,Speakeasy-AI-Session,Speakeasy-AI-Chat-Session,Speakeasy-AI-Environment,Speakeasy-AI-Mode,Speakeasy-AI-User-EmailandSpeakeasy-AI-Device-Serial,-Hostnameand-Environment. Each is the canonical name of theGram-*header it replaces, and wins when a request sends both. LiteLLM ingest also readsspeakeasy-ai-session-idandspeakeasy-ai-agent-provider,-session-idand-turn-idbefore thex-gram-*names. - Hooks:
speakeasy-hooksreads every setting fromSPEAKEASY_AI_HOOKS_*, for exampleSPEAKEASY_AI_HOOKS_API_KEY, and falls back to the matchingGRAM_HOOKS_*name when the new one is unset. The plugin bootstrap readsSPEAKEASY_AI_HOOKS_HOMEbeforeGRAM_HOOKS_HOME. New credential caches go to$XDG_CONFIG_HOME/speakeasy-ai/hooks-auth.env; an existing cache at$XDG_CONFIG_HOME/gram/hooks-auth.envstays in use. - Generated plugins: Cursor, OpenCode and Codex plugins read the API key from
SPEAKEASY_AI_API_KEY, and Claude Code plugins prompt for it under that name. These configs cannot fall back to another variable, so setSPEAKEASY_AI_API_KEYafter the plugins update. Codex telemetry and the OpenCode LiteLLM attribution use the new header names. - Install snippets: the hosted MCP install page, the dashboard setup, hooks and LiteLLM pages, and the SDK samples show only the new names. The MCP install page uses
Speakeasy-AI-EnvironmentwithSPEAKEASY_AI_ENVIRONMENTandSPEAKEASY_AI_API_KEY. - Elements: the
environmentSlugoption replacesgramEnvironment, which still works whenenvironmentSlugis not set.
- Request headers: the API accepts
Patch Changes
- ec301bc: Remote-session logins now request the scopes their protected resource asks for — the client's scope, else the resource's last challenge, else an operator pin on the resource, else the resource's live RFC 9728
scopes_supported— before falling back to the issuer's override or catalogue. The new order rolls out behind the PostHog organization flagremote-session-live-resource-scopes; with the flag off, the issuer's scope override still beats a client's own scope, as before. The issueromit_scope_fallbacksetting and the resource scope pin have no API yet and are set via SQL. - bceb491: Fix the Anthropic Compliance import missing messages added to a Claude chat after its first import. The importer treated
claude_chat_updatedactivities as the signal that a chat had new messages, but Anthropic records that activity for metadata edits only (name, model) and the activity feed has no message-level activity, so a chat was imported once and never revisited. Theanthropic_complianceschedule now walks the org-wide chat list ordered byupdated_at, which Anthropic documents as the way to pick up chats with new messages, and window-polls the activity feed forclaude_chat_createdonly to classify new chats as Claude web or desktop. Saving the integration now also probes the chat list, so a key without chat content access is refused at save time. Existing integrations restart from a bounded 24-hour window on their next poll; replays are idempotent. - 3620759: Keep the Anthropic Compliance import running when one Claude chat's content is no longer retrievable. Anthropic answers 404 for chats hard-deleted through the Compliance API or by retention while the activity feed and the chat list can still name them. The importer now skips such a chat and reports it as unavailable instead of failing the whole poll, which previously stalled the integration on that chat and counted toward auto-pause.
- ca2a2c2: Bound batch risk scan inputs to 50 KiB when they are loaded, so one oversized message no longer fails its whole analysis batch.
- bf20d80: Claude Code installs now use one settings snippet instead of CLI commands. Pick Just me (
~/.claude/settings.json) or My organization (managed settings). The snippet registers the marketplace under its exact name withautoUpdateon and enables the plugin, so plugins stay current with no manual step. The generated marketplace READMEs match, and the hooks setup dialog no longer uses the unsupportedplugins.requiredkey. - 76a8acb: Serve the hooks@0.3.34 binary to hook installations. Previously pinned releases stay available so installations that have not regenerated their bootstrap script can still install.
- 76a8acb: Serve the hooks@0.3.35 binary to hook installations. Previously pinned releases stay available so installations that have not regenerated their bootstrap script can still install.
- f03649f: The dashboard now lists tools for remote MCP servers on a custom domain when the upstream server sends its own CORS headers. Before, the browser blocked those responses and the Inspect tab showed "Something went wrong loading tools."
- 35b67b5: User-facing text now names the product Speakeasy instead of Gram across the dashboard, admin dashboard, CLI help and output, server error messages, consent pages, MCP server info, and API descriptions. HTTP header names, environment variables, package names, and code identifiers are unchanged.