Skip to main content
Glama

validate_content

Check content quality by validating broken links, code syntax, references, and basic accuracy in documentation files.

Instructions

Validate general content quality: broken links, code syntax, references, and basic accuracy

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
contentPathYesPath to the content directory to validate
validationTypeNoType of validation: links, code, references, or allall
includeCodeValidationNoWhether to validate code blocks
followExternalLinksNoWhether to validate external URLs (slower)

Implementation Reference

  • Main execution handler for the validate_content tool. Creates ContentAccuracyValidator instance and orchestrates the validation process with timeout protection and progress reporting.
    export async function handleValidateDiataxisContent(
      args: any,
      context?: any,
    ): Promise<ValidationResult> {
      await context?.info?.("🔍 Starting Diataxis content validation...");
    
      const validator = new ContentAccuracyValidator();
    
      // Add timeout protection to prevent infinite hangs
      const timeoutMs = 120000; // 2 minutes
      let timeoutHandle: NodeJS.Timeout;
      const timeoutPromise = new Promise<ValidationResult>((_, reject) => {
        timeoutHandle = setTimeout(() => {
          reject(
            new Error(
              `Validation timed out after ${
                timeoutMs / 1000
              } seconds. This may be due to a large directory structure. Try validating a smaller subset or specific directory.`,
            ),
          );
        }, timeoutMs);
      });
    
      const validationPromise = validator.validateContent(args, context);
    
      try {
        const result = await Promise.race([validationPromise, timeoutPromise]);
        clearTimeout(timeoutHandle!);
        return result;
      } catch (error: any) {
        clearTimeout(timeoutHandle!);
        // Return a partial result with error information
        return {
          success: false,
          confidence: {
            overall: 0,
            breakdown: {
              technologyDetection: 0,
              frameworkVersionAccuracy: 0,
              codeExampleRelevance: 0,
              architecturalAssumptions: 0,
              businessContextAlignment: 0,
            },
            riskFactors: [
              {
                type: "high",
                category: "validation",
                description: "Validation process failed or timed out",
                impact: "Unable to complete content validation",
                mitigation:
                  "Try validating a smaller directory or specific subset of files",
              },
            ],
          },
          issues: [],
          uncertainties: [],
          recommendations: [
            "Validation failed or timed out",
            "Consider validating smaller directory subsets",
            "Check for very large files or deep directory structures",
            `Error: ${error.message}`,
          ],
          nextSteps: [
            "Verify the content path is correct and accessible",
            "Try validating specific subdirectories instead of the entire project",
            "Check for circular symlinks or very deep directory structures",
          ],
        };
      }
    }
  • Tool schema definition and registration export. Defines input parameters for content validation. Referenced as 'validate_content' in other tools' prompts.
    export const validateDiataxisContent: Tool = {
      name: "validate_diataxis_content",
      description:
        "Validate the accuracy, completeness, and compliance of generated Diataxis documentation",
      inputSchema: {
        type: "object",
        properties: {
          contentPath: {
            type: "string",
            description: "Path to the documentation directory to validate",
          },
          analysisId: {
            type: "string",
            description:
              "Optional repository analysis ID for context-aware validation",
          },
          validationType: {
            type: "string",
            enum: ["accuracy", "completeness", "compliance", "all"],
            default: "all",
            description: "Type of validation to perform",
          },
          includeCodeValidation: {
            type: "boolean",
            default: true,
            description: "Whether to validate code examples for correctness",
          },
          confidence: {
            type: "string",
            enum: ["strict", "moderate", "permissive"],
            default: "moderate",
            description:
              "Validation confidence level - stricter levels catch more issues",
          },
        },
        required: ["contentPath"],
      },
    };
  • Core ContentAccuracyValidator class with validateContent method implementing the validation logic: accuracy checks, completeness analysis, Diataxis compliance, code example validation, confidence scoring, and recommendations.
    class ContentAccuracyValidator {
      private projectContext: any;
      private tempDir: string;
      private executionSimulator: ExecutionSimulator | null = null;
      private useExecutionSimulation: boolean;
    
      constructor(useExecutionSimulation: boolean = true) {
        this.tempDir = path.join(currentDir, ".tmp");
        this.useExecutionSimulation = useExecutionSimulation;
    
        // Initialize execution simulator if enabled
        if (useExecutionSimulation) {
          this.executionSimulator = createExecutionSimulator({
            maxDepth: 5,
            maxSteps: 50,
            timeoutMs: 15000,
            detectNullRefs: true,
            detectTypeMismatches: true,
            detectUnreachableCode: true,
            confidenceThreshold: 0.6,
          });
        }
      }
    
      async validateContent(
        options: ValidationOptions,
        context?: any,
      ): Promise<ValidationResult> {
        if (context?.meta?.progressToken) {
          await context.meta.reportProgress?.({ progress: 0, total: 100 });
        }
    
        const result: ValidationResult = {
          success: false,
          confidence: this.initializeConfidenceMetrics(),
          issues: [],
          uncertainties: [],
          recommendations: [],
          nextSteps: [],
        };
    
        // Load project context if analysis ID provided
        if (options.analysisId) {
          await context?.info?.("📊 Loading project context...");
          this.projectContext = await this.loadProjectContext(options.analysisId);
        }
    
        if (context?.meta?.progressToken) {
          await context.meta.reportProgress?.({ progress: 20, total: 100 });
        }
    
        // Determine if we should analyze application code vs documentation
        await context?.info?.("🔎 Analyzing content type...");
        const isApplicationValidation = await this.shouldAnalyzeApplicationCode(
          options.contentPath,
        );
    
        if (context?.meta?.progressToken) {
          await context.meta.reportProgress?.({ progress: 40, total: 100 });
        }
    
        // Perform different types of validation based on request
        if (
          options.validationType === "all" ||
          options.validationType === "accuracy"
        ) {
          await this.validateAccuracy(options.contentPath, result);
        }
    
        if (
          options.validationType === "all" ||
          options.validationType === "completeness"
        ) {
          await this.validateCompleteness(options.contentPath, result);
        }
    
        if (
          options.validationType === "all" ||
          options.validationType === "compliance"
        ) {
          if (isApplicationValidation) {
            await this.validateApplicationStructureCompliance(
              options.contentPath,
              result,
            );
          } else {
            await this.validateDiataxisCompliance(options.contentPath, result);
          }
        }
    
        // Code validation if requested
        if (options.includeCodeValidation) {
          result.codeValidation = await this.validateCodeExamples(
            options.contentPath,
          );
          // Set code example relevance confidence based on code validation results
          if (result.codeValidation) {
            const successRate =
              result.codeValidation.exampleResults.length > 0
                ? result.codeValidation.exampleResults.filter(
                    (e) => e.compilationSuccess,
                  ).length / result.codeValidation.exampleResults.length
                : 1;
            result.confidence.breakdown.codeExampleRelevance = Math.round(
              successRate * 100,
            );
          }
        } else {
          // If code validation is skipped, assume reasonable confidence
          result.confidence.breakdown.codeExampleRelevance = 75;
        }
    
        // Set framework version accuracy based on technology detection confidence
        result.confidence.breakdown.frameworkVersionAccuracy = Math.min(
          90,
          result.confidence.breakdown.technologyDetection + 10,
        );
    
        // Set architectural assumptions confidence based on file structure and content analysis
        const filesAnalyzed = await this.getMarkdownFiles(options.contentPath);
        const hasStructuredContent = filesAnalyzed.length > 3; // Basic heuristic
        result.confidence.breakdown.architecturalAssumptions = hasStructuredContent
          ? 80
          : 60;
    
        // Calculate overall confidence and success
        this.calculateOverallMetrics(result);
    
        // Generate recommendations and next steps
        this.generateRecommendations(result, options);
    
        if (context?.meta?.progressToken) {
          await context.meta.reportProgress?.({ progress: 100, total: 100 });
        }
    
        const status = result.success ? "PASSED" : "ISSUES FOUND";
        await context?.info?.(
          `✅ Validation complete! Status: ${status} (${result.confidence.overall}% confidence, ${result.issues.length} issue(s))`,
        );
    
        return result;
      }
  • References to "validate_content" tool in relatedTools arrays and nextSteps, confirming usage as validate_content tool name in workflows.
              "validate_content",
              "setup_structure",
            ],
          });
        }
      }
    
      // Style improvement prompts based on health scores
      if (
        promptTypes.includes("style_improvement") &&
        documentationContext.readmeHealth &&
        documentationContext.readmeHealth < 80
      ) {
        prompts.push({
          id: "style-improvement-prompt",
          title: "Documentation Style Enhancement",
          category: "style_improvement",
          audience,
          priority: "medium",
          prompt: `Improve the writing style and clarity of existing documentation. Focus on ${audience} readability, consistent tone, and professional presentation.`,
          context: `Current README health score: ${documentationContext.readmeHealth}/100`,
          expectedOutput:
            "Refined documentation with improved clarity, consistency, and professional tone",
          integrationHints: [
            "Use evaluate_readme_health metrics for focus areas",
            "Apply readme_best_practices guidelines",
            "Validate improvements with content validation",
          ],
          relatedTools: [
            "evaluate_readme_health",
            "readme_best_practices",
            "validate_content",
          ],
        });
      }
    
      // Advanced integration prompts for comprehensive level
      if (integrationLevel === "comprehensive" || integrationLevel === "advanced") {
        prompts.push({
          id: "deployment-docs-prompt",
          title: "Deployment Documentation",
          category: "deployment_optimization",
          audience,
          priority: "medium",
          prompt: `Create deployment documentation that integrates with the recommended static site generator and deployment workflow. Include environment setup, build process, and troubleshooting.`,
          context: `Project has CI: ${projectContext.hasCI}, Package manager: ${projectContext.packageManager}`,
          expectedOutput:
            "Complete deployment guide with step-by-step instructions and troubleshooting",
          integrationHints: [
            "Use recommend_ssg output for deployment strategy",
            "Reference deploy_pages workflow",
            "Include verify_deployment checklist",
          ],
          relatedTools: [
            "recommend_ssg",
            "deploy_pages",
            "verify_deployment",
            "test_local_deployment",
          ],
        });
      }
    
      return prompts;
    }
    
    /**
     * Generate integration recommendations based on cross-tool insights
     */
    function generateIntegrationRecommendations(
      projectContext: ProjectContext,
      documentationContext: DocumentationContext,
      _prompts: TechnicalWriterPrompt[],
    ): string[] {
      const recommendations: string[] = [];
    
      recommendations.push(
        "Run analyze_repository first to establish comprehensive project context",
      );
    
      if (!documentationContext.readmeExists) {
        recommendations.push(
          "Use generate_readme_template to create initial README structure",
        );
      }
    
      if (documentationContext.documentationGaps.length > 0) {
        recommendations.push(
          "Execute detect_documentation_gaps to identify all missing content areas",
        );
      }
    
      if (projectContext.hasTests) {
        recommendations.push(
          "Include testing documentation using repository analysis insights",
        );
      }
    
      if (projectContext.hasCI) {
        recommendations.push(
          "Document CI/CD workflow using deployment tool integration",
        );
      }
    
      recommendations.push(
        "Validate all generated content using validate_content tool",
      );
      recommendations.push(
        "Check documentation links with check_documentation_links after content creation",
      );
    
      return recommendations;
    }
    
    /**
     * Generate next steps based on prompts and integration level
     */
    function generateNextSteps(
      prompts: TechnicalWriterPrompt[],
      integrationLevel: string,
    ): NextStep[] {
      const steps: NextStep[] = [];
    
      steps.push({
        action:
          "Execute high-priority prompts first to address critical documentation gaps",
        toolRequired: "generate_technical_writer_prompts",
        priority: "high",
      });
    
      steps.push({
        action: "Use generated prompts with AI writing tools for content creation",
        toolRequired: "optimize_readme",
        priority: "high",
      });
    
      steps.push({
        action: "Validate generated content using DocuMCP validation tools",
        toolRequired: "validate_content",
        priority: "medium",
      });
    
      if (integrationLevel === "comprehensive" || integrationLevel === "advanced") {
        steps.push({
          action: "Run full documentation workflow using integrated tool chain",
          toolRequired: "analyze_repository",
          priority: "medium",
        });
    
        steps.push({
          action: "Test documentation with target audience using deployment tools",
          toolRequired: "test_local_deployment",
          priority: "low",
        });
      }
    
      steps.push({
        action:
          "Iterate on content based on validation feedback and best practices analysis",
        toolRequired: "readme_best_practices",
        priority: "low",
      });
    
      return steps;
    }
    
    /**
     * Helper functions
     */
    async function fileExists(path: string): Promise<boolean> {
      try {
        await fs.access(path);
        return true;
      } catch {
        return false;
      }
    }
    
    async function hasTestFiles(projectPath: string): Promise<boolean> {
      try {
        const files = await fs.readdir(projectPath, { recursive: true });
        return files.some(
          (file) =>
            typeof file === "string" &&
            (file.includes("test") ||
              file.includes("spec") ||
              file.endsWith(".test.js") ||
              file.endsWith(".spec.js")),
        );
      } catch {
        return false;
      }
    }
    
    async function hasCIConfig(projectPath: string): Promise<boolean> {
      const ciFiles = [
        ".github/workflows",
        ".gitlab-ci.yml",
        "circle.yml",
        ".travis.yml",
      ];
    
      for (const ciFile of ciFiles) {
        if (await fileExists(join(projectPath, ciFile))) {
          return true;
        }
      }
    
      return false;
    }
    
    function categorizePrompts(
      prompts: TechnicalWriterPrompt[],
    ): Record<string, number> {
      const categories: Record<string, number> = {};
    
      for (const prompt of prompts) {
        categories[prompt.category] = (categories[prompt.category] || 0) + 1;
      }
    
      return categories;
    }
    
    function calculateConfidenceScore(
      projectContext: ProjectContext,
      documentationContext: DocumentationContext,
    ): number {
      let score = 50; // Base score
    
      // Increase confidence based on available context
      if (projectContext.projectType !== "unknown") score += 20;
      if (projectContext.languages.length > 0) score += 15;
      if (projectContext.frameworks.length > 0) score += 10;
      if (documentationContext.readmeExists) score += 5;
    
      return Math.min(score, 100);
    }
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It mentions what gets validated but doesn't describe important behavioral aspects: whether this is a read-only operation, what permissions are needed, whether it modifies content, what the output format looks like, or performance implications of 'followExternalLinks'. For a validation tool with 4 parameters and no annotations, this is insufficient behavioral context.

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

