diff --git a/packages/mcp-server-supabase/package.json b/packages/mcp-server-supabase/package.json index 0c67995..24829f3 100644 --- a/packages/mcp-server-supabase/package.json +++ b/packages/mcp-server-supabase/package.json @@ -50,6 +50,7 @@ "@modelcontextprotocol/sdk": "^1.18.0", "@supabase/mcp-utils": "workspace:^", "common-tags": "^1.8.2", + "gqlmin": "^0.3.1", "graphql": "^16.11.0", "openapi-fetch": "^0.13.5", "zod": "^3.24.1" diff --git a/packages/mcp-server-supabase/src/content-api/index.ts b/packages/mcp-server-supabase/src/content-api/index.ts index b788024..921dbd5 100644 --- a/packages/mcp-server-supabase/src/content-api/index.ts +++ b/packages/mcp-server-supabase/src/content-api/index.ts @@ -1,3 +1,4 @@ +import gqlmin from 'gqlmin'; import { z } from 'zod'; import { GraphQLClient, type GraphQLRequest, type QueryFn } from './graphql.js'; @@ -25,7 +26,8 @@ export async function createContentApiClient( loadSchema: async () => { const response = await graphqlClient.query({ query: '{ schema }' }); const { schema } = contentApiSchemaResponseSchema.parse(response); - return schema; + const minifiedSchema = gqlmin(schema); + return minifiedSchema; }, async query(request: GraphQLRequest) { return graphqlClient.query(request); diff --git a/packages/mcp-server-supabase/src/server.test.ts b/packages/mcp-server-supabase/src/server.test.ts index d20ac9e..6ab0fa8 100644 --- a/packages/mcp-server-supabase/src/server.test.ts +++ b/packages/mcp-server-supabase/src/server.test.ts @@ -5,6 +5,7 @@ import { } from '@modelcontextprotocol/sdk/types.js'; import { StreamTransport } from '@supabase/mcp-utils'; import { codeBlock, stripIndent } from 'common-tags'; +import gqlmin from 'gqlmin'; import { setupServer } from 'msw/node'; import { beforeEach, describe, expect, test } from 'vitest'; import { @@ -2962,7 +2963,8 @@ describe('docs tools', () => { throw new Error('tool description not found'); } - expect(tool.description.includes(contentApiMockSchema)).toBe(true); + const minifiedSchema = gqlmin(contentApiMockSchema); + expect(tool.description.includes(minifiedSchema)).toBe(true); }); test('schema is only loaded when listing tools', async () => { diff --git a/packages/mcp-server-supabase/src/tools/docs-tools.ts b/packages/mcp-server-supabase/src/tools/docs-tools.ts index c03a7e7..4077bea 100644 --- a/packages/mcp-server-supabase/src/tools/docs-tools.ts +++ b/packages/mcp-server-supabase/src/tools/docs-tools.ts @@ -16,7 +16,9 @@ export function getDocsTools({ contentApiClient }: DocsToolsOptions) { return source` Search the Supabase documentation using GraphQL. Must be a valid GraphQL query. You should default to calling this even if you think you already know the answer, since the documentation is always being updated. - Below is the GraphQL schema for the Supabase docs endpoint: + + Below is the GraphQL schema for this tool: + ${schema} `; }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94ada8d..59af84c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,6 +72,9 @@ importers: common-tags: specifier: ^1.8.2 version: 1.8.2 + gqlmin: + specifier: ^0.3.1 + version: 0.3.1 graphql: specifier: ^16.11.0 version: 16.11.0 @@ -824,6 +827,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/moo@0.5.10': + resolution: {integrity: sha512-W6KzyZjXUYpwQfLK1O1UDzqcqYlul+lO7Bt71luyIIyNlOZwJaNeWWdqFs1C/f2hohZvUFHMk6oFNe9Rg48DbA==} + '@types/node@22.17.2': resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} @@ -1240,6 +1246,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + gqlmin@0.3.1: + resolution: {integrity: sha512-UTkeFjVvfdAOyPVCw05WlysiYaelNxjGo/6n+T5fTwUjS4qH1xitdSqVziWlckYONrZvsGoTVSmHQtG//vTNLA==} + hasBin: true + graphql@16.11.0: resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -1424,6 +1434,9 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2538,6 +2551,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/moo@0.5.10': {} + '@types/node@22.17.2': dependencies: undici-types: 6.21.0 @@ -3007,6 +3022,11 @@ snapshots: gopd@1.2.0: {} + gqlmin@0.3.1: + dependencies: + '@types/moo': 0.5.10 + moo: 0.5.2 + graphql@16.11.0: {} has-flag@4.0.0: {} @@ -3166,6 +3186,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + moo@0.5.2: {} + ms@2.1.3: {} msw@2.10.5(@types/node@22.17.2)(typescript@5.9.2):