{"version":3,"file":"tools.mjs","names":[],"sources":["../src/tools.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/server';\nimport * as z from 'zod';\nimport { MantineMcpDataClient } from './data-client';\n\nconst kindSchema = z.enum(['component', 'hook', 'guide', 'faq']);\nconst groupSchema = z.enum([\n  'gettingStarted',\n  'theming',\n  'hooks',\n  'components',\n  'extensions',\n  'form',\n]);\nconst nameSchema = z.string().trim().min(1);\n\nfunction text(payload: unknown) {\n  return {\n    content: [\n      {\n        type: 'text' as const,\n        text: typeof payload === 'string' ? payload : JSON.stringify(payload, null, 2),\n      },\n    ],\n  };\n}\n\nfunction error(message: string) {\n  return { isError: true, content: [{ type: 'text' as const, text: message }] };\n}\n\n/** Registers every Mantine documentation tool on an MCP server instance */\nexport function registerTools(server: McpServer, client: MantineMcpDataClient): void {\n  server.registerTool(\n    'search_docs',\n    {\n      title: 'Search Mantine documentation',\n      description:\n        'Search all Mantine documentation — components, hooks, @mantine/form, styling, theming, guides and FAQ. Returns ranked matches; a match may point at a specific section, which can then be fetched with get_item_doc.',\n      inputSchema: z.object({\n        query: z.string().describe('Free text query, e.g. \"validate a form with zod\"'),\n        kind: kindSchema.optional(),\n        package: z.string().optional().describe('Filter by package, e.g. \"@mantine/form\"'),\n        limit: z.number().optional().describe('Maximum number of results (default 20, max 100)'),\n      }),\n    },\n    async (args) => text(await client.search(args))\n  );\n\n  server.registerTool(\n    'get_item_doc',\n    {\n      title: 'Get Mantine documentation',\n      description:\n        'Get documentation for a Mantine component, hook, guide or FAQ page. Without a section it returns an outline (description plus section list) — pass a section to fetch just that part, or full:true for the whole page.',\n      inputSchema: z.object({\n        name: nameSchema.describe('Item name or id, e.g. \"useForm\", \"Button\", \"form-validation\"'),\n        kind: kindSchema.optional(),\n        section: z.string().optional().describe('Section slug from the outline, e.g. \"zod\"'),\n        full: z.boolean().optional().describe('Return the entire page; can be very large'),\n      }),\n    },\n    async (args) => {\n      const result = await client.getDoc(args);\n\n      if (!result) {\n        const suggestions = await client.suggestFor(args.name);\n        return error(\n          suggestions.length > 0\n            ? `No exact match for \"${args.name}\". Did you mean: ${suggestions.join(', ')}?`\n            : `No Mantine documentation found for \"${args.name}\". Try search_docs first.`\n        );\n      }\n\n      return text(result);\n    }\n  );\n\n  server.registerTool(\n    'get_item_props',\n    {\n      title: 'Get Mantine props or signature',\n      description:\n        'Get props for a Mantine component, or the TypeScript signature for a hook. Pages documenting an API in prose point at the relevant section instead.',\n      inputSchema: z.object({ name: nameSchema, kind: kindSchema.optional() }),\n    },\n    async (args) => {\n      const result = await client.getProps(args);\n\n      if (!result) {\n        const suggestions = await client.suggestFor(args.name);\n        return error(\n          suggestions.length > 0\n            ? `No exact match for \"${args.name}\". Did you mean: ${suggestions.join(', ')}?`\n            : `No Mantine documentation found for \"${args.name}\".`\n        );\n      }\n\n      return text(result);\n    }\n  );\n\n  server.registerTool(\n    'list_items',\n    {\n      title: 'List Mantine documentation items',\n      description:\n        'List Mantine documentation items, filtered by kind, nav group, category, package or a text query.',\n      inputSchema: z.object({\n        kind: kindSchema.optional(),\n        group: groupSchema.optional(),\n        category: z.string().optional(),\n        package: z.string().optional(),\n        query: z.string().optional(),\n        limit: z.number().optional().describe('Maximum number of results (default 30, max 500)'),\n      }),\n    },\n    async (args) => text(await client.listItems(args))\n  );\n\n  server.registerTool(\n    'get_api',\n    {\n      title: 'Resolve a Mantine symbol',\n      description:\n        'Resolve a Mantine symbol (useForm, useDisclosure, UseFormReturnType) to its TypeScript signature and exported types, without knowing which page documents it.',\n      inputSchema: z.object({ symbol: nameSchema }),\n    },\n    async ({ symbol }) => {\n      const result = await client.getApi(symbol);\n\n      if (!result) {\n        const suggestions = await client.suggestFor(symbol);\n        return error(\n          suggestions.length > 0\n            ? `No API found for \"${symbol}\". Did you mean: ${suggestions.join(', ')}?`\n            : `No API found for \"${symbol}\". Try search_docs.`\n        );\n      }\n\n      return text(result);\n    }\n  );\n}\n"],"mappings":"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"}