graphql-agent-toolkit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +369 -0
- package/dist/cli.cjs +574 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +573 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +1726 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +260 -0
- package/dist/index.d.ts +260 -0
- package/dist/index.js +1683 -0
- package/dist/index.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/introspection/fetcher.ts","../src/introspection/parser.ts","../src/operations/variables.ts","../src/operations/builder.ts","../src/mcp/server.ts","../src/mcp/executor.ts","../src/mcp/tool-factory.ts","../src/semantic/tokenizer.ts","../src/semantic/navigator.ts","../src/pagination/handler.ts","../src/summarizer/summarizer.ts","../src/adapters/langchain.ts","../src/adapters/crewai.ts","../src/adapters/vercel-ai.ts","../src/mock/generator.ts"],"sourcesContent":["import { getIntrospectionQuery, type IntrospectionQuery } from 'graphql';\nimport { GraphQLClient } from 'graphql-request';\n\nexport interface FetchSchemaOptions {\n endpoint: string;\n headers?: Record<string, string>;\n}\n\nexport async function fetchSchema(options: FetchSchemaOptions): Promise<IntrospectionQuery> {\n const client = new GraphQLClient(options.endpoint, {\n headers: options.headers,\n });\n\n const query = getIntrospectionQuery();\n\n try {\n const result = await client.request<IntrospectionQuery>(query);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to fetch schema from ${options.endpoint}: ${error.message}`);\n }\n throw new Error(`Failed to fetch schema from ${options.endpoint}: Unknown error`);\n }\n}\n","import type { IntrospectionQuery } from 'graphql';\nimport type { ParsedSchema, SchemaType, SchemaField, SchemaArgument, TypeRef } from '../types/index.js';\n\nfunction convertTypeRef(introspectionType: {\n kind: string;\n name?: string | null;\n ofType?: unknown;\n}): TypeRef {\n return {\n kind: introspectionType.kind as TypeRef['kind'],\n name: introspectionType.name ?? null,\n ofType: introspectionType.ofType\n ? convertTypeRef(\n introspectionType.ofType as { kind: string; name?: string | null; ofType?: unknown },\n )\n : null,\n };\n}\n\nfunction convertArgument(arg: {\n name: string;\n description?: string | null;\n type: { kind: string; name?: string | null; ofType?: unknown };\n defaultValue?: string | null;\n}): SchemaArgument {\n return {\n name: arg.name,\n description: arg.description ?? null,\n type: convertTypeRef(arg.type),\n defaultValue: arg.defaultValue ?? null,\n };\n}\n\nfunction convertField(field: {\n name: string;\n description?: string | null;\n type: { kind: string; name?: string | null; ofType?: unknown };\n args?: readonly {\n name: string;\n description?: string | null;\n type: { kind: string; name?: string | null; ofType?: unknown };\n defaultValue?: string | null;\n }[];\n isDeprecated?: boolean;\n}): SchemaField {\n return {\n name: field.name,\n description: field.description ?? null,\n type: convertTypeRef(field.type),\n args: (field.args ?? []).map(convertArgument),\n isDeprecated: field.isDeprecated ?? false,\n };\n}\n\nexport function parseSchema(introspectionResult: IntrospectionQuery): ParsedSchema {\n const schema = introspectionResult.__schema;\n\n const types = new Map<string, SchemaType>();\n\n for (const type of schema.types) {\n // Filter out built-in types (prefixed with __)\n if (type.name.startsWith('__')) {\n continue;\n }\n\n const schemaType: SchemaType = {\n name: type.name,\n kind: type.kind as TypeRef['kind'],\n description: type.description ?? null,\n fields: ('fields' in type && type.fields ? type.fields.map(convertField) : []),\n inputFields: (\n 'inputFields' in type && type.inputFields\n ? (type.inputFields as Array<{\n name: string;\n description?: string | null;\n type: { kind: string; name?: string | null; ofType?: unknown };\n defaultValue?: string | null;\n }>).map(convertArgument)\n : []\n ),\n enumValues: (\n 'enumValues' in type && type.enumValues\n ? type.enumValues.map((v: { name: string; description?: string | null }) => ({\n name: v.name,\n description: v.description ?? null,\n }))\n : []\n ),\n interfaces: (\n 'interfaces' in type && type.interfaces\n ? type.interfaces.map((i: { name: string }) => i.name)\n : []\n ),\n possibleTypes: (\n 'possibleTypes' in type && type.possibleTypes\n ? type.possibleTypes.map((t: { name: string }) => t.name)\n : []\n ),\n };\n\n types.set(type.name, schemaType);\n }\n\n return {\n queryType: schema.queryType.name,\n mutationType: schema.mutationType?.name ?? null,\n subscriptionType: schema.subscriptionType?.name ?? null,\n types,\n };\n}\n","import type { TypeRef } from '../types/index.js';\n\n/**\n * Converts a TypeRef to a GraphQL type string.\n * e.g. NON_NULL(LIST(NON_NULL(OBJECT(\"User\")))) → \"[User!]!\"\n */\nexport function typeRefToString(typeRef: TypeRef): string {\n if (typeRef.kind === 'NON_NULL') {\n if (!typeRef.ofType) {\n return 'Unknown!';\n }\n return `${typeRefToString(typeRef.ofType)}!`;\n }\n\n if (typeRef.kind === 'LIST') {\n if (!typeRef.ofType) {\n return '[Unknown]';\n }\n return `[${typeRefToString(typeRef.ofType)}]`;\n }\n\n return typeRef.name ?? 'Unknown';\n}\n\n/**\n * Checks if a TypeRef is required (NON_NULL at top level).\n */\nexport function isRequired(typeRef: TypeRef): boolean {\n return typeRef.kind === 'NON_NULL';\n}\n\n/**\n * Unwraps a TypeRef to get the underlying named type.\n */\nexport function unwrapType(typeRef: TypeRef): TypeRef {\n if (typeRef.kind === 'NON_NULL' || typeRef.kind === 'LIST') {\n if (typeRef.ofType) {\n return unwrapType(typeRef.ofType);\n }\n }\n return typeRef;\n}\n","import type { ParsedSchema, SchemaField } from '../types/index.js';\nimport { typeRefToString, isRequired, unwrapType } from './variables.js';\n\nexport interface VariableDefinition {\n name: string;\n type: string;\n required: boolean;\n description: string | null;\n}\n\nexport interface GeneratedOperation {\n operation: string;\n operationName: string;\n variables: VariableDefinition[];\n operationType: 'query' | 'mutation';\n}\n\nexport interface BuildOperationOptions {\n maxDepth?: number;\n includeDeprecated?: boolean;\n}\n\nconst SCALAR_KINDS = new Set(['SCALAR', 'ENUM']);\n\nfunction isScalarLike(schema: ParsedSchema, field: SchemaField): boolean {\n const unwrapped = unwrapType(field.type);\n if (SCALAR_KINDS.has(unwrapped.kind)) {\n return true;\n }\n // Check if the named type exists and is scalar/enum\n if (unwrapped.name) {\n const namedType = schema.types.get(unwrapped.name);\n if (namedType && SCALAR_KINDS.has(namedType.kind)) {\n return true;\n }\n }\n return false;\n}\n\nfunction buildSelectionSet(\n schema: ParsedSchema,\n typeName: string,\n currentDepth: number,\n maxDepth: number,\n visited: Set<string>,\n includeDeprecated: boolean,\n indentLevel: number = 2,\n): string {\n if (currentDepth >= maxDepth) {\n return '';\n }\n\n const type = schema.types.get(typeName);\n if (!type || type.fields.length === 0) {\n return '';\n }\n\n const fieldIndent = ' '.repeat(indentLevel + 1);\n const closingIndent = ' '.repeat(indentLevel);\n\n // Prevent infinite recursion\n if (visited.has(typeName)) {\n // Only include scalar fields to break the cycle\n const scalarFields = type.fields\n .filter((f) => !f.isDeprecated || includeDeprecated)\n .filter((f) => isScalarLike(schema, f));\n\n if (scalarFields.length === 0) {\n return '';\n }\n\n return `{\\n${scalarFields.map((f) => `${fieldIndent}${f.name}`).join('\\n')}\\n${closingIndent}}`;\n }\n\n visited.add(typeName);\n\n const fields = type.fields.filter((f) => !f.isDeprecated || includeDeprecated);\n const lines: string[] = [];\n\n for (const field of fields) {\n const unwrapped = unwrapType(field.type);\n\n if (isScalarLike(schema, field)) {\n lines.push(`${fieldIndent}${field.name}`);\n } else if (unwrapped.name) {\n const nestedSelection = buildSelectionSet(\n schema,\n unwrapped.name,\n currentDepth + 1,\n maxDepth,\n new Set(visited),\n includeDeprecated,\n indentLevel + 1,\n );\n if (nestedSelection) {\n lines.push(`${fieldIndent}${field.name} ${nestedSelection}`);\n }\n }\n }\n\n visited.delete(typeName);\n\n if (lines.length === 0) {\n return '';\n }\n\n return `{\\n${lines.join('\\n')}\\n${closingIndent}}`;\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function buildOperation(\n schema: ParsedSchema,\n rootFieldName: string,\n options?: BuildOperationOptions,\n): GeneratedOperation {\n const maxDepth = options?.maxDepth ?? 2;\n const includeDeprecated = options?.includeDeprecated ?? false;\n\n // Look up the field in query type first, then mutation type\n let operationType: 'query' | 'mutation' = 'query';\n let rootField: SchemaField | undefined;\n\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n rootField = queryType.fields.find((f) => f.name === rootFieldName);\n }\n\n if (!rootField && schema.mutationType) {\n const mutationType = schema.types.get(schema.mutationType);\n if (mutationType) {\n rootField = mutationType.fields.find((f) => f.name === rootFieldName);\n if (rootField) {\n operationType = 'mutation';\n }\n }\n }\n\n if (!rootField) {\n throw new Error(`Field \"${rootFieldName}\" not found in schema query or mutation types`);\n }\n\n const operationName = `${capitalize(rootFieldName)}${capitalize(operationType)}`;\n\n // Build variable definitions from arguments\n const variables: VariableDefinition[] = rootField.args.map((arg) => ({\n name: arg.name,\n type: typeRefToString(arg.type),\n required: isRequired(arg.type),\n description: arg.description,\n }));\n\n // Build the variable definitions string for the operation\n const varDefs = variables.length > 0\n ? `(${variables.map((v) => `$${v.name}: ${v.type}`).join(', ')})`\n : '';\n\n // Build argument passing string\n const argsPassing = rootField.args.length > 0\n ? `(${rootField.args.map((a) => `${a.name}: $${a.name}`).join(', ')})`\n : '';\n\n // Build selection set based on return type\n const unwrapped = unwrapType(rootField.type);\n let selectionSet = '';\n\n if (!isScalarLike(schema, rootField) && unwrapped.name) {\n selectionSet = ` ${buildSelectionSet(\n schema,\n unwrapped.name,\n 0,\n maxDepth,\n new Set(),\n includeDeprecated,\n 1,\n )}`;\n }\n\n const operation = `${operationType} ${operationName}${varDefs} {\\n ${rootFieldName}${argsPassing}${selectionSet}\\n}`;\n\n return {\n operation,\n operationName,\n variables,\n operationType,\n };\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { AgentToolkitConfig } from '../types/index.js';\nimport { fetchSchema } from '../introspection/fetcher.js';\nimport { parseSchema } from '../introspection/parser.js';\nimport { GraphQLExecutor } from './executor.js';\nimport { createToolsFromSchema } from './tool-factory.js';\n\nconst packageVersion = process.env.PACKAGE_VERSION || '0.1.0';\n\nexport interface AgentToolkitServerOptions {\n serverName?: string;\n serverVersion?: string;\n}\n\n/**\n * Creates a fully configured MCP server from a GraphQL endpoint configuration.\n */\nexport async function createAgentToolkitServer(\n config: AgentToolkitConfig,\n options?: AgentToolkitServerOptions,\n): Promise<McpServer> {\n const serverName = options?.serverName ?? 'graphql-agent-toolkit';\n const serverVersion = options?.serverVersion ?? packageVersion;\n\n // Fetch and parse schema\n const introspectionResult = await fetchSchema({\n endpoint: config.endpoint,\n headers: config.headers,\n });\n const schema = parseSchema(introspectionResult);\n\n // Create executor\n const executor = new GraphQLExecutor(config.endpoint, config.headers);\n\n // Create tools\n const tools = createToolsFromSchema(schema, executor, {\n maxDepth: config.operationDepth ?? 2,\n includeDeprecated: config.includeDeprecated ?? false,\n });\n\n // Create MCP server\n const server = new McpServer({\n name: serverName,\n version: serverVersion,\n });\n\n // Register tools\n for (const tool of tools) {\n const inputSchema = Object.keys(tool.inputSchema).length > 0 ? tool.inputSchema : undefined;\n\n if (inputSchema) {\n server.tool(\n tool.name,\n tool.description,\n inputSchema,\n async (args) => {\n try {\n const result = await tool.execute(args as Record<string, unknown>);\n return {\n content: [{ type: 'text' as const, text: result }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [{ type: 'text' as const, text: `Error: ${message}` }],\n isError: true,\n };\n }\n },\n );\n } else {\n server.tool(\n tool.name,\n tool.description,\n async () => {\n try {\n const result = await tool.execute({});\n return {\n content: [{ type: 'text' as const, text: result }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return {\n content: [{ type: 'text' as const, text: `Error: ${message}` }],\n isError: true,\n };\n }\n },\n );\n }\n }\n\n // Register a schema explorer resource\n server.tool(\n 'explore_schema',\n 'Explore the GraphQL schema — list types, fields, and arguments',\n {\n typeName: z.string().optional().describe('Type name to explore. If omitted, lists all types.'),\n },\n async (args) => {\n if (args.typeName) {\n const type = schema.types.get(args.typeName);\n if (!type) {\n return {\n content: [{ type: 'text' as const, text: `Type \"${args.typeName}\" not found.` }],\n };\n }\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(type, null, 2) }],\n };\n }\n\n const typeList = Array.from(schema.types.values())\n .filter((t) => !['SCALAR'].includes(t.kind))\n .map((t) => `${t.kind} ${t.name}${t.description ? ` — ${t.description}` : ''}`);\n\n return {\n content: [{ type: 'text' as const, text: typeList.join('\\n') }],\n };\n },\n );\n\n return server;\n}\n","import { GraphQLClient } from 'graphql-request';\n\nexport class GraphQLExecutor {\n private client: GraphQLClient;\n\n constructor(endpoint: string, headers?: Record<string, string>) {\n this.client = new GraphQLClient(endpoint, { headers });\n }\n\n async execute(\n operation: string,\n variables?: Record<string, unknown>,\n additionalHeaders?: Record<string, string>,\n ): Promise<string> {\n try {\n const result = await this.client.request(operation, variables, additionalHeaders);\n return JSON.stringify(result, null, 2);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`GraphQL execution failed: ${error.message}`);\n }\n throw new Error('GraphQL execution failed: Unknown error');\n }\n }\n}\n","import { z } from 'zod';\nimport type { ParsedSchema, SchemaField, TypeRef } from '../types/index.js';\nimport { buildOperation } from '../operations/index.js';\nimport { unwrapType } from '../operations/variables.js';\nimport type { GraphQLExecutor } from './executor.js';\n\nexport interface McpToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, z.ZodType>;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}\n\nexport interface CreateToolsOptions {\n maxDepth?: number;\n includeDeprecated?: boolean;\n}\n\n/**\n * Maps a GraphQL TypeRef to a Zod schema for validation.\n */\nfunction typeRefToZod(typeRef: TypeRef, schema: ParsedSchema): z.ZodType {\n if (typeRef.kind === 'NON_NULL') {\n if (!typeRef.ofType) return z.unknown();\n return typeRefToZod(typeRef.ofType, schema);\n }\n\n if (typeRef.kind === 'LIST') {\n if (!typeRef.ofType) return z.array(z.unknown());\n return z.array(typeRefToZod(typeRef.ofType, schema)).optional();\n }\n\n const unwrapped = unwrapType(typeRef);\n const typeName = unwrapped.name;\n\n if (typeName) {\n // Check if it's an enum\n const namedType = schema.types.get(typeName);\n if (namedType && namedType.kind === 'ENUM' && namedType.enumValues.length > 0) {\n const values = namedType.enumValues.map((v) => v.name) as [string, ...string[]];\n return z.enum(values).optional();\n }\n\n // Check if it's an input object\n if (namedType && namedType.kind === 'INPUT_OBJECT') {\n const shape: Record<string, z.ZodType> = {};\n for (const field of namedType.inputFields) {\n const fieldSchema = typeRefToZod(field.type, schema);\n if (field.type.kind === 'NON_NULL') {\n shape[field.name] = fieldSchema;\n } else {\n shape[field.name] = fieldSchema.optional();\n }\n }\n return z.object(shape);\n }\n }\n\n // Map scalars\n switch (typeName) {\n case 'String':\n return z.string().optional();\n case 'Int':\n return z.number().int().optional();\n case 'Float':\n return z.number().optional();\n case 'Boolean':\n return z.boolean().optional();\n case 'ID':\n return z.string().optional();\n default:\n return z.unknown().optional();\n }\n}\n\n/**\n * Builds the Zod input schema object for a tool from a field's arguments.\n */\nfunction buildInputSchema(\n field: SchemaField,\n schema: ParsedSchema,\n): Record<string, z.ZodType> {\n const shape: Record<string, z.ZodType> = {};\n\n for (const arg of field.args) {\n const zodType = typeRefToZod(arg.type, schema);\n if (arg.type.kind === 'NON_NULL') {\n shape[arg.name] = zodType;\n } else {\n shape[arg.name] = zodType.optional();\n }\n }\n\n return shape;\n}\n\n/**\n * Creates MCP tool definitions from a parsed GraphQL schema.\n */\nexport function createToolsFromSchema(\n schema: ParsedSchema,\n executor: GraphQLExecutor,\n options?: CreateToolsOptions,\n): McpToolDefinition[] {\n const maxDepth = options?.maxDepth ?? 2;\n const includeDeprecated = options?.includeDeprecated ?? false;\n const tools: McpToolDefinition[] = [];\n\n // Process query fields\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n for (const field of queryType.fields) {\n if (field.isDeprecated && !includeDeprecated) continue;\n\n const toolName = `query_${field.name}`;\n const description = field.description || `Query ${field.name}`;\n const inputSchema = buildInputSchema(field, schema);\n\n tools.push({\n name: toolName,\n description,\n inputSchema,\n execute: async (args: Record<string, unknown>) => {\n const op = buildOperation(schema, field.name, { maxDepth, includeDeprecated });\n return executor.execute(op.operation, args);\n },\n });\n }\n }\n\n // Process mutation fields\n if (schema.mutationType) {\n const mutationType = schema.types.get(schema.mutationType);\n if (mutationType) {\n for (const field of mutationType.fields) {\n if (field.isDeprecated && !includeDeprecated) continue;\n\n const toolName = `mutate_${field.name}`;\n const description = field.description || `Mutation ${field.name}`;\n const inputSchema = buildInputSchema(field, schema);\n\n tools.push({\n name: toolName,\n description,\n inputSchema,\n execute: async (args: Record<string, unknown>) => {\n const op = buildOperation(schema, field.name, { maxDepth, includeDeprecated });\n return executor.execute(op.operation, args);\n },\n });\n }\n }\n }\n\n return tools;\n}\n","const STOP_WORDS = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',\n 'should', 'may', 'might', 'shall', 'can', 'need', 'dare', 'ought',\n 'used', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from',\n 'as', 'into', 'through', 'during', 'before', 'after', 'above',\n 'below', 'between', 'out', 'off', 'over', 'under', 'again',\n 'further', 'then', 'once', 'and', 'but', 'or', 'nor', 'not', 'so',\n 'yet', 'both', 'either', 'neither', 'each', 'every', 'all', 'any',\n 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'only',\n 'own', 'same', 'than', 'too', 'very', 'just', 'because', 'if',\n 'it', 'its', 'this', 'that', 'these', 'those', 'i', 'me', 'my',\n 'we', 'our', 'you', 'your', 'he', 'him', 'his', 'she', 'her',\n 'they', 'them', 'their', 'what', 'which', 'who', 'whom',\n]);\n\n/**\n * Split camelCase/PascalCase identifiers into individual words,\n * lowercase them, and remove stop words.\n */\nexport function tokenize(text: string): string[] {\n if (!text) return [];\n\n // Split camelCase/PascalCase: insert space before capitals\n const split = text\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n // Split on non-alphanumeric characters\n .replace(/[^a-zA-Z0-9]+/g, ' ')\n .toLowerCase()\n .trim()\n .split(/\\s+/)\n .filter((word) => word.length > 0);\n\n // Remove stop words\n return split.filter((word) => !STOP_WORDS.has(word));\n}\n","import type { ParsedSchema } from '../types/index.js';\nimport { tokenize } from './tokenizer.js';\n\nexport interface SearchResult {\n typeName: string;\n score: number;\n kind: string;\n description: string | null;\n}\n\ninterface DocumentVector {\n typeName: string;\n tokens: string[];\n tfidf: Map<string, number>;\n}\n\n/**\n * SchemaNavigator provides semantic search over a GraphQL schema\n * using TF-IDF and cosine similarity.\n */\nexport class SchemaNavigator {\n private schema: ParsedSchema | null = null;\n private documents: DocumentVector[] = [];\n private idf: Map<string, number> = new Map();\n\n /**\n * Index a parsed schema for semantic search.\n */\n index(schema: ParsedSchema): void {\n this.schema = schema;\n this.documents = [];\n\n // Build document for each type\n for (const [typeName, type] of schema.types) {\n // Skip scalar types for search\n if (type.kind === 'SCALAR') continue;\n\n const textParts: string[] = [typeName];\n\n if (type.description) {\n textParts.push(type.description);\n }\n\n for (const field of type.fields) {\n textParts.push(field.name);\n if (field.description) {\n textParts.push(field.description);\n }\n }\n\n for (const field of type.inputFields) {\n textParts.push(field.name);\n if (field.description) {\n textParts.push(field.description);\n }\n }\n\n for (const ev of type.enumValues) {\n textParts.push(ev.name);\n if (ev.description) {\n textParts.push(ev.description);\n }\n }\n\n const tokens = tokenize(textParts.join(' '));\n this.documents.push({ typeName, tokens, tfidf: new Map() });\n }\n\n // Compute IDF\n this.computeIdf();\n\n // Compute TF-IDF for each document\n for (const doc of this.documents) {\n doc.tfidf = this.computeTfidf(doc.tokens);\n }\n }\n\n /**\n * Search the schema for types matching the query.\n */\n search(query: string, limit: number = 5): SearchResult[] {\n if (!this.schema || this.documents.length === 0) {\n return [];\n }\n\n const queryTokens = tokenize(query);\n if (queryTokens.length === 0) {\n return [];\n }\n\n const queryTfidf = this.computeTfidf(queryTokens);\n\n const scored: SearchResult[] = [];\n\n for (const doc of this.documents) {\n const score = this.cosineSimilarity(queryTfidf, doc.tfidf);\n if (score > 0) {\n const type = this.schema.types.get(doc.typeName)!;\n scored.push({\n typeName: doc.typeName,\n score,\n kind: type.kind,\n description: type.description,\n });\n }\n }\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n return scored.slice(0, limit);\n }\n\n /**\n * Get formatted context for a specific type.\n */\n getTypeContext(typeName: string): string | null {\n if (!this.schema) return null;\n\n const type = this.schema.types.get(typeName);\n if (!type) return null;\n\n const lines: string[] = [];\n lines.push(`${type.kind} ${type.name}`);\n\n if (type.description) {\n lines.push(` Description: ${type.description}`);\n }\n\n if (type.fields.length > 0) {\n lines.push(' Fields:');\n for (const field of type.fields) {\n const desc = field.description ? ` — ${field.description}` : '';\n const args = field.args.length > 0\n ? `(${field.args.map((a) => a.name).join(', ')})`\n : '';\n lines.push(` ${field.name}${args}${desc}`);\n }\n }\n\n if (type.inputFields.length > 0) {\n lines.push(' Input Fields:');\n for (const field of type.inputFields) {\n const desc = field.description ? ` — ${field.description}` : '';\n lines.push(` ${field.name}${desc}`);\n }\n }\n\n if (type.enumValues.length > 0) {\n lines.push(' Enum Values:');\n for (const ev of type.enumValues) {\n const desc = ev.description ? ` — ${ev.description}` : '';\n lines.push(` ${ev.name}${desc}`);\n }\n }\n\n if (type.interfaces.length > 0) {\n lines.push(` Implements: ${type.interfaces.join(', ')}`);\n }\n\n if (type.possibleTypes.length > 0) {\n lines.push(` Possible Types: ${type.possibleTypes.join(', ')}`);\n }\n\n return lines.join('\\n');\n }\n\n private computeIdf(): void {\n const docCount = this.documents.length;\n const termDocFreq = new Map<string, number>();\n\n for (const doc of this.documents) {\n const uniqueTokens = new Set(doc.tokens);\n for (const token of uniqueTokens) {\n termDocFreq.set(token, (termDocFreq.get(token) ?? 0) + 1);\n }\n }\n\n this.idf = new Map();\n for (const [term, freq] of termDocFreq) {\n // Use smoothed IDF to avoid zero values when a term appears in all documents\n this.idf.set(term, Math.log(1 + docCount / (1 + freq)));\n }\n }\n\n private computeTfidf(tokens: string[]): Map<string, number> {\n const tf = new Map<string, number>();\n for (const token of tokens) {\n tf.set(token, (tf.get(token) ?? 0) + 1);\n }\n\n const tfidf = new Map<string, number>();\n for (const [term, count] of tf) {\n const idfVal = this.idf.get(term) ?? Math.log(1 + this.documents.length);\n tfidf.set(term, (count / tokens.length) * idfVal);\n }\n\n return tfidf;\n }\n\n private cosineSimilarity(a: Map<string, number>, b: Map<string, number>): number {\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (const [term, val] of a) {\n normA += val * val;\n const bVal = b.get(term);\n if (bVal !== undefined) {\n dotProduct += val * bVal;\n }\n }\n\n for (const val of b.values()) {\n normB += val * val;\n }\n\n if (normA === 0 || normB === 0) return 0;\n\n return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));\n }\n}\n","import type { ParsedSchema } from '../types/index.js';\nimport type { GraphQLExecutor } from '../mcp/executor.js';\n\nexport interface PaginationConfig {\n style: 'relay' | 'offset' | 'auto';\n pageSize: number;\n maxPages?: number;\n}\n\nexport interface PaginatedResult<T = unknown> {\n items: T[];\n totalFetched: number;\n hasMore: boolean;\n cursors?: { start: string; end: string };\n}\n\nconst DEFAULT_PAGE_SIZE = 20;\nconst DEFAULT_MAX_PAGES = 10;\n\n/**\n * Auto-detect pagination style from a type's fields.\n *\n * Relay: The type has an `edges` field whose unwrapped type has a `node` field,\n * AND a `pageInfo` field whose type has `hasNextPage` and `endCursor`.\n *\n * Offset: The type (or its parent query field) has `limit`/`offset` or `skip`/`take` args.\n * We detect this by looking for fields on the Query type that return this typeName\n * and have offset-style arguments.\n */\nexport function detectPaginationStyle(\n schema: ParsedSchema,\n typeName: string,\n): 'relay' | 'offset' | 'none' {\n const type = schema.types.get(typeName);\n if (!type) return 'none';\n\n // Check for Relay pattern: edges { node } + pageInfo { hasNextPage, endCursor }\n const edgesField = type.fields.find((f) => f.name === 'edges');\n const pageInfoField = type.fields.find((f) => f.name === 'pageInfo');\n\n if (edgesField && pageInfoField) {\n // Verify edges has node\n const edgesTypeName = unwrapTypeName(edgesField.type);\n if (edgesTypeName) {\n const edgesType = schema.types.get(edgesTypeName);\n if (edgesType) {\n const hasNode = edgesType.fields.some((f) => f.name === 'node');\n if (hasNode) {\n // Verify pageInfo has hasNextPage and endCursor\n const pageInfoTypeName = unwrapTypeName(pageInfoField.type);\n if (pageInfoTypeName) {\n const pageInfoType = schema.types.get(pageInfoTypeName);\n if (pageInfoType) {\n const hasNextPage = pageInfoType.fields.some((f) => f.name === 'hasNextPage');\n const hasEndCursor = pageInfoType.fields.some((f) => f.name === 'endCursor');\n if (hasNextPage && hasEndCursor) {\n return 'relay';\n }\n }\n }\n }\n }\n }\n }\n\n // Check for offset pattern: look at query fields that return this type\n // and check if they have limit/offset or skip/take args\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n for (const field of queryType.fields) {\n const returnTypeName = unwrapTypeName(field.type);\n if (returnTypeName === typeName) {\n const argNames = field.args.map((a) => a.name);\n const hasLimitOffset =\n argNames.includes('limit') && argNames.includes('offset');\n const hasSkipTake =\n argNames.includes('skip') && argNames.includes('take');\n if (hasLimitOffset || hasSkipTake) {\n return 'offset';\n }\n }\n }\n }\n\n return 'none';\n}\n\n/**\n * Execute a paginated query, collecting all pages.\n */\nexport async function executePaginated(\n executor: GraphQLExecutor,\n operation: string,\n variables: Record<string, unknown>,\n config?: PaginationConfig,\n): Promise<PaginatedResult> {\n const style = config?.style ?? 'auto';\n const pageSize = config?.pageSize ?? DEFAULT_PAGE_SIZE;\n const maxPages = config?.maxPages ?? DEFAULT_MAX_PAGES;\n\n if (style === 'relay' || (style === 'auto' && isRelayOperation(operation))) {\n return executeRelayPaginated(executor, operation, variables, pageSize, maxPages);\n }\n\n if (style === 'offset' || (style === 'auto' && isOffsetOperation(operation))) {\n return executeOffsetPaginated(executor, operation, variables, pageSize, maxPages);\n }\n\n // Fallback: execute once, no pagination\n const resultStr = await executor.execute(operation, variables);\n const data = JSON.parse(resultStr);\n const items = extractItems(data);\n return {\n items,\n totalFetched: items.length,\n hasMore: false,\n };\n}\n\n/**\n * Check if operation string looks like a Relay query (has after/first variables and pageInfo).\n */\nfunction isRelayOperation(operation: string): boolean {\n return (\n operation.includes('$after') &&\n operation.includes('$first') &&\n operation.includes('pageInfo')\n );\n}\n\n/**\n * Check if operation string looks like an offset query (has limit/offset or skip/take).\n */\nfunction isOffsetOperation(operation: string): boolean {\n return (\n (operation.includes('$limit') && operation.includes('$offset')) ||\n (operation.includes('$skip') && operation.includes('$take'))\n );\n}\n\nasync function executeRelayPaginated(\n executor: GraphQLExecutor,\n operation: string,\n variables: Record<string, unknown>,\n pageSize: number,\n maxPages: number,\n): Promise<PaginatedResult> {\n const allItems: unknown[] = [];\n let cursor: string | null = null;\n let startCursor: string | null = null;\n let hasMore = true;\n let pageCount = 0;\n\n while (hasMore && pageCount < maxPages) {\n const vars: Record<string, unknown> = {\n ...variables,\n first: pageSize,\n };\n if (cursor) {\n vars.after = cursor;\n }\n\n const resultStr = await executor.execute(operation, vars);\n const data = JSON.parse(resultStr);\n\n // Extract edges and pageInfo from the response\n const connectionData = findConnectionData(data);\n if (!connectionData) {\n // Not a valid connection response, return what we have\n break;\n }\n\n const { edges, pageInfo } = connectionData;\n\n if (pageCount === 0 && pageInfo.startCursor) {\n startCursor = pageInfo.startCursor;\n }\n\n // Extract nodes from edges\n for (const edge of edges) {\n if (edge && typeof edge === 'object' && 'node' in edge) {\n allItems.push((edge as { node: unknown }).node);\n } else {\n allItems.push(edge);\n }\n }\n\n hasMore = pageInfo.hasNextPage ?? false;\n cursor = pageInfo.endCursor ?? null;\n pageCount++;\n\n if (!hasMore || !cursor) break;\n }\n\n const result: PaginatedResult = {\n items: allItems,\n totalFetched: allItems.length,\n hasMore,\n };\n\n if (startCursor || cursor) {\n result.cursors = {\n start: startCursor ?? '',\n end: cursor ?? '',\n };\n }\n\n return result;\n}\n\nasync function executeOffsetPaginated(\n executor: GraphQLExecutor,\n operation: string,\n variables: Record<string, unknown>,\n pageSize: number,\n maxPages: number,\n): Promise<PaginatedResult> {\n const allItems: unknown[] = [];\n let currentOffset = 0;\n let hasMore = true;\n let pageCount = 0;\n\n // Detect whether to use limit/offset or skip/take\n const useSkipTake =\n operation.includes('$skip') && operation.includes('$take');\n\n while (hasMore && pageCount < maxPages) {\n const vars: Record<string, unknown> = { ...variables };\n\n if (useSkipTake) {\n vars.skip = currentOffset;\n vars.take = pageSize;\n } else {\n vars.offset = currentOffset;\n vars.limit = pageSize;\n }\n\n const resultStr = await executor.execute(operation, vars);\n const data = JSON.parse(resultStr);\n const items = extractItems(data);\n\n allItems.push(...items);\n pageCount++;\n\n if (items.length < pageSize) {\n hasMore = false;\n } else {\n currentOffset += pageSize;\n }\n }\n\n return {\n items: allItems,\n totalFetched: allItems.length,\n hasMore,\n };\n}\n\ninterface PageInfo {\n hasNextPage?: boolean;\n endCursor?: string | null;\n startCursor?: string | null;\n}\n\ninterface ConnectionData {\n edges: unknown[];\n pageInfo: PageInfo;\n}\n\n/**\n * Recursively find connection data (edges + pageInfo) in a response object.\n */\nfunction findConnectionData(data: unknown): ConnectionData | null {\n if (!data || typeof data !== 'object') return null;\n\n const obj = data as Record<string, unknown>;\n\n // Check if this object directly has edges and pageInfo\n if (Array.isArray(obj.edges) && obj.pageInfo && typeof obj.pageInfo === 'object') {\n return {\n edges: obj.edges,\n pageInfo: obj.pageInfo as PageInfo,\n };\n }\n\n // Recurse into object properties\n for (const value of Object.values(obj)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const found = findConnectionData(value);\n if (found) return found;\n }\n }\n\n return null;\n}\n\n/**\n * Extract array items from a GraphQL response, searching for the first array value.\n */\nfunction extractItems(data: unknown): unknown[] {\n if (Array.isArray(data)) return data;\n if (!data || typeof data !== 'object') return [];\n\n const obj = data as Record<string, unknown>;\n for (const value of Object.values(obj)) {\n if (Array.isArray(value)) return value;\n if (value && typeof value === 'object') {\n const items = extractItems(value);\n if (items.length > 0) return items;\n }\n }\n\n return [];\n}\n\n/**\n * Unwrap a TypeRef to get the named type.\n */\nfunction unwrapTypeName(typeRef: { kind: string; name: string | null; ofType: unknown | null }): string | null {\n if (typeRef.kind === 'NON_NULL' || typeRef.kind === 'LIST') {\n if (typeRef.ofType) {\n return unwrapTypeName(typeRef.ofType as { kind: string; name: string | null; ofType: unknown | null });\n }\n return null;\n }\n return typeRef.name;\n}\n","export interface SummaryConfig {\n maxItems: number;\n maxDepth: number;\n maxStringLength: number;\n includeMetadata: boolean;\n}\n\nexport interface SummaryMetadata {\n totalItems: number;\n truncated: boolean;\n originalSize: number;\n}\n\nconst DEFAULT_CONFIG: SummaryConfig = {\n maxItems: 5,\n maxDepth: 3,\n maxStringLength: 200,\n includeMetadata: true,\n};\n\n/**\n * Summarize a GraphQL response by truncating arrays, limiting depth,\n * and shortening long strings.\n */\nexport function summarizeResponse(\n data: unknown,\n config?: Partial<SummaryConfig>,\n): { summary: unknown; metadata: SummaryMetadata } {\n const cfg = { ...DEFAULT_CONFIG, ...config };\n const originalSize = JSON.stringify(data).length;\n let truncated = false;\n let totalItems = 0;\n\n function countItems(value: unknown): number {\n if (Array.isArray(value)) return value.length;\n if (value && typeof value === 'object') {\n let count = 0;\n for (const v of Object.values(value as Record<string, unknown>)) {\n if (Array.isArray(v)) count += v.length;\n else count += countItems(v);\n }\n return count;\n }\n return 0;\n }\n\n totalItems = countItems(data);\n\n function summarize(value: unknown, depth: number): unknown {\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n if (value.length > cfg.maxStringLength) {\n truncated = true;\n return value.slice(0, cfg.maxStringLength) + '...';\n }\n return value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (depth >= cfg.maxDepth) {\n truncated = true;\n return `[...${value.length} items]`;\n }\n\n const items = value.slice(0, cfg.maxItems).map((item) => summarize(item, depth + 1));\n\n if (value.length > cfg.maxItems) {\n truncated = true;\n if (cfg.includeMetadata) {\n return Object.assign(items, {\n _meta: { totalCount: value.length, showing: cfg.maxItems },\n });\n }\n }\n\n return items;\n }\n\n if (typeof value === 'object') {\n if (depth >= cfg.maxDepth) {\n const keys = Object.keys(value as Record<string, unknown>);\n truncated = true;\n return `{...${keys.length} keys}`;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n result[key] = summarize(val, depth + 1);\n }\n return result;\n }\n\n return value;\n }\n\n const summary = summarize(data, 0);\n\n return {\n summary,\n metadata: {\n totalItems,\n truncated,\n originalSize,\n },\n };\n}\n\n/**\n * Format data as clean markdown suitable for LLM context.\n */\nexport function formatForLLM(\n data: unknown,\n config?: Partial<SummaryConfig>,\n): string {\n const { summary } = summarizeResponse(data, config);\n return renderMarkdown(summary, 0);\n}\n\nfunction renderMarkdown(value: unknown, indent: number): string {\n if (value === null || value === undefined) return 'null';\n\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n\n if (Array.isArray(value)) {\n if (value.length === 0) return '(empty list)';\n\n const lines: string[] = [];\n const meta = (value as unknown as Record<string, unknown>)._meta as { totalCount: number; showing: number } | undefined;\n\n for (const item of value) {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n // Object items - render as nested bullets\n const objLines = renderObjectAsBullets(item as Record<string, unknown>, indent + 1);\n lines.push(`${' '.repeat(indent)}- ${objLines}`);\n } else {\n lines.push(`${' '.repeat(indent)}- ${renderMarkdown(item, indent + 1)}`);\n }\n }\n\n if (meta) {\n lines.push(`${' '.repeat(indent)}- _(${meta.totalCount - meta.showing} more items...)_`);\n }\n\n return lines.join('\\n');\n }\n\n if (typeof value === 'object') {\n return renderObjectAsSection(value as Record<string, unknown>, indent);\n }\n\n return String(value);\n}\n\nfunction renderObjectAsBullets(obj: Record<string, unknown>, indent: number): string {\n const entries = Object.entries(obj).filter(([k]) => k !== '_meta');\n if (entries.length === 0) return '(empty)';\n\n const parts: string[] = [];\n let first = true;\n\n for (const [key, value] of entries) {\n if (typeof value === 'object' && value !== null) {\n if (first) {\n parts.push(`**${key}**: ${renderMarkdown(value, indent + 1)}`);\n first = false;\n } else {\n parts.push(`${' '.repeat(indent)}**${key}**: ${renderMarkdown(value, indent + 1)}`);\n }\n } else {\n const rendered = renderMarkdown(value, indent);\n if (first) {\n parts.push(`**${key}**: ${rendered}`);\n first = false;\n } else {\n parts.push(`${' '.repeat(indent)}**${key}**: ${rendered}`);\n }\n }\n }\n\n return parts.join('\\n');\n}\n\nfunction renderObjectAsSection(obj: Record<string, unknown>, indent: number): string {\n const entries = Object.entries(obj).filter(([k]) => k !== '_meta');\n if (entries.length === 0) return '(empty)';\n\n const lines: string[] = [];\n const headerLevel = Math.min(indent + 2, 6);\n const header = '#'.repeat(headerLevel);\n\n for (const [key, value] of entries) {\n if (typeof value === 'object' && value !== null) {\n lines.push(`${header} ${key}`);\n lines.push(renderMarkdown(value, indent + 1));\n } else {\n lines.push(`- **${key}**: ${renderMarkdown(value, indent)}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import { z } from 'zod';\nimport type { ParsedSchema, SchemaField, TypeRef } from '../types/index.js';\nimport { buildOperation } from '../operations/index.js';\nimport { unwrapType } from '../operations/variables.js';\nimport type { GraphQLExecutor } from '../mcp/executor.js';\n\nexport interface LangChainToolConfig {\n name: string;\n description: string;\n schema: Record<string, unknown>;\n func: (input: string) => Promise<string>;\n}\n\nexport interface StructuredToolConfig {\n name: string;\n description: string;\n schema: z.ZodObject<Record<string, z.ZodType>>;\n func: (input: Record<string, unknown>) => Promise<string>;\n}\n\ninterface AdapterOptions {\n maxDepth?: number;\n}\n\n/**\n * Convert a GraphQL TypeRef to a JSON Schema representation.\n */\nfunction typeRefToJsonSchema(typeRef: TypeRef, schema: ParsedSchema): Record<string, unknown> {\n if (typeRef.kind === 'NON_NULL') {\n if (!typeRef.ofType) return { type: 'string' };\n return typeRefToJsonSchema(typeRef.ofType, schema);\n }\n\n if (typeRef.kind === 'LIST') {\n if (!typeRef.ofType) return { type: 'array', items: {} };\n return { type: 'array', items: typeRefToJsonSchema(typeRef.ofType, schema) };\n }\n\n const unwrapped = unwrapType(typeRef);\n const typeName = unwrapped.name;\n\n if (typeName) {\n const namedType = schema.types.get(typeName);\n if (namedType && namedType.kind === 'ENUM' && namedType.enumValues.length > 0) {\n return { type: 'string', enum: namedType.enumValues.map((v) => v.name) };\n }\n\n if (namedType && namedType.kind === 'INPUT_OBJECT') {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const field of namedType.inputFields) {\n properties[field.name] = typeRefToJsonSchema(field.type, schema);\n if (field.type.kind === 'NON_NULL') {\n required.push(field.name);\n }\n }\n const result: Record<string, unknown> = { type: 'object', properties };\n if (required.length > 0) result.required = required;\n return result;\n }\n }\n\n switch (typeName) {\n case 'String':\n case 'ID':\n return { type: 'string' };\n case 'Int':\n return { type: 'integer' };\n case 'Float':\n return { type: 'number' };\n case 'Boolean':\n return { type: 'boolean' };\n default:\n return {};\n }\n}\n\n/**\n * Convert a GraphQL TypeRef to a Zod schema.\n */\nfunction typeRefToZod(typeRef: TypeRef, schema: ParsedSchema): z.ZodType {\n if (typeRef.kind === 'NON_NULL') {\n if (!typeRef.ofType) return z.unknown();\n return typeRefToZod(typeRef.ofType, schema);\n }\n\n if (typeRef.kind === 'LIST') {\n if (!typeRef.ofType) return z.array(z.unknown()).optional();\n return z.array(typeRefToZod(typeRef.ofType, schema)).optional();\n }\n\n const unwrapped = unwrapType(typeRef);\n const typeName = unwrapped.name;\n\n if (typeName) {\n const namedType = schema.types.get(typeName);\n if (namedType && namedType.kind === 'ENUM' && namedType.enumValues.length > 0) {\n const values = namedType.enumValues.map((v) => v.name) as [string, ...string[]];\n return z.enum(values).optional();\n }\n\n if (namedType && namedType.kind === 'INPUT_OBJECT') {\n const shape: Record<string, z.ZodType> = {};\n for (const field of namedType.inputFields) {\n const fieldSchema = typeRefToZod(field.type, schema);\n if (field.type.kind === 'NON_NULL') {\n shape[field.name] = fieldSchema;\n } else {\n shape[field.name] = fieldSchema.optional();\n }\n }\n return z.object(shape);\n }\n }\n\n switch (typeName) {\n case 'String':\n case 'ID':\n return z.string().optional();\n case 'Int':\n return z.number().int().optional();\n case 'Float':\n return z.number().optional();\n case 'Boolean':\n return z.boolean().optional();\n default:\n return z.unknown().optional();\n }\n}\n\n/**\n * Build JSON Schema for a field's arguments.\n */\nfunction buildJsonSchema(\n field: SchemaField,\n schema: ParsedSchema,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const arg of field.args) {\n properties[arg.name] = typeRefToJsonSchema(arg.type, schema);\n if (arg.type.kind === 'NON_NULL') {\n required.push(arg.name);\n }\n }\n\n const result: Record<string, unknown> = {\n type: 'object',\n properties,\n };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/**\n * Build a Zod object schema for a field's arguments.\n */\nfunction buildZodSchema(\n field: SchemaField,\n schema: ParsedSchema,\n): z.ZodObject<Record<string, z.ZodType>> {\n const shape: Record<string, z.ZodType> = {};\n\n for (const arg of field.args) {\n const zodType = typeRefToZod(arg.type, schema);\n if (arg.type.kind === 'NON_NULL') {\n shape[arg.name] = zodType;\n } else {\n shape[arg.name] = zodType.optional();\n }\n }\n\n return z.object(shape);\n}\n\n/**\n * Collect all query/mutation fields from the schema.\n */\nfunction collectRootFields(\n schema: ParsedSchema,\n): Array<{ field: SchemaField; operationType: 'query' | 'mutation' }> {\n const result: Array<{ field: SchemaField; operationType: 'query' | 'mutation' }> = [];\n\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n for (const field of queryType.fields) {\n result.push({ field, operationType: 'query' });\n }\n }\n\n if (schema.mutationType) {\n const mutationType = schema.types.get(schema.mutationType);\n if (mutationType) {\n for (const field of mutationType.fields) {\n result.push({ field, operationType: 'mutation' });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Create tools compatible with LangChain's Tool pattern.\n * Each tool's func accepts a JSON string input and returns a JSON string.\n */\nexport function createLangChainTools(\n schema: ParsedSchema,\n executor: GraphQLExecutor,\n options?: AdapterOptions,\n): LangChainToolConfig[] {\n const maxDepth = options?.maxDepth ?? 2;\n const rootFields = collectRootFields(schema);\n\n return rootFields.map(({ field, operationType }) => {\n const toolName = operationType === 'query' ? `query_${field.name}` : `mutate_${field.name}`;\n const description = field.description || `${operationType === 'query' ? 'Query' : 'Mutation'} ${field.name}`;\n const jsonSchema = buildJsonSchema(field, schema);\n\n return {\n name: toolName,\n description,\n schema: jsonSchema,\n func: async (input: string): Promise<string> => {\n const variables = input ? JSON.parse(input) : {};\n const op = buildOperation(schema, field.name, { maxDepth });\n return executor.execute(op.operation, variables);\n },\n };\n });\n}\n\n/**\n * Create tools compatible with LangChain's StructuredTool pattern.\n * Each tool's func accepts a typed object and returns a JSON string.\n */\nexport function createStructuredTools(\n schema: ParsedSchema,\n executor: GraphQLExecutor,\n options?: AdapterOptions,\n): StructuredToolConfig[] {\n const maxDepth = options?.maxDepth ?? 2;\n const rootFields = collectRootFields(schema);\n\n return rootFields.map(({ field, operationType }) => {\n const toolName = operationType === 'query' ? `query_${field.name}` : `mutate_${field.name}`;\n const description = field.description || `${operationType === 'query' ? 'Query' : 'Mutation'} ${field.name}`;\n const zodSchema = buildZodSchema(field, schema);\n\n return {\n name: toolName,\n description,\n schema: zodSchema,\n func: async (input: Record<string, unknown>): Promise<string> => {\n const op = buildOperation(schema, field.name, { maxDepth });\n return executor.execute(op.operation, input);\n },\n };\n });\n}\n","import type { ParsedSchema, SchemaField, TypeRef } from '../types/index.js';\nimport { buildOperation } from '../operations/index.js';\nimport { unwrapType } from '../operations/variables.js';\nimport type { GraphQLExecutor } from '../mcp/executor.js';\n\nexport interface CrewAIToolConfig {\n name: string;\n description: string;\n args_schema: Record<string, unknown>;\n func: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface AdapterOptions {\n maxDepth?: number;\n}\n\n/**\n * Convert a GraphQL TypeRef to a JSON Schema representation.\n */\nfunction typeRefToJsonSchema(typeRef: TypeRef, schema: ParsedSchema): Record<string, unknown> {\n if (typeRef.kind === 'NON_NULL') {\n if (!typeRef.ofType) return { type: 'string' };\n return typeRefToJsonSchema(typeRef.ofType, schema);\n }\n\n if (typeRef.kind === 'LIST') {\n if (!typeRef.ofType) return { type: 'array', items: {} };\n return { type: 'array', items: typeRefToJsonSchema(typeRef.ofType, schema) };\n }\n\n const unwrapped = unwrapType(typeRef);\n const typeName = unwrapped.name;\n\n if (typeName) {\n const namedType = schema.types.get(typeName);\n if (namedType && namedType.kind === 'ENUM' && namedType.enumValues.length > 0) {\n return { type: 'string', enum: namedType.enumValues.map((v) => v.name) };\n }\n\n if (namedType && namedType.kind === 'INPUT_OBJECT') {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const field of namedType.inputFields) {\n properties[field.name] = typeRefToJsonSchema(field.type, schema);\n if (field.type.kind === 'NON_NULL') {\n required.push(field.name);\n }\n }\n const result: Record<string, unknown> = { type: 'object', properties };\n if (required.length > 0) result.required = required;\n return result;\n }\n }\n\n switch (typeName) {\n case 'String':\n case 'ID':\n return { type: 'string' };\n case 'Int':\n return { type: 'integer' };\n case 'Float':\n return { type: 'number' };\n case 'Boolean':\n return { type: 'boolean' };\n default:\n return {};\n }\n}\n\n/**\n * Build JSON Schema for a field's arguments, using CrewAI conventions.\n */\nfunction buildArgsSchema(\n field: SchemaField,\n schema: ParsedSchema,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const arg of field.args) {\n properties[arg.name] = typeRefToJsonSchema(arg.type, schema);\n if (arg.type.kind === 'NON_NULL') {\n required.push(arg.name);\n }\n }\n\n const result: Record<string, unknown> = {\n type: 'object',\n properties,\n };\n if (required.length > 0) result.required = required;\n return result;\n}\n\n/**\n * Create tools compatible with CrewAI's tool interface.\n * CrewAI uses args_schema (JSON Schema) and func takes a dict.\n */\nexport function createCrewAITools(\n schema: ParsedSchema,\n executor: GraphQLExecutor,\n options?: AdapterOptions,\n): CrewAIToolConfig[] {\n const maxDepth = options?.maxDepth ?? 2;\n const tools: CrewAIToolConfig[] = [];\n\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n for (const field of queryType.fields) {\n const toolName = `query_${field.name}`;\n const description = field.description || `Query ${field.name}`;\n const argsSchema = buildArgsSchema(field, schema);\n\n tools.push({\n name: toolName,\n description,\n args_schema: argsSchema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const op = buildOperation(schema, field.name, { maxDepth });\n return executor.execute(op.operation, args);\n },\n });\n }\n }\n\n if (schema.mutationType) {\n const mutationType = schema.types.get(schema.mutationType);\n if (mutationType) {\n for (const field of mutationType.fields) {\n const toolName = `mutate_${field.name}`;\n const description = field.description || `Mutation ${field.name}`;\n const argsSchema = buildArgsSchema(field, schema);\n\n tools.push({\n name: toolName,\n description,\n args_schema: argsSchema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const op = buildOperation(schema, field.name, { maxDepth });\n return executor.execute(op.operation, args);\n },\n });\n }\n }\n }\n\n return tools;\n}\n","import { z } from 'zod';\nimport type { ParsedSchema, SchemaField, TypeRef } from '../types/index.js';\nimport { buildOperation } from '../operations/index.js';\nimport { unwrapType } from '../operations/variables.js';\nimport type { GraphQLExecutor } from '../mcp/executor.js';\n\nexport interface VercelAIToolConfig {\n description: string;\n parameters: z.ZodObject<Record<string, z.ZodType>>;\n execute: (args: Record<string, unknown>) => Promise<string>;\n}\n\ninterface AdapterOptions {\n maxDepth?: number;\n}\n\n/**\n * Convert a GraphQL TypeRef to a Zod schema.\n */\nfunction typeRefToZod(typeRef: TypeRef, schema: ParsedSchema): z.ZodType {\n if (typeRef.kind === 'NON_NULL') {\n if (!typeRef.ofType) return z.unknown();\n return typeRefToZod(typeRef.ofType, schema);\n }\n\n if (typeRef.kind === 'LIST') {\n if (!typeRef.ofType) return z.array(z.unknown()).optional();\n return z.array(typeRefToZod(typeRef.ofType, schema)).optional();\n }\n\n const unwrapped = unwrapType(typeRef);\n const typeName = unwrapped.name;\n\n if (typeName) {\n const namedType = schema.types.get(typeName);\n if (namedType && namedType.kind === 'ENUM' && namedType.enumValues.length > 0) {\n const values = namedType.enumValues.map((v) => v.name) as [string, ...string[]];\n return z.enum(values).optional();\n }\n\n if (namedType && namedType.kind === 'INPUT_OBJECT') {\n const shape: Record<string, z.ZodType> = {};\n for (const field of namedType.inputFields) {\n const fieldSchema = typeRefToZod(field.type, schema);\n if (field.type.kind === 'NON_NULL') {\n shape[field.name] = fieldSchema;\n } else {\n shape[field.name] = fieldSchema.optional();\n }\n }\n return z.object(shape);\n }\n }\n\n switch (typeName) {\n case 'String':\n case 'ID':\n return z.string().optional();\n case 'Int':\n return z.number().int().optional();\n case 'Float':\n return z.number().optional();\n case 'Boolean':\n return z.boolean().optional();\n default:\n return z.unknown().optional();\n }\n}\n\n/**\n * Build a Zod object schema for a field's arguments.\n */\nfunction buildParametersSchema(\n field: SchemaField,\n schema: ParsedSchema,\n): z.ZodObject<Record<string, z.ZodType>> {\n const shape: Record<string, z.ZodType> = {};\n\n for (const arg of field.args) {\n const zodType = typeRefToZod(arg.type, schema);\n if (arg.type.kind === 'NON_NULL') {\n shape[arg.name] = zodType;\n } else {\n shape[arg.name] = zodType.optional();\n }\n }\n\n return z.object(shape);\n}\n\n/**\n * Create tools compatible with Vercel AI SDK's tool() shape.\n * Returns Record<toolName, { description, parameters: ZodSchema, execute }>.\n */\nexport function createVercelAITools(\n schema: ParsedSchema,\n executor: GraphQLExecutor,\n options?: AdapterOptions,\n): Record<string, VercelAIToolConfig> {\n const maxDepth = options?.maxDepth ?? 2;\n const tools: Record<string, VercelAIToolConfig> = {};\n\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n for (const field of queryType.fields) {\n const toolName = `query_${field.name}`;\n const description = field.description || `Query ${field.name}`;\n const parameters = buildParametersSchema(field, schema);\n\n tools[toolName] = {\n description,\n parameters,\n execute: async (args: Record<string, unknown>): Promise<string> => {\n const op = buildOperation(schema, field.name, { maxDepth });\n return executor.execute(op.operation, args);\n },\n };\n }\n }\n\n if (schema.mutationType) {\n const mutationType = schema.types.get(schema.mutationType);\n if (mutationType) {\n for (const field of mutationType.fields) {\n const toolName = `mutate_${field.name}`;\n const description = field.description || `Mutation ${field.name}`;\n const parameters = buildParametersSchema(field, schema);\n\n tools[toolName] = {\n description,\n parameters,\n execute: async (args: Record<string, unknown>): Promise<string> => {\n const op = buildOperation(schema, field.name, { maxDepth });\n return executor.execute(op.operation, args);\n },\n };\n }\n }\n }\n\n return tools;\n}\n","import type { ParsedSchema, SchemaField, TypeRef } from '../types/index.js';\nimport { unwrapType } from '../operations/variables.js';\nimport { GraphQLExecutor } from '../mcp/executor.js';\n\nexport interface MockConfig {\n seed?: number;\n arrayLength?: number;\n maxDepth?: number;\n}\n\nconst DEFAULT_ARRAY_LENGTH = 3;\nconst DEFAULT_MAX_DEPTH = 3;\n\n/**\n * Simple deterministic hash from a string.\n * Returns a positive integer.\n */\nfunction hashString(str: string, seed: number = 0): number {\n let hash = seed;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash + char) | 0;\n }\n return Math.abs(hash);\n}\n\n/**\n * Parse @mock(...) directive from a field description.\n * Supports: @mock(\"string value\"), @mock(123), @mock(true), @mock(false)\n */\nfunction parseMockDirective(description: string | null): unknown | undefined {\n if (!description) return undefined;\n\n const match = description.match(/@mock\\(([^)]+)\\)/);\n if (!match) return undefined;\n\n const raw = match[1].trim();\n\n // String value: @mock(\"value\") or @mock('value')\n if ((raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))) {\n return raw.slice(1, -1);\n }\n\n // Boolean\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n\n // Number\n const num = Number(raw);\n if (!isNaN(num)) return num;\n\n // Fallback: return raw string\n return raw;\n}\n\n/**\n * Generate a mock scalar value for a given type name and field name.\n */\nfunction generateScalar(\n typeName: string,\n fieldName: string,\n index: number,\n seed: number,\n): unknown {\n const hash = hashString(fieldName, seed);\n\n switch (typeName) {\n case 'String':\n return `mock_${fieldName}`;\n case 'Int':\n return (hash % 1000) + index;\n case 'Float':\n return parseFloat(((hash % 10000) / 100 + index * 0.1).toFixed(2));\n case 'Boolean':\n return index % 2 === 0;\n case 'ID':\n return `id_${fieldName}_${index}`;\n default:\n return `mock_${typeName}_${fieldName}`;\n }\n}\n\n/**\n * Generate mock data for a specific type in the schema.\n */\nexport function generateMockData(\n schema: ParsedSchema,\n typeName: string,\n config?: MockConfig,\n): Record<string, unknown> {\n const seed = config?.seed ?? 0;\n const arrayLength = config?.arrayLength ?? DEFAULT_ARRAY_LENGTH;\n const maxDepth = config?.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n return generateForType(schema, typeName, 0, maxDepth, arrayLength, seed, 0, new Set());\n}\n\nfunction generateForType(\n schema: ParsedSchema,\n typeName: string,\n depth: number,\n maxDepth: number,\n arrayLength: number,\n seed: number,\n index: number,\n visited: Set<string>,\n): Record<string, unknown> {\n const type = schema.types.get(typeName);\n if (!type || type.fields.length === 0) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n\n for (const field of type.fields) {\n // Check for @mock directive in description\n const mockValue = parseMockDirective(field.description);\n if (mockValue !== undefined) {\n result[field.name] = mockValue;\n continue;\n }\n\n result[field.name] = generateForField(\n schema,\n field,\n depth,\n maxDepth,\n arrayLength,\n seed,\n index,\n visited,\n );\n }\n\n return result;\n}\n\nfunction generateForField(\n schema: ParsedSchema,\n field: SchemaField,\n depth: number,\n maxDepth: number,\n arrayLength: number,\n seed: number,\n index: number,\n visited: Set<string>,\n): unknown {\n return generateForTypeRef(\n schema,\n field.type,\n field.name,\n depth,\n maxDepth,\n arrayLength,\n seed,\n index,\n visited,\n );\n}\n\nfunction generateForTypeRef(\n schema: ParsedSchema,\n typeRef: TypeRef,\n fieldName: string,\n depth: number,\n maxDepth: number,\n arrayLength: number,\n seed: number,\n index: number,\n visited: Set<string>,\n): unknown {\n // Unwrap NON_NULL\n if (typeRef.kind === 'NON_NULL') {\n if (!typeRef.ofType) return null;\n return generateForTypeRef(\n schema,\n typeRef.ofType,\n fieldName,\n depth,\n maxDepth,\n arrayLength,\n seed,\n index,\n visited,\n );\n }\n\n // Handle LIST\n if (typeRef.kind === 'LIST') {\n if (!typeRef.ofType) return [];\n if (depth >= maxDepth) return [];\n\n const items: unknown[] = [];\n for (let i = 0; i < arrayLength; i++) {\n items.push(\n generateForTypeRef(\n schema,\n typeRef.ofType,\n fieldName,\n depth,\n maxDepth,\n arrayLength,\n seed,\n i,\n new Set(visited),\n ),\n );\n }\n return items;\n }\n\n const unwrapped = unwrapType(typeRef);\n const resolvedTypeName = unwrapped.name;\n\n if (!resolvedTypeName) return null;\n\n // Check if it's an enum\n const namedType = schema.types.get(resolvedTypeName);\n if (namedType && namedType.kind === 'ENUM' && namedType.enumValues.length > 0) {\n return namedType.enumValues[0].name;\n }\n\n // Check if it's a scalar\n if (\n unwrapped.kind === 'SCALAR' ||\n (namedType && namedType.kind === 'SCALAR')\n ) {\n return generateScalar(resolvedTypeName, fieldName, index, seed);\n }\n\n // It's an object type — recurse if within depth\n if (depth >= maxDepth) {\n return null;\n }\n\n // Prevent infinite recursion for circular types\n if (visited.has(resolvedTypeName)) {\n return null;\n }\n\n visited.add(resolvedTypeName);\n const result = generateForType(\n schema,\n resolvedTypeName,\n depth + 1,\n maxDepth,\n arrayLength,\n seed,\n index,\n new Set(visited),\n );\n visited.delete(resolvedTypeName);\n\n return result;\n}\n\n/**\n * Create a mock executor that returns generated data instead of HTTP calls.\n * Implements the same interface as GraphQLExecutor.\n */\nexport function createMockExecutor(\n schema: ParsedSchema,\n config?: MockConfig,\n): GraphQLExecutor {\n const mockExecutor = Object.create(GraphQLExecutor.prototype) as GraphQLExecutor;\n\n // Override the execute method\n (mockExecutor as unknown as Record<string, unknown>).execute = async (\n operation: string,\n _variables?: Record<string, unknown>,\n _additionalHeaders?: Record<string, string>,\n ): Promise<string> => {\n // Parse the operation to find the root field name and its return type\n const rootFieldName = extractRootFieldName(operation);\n if (!rootFieldName) {\n return JSON.stringify({ data: null });\n }\n\n // Find the return type from the schema\n const returnTypeName = findReturnTypeName(schema, rootFieldName);\n if (!returnTypeName) {\n return JSON.stringify({ data: { [rootFieldName]: null } });\n }\n\n // Check if it's a scalar return type\n const returnType = schema.types.get(returnTypeName);\n if (!returnType || returnType.kind === 'SCALAR') {\n const scalarValue = generateScalar(returnTypeName, rootFieldName, 0, config?.seed ?? 0);\n return JSON.stringify({ data: { [rootFieldName]: scalarValue } }, null, 2);\n }\n\n // Check if the field returns a list\n const isList = isListField(schema, rootFieldName);\n if (isList) {\n const arrayLength = config?.arrayLength ?? DEFAULT_ARRAY_LENGTH;\n const items: Record<string, unknown>[] = [];\n for (let i = 0; i < arrayLength; i++) {\n items.push(generateMockData(schema, returnTypeName, { ...config, seed: (config?.seed ?? 0) + i }));\n }\n return JSON.stringify({ data: { [rootFieldName]: items } }, null, 2);\n }\n\n const mockData = generateMockData(schema, returnTypeName, config);\n return JSON.stringify({ data: { [rootFieldName]: mockData } }, null, 2);\n };\n\n return mockExecutor;\n}\n\n/**\n * Extract the root field name from a GraphQL operation string.\n */\nfunction extractRootFieldName(operation: string): string | null {\n // Match the first field after the opening brace of the operation\n // e.g., \"query UserQuery($id: ID!) {\\n user(id: $id) {\\n...\"\n const match = operation.match(/(?:query|mutation|subscription)\\s+\\w*[^{]*\\{\\s*(\\w+)/);\n if (match) return match[1];\n\n // Try simpler pattern: \"{ fieldName\"\n const simpleMatch = operation.match(/\\{\\s*(\\w+)/);\n return simpleMatch ? simpleMatch[1] : null;\n}\n\n/**\n * Find the return type name for a root field.\n */\nfunction findReturnTypeName(schema: ParsedSchema, fieldName: string): string | null {\n // Check query type\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n const field = queryType.fields.find((f) => f.name === fieldName);\n if (field) {\n const unwrapped = unwrapType(field.type);\n return unwrapped.name;\n }\n }\n\n // Check mutation type\n if (schema.mutationType) {\n const mutationType = schema.types.get(schema.mutationType);\n if (mutationType) {\n const field = mutationType.fields.find((f) => f.name === fieldName);\n if (field) {\n const unwrapped = unwrapType(field.type);\n return unwrapped.name;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Check if a root field returns a list type.\n */\nfunction isListField(schema: ParsedSchema, fieldName: string): boolean {\n const queryType = schema.types.get(schema.queryType);\n if (queryType) {\n const field = queryType.fields.find((f) => f.name === fieldName);\n if (field) return isListTypeRef(field.type);\n }\n\n if (schema.mutationType) {\n const mutationType = schema.types.get(schema.mutationType);\n if (mutationType) {\n const field = mutationType.fields.find((f) => f.name === fieldName);\n if (field) return isListTypeRef(field.type);\n }\n }\n\n return false;\n}\n\nfunction isListTypeRef(typeRef: TypeRef): boolean {\n if (typeRef.kind === 'LIST') return true;\n if (typeRef.kind === 'NON_NULL' && typeRef.ofType) return isListTypeRef(typeRef.ofType);\n return false;\n}\n"],"mappings":"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","names":["z","GraphQLClient","z","z","typeRefToZod","z","typeRefToJsonSchema","z","typeRefToZod","z"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "graphql-agent-toolkit",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Turn any GraphQL API into AI-agent-ready tools — MCP servers, LangChain tools, and standalone SDKs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"bin": {
|
|
22
|
+
"graphql-agent-toolkit": "./dist/cli.js"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsup",
|
|
29
|
+
"dev": "tsup --watch",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"lint": "eslint src/ --ext .ts",
|
|
33
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"prepublishOnly": "npm run build"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"graphql",
|
|
39
|
+
"mcp",
|
|
40
|
+
"ai",
|
|
41
|
+
"agent",
|
|
42
|
+
"toolkit",
|
|
43
|
+
"langchain",
|
|
44
|
+
"model-context-protocol",
|
|
45
|
+
"crewai",
|
|
46
|
+
"vercel-ai",
|
|
47
|
+
"introspection",
|
|
48
|
+
"typescript",
|
|
49
|
+
"sdk"
|
|
50
|
+
],
|
|
51
|
+
"author": "Mark Stuart",
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"repository": {
|
|
54
|
+
"type": "git",
|
|
55
|
+
"url": "https://github.com/mstuart/graphql-agent-toolkit.git"
|
|
56
|
+
},
|
|
57
|
+
"homepage": "https://github.com/mstuart/graphql-agent-toolkit#readme",
|
|
58
|
+
"bugs": {
|
|
59
|
+
"url": "https://github.com/mstuart/graphql-agent-toolkit/issues"
|
|
60
|
+
},
|
|
61
|
+
"sideEffects": false,
|
|
62
|
+
"engines": {
|
|
63
|
+
"node": ">=18.0.0"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
66
|
+
"graphql": "^16.12.0"
|
|
67
|
+
},
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
70
|
+
"commander": "^14.0.3",
|
|
71
|
+
"graphql-request": "^7.4.0",
|
|
72
|
+
"zod": "^4.3.6"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"graphql": "^16.12.0",
|
|
76
|
+
"@types/node": "^25.2.3",
|
|
77
|
+
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
|
78
|
+
"@typescript-eslint/parser": "^8.55.0",
|
|
79
|
+
"eslint": "^8.57.1",
|
|
80
|
+
"prettier": "^3.8.1",
|
|
81
|
+
"tsup": "^8.5.1",
|
|
82
|
+
"typescript": "^5.9.3",
|
|
83
|
+
"vitest": "^4.0.18"
|
|
84
|
+
}
|
|
85
|
+
}
|