UNPKG

mcp-grocy

Version:

Model Context Protocol (MCP) server for Grocy integration

63 lines (62 loc) 2.02 kB
/** * Improved type definitions for better type safety */ import { z } from 'zod'; // Configuration types export const ConfigSchema = z.object({ env: z.object({ GROCY_API_KEY: z.string().optional(), RELEASE_VERSION: z.string().optional(), NODE_ENV: z.enum(['development', 'production', 'test']).optional(), }), yaml: z.object({ server: z.object({ enable_http_server: z.boolean().default(false), http_server_port: z.number().min(1).max(65535).default(8080), }), grocy: z.object({ base_url: z.string().url(), enable_ssl_verify: z.boolean().default(true), response_size_limit: z.number().positive().default(10000), }), tools: z.record(z.string(), z.object({ enabled: z.boolean().default(false), ack_token: z.string().optional(), }).catchall(z.unknown())), }) }); // Validation schemas for runtime type checking export const ToolResultSchema = z.object({ success: z.boolean(), data: z.any().optional(), error: z.string().optional(), message: z.string().optional(), details: z.any().optional() }); export const ToolDefinitionSchema = z.object({ name: z.string(), description: z.string(), inputSchema: z.object({ type: z.literal('object'), properties: z.record(z.any()), required: z.array(z.string()).optional() }) }); export const ToolModuleSchema = z.object({ definitions: z.array(ToolDefinitionSchema), handlers: z.record(z.function()) }); // Type guards export function isToolResult(obj) { return ToolResultSchema.safeParse(obj).success; } export function isToolDefinition(obj) { return ToolDefinitionSchema.safeParse(obj).success; } export function isToolModule(obj) { return obj && typeof obj === 'object' && Array.isArray(obj.definitions) && typeof obj.handlers === 'object' && obj.definitions.every((def) => isToolDefinition(def)); }