UNPKG

@emmahyde/thinking-patterns

Version:

MCP server combining systematic thinking, mental models, debugging approaches, and stochastic algorithms for comprehensive cognitive pattern support

94 lines (93 loc) 4.12 kB
import { BaseToolServer } from '../base/BaseToolServer.js'; import { StructuredArgumentationSchema } from '../schemas/index.js'; import { boxed } from '../utils/index.js'; /** * Structured Argumentation Server using thinking-patterns tools approach * Extends BaseToolServer for standardized validation and error handling */ export class StructuredArgumentationServer extends BaseToolServer { constructor() { super(StructuredArgumentationSchema); } handle(validInput) { return this.process(validInput); } /** * Standardized process method for structured argumentation * @param validInput - Validated structured argumentation data * @returns Processed structured argumentation result */ process(validInput) { // Format output using boxed utility const formattedOutput = this.formatArgumentationOutput(validInput); // Log formatted output to console (suppress during tests) if (process.env.NODE_ENV !== 'test' && process.env.JEST_WORKER_ID === undefined) { console.error(formattedOutput); } return { claim: validInput.claim, premises: validInput.premises, conclusion: validInput.conclusion, argumentId: validInput.argumentId, argumentType: validInput.argumentType, confidence: validInput.confidence, respondsTo: validInput.respondsTo, supports: validInput.supports, contradicts: validInput.contradicts, strengths: validInput.strengths, weaknesses: validInput.weaknesses, suggestedNextTypes: validInput.suggestedNextTypes, nextArgumentNeeded: validInput.nextArgumentNeeded, status: 'success', premiseCount: validInput.premises.length, hasConclusion: !!validInput.conclusion, hasRespondsTo: !!validInput.respondsTo, hasSupports: !!validInput.supports && validInput.supports.length > 0, hasContradicts: !!validInput.contradicts && validInput.contradicts.length > 0, strengthCount: validInput.strengths?.length ?? 0, weaknessCount: validInput.weaknesses?.length ?? 0, hasSuggestedNextTypes: !!validInput.suggestedNextTypes && validInput.suggestedNextTypes.length > 0, timestamp: new Date().toISOString(), }; } formatArgumentationOutput(data) { const sections = { 'Claim': data.claim, 'Argument Type': data.argumentType.toUpperCase(), 'Confidence': `${(data.confidence * 100).toFixed(1)}%` }; if (data.argumentId) { sections['Argument ID'] = data.argumentId; } // Premises if (data.premises.length > 0) { sections['Premises'] = data.premises.map((premise, index) => `${index + 1}. ${premise}`); } // Conclusion if (data.conclusion) { sections['Conclusion'] = data.conclusion; } // Relationships if (data.respondsTo) { sections['Responds To'] = data.respondsTo; } if (data.supports && data.supports.length > 0) { sections['Supports'] = data.supports.map(support => `• ${support}`); } if (data.contradicts && data.contradicts.length > 0) { sections['Contradicts'] = data.contradicts.map(contradiction => `• ${contradiction}`); } // Analysis if (data.strengths && data.strengths.length > 0) { sections['Strengths'] = data.strengths.map(strength => `• ${strength}`); } if (data.weaknesses && data.weaknesses.length > 0) { sections['Weaknesses'] = data.weaknesses.map(weakness => `• ${weakness}`); } // Suggested next types if (data.suggestedNextTypes && data.suggestedNextTypes.length > 0) { sections['Suggested Next Arguments'] = data.suggestedNextTypes.map(type => `• ${type}`); } return boxed('⚖️ Structured Argumentation', sections); } }