diff --git a/mcp-server/src/index.ts b/mcp-server/src/index.ts index c7e7b26..8bb0d60 100644 --- a/mcp-server/src/index.ts +++ b/mcp-server/src/index.ts @@ -28,6 +28,7 @@ export const clientSettings = { integrationName: integrationName, apiKey: process.env.AMPERSAND_API_KEY || '', groupRef: groupRef, + providerWorkspaceRef: '', // Optional workspace reference for multi-workspace providers }; export type ClientSettings = typeof clientSettings; diff --git a/mcp-server/src/oauth.ts b/mcp-server/src/oauth.ts index 805d2f5..5776e29 100644 --- a/mcp-server/src/oauth.ts +++ b/mcp-server/src/oauth.ts @@ -2,6 +2,7 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { providerSchema } from './schemas'; import { ClientSettings } from '.'; import crypto from 'crypto'; +import { z } from 'zod'; export async function createStartOAuthTool( server: Server, @@ -13,13 +14,25 @@ export async function createStartOAuthTool( `Connect to a SaaS tool provider using the Ampersand OAuth flow. The tool will return a clickable link to the OAuth flow for the user to click.`, { provider: providerSchema, + providerWorkspaceRef: z + .string() + .optional() + .describe('Optional workspace reference for multi-workspace providers'), }, - async ({ provider }: { provider: string }) => { + async ({ + provider, + providerWorkspaceRef, + }: { + provider: string; + providerWorkspaceRef?: string; + }) => { let oAuthUrl = ''; try { const consumerRef = crypto.randomUUID(); const groupRef = settings?.groupRef || process.env.AMPERSAND_GROUP_REF; const projectId = settings?.project || process.env.AMPERSAND_PROJECT_ID; + const finalProviderWorkspaceRef = + settings?.providerWorkspaceRef || providerWorkspaceRef; const apiKey = settings?.apiKey || ''; const options: RequestInit = { method: 'POST', @@ -27,7 +40,15 @@ export async function createStartOAuthTool( 'Content-Type': 'application/json', 'X-Api-Key': apiKey, }, - body: JSON.stringify({ provider, consumerRef, groupRef, projectId }), + body: JSON.stringify({ + provider, + consumerRef, + groupRef, + projectId, + ...(finalProviderWorkspaceRef && { + providerWorkspaceRef: finalProviderWorkspaceRef, + }), + }), }; console.log( '[START-OAUTH] API request to oauthConnect: ', diff --git a/sdk/lib/adapters/mcp.ts b/sdk/lib/adapters/mcp.ts index 2b1e3d8..434a476 100644 --- a/sdk/lib/adapters/mcp.ts +++ b/sdk/lib/adapters/mcp.ts @@ -43,6 +43,7 @@ type ClientSettings = { integrationName: string; apiKey: string; groupRef: string; + providerWorkspaceRef?: string; }; /** @@ -310,13 +311,15 @@ export const createStartOAuthTool = async ( startOAuthToolDescription, startOAuthInputSchema.shape, async (params: StartOAuthInputType): Promise => { - const { provider, groupRef, consumerRef } = params; + const { provider, groupRef, consumerRef, providerWorkspaceRef } = params; const finalConsumerRef = consumerRef || Math.random().toString(36).substring(2, 15); const finalGroupRef = settings?.groupRef || groupRef || ''; const projectId = settings?.project || process.env.AMPERSAND_PROJECT_ID || ''; - let url = ''; + const finalProviderWorkspaceRef = + settings?.providerWorkspaceRef || providerWorkspaceRef; + try { const response = await fetch( 'https://api.withampersand.com/v1/oauth-connect', @@ -328,10 +331,13 @@ export const createStartOAuthTool = async ( consumerRef: finalConsumerRef, groupRef: finalGroupRef, projectId, + ...(finalProviderWorkspaceRef && { + providerWorkspaceRef: finalProviderWorkspaceRef, + }), }), }, ); - url = await response.text(); + const url = await response.text(); return { content: [ {