UNPKG

mcp-adr-analysis-server

Version:

MCP server for analyzing Architectural Decision Records and project architecture

129 lines 4.34 kB
/** * Core TypeScript interfaces for MCP ADR Analysis Server * Based on shrimp-rules.md requirements */ import { z } from 'zod'; export const AdrSchema = z.object({ id: z.string(), title: z.string(), status: z.enum(['proposed', 'accepted', 'deprecated', 'superseded']), date: z.string(), context: z.string(), decision: z.string(), consequences: z.string(), implementationPlan: z.string().optional(), filePath: z.string(), tags: z.array(z.string()).optional(), relatedAdrs: z.array(z.string()).optional(), }); export const DetectedTechnologySchema = z.object({ name: z.string(), category: z.enum(['framework', 'library', 'database', 'cloud', 'devops', 'language', 'tool']), version: z.string().optional(), confidence: z.number().min(0).max(1), evidence: z.array(z.string()), filePaths: z.array(z.string()), description: z.string().optional(), }); export const DetectedPatternSchema = z.object({ name: z.string(), type: z.enum([ 'architectural', 'structural', 'organizational', 'communication', 'testing', 'data', ]), confidence: z.number().min(0).max(1), description: z.string(), evidence: z.array(z.string()), filePaths: z.array(z.string()), suboptimal: z.boolean().optional(), recommendations: z.array(z.string()).optional(), }); export const ArchitecturalKnowledgeGraphSchema = z.object({ projectId: z.string(), timestamp: z.string(), adrs: z.array(AdrSchema), technologies: z.array(DetectedTechnologySchema), patterns: z.array(DetectedPatternSchema), rules: z.array(z.any()), // Will be defined by RuleSchema relationships: z.array(z.object({ source: z.string(), target: z.string(), type: z.enum(['implements', 'depends_on', 'conflicts_with', 'supersedes', 'relates_to']), strength: z.number().min(0).max(1), description: z.string().optional(), })), metadata: z.object({ name: z.string(), description: z.string().optional(), version: z.string().optional(), lastAnalyzed: z.string(), analysisVersion: z.string(), fileCount: z.number(), directoryCount: z.number(), }), }); export const AdrTaskSchema = z.object({ id: z.string(), adrId: z.string(), title: z.string(), description: z.string(), status: z.enum(['pending', 'in_progress', 'completed', 'blocked']), priority: z.enum(['low', 'medium', 'high', 'critical']), estimatedEffort: z.string().optional(), assignee: z.string().optional(), dueDate: z.string().optional(), dependencies: z.array(z.string()).optional(), verificationCriteria: z.string().optional(), completionEvidence: z.array(z.string()).optional(), }); export const RuleSchema = z.object({ id: z.string(), name: z.string(), description: z.string(), type: z.enum(['architectural', 'coding', 'security', 'performance', 'documentation']), severity: z.enum(['info', 'warning', 'error', 'critical']), pattern: z.string(), message: z.string(), source: z.enum(['adr', 'inferred', 'user_defined']), sourceId: z.string().optional(), enabled: z.boolean(), tags: z.array(z.string()).optional(), }); // ============================================================================ // Error Types // ============================================================================ export class McpAdrError extends Error { code; details; constructor(message, code, details) { super(message); this.name = 'McpAdrError'; this.code = code; if (details !== undefined) { this.details = details; } } } export class ValidationError extends McpAdrError { constructor(message, details) { super(message, 'VALIDATION_ERROR', details); this.name = 'ValidationError'; } } export class FileSystemError extends McpAdrError { constructor(message, details) { super(message, 'FILESYSTEM_ERROR', details); this.name = 'FileSystemError'; } } export class AnalysisError extends McpAdrError { constructor(message, details) { super(message, 'ANALYSIS_ERROR', details); this.name = 'AnalysisError'; } } //# sourceMappingURL=index.js.map