diff --git a/apps/docs/public/img/mcp-clients/kiro-dark-icon.svg b/apps/docs/public/img/mcp-clients/kiro-dark-icon.svg
new file mode 100644
index 0000000000000..ef4abd2d85d25
--- /dev/null
+++ b/apps/docs/public/img/mcp-clients/kiro-dark-icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/apps/docs/public/img/mcp-clients/kiro-icon.svg b/apps/docs/public/img/mcp-clients/kiro-icon.svg
new file mode 100644
index 0000000000000..ef4abd2d85d25
--- /dev/null
+++ b/apps/docs/public/img/mcp-clients/kiro-icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/apps/studio/public/img/mcp-clients/kiro-dark-icon.svg b/apps/studio/public/img/mcp-clients/kiro-dark-icon.svg
new file mode 100644
index 0000000000000..ef4abd2d85d25
--- /dev/null
+++ b/apps/studio/public/img/mcp-clients/kiro-dark-icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/apps/studio/public/img/mcp-clients/kiro-icon.svg b/apps/studio/public/img/mcp-clients/kiro-icon.svg
new file mode 100644
index 0000000000000..ef4abd2d85d25
--- /dev/null
+++ b/apps/studio/public/img/mcp-clients/kiro-icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx b/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx
index 6697da68b1c65..c476dcf5fd5f4 100644
--- a/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx
+++ b/packages/ui-patterns/src/McpUrlBuilder/McpConfigPanel.tsx
@@ -129,6 +129,7 @@ export function McpConfigPanel({
clientConfig={clientConfig}
onCopyCallback={onCopyCallback}
onInstallCallback={onInstallCallback}
+ isPlatform={isPlatform}
/>
diff --git a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx
index dcc4a81de1f28..c72efd5455848 100644
--- a/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx
+++ b/packages/ui-patterns/src/McpUrlBuilder/components/McpConfigurationDisplay.tsx
@@ -17,6 +17,7 @@ interface McpConfigurationDisplayProps {
basePath: string
onCopyCallback: (type?: McpOnCopyCallback) => void
onInstallCallback?: () => void
+ isPlatform?: boolean
}
type ConfigFormat = CodeBlockLang | 'toml'
@@ -29,12 +30,14 @@ export function McpConfigurationDisplay({
basePath,
onCopyCallback,
onInstallCallback,
+ isPlatform,
}: McpConfigurationDisplayProps) {
const mcpButtonData = getMcpButtonData({
basePath,
theme,
client: selectedClient,
clientConfig,
+ isPlatform,
})
// Extract file extension and determine format
@@ -69,7 +72,9 @@ export function McpConfigurationDisplay({
+ <>
+
+ {selectedClient.primaryInstructions
+ ? 'Alternatively, add'
+ : mcpButtonData
+ ? 'Or add'
+ : 'Add'}{' '}
+ this configuration to{' '}
+ {selectedClient.configFile}:
+
+ onCopyCallback?.('config')}
+ />
+ >
)}
- onCopyCallback?.('config')}
- />
-
{selectedClient.alternateInstructions &&
selectedClient.alternateInstructions(clientConfig, onCopyCallback)}
diff --git a/packages/ui-patterns/src/McpUrlBuilder/constants.tsx b/packages/ui-patterns/src/McpUrlBuilder/constants.tsx
index b8d38e495c063..854cd2ec3642c 100644
--- a/packages/ui-patterns/src/McpUrlBuilder/constants.tsx
+++ b/packages/ui-patterns/src/McpUrlBuilder/constants.tsx
@@ -438,6 +438,31 @@ export const MCP_CLIENTS: McpClient[] = [
),
},
+ {
+ key: 'kiro',
+ label: 'Kiro',
+ icon: 'kiro',
+ configFile: '~/.kiro/settings/mcp.json',
+ externalDocsUrl: 'https://kiro.dev/docs/mcp/',
+ generateDeepLink: (_config, options) => {
+ const power = options?.isPlatform ? 'supabase-hosted' : 'supabase-local'
+ return `https://kiro.dev/launch/powers/${power}`
+ },
+ deepLinkDescription: (
+ <>
+ Install the Supabase{' '}
+
+ power
+ {' '}
+ for Kiro. This bundles the Supabase MCP server and steering files for best practices.
+ >
+ ),
+ },
]
export const DEFAULT_MCP_URL_PLATFORM = 'http://localhost:8080/mcp'
diff --git a/packages/ui-patterns/src/McpUrlBuilder/types.ts b/packages/ui-patterns/src/McpUrlBuilder/types.ts
index 6a2dee544244b..92a6913737b77 100644
--- a/packages/ui-patterns/src/McpUrlBuilder/types.ts
+++ b/packages/ui-patterns/src/McpUrlBuilder/types.ts
@@ -6,6 +6,10 @@ export interface McpFeatureGroup {
export type McpOnCopyCallback = 'url' | 'config' | 'command'
+export interface McpClientDeepLinkOptions {
+ isPlatform?: boolean
+}
+
export interface McpClient {
key: string
label: string
@@ -13,8 +17,10 @@ export interface McpClient {
docsUrl?: string
externalDocsUrl?: string
configFile?: string
- generateDeepLink?: (config: McpClientConfig) => string | null
+ generateDeepLink?: (config: McpClientConfig, options?: McpClientDeepLinkOptions) => string | null
transformConfig?: (config: McpClientBaseConfig) => McpClientConfig
+ /** Optional custom description shown above the deep link button generated by generateDeepLink */
+ deepLinkDescription?: React.ReactNode
primaryInstructions?: (
config: McpClientConfig,
onCopy: (type?: McpOnCopyCallback) => void
diff --git a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts
index 098dc8bcaaa77..357db14f09c30 100644
--- a/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts
+++ b/packages/ui-patterns/src/McpUrlBuilder/utils/getMcpButtonData.ts
@@ -5,6 +5,7 @@ interface GetMcpButtonDataOptions {
theme?: 'light' | 'dark'
client: McpClient
clientConfig: McpClientConfig
+ isPlatform?: boolean
}
export function getMcpButtonData({
@@ -12,9 +13,10 @@ export function getMcpButtonData({
theme,
client,
clientConfig,
+ isPlatform,
}: GetMcpButtonDataOptions) {
if (client.generateDeepLink) {
- const deepLink = client.generateDeepLink(clientConfig)
+ const deepLink = client.generateDeepLink(clientConfig, { isPlatform })
if (!deepLink) return null
// If the theme is dark, the button background will be light and vice-versa