{"version":3,"file":"server.cjs","names":["MantineMcpDataClient","readline"],"sources":["../src/server.ts"],"sourcesContent":["import readline from 'node:readline';\nimport { MantineMcpDataClient } from './data-client';\nimport { GetItemArgs, ListItemsArgs, SearchDocsArgs } from './types';\n\ninterface JsonRpcRequest {\n  jsonrpc: '2.0';\n  id?: string | number | null;\n  method: string;\n  params?: unknown;\n}\n\nconst TOOL_DEFINITIONS = [\n  {\n    name: 'list_items',\n    description:\n      'List Mantine documentation items. Supports filtering by kind (component|hook), package and text query.',\n    inputSchema: {\n      type: 'object',\n      properties: {\n        kind: { type: 'string', enum: ['component', 'hook'] },\n        package: { type: 'string' },\n        query: { type: 'string' },\n        limit: { type: 'number' },\n      },\n      additionalProperties: false,\n    },\n  },\n  {\n    name: 'get_item_doc',\n    description: 'Get the LLM-ready markdown documentation for a Mantine item by name or id.',\n    inputSchema: {\n      type: 'object',\n      properties: {\n        name: { type: 'string' },\n        kind: { type: 'string', enum: ['component', 'hook'] },\n      },\n      required: ['name'],\n      additionalProperties: false,\n    },\n  },\n  {\n    name: 'get_item_props',\n    description: 'Get normalized props metadata for a Mantine item by name or id.',\n    inputSchema: {\n      type: 'object',\n      properties: {\n        name: { type: 'string' },\n        kind: { type: 'string', enum: ['component', 'hook'] },\n      },\n      required: ['name'],\n      additionalProperties: false,\n    },\n  },\n  {\n    name: 'search_docs',\n    description: 'Search Mantine docs by free text query and return ranked matches.',\n    inputSchema: {\n      type: 'object',\n      properties: {\n        kind: { type: 'string', enum: ['component', 'hook'] },\n        query: { type: 'string' },\n        limit: { type: 'number' },\n      },\n      required: ['query'],\n      additionalProperties: false,\n    },\n  },\n];\n\nfunction createJsonRpcError(code: number, message: string) {\n  return { code, message };\n}\n\nfunction toToolResult(content: unknown) {\n  const text = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n  return {\n    content: [{ type: 'text', text }],\n  };\n}\n\nfunction toToolError(message: string) {\n  return {\n    isError: true,\n    content: [{ type: 'text', text: message }],\n  };\n}\n\nfunction parseListItemsArgs(args: Record<string, unknown>): ListItemsArgs {\n  return {\n    kind: args.kind === 'component' || args.kind === 'hook' ? args.kind : undefined,\n    package: typeof args.package === 'string' ? args.package : undefined,\n    query: typeof args.query === 'string' ? args.query : undefined,\n    limit: typeof args.limit === 'number' ? args.limit : undefined,\n  };\n}\n\nfunction parseGetItemArgs(args: Record<string, unknown>): GetItemArgs | null {\n  if (typeof args.name !== 'string' || args.name.length === 0) {\n    return null;\n  }\n\n  return {\n    name: args.name,\n    kind: args.kind === 'component' || args.kind === 'hook' ? args.kind : undefined,\n  };\n}\n\nfunction parseSearchDocsArgs(args: Record<string, unknown>): SearchDocsArgs | null {\n  if (typeof args.query !== 'string' || args.query.length === 0) {\n    return null;\n  }\n\n  return {\n    query: args.query,\n    kind: args.kind === 'component' || args.kind === 'hook' ? args.kind : undefined,\n    limit: typeof args.limit === 'number' ? args.limit : undefined,\n  };\n}\n\nfunction writeMessage(payload: unknown) {\n  process.stdout.write(`${JSON.stringify(payload)}\\n`);\n}\n\nfunction writeResponse(id: string | number | null, result: unknown) {\n  writeMessage({ jsonrpc: '2.0', id, result });\n}\n\nfunction writeError(id: string | number | null, code: number, message: string) {\n  writeMessage({\n    jsonrpc: '2.0',\n    id,\n    error: createJsonRpcError(code, message),\n  });\n}\n\nexport function startServer() {\n  const timeoutMs = Number(process.env.MANTINE_MCP_TIMEOUT_MS || 10000);\n  const dataUrl = process.env.MANTINE_MCP_DATA_URL || 'https://mantine.dev/mcp';\n  const client = new MantineMcpDataClient(dataUrl, timeoutMs);\n\n  const rl = readline.createInterface({ input: process.stdin, terminal: false });\n\n  rl.on('line', (line: string) => {\n    const trimmed = line.trim();\n    if (trimmed.length === 0) {\n      return;\n    }\n\n    let request: JsonRpcRequest;\n    try {\n      request = JSON.parse(trimmed);\n    } catch {\n      writeError(null, -32700, 'Parse error');\n      return;\n    }\n\n    void handleRequest(client, request);\n  });\n}\n\nasync function handleRequest(client: MantineMcpDataClient, request: JsonRpcRequest) {\n  const id = request.id ?? null;\n\n  if (!request || request.jsonrpc !== '2.0' || typeof request.method !== 'string') {\n    writeError(id, -32600, 'Invalid request');\n    return;\n  }\n\n  try {\n    switch (request.method) {\n      case 'initialize': {\n        writeResponse(id, {\n          protocolVersion: '2024-11-05',\n          capabilities: {\n            tools: {},\n          },\n          serverInfo: {\n            name: '@mantine/mcp-server',\n            version: '9',\n          },\n        });\n        break;\n      }\n\n      case 'notifications/initialized': {\n        return;\n      }\n\n      case 'tools/list': {\n        writeResponse(id, { tools: TOOL_DEFINITIONS });\n        return;\n      }\n\n      case 'tools/call': {\n        const params =\n          request.params && typeof request.params === 'object'\n            ? (request.params as Record<string, unknown>)\n            : {};\n        const name = typeof params.name === 'string' ? params.name : '';\n        const args =\n          params.arguments && typeof params.arguments === 'object'\n            ? (params.arguments as Record<string, unknown>)\n            : {};\n\n        if (!name) {\n          writeResponse(id, toToolError('Tool name is required'));\n          return;\n        }\n\n        if (name === 'list_items') {\n          const result = await client.listItems(parseListItemsArgs(args));\n          writeResponse(id, toToolResult(result));\n          return;\n        }\n\n        if (name === 'get_item_doc') {\n          const parsed = parseGetItemArgs(args);\n          if (!parsed) {\n            writeResponse(id, toToolError('Argument \"name\" is required'));\n            return;\n          }\n\n          const result = await client.getItemDoc(parsed);\n          if (!result) {\n            writeResponse(id, toToolError(`Item not found: ${parsed.name}`));\n            return;\n          }\n\n          writeResponse(id, toToolResult(result));\n          return;\n        }\n\n        if (name === 'get_item_props') {\n          const parsed = parseGetItemArgs(args);\n          if (!parsed) {\n            writeResponse(id, toToolError('Argument \"name\" is required'));\n            return;\n          }\n\n          const result = await client.getItemProps(parsed);\n          if (!result) {\n            writeResponse(id, toToolError(`Item not found: ${parsed.name}`));\n            return;\n          }\n\n          writeResponse(id, toToolResult(result));\n          return;\n        }\n\n        if (name === 'search_docs') {\n          const parsed = parseSearchDocsArgs(args);\n          if (!parsed) {\n            writeResponse(id, toToolError('Argument \"query\" is required'));\n            return;\n          }\n\n          const result = await client.searchDocs(parsed);\n          writeResponse(id, toToolResult(result));\n          return;\n        }\n\n        writeResponse(id, toToolError(`Unknown tool: ${name}`));\n        return;\n      }\n\n      default: {\n        if (id === null) {\n          return;\n        }\n\n        writeError(id, -32601, `Method not found: ${request.method}`);\n      }\n    }\n  } catch (error) {\n    const message = error instanceof Error ? error.message : 'Unexpected error';\n\n    if (request.method === 'tools/call') {\n      writeResponse(id, toToolError(message));\n      return;\n    }\n\n    writeError(id, -32000, message);\n  }\n}\n"],"mappings":"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"}