Conciseness5/5

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

The description is perfectly concise - a single sentence that efficiently communicates the tool's purpose and scope. Every word earns its place, with no redundant information. The structure is front-loaded with the core purpose followed by specific validation types, making it immediately understandable.

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

Completeness2/5

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

For a tool with 4 parameters, no annotations, and no output schema, the description is incomplete. It doesn't explain what the tool returns, what happens during validation, error conditions, or performance characteristics. While concise, it lacks the contextual information needed for an agent to understand the full implications of invoking this tool, especially given the absence of structured behavioral annotations.

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%, so the schema already fully documents all 4 parameters. The description mentions validation types (links, code, references) which aligns with the 'validationType' parameter, but doesn't add meaningful semantic context beyond what's in the schema descriptions. The baseline of 3 is appropriate when the schema does the heavy lifting for parameter documentation.

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

Purpose4/5

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

The description clearly states the tool's purpose: 'Validate general content quality' with specific validation types listed (broken links, code syntax, references, basic accuracy). It distinguishes itself from siblings like 'validate_documentation_freshness' or 'validate_readme_checklist' by focusing on general content quality rather than specific documentation aspects. However, it doesn't explicitly contrast with all similar tools like 'check_documentation_links'.

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?

The description provides no guidance on when to use this tool versus alternatives. With many sibling tools performing various validation and analysis functions (e.g., 'validate_documentation_freshness', 'check_documentation_links', 'evaluate_readme_health'), there's no indication of when this general content validation is preferred over more specialized tools. The description only states what it does, not when to choose it.

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/tosin2013/documcp'

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