@mantine/mcp-server 9.4.2 → 9.5.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/cjs/server.cjs CHANGED
@@ -169,7 +169,7 @@ async function handleRequest(client, request) {
169
169
  version: "9"
170
170
  }
171
171
  });
172
- return;
172
+ break;
173
173
  case "notifications/initialized": return;
174
174
  case "tools/list":
175
175
  writeResponse(id, { tools: TOOL_DEFINITIONS });
@@ -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 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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"}
package/esm/server.mjs CHANGED
@@ -167,7 +167,7 @@ async function handleRequest(client, request) {
167
167
  version: "9"
168
168
  }
169
169
  });
170
- return;
170
+ break;
171
171
  case "notifications/initialized": return;
172
172
  case "tools/list":
173
173
  writeResponse(id, { tools: TOOL_DEFINITIONS });
@@ -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 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":";;;;AAWA,MAAM,mBAAmB;CACvB;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM;KAAE,MAAM;KAAU,MAAM,CAAC,aAAa,MAAM;IAAE;IACpD,SAAS,EAAE,MAAM,SAAS;IAC1B,OAAO,EAAE,MAAM,SAAS;IACxB,OAAO,EAAE,MAAM,SAAS;GAC1B;GACA,sBAAsB;EACxB;CACF;CACA;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM,EAAE,MAAM,SAAS;IACvB,MAAM;KAAE,MAAM;KAAU,MAAM,CAAC,aAAa,MAAM;IAAE;GACtD;GACA,UAAU,CAAC,MAAM;GACjB,sBAAsB;EACxB;CACF;CACA;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM,EAAE,MAAM,SAAS;IACvB,MAAM;KAAE,MAAM;KAAU,MAAM,CAAC,aAAa,MAAM;IAAE;GACtD;GACA,UAAU,CAAC,MAAM;GACjB,sBAAsB;EACxB;CACF;CACA;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM;KAAE,MAAM;KAAU,MAAM,CAAC,aAAa,MAAM;IAAE;IACpD,OAAO,EAAE,MAAM,SAAS;IACxB,OAAO,EAAE,MAAM,SAAS;GAC1B;GACA,UAAU,CAAC,OAAO;GAClB,sBAAsB;EACxB;CACF;AACF;AAEA,SAAS,mBAAmB,MAAc,SAAiB;CACzD,OAAO;EAAE;EAAM;CAAQ;AACzB;AAEA,SAAS,aAAa,SAAkB;CAGtC,OAAO,EACL,SAAS,CAAC;EAAE,MAAM;EAAQ,MAHf,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC;CAGnD,CAAC,EAClC;AACF;AAEA,SAAS,YAAY,SAAiB;CACpC,OAAO;EACL,SAAS;EACT,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM;EAAQ,CAAC;CAC3C;AACF;AAEA,SAAS,mBAAmB,MAA8C;CACxE,OAAO;EACL,MAAM,KAAK,SAAS,eAAe,KAAK,SAAS,SAAS,KAAK,OAAO,KAAA;EACtE,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAA;EAC3D,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAA;EACrD,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAA;CACvD;AACF;AAEA,SAAS,iBAAiB,MAAmD;CAC3E,IAAI,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,WAAW,GACxD,OAAO;CAGT,OAAO;EACL,MAAM,KAAK;EACX,MAAM,KAAK,SAAS,eAAe,KAAK,SAAS,SAAS,KAAK,OAAO,KAAA;CACxE;AACF;AAEA,SAAS,oBAAoB,MAAsD;CACjF,IAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,WAAW,GAC1D,OAAO;CAGT,OAAO;EACL,OAAO,KAAK;EACZ,MAAM,KAAK,SAAS,eAAe,KAAK,SAAS,SAAS,KAAK,OAAO,KAAA;EACtE,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAA;CACvD;AACF;AAEA,SAAS,aAAa,SAAkB;CACtC,QAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,OAAO,EAAE,GAAG;AACrD;AAEA,SAAS,cAAc,IAA4B,QAAiB;CAClE,aAAa;EAAE,SAAS;EAAO;EAAI;CAAO,CAAC;AAC7C;AAEA,SAAS,WAAW,IAA4B,MAAc,SAAiB;CAC7E,aAAa;EACX,SAAS;EACT;EACA,OAAO,mBAAmB,MAAM,OAAO;CACzC,CAAC;AACH;AAEA,SAAgB,cAAc;CAC5B,MAAM,YAAY,OAAO,QAAQ,IAAI,0BAA0B,GAAK;CAEpE,MAAM,SAAS,IAAI,qBADH,QAAQ,IAAI,wBAAwB,2BACH,SAAS;CAI1D,SAFoB,gBAAgB;EAAE,OAAO,QAAQ;EAAO,UAAU;CAAM,CAE3E,CAAC,CAAC,GAAG,SAAS,SAAiB;EAC9B,MAAM,UAAU,KAAK,KAAK;EAC1B,IAAI,QAAQ,WAAW,GACrB;EAGF,IAAI;EACJ,IAAI;GACF,UAAU,KAAK,MAAM,OAAO;EAC9B,QAAQ;GACN,WAAW,MAAM,QAAQ,aAAa;GACtC;EACF;EAEA,cAAmB,QAAQ,OAAO;CACpC,CAAC;AACH;AAEA,eAAe,cAAc,QAA8B,SAAyB;CAClF,MAAM,KAAK,QAAQ,MAAM;CAEzB,IAAI,CAAC,WAAW,QAAQ,YAAY,SAAS,OAAO,QAAQ,WAAW,UAAU;EAC/E,WAAW,IAAI,QAAQ,iBAAiB;EACxC;CACF;CAEA,IAAI;EACF,QAAQ,QAAQ,QAAhB;GACE,KAAK;IACH,cAAc,IAAI;KAChB,iBAAiB;KACjB,cAAc,EACZ,OAAO,CAAC,EACV;KACA,YAAY;MACV,MAAM;MACN,SAAS;KACX;IACF,CAAC;IACD;GAGF,KAAK,6BACH;GAGF,KAAK;IACH,cAAc,IAAI,EAAE,OAAO,iBAAiB,CAAC;IAC7C;GAGF,KAAK,cAAc;IACjB,MAAM,SACJ,QAAQ,UAAU,OAAO,QAAQ,WAAW,WACvC,QAAQ,SACT,CAAC;IACP,MAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;IAC7D,MAAM,OACJ,OAAO,aAAa,OAAO,OAAO,cAAc,WAC3C,OAAO,YACR,CAAC;IAEP,IAAI,CAAC,MAAM;KACT,cAAc,IAAI,YAAY,uBAAuB,CAAC;KACtD;IACF;IAEA,IAAI,SAAS,cAAc;KAEzB,cAAc,IAAI,aAAa,MADV,OAAO,UAAU,mBAAmB,IAAI,CAAC,CACzB,CAAC;KACtC;IACF;IAEA,IAAI,SAAS,gBAAgB;KAC3B,MAAM,SAAS,iBAAiB,IAAI;KACpC,IAAI,CAAC,QAAQ;MACX,cAAc,IAAI,YAAY,+BAA6B,CAAC;MAC5D;KACF;KAEA,MAAM,SAAS,MAAM,OAAO,WAAW,MAAM;KAC7C,IAAI,CAAC,QAAQ;MACX,cAAc,IAAI,YAAY,mBAAmB,OAAO,MAAM,CAAC;MAC/D;KACF;KAEA,cAAc,IAAI,aAAa,MAAM,CAAC;KACtC;IACF;IAEA,IAAI,SAAS,kBAAkB;KAC7B,MAAM,SAAS,iBAAiB,IAAI;KACpC,IAAI,CAAC,QAAQ;MACX,cAAc,IAAI,YAAY,+BAA6B,CAAC;MAC5D;KACF;KAEA,MAAM,SAAS,MAAM,OAAO,aAAa,MAAM;KAC/C,IAAI,CAAC,QAAQ;MACX,cAAc,IAAI,YAAY,mBAAmB,OAAO,MAAM,CAAC;MAC/D;KACF;KAEA,cAAc,IAAI,aAAa,MAAM,CAAC;KACtC;IACF;IAEA,IAAI,SAAS,eAAe;KAC1B,MAAM,SAAS,oBAAoB,IAAI;KACvC,IAAI,CAAC,QAAQ;MACX,cAAc,IAAI,YAAY,gCAA8B,CAAC;MAC7D;KACF;KAGA,cAAc,IAAI,aAAa,MADV,OAAO,WAAW,MAAM,CACR,CAAC;KACtC;IACF;IAEA,cAAc,IAAI,YAAY,iBAAiB,MAAM,CAAC;IACtD;GACF;GAEA;IACE,IAAI,OAAO,MACT;IAGF,WAAW,IAAI,QAAQ,qBAAqB,QAAQ,QAAQ;EAEhE;CACF,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;EAEzD,IAAI,QAAQ,WAAW,cAAc;GACnC,cAAc,IAAI,YAAY,OAAO,CAAC;GACtC;EACF;EAEA,WAAW,IAAI,OAAQ,OAAO;CAChC;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mantine/mcp-server",
3
- "version": "9.4.2",
3
+ "version": "9.5.0",
4
4
  "description": "MCP server for Mantine documentation",
5
5
  "homepage": "https://mantine.dev",
6
6
  "license": "MIT",