@@ -190,7 +191,7 @@ export const InterstitialAccountRow = ({
>
diff --git a/apps/studio/lib/gotrue.test.ts b/apps/studio/lib/gotrue.test.ts
index dc4dca400d0..298a9a84221 100644
--- a/apps/studio/lib/gotrue.test.ts
+++ b/apps/studio/lib/gotrue.test.ts
@@ -4,6 +4,7 @@ import {
buildSignUpReturnPath,
DEFAULT_FALLBACK_PATH,
DEFAULT_SIGNUP_RETURN_PATH,
+ getReturnToPath,
getSignUpReturnTo,
validateReturnTo,
} from './gotrue'
@@ -104,6 +105,26 @@ describe('buildSignUpReturnPath', () => {
})
})
+describe('getReturnToPath', () => {
+ it('rebuilds a nested returnTo path with the params that rode alongside it', () => {
+ // @ts-ignore
+ delete window.location
+ // @ts-ignore
+ window.location = { search: '?ref=abc&name=OPENAI_API_KEY&returnTo=%2Fmcp%2Fsecrets' }
+
+ expect(getReturnToPath()).toBe('/mcp/secrets?ref=abc&name=OPENAI_API_KEY')
+ })
+
+ it('accepts a multi-segment returnTo rather than falling back', () => {
+ // @ts-ignore
+ delete window.location
+ // @ts-ignore
+ window.location = { search: '?returnTo=%2Fmcp%2Fsecrets' }
+
+ expect(getReturnToPath()).toBe('/mcp/secrets')
+ })
+})
+
describe('validateReturnTo', () => {
const fallback = DEFAULT_FALLBACK_PATH
diff --git a/apps/studio/pages/mcp/secrets.tsx b/apps/studio/pages/mcp/secrets.tsx
new file mode 100644
index 00000000000..3570fa90557
--- /dev/null
+++ b/apps/studio/pages/mcp/secrets.tsx
@@ -0,0 +1,21 @@
+import Head from 'next/head'
+
+import { McpSecrets } from '@/components/interfaces/MCP/Secrets/McpSecrets'
+import { withAuth } from '@/hooks/misc/withAuth'
+import { buildStudioPageTitle } from '@/lib/page-title'
+import type { NextPageWithLayout } from '@/types'
+
+const PAGE_TITLE = buildStudioPageTitle({ section: 'Store an API key', brand: 'Supabase' })
+
+const McpSecretsPage: NextPageWithLayout = () => {
+ return (
+ <>
+
+
{PAGE_TITLE}
+
+
+ >
+ )
+}
+
+export default withAuth(McpSecretsPage)
diff --git a/apps/studio/routeTree.gen.ts b/apps/studio/routeTree.gen.ts
index 5525691e471..e79427123ec 100644
--- a/apps/studio/routeTree.gen.ts
+++ b/apps/studio/routeTree.gen.ts
@@ -24,6 +24,7 @@ import { Route as ProjectChar91_Char93RouteImport } from './routes/project.[_]'
import { Route as ProjectRefRouteImport } from './routes/project/$ref'
import { Route as OrgChar91_Char93RouteImport } from './routes/org.[_]'
import { Route as NewSlugRouteImport } from './routes/new/$slug'
+import { Route as McpSecretsRouteImport } from './routes/mcp/secrets'
import { Route as IntegrationsVercelRouteImport } from './routes/integrations/vercel'
import { Route as ApiStatusOverrideRouteImport } from './routes/api/status-override'
import { Route as ApiScopedAccessTokenPermissionsRouteImport } from './routes/api/scoped-access-token-permissions'
@@ -403,6 +404,11 @@ const NewSlugRoute = NewSlugRouteImport.update({
path: '/new/$slug',
getParentRoute: () => rootRouteImport,
} as any)
+const McpSecretsRoute = McpSecretsRouteImport.update({
+ id: '/mcp/secrets',
+ path: '/mcp/secrets',
+ getParentRoute: () => rootRouteImport,
+} as any)
const IntegrationsVercelRoute = IntegrationsVercelRouteImport.update({
id: '/integrations/vercel',
path: '/integrations/vercel',
@@ -2149,6 +2155,7 @@ export interface FileRoutesByFullPath {
'/api/scoped-access-token-permissions': typeof ApiScopedAccessTokenPermissionsRoute
'/api/status-override': typeof ApiStatusOverrideRoute
'/integrations/vercel': typeof IntegrationsVercelRouteWithChildren
+ '/mcp/secrets': typeof McpSecretsRoute
'/new/$slug': typeof NewSlugRoute
'/org/_': typeof OrgChar91_Char93RouteWithChildren
'/project/$ref': typeof ProjectRefRouteWithChildren
@@ -2467,6 +2474,7 @@ export interface FileRoutesByTo {
'/api/scoped-access-token-permissions': typeof ApiScopedAccessTokenPermissionsRoute
'/api/status-override': typeof ApiStatusOverrideRoute
'/integrations/vercel': typeof IntegrationsVercelRouteWithChildren
+ '/mcp/secrets': typeof McpSecretsRoute
'/new/$slug': typeof NewSlugRoute
'/org/_': typeof OrgChar91_Char93RouteWithChildren
'/project/_': typeof ProjectChar91_Char93RouteWithChildren
@@ -2776,6 +2784,7 @@ export interface FileRoutesById {
'/api/scoped-access-token-permissions': typeof ApiScopedAccessTokenPermissionsRoute
'/api/status-override': typeof ApiStatusOverrideRoute
'/integrations/vercel': typeof IntegrationsVercelRouteWithChildren
+ '/mcp/secrets': typeof McpSecretsRoute
'/new/$slug': typeof NewSlugRoute
'/org/_': typeof OrgChar91_Char93RouteWithChildren
'/project/$ref': typeof ProjectRefRouteWithChildren
@@ -3097,6 +3106,7 @@ export interface FileRouteTypes {
| '/api/scoped-access-token-permissions'
| '/api/status-override'
| '/integrations/vercel'
+ | '/mcp/secrets'
| '/new/$slug'
| '/org/_'
| '/project/$ref'
@@ -3415,6 +3425,7 @@ export interface FileRouteTypes {
| '/api/scoped-access-token-permissions'
| '/api/status-override'
| '/integrations/vercel'
+ | '/mcp/secrets'
| '/new/$slug'
| '/org/_'
| '/project/_'
@@ -3723,6 +3734,7 @@ export interface FileRouteTypes {
| '/api/scoped-access-token-permissions'
| '/api/status-override'
| '/integrations/vercel'
+ | '/mcp/secrets'
| '/new/$slug'
| '/org/_'
| '/project/$ref'
@@ -4034,6 +4046,7 @@ export interface RootRouteChildren {
ApiScopedAccessTokenPermissionsRoute: typeof ApiScopedAccessTokenPermissionsRoute
ApiStatusOverrideRoute: typeof ApiStatusOverrideRoute
IntegrationsVercelRoute: typeof IntegrationsVercelRouteWithChildren
+ McpSecretsRoute: typeof McpSecretsRoute
NewSlugRoute: typeof NewSlugRoute
OrgChar91_Char93Route: typeof OrgChar91_Char93RouteWithChildren
ProjectRefRoute: typeof ProjectRefRouteWithChildren
@@ -4238,6 +4251,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof NewSlugRouteImport
parentRoute: typeof rootRouteImport
}
+ '/mcp/secrets': {
+ id: '/mcp/secrets'
+ path: '/mcp/secrets'
+ fullPath: '/mcp/secrets'
+ preLoaderRoute: typeof McpSecretsRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/integrations/vercel': {
id: '/integrations/vercel'
path: '/integrations/vercel'
@@ -7115,6 +7135,7 @@ const rootRouteChildren: RootRouteChildren = {
ApiScopedAccessTokenPermissionsRoute: ApiScopedAccessTokenPermissionsRoute,
ApiStatusOverrideRoute: ApiStatusOverrideRoute,
IntegrationsVercelRoute: IntegrationsVercelRouteWithChildren,
+ McpSecretsRoute: McpSecretsRoute,
NewSlugRoute: NewSlugRoute,
OrgChar91_Char93Route: OrgChar91_Char93RouteWithChildren,
ProjectRefRoute: ProjectRefRouteWithChildren,
diff --git a/apps/studio/routes/mcp/secrets.tsx b/apps/studio/routes/mcp/secrets.tsx
new file mode 100644
index 00000000000..fa284e732ba
--- /dev/null
+++ b/apps/studio/routes/mcp/secrets.tsx
@@ -0,0 +1,11 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import McpSecretsPage from '@/pages/mcp/secrets'
+
+export const Route = createFileRoute('/mcp/secrets')({
+ component: McpSecrets,
+})
+
+function McpSecrets() {
+ return
+}