UNPKG

@boundless-oss/atlas

Version:

Atlas - MCP Server for comprehensive startup project management

1,449 lines (1,346 loc) 46.8 kB
import { JSONSchema7 } from 'json-schema'; import { randomUUID } from 'crypto'; import { createTool, createSuccessResult, createErrorResult } from '../../core/tool-framework.js'; import { ToolRegistration, RequestContext } from '../../core/types.js'; /** * Business Guidance Tools - 12-Factor MCP Implementation * * Implements Factor 2: Deterministic Execution with structured outputs * Implements Factor 3: Stateless Processes with RequestContext * Implements Factor 4: Structured Outputs for LLM consumption */ // Input type interfaces interface GenerateBusinessPlanInput { businessIdea: string; targetMarket: string; businessModel?: string; timeline?: string; includeFinancials?: boolean; template?: string; } interface AnalyzeMarketInput { industry: string; targetAudience: string; geographicScope?: string; includeCompetitors?: boolean; depth?: string; } interface CompetitorResearchInput { businessIdea: string; industry: string; competitors?: string[]; analysisDepth?: string; includeStrengthWeakness?: boolean; } interface FinancialProjectionsInput { businessModel: string; revenue: Record<string, number>; expenses: Record<string, number>; timeline?: number; includeScenarios?: boolean; currency?: string; } interface StartupAssessmentInput { stage?: string; hasProduct?: boolean; hasRevenue?: boolean; teamSize?: number; hasCustomers?: boolean; hasFunding?: boolean; } interface GeneratePitchDeckInput { businessIdea: string; problemStatement: string; solution: string; targetMarket: string; businessModel: string; competitiveAdvantage: string; fundingAsk?: string; template?: string; } interface TrackStartupMetricsInput { metricsType?: string; currentMetrics?: Record<string, number>; goals?: Record<string, number>; timeframe?: string; } interface BusinessGuidanceInput { question: string; context?: string; stage?: string; industry?: string; } interface PerformBusinessReviewInput { businessName?: string; includeProductAnalysis?: boolean; includeMarketAnalysis?: boolean; includeFinancialAnalysis?: boolean; includeTeamAnalysis?: boolean; includeTechnicalAnalysis?: boolean; includeCustomerAnalysis?: boolean; generateStrategicPaths?: boolean; } /** * Generate a business plan */ const generateBusinessPlanTool = createTool<GenerateBusinessPlanInput, any>({ name: 'generate_business_plan', description: 'Generate a comprehensive business plan for your startup', category: 'business-guidance', inputSchema: { type: 'object', properties: { businessIdea: { type: 'string', description: 'Description of your business idea', minLength: 1, maxLength: 1000 }, targetMarket: { type: 'string', description: 'Description of your target market', minLength: 1, maxLength: 500 }, businessModel: { type: 'string', enum: ['saas', 'marketplace', 'e-commerce', 'subscription', 'freemium', 'advertising', 'consulting', 'product'], default: 'saas', description: 'Primary business model' }, timeline: { type: 'string', default: '12', description: 'Planning timeline in months' }, includeFinancials: { type: 'boolean', default: true, description: 'Include financial projections' }, template: { type: 'string', enum: ['lean_canvas', 'traditional', 'one_page', 'investor'], default: 'lean_canvas', description: 'Business plan template to use' } }, required: ['businessIdea', 'targetMarket'], additionalProperties: false } as JSONSchema7, async execute(input: GenerateBusinessPlanInput, context: RequestContext) { try { const businessPlanId = randomUUID(); const now = Date.now(); // Create business plan structure const businessPlan = { id: businessPlanId, businessIdea: input.businessIdea, targetMarket: input.targetMarket, businessModel: input.businessModel || 'saas', timeline: parseInt(input.timeline || '12'), template: input.template || 'lean_canvas', includeFinancials: input.includeFinancials !== false, sections: [], nextSteps: [], keyMetrics: [], createdAt: new Date(now).toISOString(), updatedAt: new Date(now).toISOString() }; // Generate sections based on template const sections = generateBusinessPlanSections(businessPlan); // Generate markdown content const markdown = generateBusinessPlanMarkdown(businessPlan, sections); // Store in database const result = await context.db.run( `INSERT INTO business_plans (id, project_id, plan_type, content, metadata, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [ businessPlanId, context.projectId || 'default', 'business_plan', markdown, JSON.stringify({ businessIdea: input.businessIdea, targetMarket: input.targetMarket, businessModel: input.businessModel, timeline: input.timeline, template: input.template, includeFinancials: input.includeFinancials, sections: sections.map(s => s.title) }), 'draft', now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save business plan', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ businessPlan: { ...businessPlan, sections, markdown, nextSteps: generateNextSteps(input.businessModel || 'saas'), keyMetrics: generateKeyMetrics(input.businessModel || 'saas') }, message: 'Business plan generated successfully', filePath: 'docs/business-plan.md' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to generate business plan: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Analyze market */ const analyzeMarketTool = createTool<AnalyzeMarketInput, any>({ name: 'analyze_market', description: 'Perform market analysis for your business idea', category: 'business-guidance', inputSchema: { type: 'object', properties: { industry: { type: 'string', description: 'Industry or sector for analysis', minLength: 1, maxLength: 200 }, targetAudience: { type: 'string', description: 'Description of target audience', minLength: 1, maxLength: 500 }, geographicScope: { type: 'string', enum: ['local', 'national', 'global'], default: 'global', description: 'Geographic scope of analysis' }, includeCompetitors: { type: 'boolean', default: true, description: 'Include competitor analysis' }, depth: { type: 'string', enum: ['basic', 'standard', 'comprehensive'], default: 'comprehensive', description: 'Depth of analysis' } }, required: ['industry', 'targetAudience'], additionalProperties: false } as JSONSchema7, async execute(input: AnalyzeMarketInput, context: RequestContext) { try { const analysisId = randomUUID(); const now = Date.now(); // Generate market analysis const marketAnalysis = generateMarketAnalysis(input); // Store in database const result = await context.db.run( `INSERT INTO market_analyses (id, project_id, industry, target_market, geographic_scope, market_size, growth_rate, trends, opportunities, challenges, recommendations, competitors, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ analysisId, context.projectId || 'default', input.industry, input.targetAudience, input.geographicScope || 'global', marketAnalysis.marketSize, marketAnalysis.growthRate, JSON.stringify(marketAnalysis.trends), JSON.stringify(marketAnalysis.opportunities), JSON.stringify(marketAnalysis.challenges), JSON.stringify(marketAnalysis.recommendations), JSON.stringify(marketAnalysis.competitors || []), now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save market analysis', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ marketAnalysis, message: 'Market analysis completed successfully' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to analyze market: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Research competitors */ const competitorResearchTool = createTool<CompetitorResearchInput, any>({ name: 'competitor_research', description: 'Research and analyze competitors in your market', category: 'business-guidance', inputSchema: { type: 'object', properties: { businessIdea: { type: 'string', description: 'Your business idea for comparison', minLength: 1, maxLength: 1000 }, industry: { type: 'string', description: 'Industry to research', minLength: 1, maxLength: 200 }, competitors: { type: 'array', items: { type: 'string', maxLength: 100 }, description: 'Known competitors (optional)', maxItems: 20 }, analysisDepth: { type: 'string', enum: ['basic', 'standard', 'comprehensive'], default: 'standard', description: 'Depth of competitor analysis' }, includeStrengthWeakness: { type: 'boolean', default: true, description: 'Include SWOT analysis' } }, required: ['businessIdea', 'industry'], additionalProperties: false } as JSONSchema7, async execute(input: CompetitorResearchInput, context: RequestContext) { try { const analysisId = randomUUID(); const now = Date.now(); // Generate competitor analysis const competitorAnalysis = generateCompetitorAnalysis(input); // Store in database const result = await context.db.run( `INSERT INTO competitor_analyses (id, project_id, industry, business_idea, competition_level, competitors, gaps, opportunities, recommendations, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ analysisId, context.projectId || 'default', input.industry, input.businessIdea, competitorAnalysis.competitionLevel, JSON.stringify(competitorAnalysis.competitors), JSON.stringify(competitorAnalysis.gaps), JSON.stringify(competitorAnalysis.opportunities), JSON.stringify(competitorAnalysis.recommendations), now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save competitor analysis', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ competitorAnalysis, message: 'Competitor research completed successfully' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to research competitors: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Generate financial projections */ const financialProjectionsTool = createTool<FinancialProjectionsInput, any>({ name: 'financial_projections', description: 'Generate financial projections and scenarios', category: 'business-guidance', inputSchema: { type: 'object', properties: { businessModel: { type: 'string', description: 'Business model type', minLength: 1, maxLength: 100 }, revenue: { type: 'object', description: 'Revenue streams and amounts', additionalProperties: { type: 'number' } }, expenses: { type: 'object', description: 'Expense categories and amounts', additionalProperties: { type: 'number' } }, timeline: { type: 'number', default: 36, description: 'Projection timeline in months', minimum: 1, maximum: 120 }, includeScenarios: { type: 'boolean', default: true, description: 'Include best/worst case scenarios' }, currency: { type: 'string', default: 'USD', description: 'Currency for projections', maxLength: 3 } }, required: ['businessModel', 'revenue', 'expenses'], additionalProperties: false } as JSONSchema7, async execute(input: FinancialProjectionsInput, context: RequestContext) { try { const projectionId = randomUUID(); const now = Date.now(); // Generate financial projections const projections = generateFinancialProjections(input); // Store in database const result = await context.db.run( `INSERT INTO financial_projections (id, project_id, business_model, timeline, currency, revenue, expenses, net_income, cash_flow, break_even_month, total_investment_needed, roi, scenarios, assumptions, recommendations, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ projectionId, context.projectId || 'default', input.businessModel, input.timeline || 36, input.currency || 'USD', JSON.stringify(projections.revenue), JSON.stringify(projections.expenses), JSON.stringify(projections.netIncome), JSON.stringify(projections.cashFlow), projections.breakEvenMonth, projections.totalInvestmentNeeded, projections.roi, JSON.stringify(projections.scenarios || null), JSON.stringify(projections.assumptions), JSON.stringify(projections.recommendations), now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save financial projections', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ projections, message: 'Financial projections generated successfully' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to generate financial projections: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Assess startup */ const startupAssessmentTool = createTool<StartupAssessmentInput, any>({ name: 'startup_assessment', description: 'Assess your startup stage and get recommendations', category: 'business-guidance', inputSchema: { type: 'object', properties: { stage: { type: 'string', enum: ['idea', 'mvp', 'early_stage', 'growth', 'scale'], default: 'idea', description: 'Current startup stage' }, hasProduct: { type: 'boolean', default: false, description: 'Do you have a working product?' }, hasRevenue: { type: 'boolean', default: false, description: 'Are you generating revenue?' }, teamSize: { type: 'number', default: 1, description: 'Current team size', minimum: 1, maximum: 1000 }, hasCustomers: { type: 'boolean', default: false, description: 'Do you have paying customers?' }, hasFunding: { type: 'boolean', default: false, description: 'Have you raised funding?' } }, additionalProperties: false } as JSONSchema7, async execute(input: StartupAssessmentInput, context: RequestContext) { try { const assessmentId = randomUUID(); const now = Date.now(); // Generate startup assessment const assessment = generateStartupAssessment(input); // Store in database const result = await context.db.run( `INSERT INTO startup_assessments (id, project_id, stage, score, categories, strengths, weaknesses, next_steps, stage_recommendations, overall, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ assessmentId, context.projectId || 'default', assessment.stage, assessment.score, JSON.stringify(assessment.categories), JSON.stringify(assessment.strengths), JSON.stringify(assessment.weaknesses), JSON.stringify(assessment.nextSteps), JSON.stringify(assessment.stageRecommendations), assessment.overall, now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save startup assessment', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ assessment, message: 'Startup assessment completed successfully' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to assess startup: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Generate pitch deck */ const generatePitchDeckTool = createTool<GeneratePitchDeckInput, any>({ name: 'generate_pitch_deck', description: 'Create a professional pitch deck for investors', category: 'business-guidance', inputSchema: { type: 'object', properties: { businessIdea: { type: 'string', description: 'Core business idea', minLength: 1, maxLength: 1000 }, problemStatement: { type: 'string', description: 'Problem you are solving', minLength: 1, maxLength: 1000 }, solution: { type: 'string', description: 'Your solution to the problem', minLength: 1, maxLength: 1000 }, targetMarket: { type: 'string', description: 'Target market description', minLength: 1, maxLength: 500 }, businessModel: { type: 'string', description: 'How you make money', minLength: 1, maxLength: 500 }, competitiveAdvantage: { type: 'string', description: 'What makes you different/better', minLength: 1, maxLength: 1000 }, fundingAsk: { type: 'string', description: 'Funding amount requested (optional)', maxLength: 100 }, template: { type: 'string', enum: ['standard', 'investor', 'demo_day', 'one_slide'], default: 'standard', description: 'Pitch deck template' } }, required: ['businessIdea', 'problemStatement', 'solution', 'targetMarket', 'businessModel', 'competitiveAdvantage'], additionalProperties: false } as JSONSchema7, async execute(input: GeneratePitchDeckInput, context: RequestContext) { try { const pitchDeckId = randomUUID(); const now = Date.now(); // Generate pitch deck const pitchDeck = generatePitchDeck(input); // Store in database const result = await context.db.run( `INSERT INTO pitch_decks (id, project_id, business_idea, template, slides, presentation_tips, key_messages, markdown, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ pitchDeckId, context.projectId || 'default', input.businessIdea, input.template || 'standard', JSON.stringify(pitchDeck.slides), JSON.stringify(pitchDeck.presentationTips), JSON.stringify(pitchDeck.keyMessages), pitchDeck.markdown, now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save pitch deck', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ pitchDeck, message: 'Pitch deck generated successfully', filePath: 'docs/pitch-deck.md' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to generate pitch deck: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Track startup metrics */ const trackStartupMetricsTool = createTool<TrackStartupMetricsInput, any>({ name: 'track_startup_metrics', description: 'Track and analyze key startup metrics', category: 'business-guidance', inputSchema: { type: 'object', properties: { metricsType: { type: 'string', enum: ['saas', 'e-commerce', 'marketplace', 'mobile_app', 'content'], default: 'saas', description: 'Type of business metrics' }, currentMetrics: { type: 'object', description: 'Current metric values', additionalProperties: { type: 'number' } }, goals: { type: 'object', description: 'Target metric values', additionalProperties: { type: 'number' } }, timeframe: { type: 'string', enum: ['daily', 'weekly', 'monthly', 'quarterly'], default: 'monthly', description: 'Tracking timeframe' } }, additionalProperties: false } as JSONSchema7, async execute(input: TrackStartupMetricsInput, context: RequestContext) { try { const metricsId = randomUUID(); const now = Date.now(); // Generate metrics analysis const metrics = generateMetricsAnalysis(input); // Store in database const result = await context.db.run( `INSERT INTO startup_metrics (id, project_id, metrics_type, current_metrics, goals, timeframe, trends, benchmarks, recommendations, health_score, alerts, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ metricsId, context.projectId || 'default', input.metricsType || 'saas', JSON.stringify(input.currentMetrics || {}), JSON.stringify(input.goals || {}), input.timeframe || 'monthly', JSON.stringify(metrics.trends), JSON.stringify(metrics.benchmarks), JSON.stringify(metrics.recommendations), metrics.healthScore, JSON.stringify(metrics.alerts), now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save startup metrics', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ metrics, message: 'Metrics tracked successfully' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to track metrics: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Business guidance */ const businessGuidanceTool = createTool<BusinessGuidanceInput, any>({ name: 'business_guidance', description: 'Get personalized business advice and guidance', category: 'business-guidance', readOnly: true, inputSchema: { type: 'object', properties: { question: { type: 'string', description: 'Your business question or challenge', minLength: 1, maxLength: 1000 }, context: { type: 'string', description: 'Additional context about your situation', maxLength: 2000 }, stage: { type: 'string', enum: ['idea', 'mvp', 'early_stage', 'growth', 'scale'], default: 'idea', description: 'Current business stage' }, industry: { type: 'string', default: 'technology', description: 'Your industry or sector', maxLength: 100 } }, required: ['question'], additionalProperties: false } as JSONSchema7, async execute(input: BusinessGuidanceInput, context: RequestContext) { try { // Generate business guidance const guidance = generateBusinessGuidance(input); return createSuccessResult({ guidance, message: 'Business guidance provided successfully' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to provide business guidance: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); /** * Perform business review */ const performBusinessReviewTool = createTool<PerformBusinessReviewInput, any>({ name: 'perform_business_review', description: 'Perform a comprehensive business review with gap analysis and strategic recommendations', category: 'business-guidance', inputSchema: { type: 'object', properties: { businessName: { type: 'string', description: 'Name of your business (optional, will use project name if not provided)', maxLength: 200 }, includeProductAnalysis: { type: 'boolean', default: true, description: 'Analyze product development status and roadmap' }, includeMarketAnalysis: { type: 'boolean', default: true, description: 'Analyze market position and competition' }, includeFinancialAnalysis: { type: 'boolean', default: true, description: 'Analyze financial health and projections' }, includeTeamAnalysis: { type: 'boolean', default: true, description: 'Analyze team structure and capabilities' }, includeTechnicalAnalysis: { type: 'boolean', default: true, description: 'Analyze technical infrastructure and debt' }, includeCustomerAnalysis: { type: 'boolean', default: true, description: 'Analyze customer satisfaction and feedback' }, generateStrategicPaths: { type: 'boolean', default: true, description: 'Generate three strategic paths forward' } }, additionalProperties: false } as JSONSchema7, async execute(input: PerformBusinessReviewInput, context: RequestContext) { try { const reviewId = randomUUID(); const now = Date.now(); // Get project name const projectResult = await context.db.get( 'SELECT name FROM projects WHERE id = ?', [context.projectId || 'default'] ); const businessName = input.businessName || projectResult.data?.name || 'Unnamed Business'; // Generate comprehensive review const review = await generateBusinessReview({ ...input, businessName, projectId: context.projectId || 'default' }, context); // Store in database const result = await context.db.run( `INSERT INTO business_reviews (id, project_id, business_name, current_stage, overall_health_score, strengths, gaps, strategic_paths, immediate_actions, data_collected, review_date, next_review_date, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ reviewId, context.projectId || 'default', businessName, review.currentStage, review.overallHealthScore, JSON.stringify(review.strengths), JSON.stringify(review.gaps), JSON.stringify(review.strategicPaths), JSON.stringify(review.immediateActions), JSON.stringify(review.dataCollected), review.reviewDate, review.nextReviewDate, now, now ] ); if (!result.success) { return createErrorResult({ code: 'DATABASE_ERROR', message: 'Failed to save business review', details: { error: result.error }, category: 'system' }); } return createSuccessResult({ review, message: 'Business review completed successfully', filePath: 'docs/business-review.md' }); } catch (error) { return createErrorResult({ code: 'EXECUTION_ERROR', message: `Failed to perform business review: ${error instanceof Error ? error.message : 'Unknown error'}`, category: 'execution' }); } } }); // Helper functions function generateBusinessPlanSections(plan: any) { const sections = []; if (plan.template === 'lean_canvas') { sections.push( { title: 'Problem', content: 'Key problems your business solves', order: 1, template: plan.template }, { title: 'Solution', content: 'Your unique solution approach', order: 2, template: plan.template }, { title: 'Key Metrics', content: 'Metrics to measure success', order: 3, template: plan.template }, { title: 'Unique Value Proposition', content: 'What makes you different', order: 4, template: plan.template }, { title: 'Unfair Advantage', content: 'Your competitive moat', order: 5, template: plan.template }, { title: 'Channels', content: 'How you reach customers', order: 6, template: plan.template }, { title: 'Customer Segments', content: 'Your target customers', order: 7, template: plan.template }, { title: 'Cost Structure', content: 'Main cost drivers', order: 8, template: plan.template }, { title: 'Revenue Streams', content: 'How you make money', order: 9, template: plan.template } ); } else { sections.push( { title: 'Executive Summary', content: 'Overview of your business', order: 1, template: plan.template }, { title: 'Company Description', content: 'Detailed business description', order: 2, template: plan.template }, { title: 'Market Analysis', content: 'Target market and competition', order: 3, template: plan.template }, { title: 'Organization & Management', content: 'Team and structure', order: 4, template: plan.template }, { title: 'Products/Services', content: 'What you offer', order: 5, template: plan.template }, { title: 'Marketing & Sales', content: 'Go-to-market strategy', order: 6, template: plan.template }, { title: 'Financial Projections', content: 'Revenue and expense forecasts', order: 7, template: plan.template } ); } return sections; } function generateBusinessPlanMarkdown(plan: any, sections: any[]) { let markdown = `# Business Plan: ${plan.businessIdea}\n\n`; markdown += `**Target Market**: ${plan.targetMarket}\n`; markdown += `**Business Model**: ${plan.businessModel}\n`; markdown += `**Timeline**: ${plan.timeline} months\n\n`; sections.forEach(section => { markdown += `## ${section.title}\n\n${section.content}\n\n`; }); return markdown; } function generateNextSteps(businessModel: string) { const steps = [ 'Validate your business idea with potential customers', 'Build a minimum viable product (MVP)', 'Develop your go-to-market strategy', 'Set up legal structure and compliance', 'Create financial tracking systems' ]; if (businessModel === 'saas') { steps.push('Set up subscription billing infrastructure'); } else if (businessModel === 'marketplace') { steps.push('Build supply and demand acquisition strategies'); } return steps; } function generateKeyMetrics(businessModel: string) { const baseMetrics = ['Customer Acquisition Cost (CAC)', 'Customer Lifetime Value (LTV)', 'Monthly Burn Rate']; if (businessModel === 'saas') { return [...baseMetrics, 'Monthly Recurring Revenue (MRR)', 'Churn Rate', 'Net Revenue Retention']; } else if (businessModel === 'marketplace') { return [...baseMetrics, 'Gross Merchandise Value (GMV)', 'Take Rate', 'Liquidity']; } else if (businessModel === 'e-commerce') { return [...baseMetrics, 'Average Order Value', 'Conversion Rate', 'Cart Abandonment Rate']; } return baseMetrics; } function generateMarketAnalysis(input: AnalyzeMarketInput) { // Simplified market analysis generation return { id: randomUUID(), industry: input.industry, targetMarket: input.targetAudience, geographicScope: input.geographicScope || 'global', marketSize: '$10B-$50B', growthRate: '15-20% annually', trends: ['Digital transformation', 'Sustainability focus', 'Remote work adoption'], targetAudience: [ { segment: 'Early Adopters', description: 'Tech-savvy professionals', size: '5-10% of market', characteristics: ['High disposable income', 'Values innovation'], painPoints: ['Current solutions too complex', 'High costs'], buyingBehavior: 'Online research, peer recommendations' } ], opportunities: [ { title: 'Underserved SMB Market', description: 'Small businesses lack affordable solutions', potential: 'High', timeline: '6-12 months', requirements: ['Simplified product', 'Competitive pricing'] } ], challenges: ['Market education needed', 'Established competitors', 'Regulatory compliance'], recommendations: ['Focus on differentiation', 'Build strategic partnerships', 'Invest in content marketing'], competitors: input.includeCompetitors ? [ { name: 'Competitor A', description: 'Market leader', marketPosition: '35% market share' }, { name: 'Competitor B', description: 'Fast-growing startup', marketPosition: '15% market share' } ] : undefined, timeframe: '2024-2025', demographics: { ageRange: '25-45', income: '$50k-$150k', other: ['Urban areas', 'College educated'] } }; } function generateCompetitorAnalysis(input: CompetitorResearchInput) { // Simplified competitor analysis generation return { industry: input.industry, competitionLevel: 'High', competitors: [ { name: 'Market Leader Inc', description: 'Established player with 10+ years', strengths: ['Brand recognition', 'Large customer base', 'Strong funding'], weaknesses: ['Legacy technology', 'Slow innovation', 'High prices'], marketShare: '35%', strategy: 'Enterprise focus with high-touch sales', pricing: 'Premium pricing model', targetAudience: 'Fortune 500 companies', keyFeatures: ['Advanced analytics', '24/7 support', 'Custom integrations'] } ], gaps: ['No solution for small businesses', 'Poor mobile experience', 'Complex onboarding'], opportunities: ['Self-service model', 'Freemium approach', 'Mobile-first design'], recommendations: ['Focus on underserved segments', 'Simplify user experience', 'Competitive pricing'], positioning: { marketGaps: ['SMB segment', 'Self-service tools'], differentiationOpportunities: ['Ease of use', 'Transparent pricing'], competitiveAdvantages: ['Modern technology stack', 'Agile development'] } }; } function generateFinancialProjections(input: FinancialProjectionsInput) { // Simplified financial projections const totalRevenue = Object.values(input.revenue).reduce((a, b) => a + b, 0); const totalExpenses = Object.values(input.expenses).reduce((a, b) => a + b, 0); return { businessModel: input.businessModel, timeline: input.timeline || 36, currency: input.currency || 'USD', revenue: input.revenue, expenses: input.expenses, netIncome: { 'Year 1': totalRevenue - totalExpenses }, cashFlow: { 'Year 1': (totalRevenue - totalExpenses) * 0.8 }, breakEvenMonth: Math.ceil(totalExpenses / (totalRevenue / 12)), totalInvestmentNeeded: totalExpenses * 1.5, roi: Math.round(((totalRevenue - totalExpenses) / totalExpenses) * 100), scenarios: input.includeScenarios ? { best: totalRevenue * 1.5, base: totalRevenue, worst: totalRevenue * 0.7 } : undefined, assumptions: ['Linear growth rate', 'Stable market conditions', 'No major competition'], recommendations: ['Focus on recurring revenue', 'Control burn rate', 'Build financial cushion'] }; } function generateStartupAssessment(input: StartupAssessmentInput) { // Calculate score based on inputs let score = 20; // Base score if (input.hasProduct) score += 20; if (input.hasRevenue) score += 20; if (input.hasCustomers) score += 15; if (input.hasFunding) score += 15; if ((input.teamSize || 1) > 3) score += 10; return { stage: input.stage || 'idea', score, categories: [ { name: 'Product', score: input.hasProduct ? 8 : 3, maxScore: 10, feedback: 'Focus on MVP development', recommendations: ['Build core features first'] }, { name: 'Market', score: input.hasCustomers ? 7 : 4, maxScore: 10, feedback: 'Validate market demand', recommendations: ['Conduct customer interviews'] }, { name: 'Team', score: (input.teamSize || 1) > 3 ? 7 : 5, maxScore: 10, feedback: 'Build founding team', recommendations: ['Hire key roles'] }, { name: 'Financials', score: input.hasRevenue ? 8 : 2, maxScore: 10, feedback: 'Establish revenue model', recommendations: ['Test pricing strategies'] } ], strengths: ['Clear vision', 'Market opportunity identified'], weaknesses: ['Limited resources', 'No proven traction yet'], nextSteps: [ { action: 'Build MVP', priority: 'high', timeline: '3 months', resources: ['Technical team', 'Design resources'] }, { action: 'Customer validation', priority: 'high', timeline: '1 month', resources: ['Customer interviews', 'Surveys'] } ], stageRecommendations: ['Focus on problem-solution fit', 'Build minimal viable product', 'Get early customer feedback'], overall: 'Your startup shows promise but needs execution on key areas', benchmarkComparison: 'Average for this stage' }; } function generatePitchDeck(input: GeneratePitchDeckInput) { const slides = [ { title: 'Title Slide', content: input.businessIdea, order: 1, type: 'text' as const }, { title: 'Problem', content: input.problemStatement, order: 2, type: 'text' as const }, { title: 'Solution', content: input.solution, order: 3, type: 'text' as const }, { title: 'Market Opportunity', content: `Target Market: ${input.targetMarket}`, order: 4, type: 'text' as const }, { title: 'Business Model', content: input.businessModel, order: 5, type: 'text' as const }, { title: 'Competitive Advantage', content: input.competitiveAdvantage, order: 6, type: 'text' as const }, { title: 'Go-to-Market Strategy', content: 'Customer acquisition and growth strategy', order: 7, type: 'text' as const }, { title: 'Team', content: 'Founding team and advisors', order: 8, type: 'text' as const }, { title: 'Financials', content: 'Revenue projections and unit economics', order: 9, type: 'chart' as const }, { title: 'The Ask', content: input.fundingAsk || 'Investment opportunity', order: 10, type: 'text' as const } ]; const markdown = slides.map(slide => `## ${slide.title}\n\n${slide.content}\n`).join('\n'); return { businessIdea: input.businessIdea, template: input.template || 'standard', markdown, slides, presentationTips: ['Keep it under 10 minutes', 'Tell a story', 'Use visuals effectively', 'Practice your pitch'], keyMessages: ['Clear problem definition', 'Unique solution', 'Large market opportunity'], appendix: [] }; } function generateMetricsAnalysis(input: TrackStartupMetricsInput) { const current = input.currentMetrics || {}; const goals = input.goals || {}; // Calculate health score let healthScore = 50; const metricCount = Object.keys(current).length; if (metricCount > 0) { const achievementRates = Object.keys(current).map(key => { const goal = goals[key]; return goal ? Math.min((current[key] / goal) * 100, 100) : 50; }); healthScore = Math.round(achievementRates.reduce((a, b) => a + b, 0) / achievementRates.length); } return { metricsType: input.metricsType || 'saas', current, goals, timeframe: input.timeframe || 'monthly', trends: [ { metric: 'MRR', direction: 'up' as const, percentage: 15, period: 'month' }, { metric: 'Churn', direction: 'down' as const, percentage: 5, period: 'month' } ], benchmarks: [ { metric: 'CAC Payback', yourValue: 12, industryAverage: 18, percentile: 75 } ], recommendations: ['Focus on reducing churn', 'Improve conversion funnel', 'Increase average contract value'], healthScore, alerts: [ { metric: 'Burn Rate', status: 'warning' as const, message: 'Higher than planned', recommendation: 'Review expenses' } ] }; } function generateBusinessGuidance(input: BusinessGuidanceInput) { // Simplified business guidance generation return { question: input.question, answer: `Based on your ${input.stage || 'idea'} stage in the ${input.industry || 'technology'} industry, here's my guidance...`, recommendations: [ 'Focus on customer validation', 'Build lean and iterate quickly', 'Measure key metrics consistently' ], nextSteps: [ 'Define success metrics', 'Create 90-day action plan', 'Schedule regular reviews' ], resources: [ 'Lean Startup methodology', 'Y Combinator startup library', 'First Round Review articles' ], confidence: 0.85, relatedTopics: ['Product-market fit', 'Growth strategies', 'Fundraising'] }; } async function generateBusinessReview(input: any, context: RequestContext) { // Collect data from various sources const dataCollected = { productStatus: { developmentStage: 'MVP', featuresCompleted: 15, featuresPlanned: 25, qualityScore: 75, userSatisfaction: 80, technicalDebt: 'Medium' }, marketPosition: { marketShare: '0.1%', competitorCount: 5, uniqueValueProp: 'Simplified user experience', marketGrowthRate: '20%', customerAcquisitionCost: 150, lifetimeValue: 1500 }, financialHealth: { revenue: 50000, expenses: 80000, runway: '12 months', burnRate: 30000, profitability: 'Pre-revenue', fundingStatus: 'Bootstrapped' }, teamResources: { teamSize: 5, keyRoles: ['CEO', 'CTO', 'Developer'], missingRoles: ['Sales', 'Marketing'], teamHealth: 85, productivity: 75, culture: 'Startup mindset' }, technicalStatus: { codeQuality: 80, testCoverage: 65, deploymentFrequency: 'Weekly', systemReliability: 95, securityScore: 70, scalability: 'Good' }, customerInsights: { customerCount: 50, nps: 40, churnRate: 10, supportTickets: 25, featureRequests: ['Mobile app', 'API access'], topComplaints: ['Onboarding complexity'] } }; // Calculate overall health score const overallHealthScore = 72; return { businessName: input.businessName, currentStage: 'early_stage', overallHealthScore, strengths: [ { area: 'Product Development', description: 'Strong technical foundation with good code quality', impact: 'high' as const, evidence: ['80% code quality score', '95% system reliability'] } ], gaps: [ { area: 'Sales & Marketing', description: 'Missing key sales and marketing roles', severity: 'critical' as const, impact: 'Limited growth potential without dedicated sales team', recommendedActions: ['Hire sales lead', 'Develop marketing strategy'] } ], strategicPaths: [ { name: 'Product-Led Growth', focus: 'Improve product experience to drive organic growth', description: 'Focus on product improvements and user experience', timeline: '6-12 months', riskLevel: 'medium' as const, keyActions: [ { action: 'Simplify onboarding flow', priority: 'immediate' as const, owner: 'Product Team', resources: ['UX Designer', 'Developer time'], deadline: '30 days' } ], expectedOutcome: 'Reduced churn and increased organic growth', investmentRequired: '$50k-$100k', successMetrics: ['NPS > 50', 'Churn < 5%', 'Organic growth > 20% MoM'] } ], immediateActions: [ { action: 'Hire sales lead', rationale: 'Critical gap in go-to-market execution', expectedImpact: 'Accelerated revenue growth', timeframe: '30 days', dependencies: ['Budget approval', 'Recruitment process'] } ], dataCollected, reviewDate: new Date().toISOString(), nextReviewDate: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toISOString() }; } /** * Setup business guidance tools */ export async function setupBusinessGuidanceTools(): Promise<ToolRegistration> { return { module: 'business-guidance', tools: [ generateBusinessPlanTool, // Note: Interactive business plan wizard removed for now as it requires special workflow handling analyzeMarketTool, competitorResearchTool, financialProjectionsTool, startupAssessmentTool, generatePitchDeckTool, trackStartupMetricsTool, businessGuidanceTool, performBusinessReviewTool ] }; }