@mantine/mcp-server 9.3.2 → 9.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"data-client.cjs","names":[],"sources":["../src/data-client.ts"],"sourcesContent":["import { GetItemArgs, IndexItem, ItemData, ItemKind, ListItemsArgs, SearchDocsArgs } from './types';\n\nfunction normalizeValue(value: string) {\n return value.trim().toLowerCase();\n}\n\nfunction clampLimit(limit: number | undefined, fallback: number, max: number) {\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n return fallback;\n }\n\n return Math.max(1, Math.min(max, Math.floor(limit)));\n}\n\nexport class MantineMcpDataClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private indexCache: IndexItem[] | null = null;\n private itemCache = new Map<string, ItemData>();\n\n constructor(baseUrl = 'https://mantine.dev/mcp', timeoutMs = 10000) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.timeoutMs = timeoutMs;\n }\n\n private async fetchJson<T>(relativePath: string): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const url = `${this.baseUrl}/${relativePath.replace(/^\\/+/, '')}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async getIndex() {\n if (this.indexCache) {\n return this.indexCache;\n }\n\n this.indexCache = await this.fetchJson<IndexItem[]>('index.json');\n return this.indexCache;\n }\n\n async listItems(args: ListItemsArgs = {}) {\n const kind = args.kind || 'component';\n const query = args.query ? normalizeValue(args.query) : null;\n const packageName = args.package ? normalizeValue(args.package) : null;\n const limit = clampLimit(args.limit, 30, 200);\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .filter((item) => (packageName ? normalizeValue(item.package) === packageName : true))\n .filter((item) => {\n if (!query) {\n return true;\n }\n\n return (\n normalizeValue(item.name).includes(query) ||\n normalizeValue(item.description).includes(query) ||\n normalizeValue(item.searchText).includes(query)\n );\n })\n .slice(0, limit);\n }\n\n private scoreMatch(item: IndexItem, query: string) {\n const normalizedQuery = normalizeValue(query);\n const normalizedName = normalizeValue(item.name);\n\n if (normalizedName === normalizedQuery) {\n return 100;\n }\n\n if (normalizedName.startsWith(normalizedQuery)) {\n return 80;\n }\n\n if (normalizedName.includes(normalizedQuery)) {\n return 70;\n }\n\n if (normalizeValue(item.searchText).includes(normalizedQuery)) {\n return 40;\n }\n\n const tokens = normalizedQuery.split(/\\s+/).filter(Boolean);\n const matchedTokens = tokens.filter((token) => normalizeValue(item.searchText).includes(token));\n\n if (tokens.length > 0 && matchedTokens.length > 0) {\n return 10 + (matchedTokens.length / tokens.length) * 20;\n }\n\n return 0;\n }\n\n async searchDocs(args: SearchDocsArgs) {\n const kind: ItemKind = args.kind || 'component';\n const limit = clampLimit(args.limit, 20, 100);\n const query = args.query.trim();\n\n if (!query) {\n return [];\n }\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .map((item) => ({ item, score: this.scoreMatch(item, query) }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((entry) => ({\n id: entry.item.id,\n name: entry.item.name,\n kind: entry.item.kind,\n package: entry.item.package,\n route: entry.item.route,\n description: entry.item.description,\n score: Number(entry.score.toFixed(2)),\n }));\n }\n\n private async getItemDataById(id: string): Promise<ItemData> {\n const cached = this.itemCache.get(id);\n if (cached) {\n return cached;\n }\n\n const data = await this.fetchJson<ItemData>(`components/${id}.json`);\n this.itemCache.set(id, data);\n return data;\n }\n\n async findItem(args: GetItemArgs) {\n const kind = args.kind || 'component';\n const requested = normalizeValue(args.name);\n const index = await this.getIndex();\n\n const byKind = index.filter((item) => item.kind === kind);\n\n const exactId = byKind.find((item) => normalizeValue(item.id) === requested);\n if (exactId) {\n return exactId;\n }\n\n const exactName = byKind.find((item) => normalizeValue(item.name) === requested);\n if (exactName) {\n return exactName;\n }\n\n const prefixName = byKind.find((item) => normalizeValue(item.name).startsWith(requested));\n if (prefixName) {\n return prefixName;\n }\n\n return byKind.find((item) => normalizeValue(item.searchText).includes(requested)) || null;\n }\n\n async getItemDoc(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n llmUrl: data.llmUrl,\n },\n markdown: data.markdown,\n };\n }\n\n async getItemProps(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n },\n props: data.props,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-client.cjs","names":[],"sources":["../src/data-client.ts"],"sourcesContent":["import { GetItemArgs, IndexItem, ItemData, ItemKind, ListItemsArgs, SearchDocsArgs } from './types';\n\nfunction normalizeValue(value: string) {\n return value.trim().toLowerCase();\n}\n\nfunction clampLimit(limit: number | undefined, fallback: number, max: number) {\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n return fallback;\n }\n\n return Math.max(1, Math.min(max, Math.floor(limit)));\n}\n\nexport class MantineMcpDataClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private indexCache: IndexItem[] | null = null;\n private itemCache = new Map<string, ItemData>();\n\n constructor(baseUrl = 'https://mantine.dev/mcp', timeoutMs = 10000) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.timeoutMs = timeoutMs;\n }\n\n private async fetchJson<T>(relativePath: string): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const url = `${this.baseUrl}/${relativePath.replace(/^\\/+/, '')}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async getIndex() {\n if (this.indexCache) {\n return this.indexCache;\n }\n\n this.indexCache = await this.fetchJson<IndexItem[]>('index.json');\n return this.indexCache;\n }\n\n async listItems(args: ListItemsArgs = {}) {\n const kind = args.kind || 'component';\n const query = args.query ? normalizeValue(args.query) : null;\n const packageName = args.package ? normalizeValue(args.package) : null;\n const limit = clampLimit(args.limit, 30, 200);\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .filter((item) => (packageName ? normalizeValue(item.package) === packageName : true))\n .filter((item) => {\n if (!query) {\n return true;\n }\n\n return (\n normalizeValue(item.name).includes(query) ||\n normalizeValue(item.description).includes(query) ||\n normalizeValue(item.searchText).includes(query)\n );\n })\n .slice(0, limit);\n }\n\n private scoreMatch(item: IndexItem, query: string) {\n const normalizedQuery = normalizeValue(query);\n const normalizedName = normalizeValue(item.name);\n\n if (normalizedName === normalizedQuery) {\n return 100;\n }\n\n if (normalizedName.startsWith(normalizedQuery)) {\n return 80;\n }\n\n if (normalizedName.includes(normalizedQuery)) {\n return 70;\n }\n\n if (normalizeValue(item.searchText).includes(normalizedQuery)) {\n return 40;\n }\n\n const tokens = normalizedQuery.split(/\\s+/).filter(Boolean);\n const matchedTokens = tokens.filter((token) => normalizeValue(item.searchText).includes(token));\n\n if (tokens.length > 0 && matchedTokens.length > 0) {\n return 10 + (matchedTokens.length / tokens.length) * 20;\n }\n\n return 0;\n }\n\n async searchDocs(args: SearchDocsArgs) {\n const kind: ItemKind = args.kind || 'component';\n const limit = clampLimit(args.limit, 20, 100);\n const query = args.query.trim();\n\n if (!query) {\n return [];\n }\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .map((item) => ({ item, score: this.scoreMatch(item, query) }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((entry) => ({\n id: entry.item.id,\n name: entry.item.name,\n kind: entry.item.kind,\n package: entry.item.package,\n route: entry.item.route,\n description: entry.item.description,\n score: Number(entry.score.toFixed(2)),\n }));\n }\n\n private async getItemDataById(id: string): Promise<ItemData> {\n const cached = this.itemCache.get(id);\n if (cached) {\n return cached;\n }\n\n const data = await this.fetchJson<ItemData>(`components/${id}.json`);\n this.itemCache.set(id, data);\n return data;\n }\n\n async findItem(args: GetItemArgs) {\n const kind = args.kind || 'component';\n const requested = normalizeValue(args.name);\n const index = await this.getIndex();\n\n const byKind = index.filter((item) => item.kind === kind);\n\n const exactId = byKind.find((item) => normalizeValue(item.id) === requested);\n if (exactId) {\n return exactId;\n }\n\n const exactName = byKind.find((item) => normalizeValue(item.name) === requested);\n if (exactName) {\n return exactName;\n }\n\n const prefixName = byKind.find((item) => normalizeValue(item.name).startsWith(requested));\n if (prefixName) {\n return prefixName;\n }\n\n return byKind.find((item) => normalizeValue(item.searchText).includes(requested)) || null;\n }\n\n async getItemDoc(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n llmUrl: data.llmUrl,\n },\n markdown: data.markdown,\n };\n }\n\n async getItemProps(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n },\n props: data.props,\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"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 return;\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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"}
1
+ {"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 return;\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-client.mjs","names":[],"sources":["../src/data-client.ts"],"sourcesContent":["import { GetItemArgs, IndexItem, ItemData, ItemKind, ListItemsArgs, SearchDocsArgs } from './types';\n\nfunction normalizeValue(value: string) {\n return value.trim().toLowerCase();\n}\n\nfunction clampLimit(limit: number | undefined, fallback: number, max: number) {\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n return fallback;\n }\n\n return Math.max(1, Math.min(max, Math.floor(limit)));\n}\n\nexport class MantineMcpDataClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private indexCache: IndexItem[] | null = null;\n private itemCache = new Map<string, ItemData>();\n\n constructor(baseUrl = 'https://mantine.dev/mcp', timeoutMs = 10000) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.timeoutMs = timeoutMs;\n }\n\n private async fetchJson<T>(relativePath: string): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const url = `${this.baseUrl}/${relativePath.replace(/^\\/+/, '')}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async getIndex() {\n if (this.indexCache) {\n return this.indexCache;\n }\n\n this.indexCache = await this.fetchJson<IndexItem[]>('index.json');\n return this.indexCache;\n }\n\n async listItems(args: ListItemsArgs = {}) {\n const kind = args.kind || 'component';\n const query = args.query ? normalizeValue(args.query) : null;\n const packageName = args.package ? normalizeValue(args.package) : null;\n const limit = clampLimit(args.limit, 30, 200);\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .filter((item) => (packageName ? normalizeValue(item.package) === packageName : true))\n .filter((item) => {\n if (!query) {\n return true;\n }\n\n return (\n normalizeValue(item.name).includes(query) ||\n normalizeValue(item.description).includes(query) ||\n normalizeValue(item.searchText).includes(query)\n );\n })\n .slice(0, limit);\n }\n\n private scoreMatch(item: IndexItem, query: string) {\n const normalizedQuery = normalizeValue(query);\n const normalizedName = normalizeValue(item.name);\n\n if (normalizedName === normalizedQuery) {\n return 100;\n }\n\n if (normalizedName.startsWith(normalizedQuery)) {\n return 80;\n }\n\n if (normalizedName.includes(normalizedQuery)) {\n return 70;\n }\n\n if (normalizeValue(item.searchText).includes(normalizedQuery)) {\n return 40;\n }\n\n const tokens = normalizedQuery.split(/\\s+/).filter(Boolean);\n const matchedTokens = tokens.filter((token) => normalizeValue(item.searchText).includes(token));\n\n if (tokens.length > 0 && matchedTokens.length > 0) {\n return 10 + (matchedTokens.length / tokens.length) * 20;\n }\n\n return 0;\n }\n\n async searchDocs(args: SearchDocsArgs) {\n const kind: ItemKind = args.kind || 'component';\n const limit = clampLimit(args.limit, 20, 100);\n const query = args.query.trim();\n\n if (!query) {\n return [];\n }\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .map((item) => ({ item, score: this.scoreMatch(item, query) }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((entry) => ({\n id: entry.item.id,\n name: entry.item.name,\n kind: entry.item.kind,\n package: entry.item.package,\n route: entry.item.route,\n description: entry.item.description,\n score: Number(entry.score.toFixed(2)),\n }));\n }\n\n private async getItemDataById(id: string): Promise<ItemData> {\n const cached = this.itemCache.get(id);\n if (cached) {\n return cached;\n }\n\n const data = await this.fetchJson<ItemData>(`components/${id}.json`);\n this.itemCache.set(id, data);\n return data;\n }\n\n async findItem(args: GetItemArgs) {\n const kind = args.kind || 'component';\n const requested = normalizeValue(args.name);\n const index = await this.getIndex();\n\n const byKind = index.filter((item) => item.kind === kind);\n\n const exactId = byKind.find((item) => normalizeValue(item.id) === requested);\n if (exactId) {\n return exactId;\n }\n\n const exactName = byKind.find((item) => normalizeValue(item.name) === requested);\n if (exactName) {\n return exactName;\n }\n\n const prefixName = byKind.find((item) => normalizeValue(item.name).startsWith(requested));\n if (prefixName) {\n return prefixName;\n }\n\n return byKind.find((item) => normalizeValue(item.searchText).includes(requested)) || null;\n }\n\n async getItemDoc(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n llmUrl: data.llmUrl,\n },\n markdown: data.markdown,\n };\n }\n\n async getItemProps(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n },\n props: data.props,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-client.mjs","names":[],"sources":["../src/data-client.ts"],"sourcesContent":["import { GetItemArgs, IndexItem, ItemData, ItemKind, ListItemsArgs, SearchDocsArgs } from './types';\n\nfunction normalizeValue(value: string) {\n return value.trim().toLowerCase();\n}\n\nfunction clampLimit(limit: number | undefined, fallback: number, max: number) {\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n return fallback;\n }\n\n return Math.max(1, Math.min(max, Math.floor(limit)));\n}\n\nexport class MantineMcpDataClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private indexCache: IndexItem[] | null = null;\n private itemCache = new Map<string, ItemData>();\n\n constructor(baseUrl = 'https://mantine.dev/mcp', timeoutMs = 10000) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.timeoutMs = timeoutMs;\n }\n\n private async fetchJson<T>(relativePath: string): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const url = `${this.baseUrl}/${relativePath.replace(/^\\/+/, '')}`;\n const response = await fetch(url, { signal: controller.signal });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status}`);\n }\n\n return (await response.json()) as T;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async getIndex() {\n if (this.indexCache) {\n return this.indexCache;\n }\n\n this.indexCache = await this.fetchJson<IndexItem[]>('index.json');\n return this.indexCache;\n }\n\n async listItems(args: ListItemsArgs = {}) {\n const kind = args.kind || 'component';\n const query = args.query ? normalizeValue(args.query) : null;\n const packageName = args.package ? normalizeValue(args.package) : null;\n const limit = clampLimit(args.limit, 30, 200);\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .filter((item) => (packageName ? normalizeValue(item.package) === packageName : true))\n .filter((item) => {\n if (!query) {\n return true;\n }\n\n return (\n normalizeValue(item.name).includes(query) ||\n normalizeValue(item.description).includes(query) ||\n normalizeValue(item.searchText).includes(query)\n );\n })\n .slice(0, limit);\n }\n\n private scoreMatch(item: IndexItem, query: string) {\n const normalizedQuery = normalizeValue(query);\n const normalizedName = normalizeValue(item.name);\n\n if (normalizedName === normalizedQuery) {\n return 100;\n }\n\n if (normalizedName.startsWith(normalizedQuery)) {\n return 80;\n }\n\n if (normalizedName.includes(normalizedQuery)) {\n return 70;\n }\n\n if (normalizeValue(item.searchText).includes(normalizedQuery)) {\n return 40;\n }\n\n const tokens = normalizedQuery.split(/\\s+/).filter(Boolean);\n const matchedTokens = tokens.filter((token) => normalizeValue(item.searchText).includes(token));\n\n if (tokens.length > 0 && matchedTokens.length > 0) {\n return 10 + (matchedTokens.length / tokens.length) * 20;\n }\n\n return 0;\n }\n\n async searchDocs(args: SearchDocsArgs) {\n const kind: ItemKind = args.kind || 'component';\n const limit = clampLimit(args.limit, 20, 100);\n const query = args.query.trim();\n\n if (!query) {\n return [];\n }\n\n const index = await this.getIndex();\n\n return index\n .filter((item) => item.kind === kind)\n .map((item) => ({ item, score: this.scoreMatch(item, query) }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((entry) => ({\n id: entry.item.id,\n name: entry.item.name,\n kind: entry.item.kind,\n package: entry.item.package,\n route: entry.item.route,\n description: entry.item.description,\n score: Number(entry.score.toFixed(2)),\n }));\n }\n\n private async getItemDataById(id: string): Promise<ItemData> {\n const cached = this.itemCache.get(id);\n if (cached) {\n return cached;\n }\n\n const data = await this.fetchJson<ItemData>(`components/${id}.json`);\n this.itemCache.set(id, data);\n return data;\n }\n\n async findItem(args: GetItemArgs) {\n const kind = args.kind || 'component';\n const requested = normalizeValue(args.name);\n const index = await this.getIndex();\n\n const byKind = index.filter((item) => item.kind === kind);\n\n const exactId = byKind.find((item) => normalizeValue(item.id) === requested);\n if (exactId) {\n return exactId;\n }\n\n const exactName = byKind.find((item) => normalizeValue(item.name) === requested);\n if (exactName) {\n return exactName;\n }\n\n const prefixName = byKind.find((item) => normalizeValue(item.name).startsWith(requested));\n if (prefixName) {\n return prefixName;\n }\n\n return byKind.find((item) => normalizeValue(item.searchText).includes(requested)) || null;\n }\n\n async getItemDoc(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n llmUrl: data.llmUrl,\n },\n markdown: data.markdown,\n };\n }\n\n async getItemProps(args: GetItemArgs) {\n const item = await this.findItem(args);\n if (!item) {\n return null;\n }\n\n const data = await this.getItemDataById(item.id);\n\n return {\n item: {\n id: data.id,\n name: data.name,\n kind: data.kind,\n package: data.package,\n route: data.route,\n description: data.description,\n },\n props: data.props,\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":[],"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 return;\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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"}
1
+ {"version":3,"file":"server.mjs","names":[],"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 return;\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mantine/mcp-server",
3
- "version": "9.3.2",
3
+ "version": "9.4.0",
4
4
  "description": "MCP server for Mantine documentation",
5
5
  "homepage": "https://mantine.dev",
6
6
  "license": "MIT",