Skip to main content
Glama

feature_roadmap

Read-onlyIdempotent

Generate development roadmaps for projects by specifying features, timeframe, and approach to plan software development schedules.

Instructions

로드맵|일정|계획표|roadmap|timeline|project plan|development schedule - Generate development roadmap

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
projectNameYesName of the project
featuresYesList of features to include in roadmap
timeframeNoProject timeframe
approachNoDevelopment approachmvp-first
teamSizeNoDevelopment team size

Implementation Reference

  • The core handler function that executes the feature_roadmap tool. It processes input arguments to generate a detailed project roadmap with phases, features prioritized by phase and priority, estimated durations, risks, milestones, and formatted Markdown output.
    export async function featureRoadmap(args: {
      projectName: string;
      features: string;
      timeframe?: string;
      approach?: string;
      teamSize?: number;
    }): Promise<ToolResult> {
      const {
        projectName,
        features,
        timeframe = '6-months',
        approach = 'mvp-first',
        teamSize = 3
      } = args;
    
      // Parse features
      const featureList = features.split(/[,\n]/).map(f => f.trim()).filter(f => f.length > 0);
    
      // Define phases based on approach
      let phaseNames: string[] = [];
      if (approach === 'mvp-first') {
        phaseNames = ['MVP Foundation', 'Core Features', 'Advanced Features', 'Optimization & Scaling'];
      } else if (approach === 'phased-rollout') {
        phaseNames = ['Phase 1: Core', 'Phase 2: Enhancement', 'Phase 3: Expansion', 'Phase 4: Innovation'];
      } else {
        phaseNames = ['Planning & Setup', 'Development Sprint', 'Integration & Testing', 'Launch & Monitoring'];
      }
    
      // Calculate phase durations
      const totalMonths = timeframe === '3-months' ? 3 : timeframe === '6-months' ? 6 : timeframe === '12-months' ? 12 : 6;
      const monthsPerPhase = Math.ceil(totalMonths / phaseNames.length);
    
      // Categorize features by priority and complexity
      const roadmapItems: RoadmapItem[] = featureList.map((feature, index) => {
        const itemId = `F-${String(index + 1).padStart(3, '0')}`;
        
        // Determine priority
        let priority: 'high' | 'medium' | 'low' = 'medium';
        if (feature.toLowerCase().includes('critical') || feature.toLowerCase().includes('core') || feature.toLowerCase().includes('essential')) {
          priority = 'high';
        } else if (feature.toLowerCase().includes('enhancement') || feature.toLowerCase().includes('nice') || feature.toLowerCase().includes('optional')) {
          priority = 'low';
        }
    
        // Determine phase based on priority and approach
        let phase = phaseNames[1]; // Default to second phase
        if (priority === 'high' || feature.toLowerCase().includes('mvp') || feature.toLowerCase().includes('basic')) {
          phase = phaseNames[0];
        } else if (priority === 'low' || feature.toLowerCase().includes('advanced') || feature.toLowerCase().includes('future')) {
          phase = phaseNames[Math.min(2, phaseNames.length - 1)];
        }
    
        // Estimate duration
        let estimatedDuration = '2-3 weeks';
        if (feature.length > 100 || feature.toLowerCase().includes('complex') || feature.toLowerCase().includes('integration')) {
          estimatedDuration = '4-6 weeks';
        } else if (feature.length < 50 || feature.toLowerCase().includes('simple')) {
          estimatedDuration = '1-2 weeks';
        }
    
        // Generate deliverables
        const deliverables = [
          `${feature} implementation`,
          `Unit and integration tests`,
          `Documentation and user guides`,
          `Code review and quality assurance`
        ];
    
        // Generate success criteria
        const successCriteria = [
          `Feature functions as specified`,
          `Meets performance requirements`,
          `Passes all test cases`,
          `User acceptance criteria met`
        ];
    
        // Identify potential risks
        const risks = [];
        if (feature.toLowerCase().includes('external') || feature.toLowerCase().includes('third-party')) {
          risks.push('External dependency risk');
        }
        if (feature.toLowerCase().includes('performance') || feature.toLowerCase().includes('scalability')) {
          risks.push('Performance optimization complexity');
        }
        if (feature.toLowerCase().includes('security') || feature.toLowerCase().includes('authentication')) {
          risks.push('Security implementation complexity');
        }
        if (risks.length === 0) {
          risks.push('Standard development risks');
        }
    
        return {
          id: itemId,
          title: feature.length > 50 ? feature.substring(0, 47) + '...' : feature,
          description: feature,
          phase,
          priority,
          estimatedDuration,
          dependencies: [],
          deliverables,
          successCriteria,
          risks
        };
      });
    
      // Group features by phase
      const phases: RoadmapPhase[] = phaseNames.map((phaseName, index) => {
        const phaseFeatures = roadmapItems.filter(item => item.phase === phaseName);
        const phaseGoals = [];
        
        if (index === 0) {
          phaseGoals.push('Establish core functionality', 'Validate core assumptions', 'Build foundation for future features');
        } else if (index === 1) {
          phaseGoals.push('Enhance user experience', 'Add key differentiating features', 'Improve system reliability');
        } else if (index === 2) {
          phaseGoals.push('Scale system capabilities', 'Add advanced features', 'Optimize performance');
        } else {
          phaseGoals.push('Continuous improvement', 'Innovation and experimentation', 'Long-term sustainability');
        }
    
        const milestones = [
          `${phaseName} features delivered`,
          `Quality assurance completed`,
          `User feedback incorporated`,
          `Metrics and KPIs reviewed`
        ];
    
        return {
          name: phaseName,
          duration: `${monthsPerPhase} month${monthsPerPhase > 1 ? 's' : ''}`,
          goals: phaseGoals,
          features: phaseFeatures,
          milestones
        };
      });
    
      const roadmap = {
        action: 'feature_roadmap',
        project: projectName,
        timeframe,
        approach,
        teamSize,
        phases,
        summary: {
          totalFeatures: roadmapItems.length,
          totalDuration: `${totalMonths} months`,
          highPriorityFeatures: roadmapItems.filter(f => f.priority === 'high').length,
          mediumPriorityFeatures: roadmapItems.filter(f => f.priority === 'medium').length,
          lowPriorityFeatures: roadmapItems.filter(f => f.priority === 'low').length
        },
        recommendations: [
          'Review and validate priorities with stakeholders',
          'Set up regular milestone reviews and adjustments',
          'Plan for buffer time between phases for testing',
          'Consider team capacity and external dependencies',
          'Establish clear success metrics for each phase'
        ],
        status: 'success'
      };
    
      // Format output
      let formattedOutput = `# ${projectName} - Feature Roadmap\n\n`;
      formattedOutput += `**Timeframe:** ${timeframe}  \n`;
      formattedOutput += `**Approach:** ${approach}  \n`;
      formattedOutput += `**Team Size:** ${teamSize} developers  \n`;
      formattedOutput += `**Total Features:** ${roadmap.summary.totalFeatures}\n\n`;
    
      formattedOutput += `## Overview\n`;
      formattedOutput += `- **High Priority:** ${roadmap.summary.highPriorityFeatures} features\n`;
      formattedOutput += `- **Medium Priority:** ${roadmap.summary.mediumPriorityFeatures} features\n`;
      formattedOutput += `- **Low Priority:** ${roadmap.summary.lowPriorityFeatures} features\n\n`;
    
      phases.forEach((phase, index) => {
        formattedOutput += `## ${phase.name}\n`;
        formattedOutput += `**Duration:** ${phase.duration}  \n`;
        formattedOutput += `**Features:** ${phase.features.length}\n\n`;
    
        formattedOutput += `### Goals\n`;
        phase.goals.forEach(goal => {
          formattedOutput += `- ${goal}\n`;
        });
        formattedOutput += '\n';
    
        if (phase.features.length > 0) {
          formattedOutput += `### Features\n`;
          phase.features.forEach(feature => {
            formattedOutput += `**${feature.id}:** ${feature.title} (${feature.priority.toUpperCase()})  \n`;
            formattedOutput += `*Duration:* ${feature.estimatedDuration}  \n`;
            formattedOutput += `*Key Risks:* ${feature.risks.join(', ')}\n\n`;
          });
        }
    
        formattedOutput += `### Milestones\n`;
        phase.milestones.forEach(milestone => {
          formattedOutput += `- ${milestone}\n`;
        });
    
        if (index < phases.length - 1) {
          formattedOutput += '\n---\n\n';
        }
      });
    
      formattedOutput += `\n## Recommendations\n`;
      roadmap.recommendations.forEach(rec => {
        formattedOutput += `- ${rec}\n`;
      });
    
      return {
        content: [{ type: 'text', text: formattedOutput }]
      };
    }
  • The ToolDefinition object defining the input schema, description, and annotations for the feature_roadmap tool.
    export const featureRoadmapDefinition: ToolDefinition = {
      name: 'feature_roadmap',
      description: '로드맵|일정|계획표|roadmap|timeline|project plan|development schedule - Generate development roadmap',
      inputSchema: {
        type: 'object',
        properties: {
          projectName: { type: 'string', description: 'Name of the project' },
          features: { type: 'string', description: 'List of features to include in roadmap' },
          timeframe: { type: 'string', description: 'Project timeframe', enum: ['3-months', '6-months', '12-months', 'custom'] },
          approach: { type: 'string', description: 'Development approach', enum: ['mvp-first', 'phased-rollout', 'big-bang'], default: 'mvp-first' },
          teamSize: { type: 'number', description: 'Development team size' }
        },
        required: ['projectName', 'features']
      },
      annotations: {
        title: 'Feature Roadmap',
        audience: ['user', 'assistant'],
        readOnlyHint: true,
        destructiveHint: false,
        idempotentHint: true,
        openWorldHint: false
      }
    };
  • src/index.ts:131-134 (registration)
    Registration of the featureRoadmapDefinition in the tools array, which is returned by ListToolsRequestHandler.
    createUserStoriesDefinition,
    analyzeRequirementsDefinition,
    featureRoadmapDefinition,
  • src/index.ts:200-200 (registration)
    Registration of the featureRoadmap handler in the toolHandlers record for dynamic dispatch during tool execution.
    'feature_roadmap': featureRoadmap,
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false, which already inform the agent this is a safe, deterministic generation tool. The description adds minimal behavioral context beyond this - it doesn't explain what 'Generate' means operationally (e.g., creates a new artifact, returns structured data), nor does it mention any limitations, quality of output, or processing characteristics. With annotations covering safety aspects, the description adds some value but lacks rich behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is reasonably concise with a keyword list followed by the core function. However, the keyword list could be considered redundant since 'roadmap' already appears in both the tool name and core description. The structure is front-loaded with relevant terms, but the second part ('Generate development roadmap') is somewhat generic and could be more specific.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a generation tool with 5 parameters, no output schema, and good annotation coverage for safety aspects, the description is minimally adequate. It identifies the tool's domain but lacks details about what exactly gets generated, the format of output, quality considerations, or how it differs from related planning tools. The annotations handle safety profiling, but the description should do more to explain the tool's behavior and output characteristics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all 5 parameters well-documented in the schema itself (including enums for timeframe and approach). The description provides no additional parameter information beyond what's in the schema - it doesn't explain how parameters interact, provide examples of feature lists, or clarify the meaning of 'custom' timeframe or development approaches. Since the schema does the heavy lifting, the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool generates a development roadmap, which provides a basic purpose. However, it's vague about what 'Generate development roadmap' entails - does it create a visual timeline, a text plan, or something else? The keyword list at the beginning (로드맵|일정|계획표|roadmap|timeline|project plan|development schedule) suggests multiple interpretations but doesn't clarify the specific output format or nature of the generation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives. While sibling tools like 'format_as_plan', 'generate_prd', and 'create_user_stories' might be related to planning/documentation, the description doesn't differentiate this roadmap tool from them or explain its specific use case context. The agent must infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/su-record/hi-ai'

If you have feedback or need assistance with the MCP directory API, please join our Discord server