mcp-grocy
Version:
Model Context Protocol (MCP) server for Grocy integration
63 lines (62 loc) • 2.02 kB
JavaScript
/**
* 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));
}