Skip to main content
Glama

documcp

by tosin2013
mcp-readme-tools.test.ts6.92 kB
import { promises as fs } from "fs"; import { join } from "path"; describe("MCP Integration Tests", () => { let tempDir: string; beforeEach(async () => { tempDir = join(process.cwd(), "test-mcp-integration-temp"); await fs.mkdir(tempDir, { recursive: true }); }); afterEach(async () => { try { await fs.rm(tempDir, { recursive: true, force: true }); } catch (error) { // Ignore cleanup errors } }); describe("Tool Registration", () => { test("should include evaluate_readme_health in tools list", async () => { // This test verifies that the README health tool is properly registered // Since we can't directly access the server instance, we'll test the tool functions directly // but verify they match the expected MCP interface const { evaluateReadmeHealth } = await import( "../../src/tools/evaluate-readme-health.js" ); // Test with valid parameters that match the MCP schema const readmePath = join(tempDir, "README.md"); await fs.writeFile(readmePath, "# Test Project\n\nBasic README content."); const result = await evaluateReadmeHealth({ readme_path: readmePath, project_type: "community_library", // Valid enum value from schema }); expect(result.content).toBeDefined(); expect(result.isError).toBe(false); }); test("should include readme_best_practices in tools list", async () => { const { readmeBestPractices } = await import( "../../src/tools/readme-best-practices.js" ); const readmePath = join(tempDir, "README.md"); await fs.writeFile( readmePath, "# Test Library\n\nLibrary documentation.", ); const result = await readmeBestPractices({ readme_path: readmePath, project_type: "library", // Valid enum value from schema }); expect(result.success).toBe(true); expect(result.data).toBeDefined(); }); }); describe("Parameter Validation", () => { test("evaluate_readme_health should handle invalid project_type", async () => { const { evaluateReadmeHealth } = await import( "../../src/tools/evaluate-readme-health.js" ); const readmePath = join(tempDir, "README.md"); await fs.writeFile(readmePath, "# Test"); const result = await evaluateReadmeHealth({ readme_path: readmePath, project_type: "invalid_type" as any, }); expect(result.isError).toBe(true); }); test("readme_best_practices should handle invalid project_type", async () => { const { readmeBestPractices } = await import( "../../src/tools/readme-best-practices.js" ); const readmePath = join(tempDir, "README.md"); await fs.writeFile(readmePath, "# Test"); const result = await readmeBestPractices({ readme_path: readmePath, project_type: "invalid_type" as any, }); expect(result.success).toBe(false); expect(result.error).toBeDefined(); }); test("evaluate_readme_health should handle missing file", async () => { const { evaluateReadmeHealth } = await import( "../../src/tools/evaluate-readme-health.js" ); const result = await evaluateReadmeHealth({ readme_path: join(tempDir, "nonexistent.md"), }); expect(result.isError).toBe(true); }); test("readme_best_practices should handle missing file without template", async () => { const { readmeBestPractices } = await import( "../../src/tools/readme-best-practices.js" ); const result = await readmeBestPractices({ readme_path: join(tempDir, "nonexistent.md"), generate_template: false, }); expect(result.success).toBe(false); expect(result.error?.code).toBe("README_NOT_FOUND"); }); }); describe("Response Format Consistency", () => { test("evaluate_readme_health should return MCP-formatted response", async () => { const { evaluateReadmeHealth } = await import( "../../src/tools/evaluate-readme-health.js" ); const readmePath = join(tempDir, "README.md"); await fs.writeFile( readmePath, "# Complete Project\n\n## Description\nDetailed description.", ); const result = await evaluateReadmeHealth({ readme_path: readmePath, }); // Should be already formatted for MCP expect(result.content).toBeDefined(); expect(Array.isArray(result.content)).toBe(true); expect(result.isError).toBeDefined(); // Should have execution metadata const metadataContent = result.content.find((c) => c.text.includes("Execution completed"), ); expect(metadataContent).toBeDefined(); }); test("readme_best_practices should return MCPToolResponse that can be formatted", async () => { const { readmeBestPractices } = await import( "../../src/tools/readme-best-practices.js" ); const { formatMCPResponse } = await import("../../src/types/api.js"); const readmePath = join(tempDir, "README.md"); await fs.writeFile( readmePath, "# Library Project\n\n## Installation\nnpm install", ); const result = await readmeBestPractices({ readme_path: readmePath, }); // Should be raw MCPToolResponse expect(result.success).toBeDefined(); expect(result.metadata).toBeDefined(); // Should be formattable const formatted = formatMCPResponse(result); expect(formatted.content).toBeDefined(); expect(Array.isArray(formatted.content)).toBe(true); expect(formatted.isError).toBe(false); }); }); describe("Cross-tool Consistency", () => { test("both tools should handle the same README file", async () => { const { evaluateReadmeHealth } = await import( "../../src/tools/evaluate-readme-health.js" ); const { readmeBestPractices } = await import( "../../src/tools/readme-best-practices.js" ); const readmePath = join(tempDir, "README.md"); await fs.writeFile( readmePath, `# Test Project ## Description This is a comprehensive test project. ## Installation \`\`\`bash npm install test-project \`\`\` ## Usage \`\`\`javascript const test = require('test-project'); test.run(); \`\`\` ## Contributing Please read our contributing guidelines. ## License MIT License `, ); // Both tools should work on the same file const healthResult = await evaluateReadmeHealth({ readme_path: readmePath, project_type: "community_library", }); const practicesResult = await readmeBestPractices({ readme_path: readmePath, project_type: "library", }); expect(healthResult.isError).toBe(false); expect(practicesResult.success).toBe(true); }); }); });

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