Skip to content
Draft
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e0d8c92
feat(elements): add OAuth 2.1 support for external MCP servers
simplesagar Jan 21, 2026
529c35d
feat(dashboard): add OAuth connection UI to Playground sidebar
simplesagar Jan 21, 2026
d062a85
fix(dashboard): use Loader2 instead of non-existent Spinner
simplesagar Jan 21, 2026
24503b6
feat(playground): add MCP OAuth discovery support
simplesagar Jan 21, 2026
b478aaf
feat(oauth): implement MCP OAuth 2.1 with Dynamic Client Registration
simplesagar Jan 21, 2026
e5fdaf3
fix(playground): auto-refresh OAuth status after popup closes
simplesagar Jan 21, 2026
5fd0741
feat(oauth): add debug logging for OAuth status checks
simplesagar Jan 21, 2026
23bb72f
fix(oauth): show success page instead of full dashboard in OAuth popup
simplesagar Jan 21, 2026
f249e2b
Merge github.com:speakeasy-api/gram into feat/oauth-support-in-elements
walker-tx Jan 27, 2026
7c353dc
fix condition that always resulted in throw
walker-tx Jan 28, 2026
a0f547e
hoist oauth handling for external mcp servers up to app level in
walker-tx Jan 28, 2026
ecc14be
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 28, 2026
97b7212
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 28, 2026
70a853d
regen sdk
walker-tx Jan 28, 2026
b68c66e
format fix
walker-tx Jan 28, 2026
9546613
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 29, 2026
30c0938
remove duplicate code
walker-tx Jan 29, 2026
2ac20cc
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 29, 2026
d0c068f
regen sdk
walker-tx Jan 29, 2026
1e50cef
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 29, 2026
57366c8
reload mcp once oauth flow finishes
walker-tx Jan 29, 2026
6561a18
fix toolset.get requests when no slug is present
walker-tx Jan 29, 2026
8e75719
remove constant query key
walker-tx Jan 29, 2026
8cab7c8
add a prefix to oauthToken querykey
walker-tx Jan 29, 2026
494f573
validate redirect uris
walker-tx Jan 29, 2026
737de34
belt and suspenders for redirect validation
walker-tx Jan 29, 2026
d946de8
break hosted page into its own template file
walker-tx Jan 29, 2026
e2efd16
fix the empty state for playground page
walker-tx Jan 29, 2026
3423d10
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 29, 2026
27cf3e8
correct empty state render conditions
walker-tx Jan 29, 2026
aee8ce8
invalidate oauthToken upon disconnect
walker-tx Jan 29, 2026
68da726
spawn oauth popup in center of browser window
walker-tx Jan 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions client/dashboard/src/pages/playground/Playground.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
useInstance,
useListEnvironments,
useListToolsets,
useToolset,
useUpdateToolsetMutation,
} from "@gram/client/react-query/index.js";
import { ResizablePanel } from "@speakeasy-api/moonshine";
Expand Down Expand Up @@ -184,6 +185,13 @@ export function ToolsetPanel({

const toolset = toolsets?.find((toolset) => toolset.slug === selectedToolset);

// Fetch full toolset data (includes OAuth info from external MCP tools)
const { data: fullToolsetData } = useToolset(
{ slug: selectedToolset ?? "" },
undefined,
{ enabled: !!selectedToolset },
);

const environmentData = useEnvironment(selectedEnvironment ?? undefined);

// Fetch instance data to get tools
Expand Down Expand Up @@ -394,10 +402,14 @@ export function ToolsetPanel({
</Select>
}
authSettings={
toolset && environmentData ? (
fullToolsetData && environmentData ? (
<PlaygroundAuth
// eslint-disable-next-line @typescript-eslint/no-explicit-any
toolset={toolset as any}
toolset={{
...fullToolsetData,
// Map SDK's `tools` to `rawTools` for compatibility with Toolset type
rawTools: fullToolsetData.tools ?? [],
tools: asTools(fullToolsetData.tools ?? []),
}}
environment={{
slug: environmentData.slug,
entries: environmentData.entries?.map((e) => ({
Expand Down
Loading