diff --git a/packages/mcp-server-supabase/src/content-api/graphql.ts b/packages/mcp-server-supabase/src/content-api/graphql.ts index bb3a4d9..b286cfb 100644 --- a/packages/mcp-server-supabase/src/content-api/graphql.ts +++ b/packages/mcp-server-supabase/src/content-api/graphql.ts @@ -149,6 +149,13 @@ export class GraphQLClient { } } + /** + * Sets the User-Agent header for all requests. + */ + setUserAgent(userAgent: string) { + this.#headers['User-Agent'] = userAgent; + } + /** * Executes a GraphQL query against the provided URL. * diff --git a/packages/mcp-server-supabase/src/content-api/index.ts b/packages/mcp-server-supabase/src/content-api/index.ts index 767597c..937bcc8 100644 --- a/packages/mcp-server-supabase/src/content-api/index.ts +++ b/packages/mcp-server-supabase/src/content-api/index.ts @@ -8,6 +8,7 @@ const contentApiSchemaResponseSchema = z.object({ export type ContentApiClient = { schema: string; query: QueryFn; + setUserAgent: (userAgent: string) => void; }; export async function createContentApiClient( @@ -32,5 +33,8 @@ export async function createContentApiClient( async query(request: GraphQLRequest) { return graphqlClient.query(request); }, + setUserAgent(userAgent: string) { + graphqlClient.setUserAgent(userAgent); + }, }; } diff --git a/packages/mcp-server-supabase/src/server.ts b/packages/mcp-server-supabase/src/server.ts index 8f713a5..c0f2ff9 100644 --- a/packages/mcp-server-supabase/src/server.ts +++ b/packages/mcp-server-supabase/src/server.ts @@ -92,7 +92,9 @@ export function createSupabaseMcpServer(options: SupabaseMcpServerOptions) { contentApiUrl = 'https://supabase.com/docs/api/graphql', } = options; - const contentApiClientPromise = createContentApiClient(contentApiUrl); + const contentApiClientPromise = createContentApiClient(contentApiUrl, { + 'User-Agent': `supabase-mcp/${version}`, + }); const enabledFeatures = z .set(featureGroupSchema) @@ -104,7 +106,15 @@ export function createSupabaseMcpServer(options: SupabaseMcpServerOptions) { async onInitialize(info) { // Note: in stateless HTTP mode, `onInitialize` will not always be called // so we cannot rely on it for initialization. It's still useful for telemetry. - await platform.init?.(info); + const { clientInfo } = info; + const userAgent = `supabase-mcp/${version} (${clientInfo.name}/${clientInfo.version})`; + + await Promise.all([ + platform.init?.(info), + contentApiClientPromise.then((client) => + client.setUserAgent(userAgent) + ), + ]); }, tools: async () => { const contentApiClient = await contentApiClientPromise;