generate_prd
Create detailed Product Requirements Documents (PRD) by transforming project ideas into structured plans using AI analysis and industry standards. Ideal for defining scope, target users, timelines, and stakeholder roles efficiently.
Instructions
Generate a comprehensive Product Requirements Document (PRD) from a project idea using AI analysis and industry best practices
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| author | Yes | ||
| complexity | Yes | ||
| includeResearch | Yes | ||
| industryContext | No | ||
| projectIdea | Yes | ||
| projectName | Yes | ||
| stakeholders | No | ||
| targetUsers | No | ||
| timeline | No |
Implementation Reference
- Main execution handler for the generate_prd tool. Creates PRDGenerationService, generates PRD from inputs, validates it, formats summary and response.async function executeGeneratePRD(args: GeneratePRDArgs): Promise<MCPResponse> { const prdService = new PRDGenerationService(); try { // Generate comprehensive PRD from project idea const prd = await prdService.generatePRDFromIdea({ projectIdea: args.projectIdea, projectName: args.projectName, targetUsers: args.targetUsers, timeline: args.timeline, complexity: args.complexity, author: args.author, stakeholders: args.stakeholders }); // Validate PRD completeness const validation = await prdService.validatePRDCompleteness(prd); // Format response const summary = formatPRDGenerationSummary(prd, validation); return ToolResultFormatter.formatSuccess('generate_prd', { summary, prd, validation, completenessScore: validation.score, isComplete: validation.isComplete }); } catch (error) { process.stderr.write(`Error in generate_prd tool: ${error}\n`); // Check if this is an AI availability error const errorMessage = error instanceof Error ? error.message : 'Unknown error'; const isAIUnavailable = errorMessage.includes('AI service is not available') || errorMessage.includes('API key') || errorMessage.includes('provider'); if (isAIUnavailable) { const aiErrorSummary = formatAIUnavailableMessage('generate_prd', errorMessage); return ToolResultFormatter.formatSuccess('generate_prd', { content: [{ type: 'text', text: aiErrorSummary }], success: false, aiAvailable: false }); } return ToolResultFormatter.formatSuccess('generate_prd', { content: [{ type: 'text', text: `# Failed to generate PRD\n\n**Error:** ${errorMessage}\n\nPlease check your input parameters and try again.` }], success: false }); } }
- Zod schema defining input parameters for the generate_prd tool.const generatePRDSchema = z.object({ projectIdea: z.string().min(20).describe('The project idea or concept to create a PRD for'), projectName: z.string().min(3).describe('Name of the project'), targetUsers: z.array(z.string()).optional().describe('Target user groups'), timeline: z.string().optional().describe('Expected project timeline (e.g., "3 months", "Q1 2024")'), complexity: z.enum(['low', 'medium', 'high']).default('medium').describe('Expected project complexity'), author: z.string().describe('Author of the PRD'), stakeholders: z.array(z.string()).optional().describe('Project stakeholders'), includeResearch: z.boolean().default(false).describe('Whether to include market research and competitive analysis'), industryContext: z.string().optional().describe('Industry or domain context for the project') });
- src/infrastructure/tools/ToolRegistry.ts:270-270 (registration)Registers the generatePRDTool in the central ToolRegistry during initialization.this.registerTool(generatePRDTool);
- src/index.ts:444-445 (registration)MCP server router dispatches generate_prd calls to executeGeneratePRD handler.case "generate_prd": return await executeGeneratePRD(args);
- Helper service method that orchestrates AI generation of PRD from project idea, adds metadata, and validates the output.async generatePRDFromIdea(params: { projectIdea: string; projectName: string; targetUsers?: string[]; timeline?: string; complexity?: 'low' | 'medium' | 'high'; author: string; stakeholders?: string[]; }): Promise<PRDDocument> { try { // Validate input if (!params.projectIdea.trim()) { throw new Error('Project idea is required'); } if (!params.projectName.trim()) { throw new Error('Project name is required'); } // Generate PRD using AI const generatedPRD = await this.aiProcessor.generatePRDFromIdea({ projectIdea: params.projectIdea, targetUsers: params.targetUsers?.join(', '), timeline: params.timeline, complexity: params.complexity }); // Enhance with provided metadata const enhancedPRD: PRDDocument = { ...generatedPRD, title: params.projectName, author: params.author, stakeholders: params.stakeholders || [], version: '1.0.0' }; // Validate the generated PRD const validatedPRD = PRDDocumentSchema.parse(enhancedPRD); return validatedPRD; } catch (error) { process.stderr.write(`Error generating PRD from idea: ${error instanceof Error ? error.message : String(error)}\n`); throw new Error(`Failed to generate PRD: ${error instanceof Error ? error.message : 'Unknown error'}`); } }