@mantine/mcp-server 9.0.2 → 9.1.1

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
@@ -166,7 +166,7 @@ async function handleRequest(client, request) {
166
166
  capabilities: { tools: {} },
167
167
  serverInfo: {
168
168
  name: "@mantine/mcp-server",
169
- version: "9.0.0-alpha.1"
169
+ version: "9"
170
170
  }
171
171
  });
172
172
  return;
@@ -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.0.0-alpha.1',\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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"}
package/esm/server.mjs CHANGED
@@ -164,7 +164,7 @@ async function handleRequest(client, request) {
164
164
  capabilities: { tools: {} },
165
165
  serverInfo: {
166
166
  name: "@mantine/mcp-server",
167
- version: "9.0.0-alpha.1"
167
+ version: "9"
168
168
  }
169
169
  });
170
170
  return;
@@ -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.0.0-alpha.1',\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.0.2",
3
+ "version": "9.1.1",
4
4
  "description": "MCP server for Mantine documentation",
5
5
  "homepage": "https://mantine.dev",
6
6
  "license": "MIT",
@@ -37,7 +37,5 @@
37
37
  "engines": {
38
38
  "node": ">=20.9.0"
39
39
  },
40
- "bin": {
41
- "mantine-mcp-server": "./bin/mantine-mcp-server.cjs"
42
- }
40
+ "bin": "./bin/mcp-server.cjs"
43
41
  }
File without changes