UNPKG

yijing-bazi-mcp

Version:

易经八字分析 MCP 服务器 - 提供传统命理分析和易经卦象解读的AI工具

256 lines (238 loc) 7.47 kB
/** * 验证工具 * 用于参数验证和数据校验 */ const Joi = require('joi'); /** * 验证输入参数 * @param {Object} input - 输入参数 * @param {Object} schema - 验证模式 * @returns {Object} 验证后的数据 * @throws {Error} 验证失败时抛出错误 */ function validateInput(input, schema) { const { error, value } = schema.validate(input, { abortEarly: false }); if (error) { const errorMessage = error.details.map(detail => detail.message).join('; '); throw new Error(`验证失败: ${errorMessage}`); } return value; } /** * 根据工具名称验证参数 * @param {string} toolName - 工具名称 * @param {Object} args - 参数对象 * @returns {Object} 验证结果 */ function validateToolInput(toolName, args) { try { let schema; switch (toolName) { case 'yijing_generate_hexagram': schema = createYijingGenerateHexagramSchema(); break; case 'yijing_interpret': schema = createYijingInterpretSchema(); break; case 'yijing_advise': schema = createYijingAdviseSchema(); break; case 'bazi_generate_chart': schema = createBaziGenerateChartSchema(); break; case 'bazi_analyze': schema = createBaziAnalyzeSchema(); break; case 'bazi_forecast': schema = createBaziForecastSchema(); break; case 'combined_analysis': schema = createCombinedAnalysisSchema(); break; case 'destiny_consult': schema = createDestinyConsultSchema(); break; case 'knowledge_learn': schema = createKnowledgeLearnSchema(); break; case 'case_study': schema = createCaseStudySchema(); break; default: // 对于未知工具,跳过验证 return { isValid: true, value: args }; } const value = validateInput(args, schema); return { isValid: true, value }; } catch (error) { return { isValid: false, errors: [error.message], value: null }; } } /** * 创建易经卦象生成验证模式 * @returns {Object} Joi验证模式 */ function createYijingGenerateHexagramSchema() { return Joi.object({ method: Joi.string().valid('number', 'time', 'plum_blossom', 'random').required(), question: Joi.string().min(3).max(500).required(), seed: Joi.string().optional() }); } module.exports = { validateInput, validateToolInput, createYijingGenerateHexagramSchema, createYijingInterpretSchema, createYijingAdviseSchema, createBaziGenerateChartSchema, createBaziAnalyzeSchema, createBaziForecastSchema, createCombinedAnalysisSchema, createDestinyConsultSchema, createKnowledgeLearnSchema, createCaseStudySchema }; /** * 创建易经卦象解读验证模式 * @returns {Object} Joi验证模式 */ function createYijingInterpretSchema() { return Joi.object({ hexagram: Joi.object().required(), focus: Joi.string().valid('overall', 'specific_line', 'changing_hexagram').default('overall'), line_number: Joi.when('focus', { is: 'specific_line', then: Joi.number().integer().min(1).max(6).required(), otherwise: Joi.number().optional() }) }); } /** * 创建易经建议验证模式 * @returns {Object} Joi验证模式 */ function createYijingAdviseSchema() { return Joi.object({ hexagram: Joi.object().required(), question: Joi.string().min(3).max(500).required(), time_frame: Joi.string().valid('immediate', 'short_term', 'medium_term', 'long_term').default('medium_term') }); } /** * 创建八字排盘验证模式 * @returns {Object} Joi验证模式 */ function createBaziGenerateChartSchema() { return Joi.object({ birth_time: Joi.alternatives().try( Joi.date().iso(), Joi.string().pattern(/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/) ).required(), is_lunar: Joi.boolean().default(false), gender: Joi.string().valid('male', 'female', '男', '女').required(), birth_location: Joi.object({ latitude: Joi.number().min(-90).max(90).optional(), longitude: Joi.number().min(-180).max(180).optional(), timezone: Joi.string().default('Asia/Shanghai') }).optional() }); } /** * 创建八字分析验证模式 * @returns {Object} Joi验证模式 */ function createBaziAnalyzeSchema() { return Joi.object({ chart: Joi.object().required(), analysis_type: Joi.array().items( Joi.string().valid('personality', 'career', 'wealth', 'relationship', 'health') ).single().default(['personality']), detail_level: Joi.string().valid('basic', 'standard', 'detailed').default('standard') }); } /** * 创建八字预测验证模式 * @returns {Object} Joi验证模式 */ function createBaziForecastSchema() { return Joi.object({ chart: Joi.object().required(), start_date: Joi.date().iso().default(() => new Date()), end_date: Joi.date().iso().min(Joi.ref('start_date')), aspects: Joi.array().items( Joi.string().valid('career', 'wealth', 'relationship', 'health', 'general') ).single().default(['general']), resolution: Joi.string().valid('year', 'month', 'day').default('month') }); } /** * 创建综合分析验证模式 * @returns {Object} Joi验证模式 */ function createCombinedAnalysisSchema() { return Joi.object({ bazi_chart: Joi.object().required(), hexagram: Joi.object().optional(), question: Joi.string().min(3).max(500).required(), focus_areas: Joi.array().items( Joi.string().valid('career', 'wealth', 'relationship', 'health', 'general') ).single().default(['general']), analysis_depth: Joi.string().valid('basic', 'standard', 'detailed').default('standard') }); } /** * 创建命运咨询验证模式 * @returns {Object} Joi验证模式 */ function createDestinyConsultSchema() { return Joi.object({ user_profile: Joi.object({ birth_time: Joi.alternatives().try( Joi.date().iso(), Joi.string().pattern(/^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/) ).required(), gender: Joi.string().valid('male', 'female', '男', '女').required(), birth_location: Joi.object().optional(), bazi_chart: Joi.object().optional() }).required(), question: Joi.string().min(3).max(500).required(), context: Joi.array().items(Joi.string()).default([]), consultation_type: Joi.string().valid( 'guidance', 'analysis', 'prediction', 'suggestion' ).default('analysis') }); } /** * 创建知识学习验证模式 * @returns {Object} Joi验证模式 */ function createKnowledgeLearnSchema() { return Joi.object({ topic: Joi.string().required(), system: Joi.string().valid('yijing', 'bazi', 'both').default('both'), level: Joi.string().valid('beginner', 'intermediate', 'advanced').default('intermediate'), format: Joi.string().valid('text', 'structured', 'interactive').default('structured') }); } /** * 创建案例分析验证模式 * @returns {Object} Joi验证模式 */ function createCaseStudySchema() { return Joi.object({ case_id: Joi.alternatives().try( Joi.string(), Joi.number().integer().positive() ).optional(), system: Joi.string().valid('yijing', 'bazi', 'combined').default('combined'), category: Joi.string().valid( 'career', 'relationship', 'health', 'wealth', 'general' ).default('general'), analysis_focus: Joi.string().optional() }); }