Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 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
c1ea06b
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 29, 2026
e63ef8d
fix atlas hash
walker-tx Jan 30, 2026
a512069
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Jan 30, 2026
cfa3e75
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 2, 2026
7d1b3f9
use gram_session cookie in playground to fetch auth header
walker-tx Feb 2, 2026
6b34a53
reconcile schema.sql with main
walker-tx Feb 2, 2026
3957669
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 2, 2026
2a5b7bf
refactor migrations out of this branch
walker-tx Feb 2, 2026
33f6f11
feat: add external OAuth API support for playground
walker-tx Feb 2, 2026
7dc060f
remove unneeded comment
walker-tx Feb 3, 2026
9f330ee
refactor usage of smith prt package out
walker-tx Feb 3, 2026
4306574
remove timestamp and string helper funcs
walker-tx Feb 3, 2026
6ff3d10
use o11y.logdefer
walker-tx Feb 3, 2026
ee4fd28
use encryption client in lieu of interface
walker-tx Feb 3, 2026
87e12c0
move auth url creation above state storage
walker-tx Feb 3, 2026
5fa7a69
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 3, 2026
77c7e6c
remove unneeded comment
walker-tx Feb 3, 2026
bcbf23f
refactor usage of smith prt package out
walker-tx Feb 3, 2026
aea3aee
remove timestamp and string helper funcs
walker-tx Feb 3, 2026
f1b4028
use o11y.logdefer
walker-tx Feb 3, 2026
338e4b0
use encryption client in lieu of interface
walker-tx Feb 3, 2026
91e1895
move auth url creation above state storage
walker-tx Feb 3, 2026
6ac3c99
clean up auth and project id implementations
walker-tx Feb 3, 2026
041f0cf
refactor external-oauth auth and project discovery
walker-tx Feb 3, 2026
5927f40
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 3, 2026
8dac882
update oauth success styling
walker-tx Feb 3, 2026
23f1b66
Merge github.com:speakeasy-api/gram into feat/oauth-support-in-elements
walker-tx Feb 3, 2026
987598f
Merge remote-tracking branch 'origin/feat/oauth-support-in-playground…
walker-tx Feb 3, 2026
5243ddc
update hosted oauth success page
walker-tx Feb 3, 2026
75355ba
allow configuration of allowed redirect domains
walker-tx Feb 3, 2026
c923892
Merge branch 'feat/oauth-support-in-playground-api' into feat/oauth-s…
walker-tx Feb 3, 2026
8103044
Merge remote-tracking branch 'origin' into feat/oauth-support-in-elem…
walker-tx Feb 3, 2026
5907747
conditionally render chat based on oauth status
walker-tx Feb 3, 2026
7f355ab
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 4, 2026
26c5f6e
update api to index external mcp oauth tokens using toolset_id
walker-tx Feb 4, 2026
cd590df
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 4, 2026
679fab5
Merge branch 'feat/oauth-support-in-playground-api' into feat/oauth-s…
walker-tx Feb 4, 2026
6575516
update mcp/impl for new indexing
walker-tx Feb 4, 2026
a11c3f9
remove issuer requirement for status endpoint
walker-tx Feb 4, 2026
632f41f
Merge branch 'feat/oauth-support-in-playground-api' into feat/oauth-s…
walker-tx Feb 4, 2026
8a17d72
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 4, 2026
010d711
de-duplicate mcp oauth status fetching
walker-tx Feb 4, 2026
3fbb740
restore Elements.tsx to main branch
walker-tx Feb 4, 2026
bca8d84
fix elements errors
walker-tx Feb 4, 2026
c1bd1cb
remove "legacy" external oauth ui
walker-tx Feb 4, 2026
58df04a
removing frivelous sort re-orders
walker-tx Feb 4, 2026
e09f722
remove oauth page preview script
walker-tx Feb 4, 2026
7e58884
remove unused types
walker-tx Feb 4, 2026
e7d1443
fix up build errors due to vite config
walker-tx Feb 4, 2026
dcdb3ce
still trying to fix vite in CI
walker-tx Feb 4, 2026
bfa92fb
more vite fixes
walker-tx Feb 4, 2026
ee493e4
fix linting
walker-tx Feb 4, 2026
c7774a9
Merge branch 'main' of github.com:speakeasy-api/gram into feat/oauth-…
walker-tx Feb 4, 2026
9bcee86
remove elements changes
walker-tx Feb 4, 2026
57d8236
remove unneeded pnpm file changes
walker-tx Feb 4, 2026
24d0d2f
Add OAuth support for external MCP servers
walker-tx Feb 4, 2026
2e8ff2b
Update client/dashboard/src/pages/playground/PlaygroundAuth.tsx
walker-tx Feb 4, 2026
62d1b9e
check window.location matches apiUrl before sending redirect_uri
walker-tx Feb 4, 2026
2320534
Merge branch 'feat/oauth-support-in-elements' of github.com:speakeasy…
walker-tx Feb 4, 2026
97f343f
remove outdated comment
walker-tx Feb 4, 2026
7ca2e14
add AuthenticateWithCookie helper
walker-tx Feb 4, 2026
3a3757d
update comments
walker-tx Feb 4, 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
7 changes: 7 additions & 0 deletions .changeset/brown-guests-clean.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"dashboard": patch
"@gram/client": patch
"server": patch
---

feat: add OAuth support for external MCP servers in the Playground
20 changes: 20 additions & 0 deletions client/dashboard/src/pages/playground/Playground.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export default function Playground() {
function PlaygroundInner() {
const [searchParams] = useSearchParams();
const chat = useChatContext();
const routes = useRoutes();

const [selectedToolset, setSelectedToolset] = useState<string | null>(
searchParams.get("toolset") ?? null,
Expand All @@ -63,6 +64,9 @@ function PlaygroundInner() {
Record<string, string>
>({});

const { data: toolsetsData } = useListToolsets();
const toolsets = toolsetsData?.toolsets;

// We use a ref so that we can hot-swap the toolset and environment without causing a re-render
const chatConfigRef = useRef({
toolsetSlug: selectedToolset,
Expand All @@ -83,6 +87,22 @@ function PlaygroundInner() {
environmentSlug: selectedEnvironment ?? "",
});

// If toolsets have loaded and there are none, show full-page empty state
if (toolsets !== undefined && toolsets.length === 0) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (toolsets !== undefined && toolsets.length === 0) {
if (!toolsets) {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An empty array still evaluates to true.

const toolset: any[] = [];

console.log(!toolset) // false

return (
<Page>
<Page.Header>
<Page.Header.Breadcrumbs fullWidth />
</Page.Header>
<Page.Body>
<div className="h-full flex m-8">
<ToolsetsEmptyState onCreateToolset={() => routes.mcp.goTo()} />
</div>
</Page.Body>
</Page>
);
}

const logsButton = (
<Button size="sm" variant="ghost" onClick={() => setShowLogs(!showLogs)}>
<ScrollTextIcon className="size-4 mr-2" />
Expand Down
Loading
Loading