Skip to main content
Glama
tool-validation.test.js5.9 kB
// Vitest globals enabled describe("Tool Validation", () => { let PostTools, PageTools, MediaTools; beforeEach(async () => { // Dynamic imports const postsModule = await import("../dist/tools/posts.js"); const pagesModule = await import("../dist/tools/pages.js"); const mediaModule = await import("../dist/tools/media.js"); PostTools = postsModule.PostTools; PageTools = pagesModule.PageTools; MediaTools = mediaModule.MediaTools; }); describe("Tool registration", () => { test("PostTools should register all expected tools", () => { const postTools = new PostTools(); const tools = postTools.getTools(); expect(tools).toBeInstanceOf(Array); expect(tools.length).toBeGreaterThan(0); // Check for required tool properties tools.forEach((tool) => { expect(tool).toHaveProperty("name"); expect(tool).toHaveProperty("description"); expect(tool).toHaveProperty("inputSchema"); expect(typeof tool.name).toBe("string"); expect(typeof tool.description).toBe("string"); expect(typeof tool.inputSchema).toBe("object"); expect(tool.inputSchema).toHaveProperty("type"); expect(tool.inputSchema).toHaveProperty("properties"); }); }); test("PageTools should register all expected tools", () => { const pageTools = new PageTools(); const tools = pageTools.getTools(); expect(tools).toBeInstanceOf(Array); expect(tools.length).toBeGreaterThan(0); tools.forEach((tool) => { expect(tool).toHaveProperty("name"); expect(tool).toHaveProperty("description"); expect(tool).toHaveProperty("parameters"); }); }); test("MediaTools should register all expected tools", () => { const mediaTools = new MediaTools(); const tools = mediaTools.getTools(); expect(tools).toBeInstanceOf(Array); expect(tools.length).toBeGreaterThan(0); tools.forEach((tool) => { expect(tool).toHaveProperty("name"); expect(tool).toHaveProperty("description"); expect(tool).toHaveProperty("parameters"); }); }); }); describe("Tool schema validation", () => { test("should have valid parameters for post tools", () => { const postTools = new PostTools(); const tools = postTools.getTools(); const createPostTool = tools.find((tool) => tool.name === "wp_create_post"); expect(createPostTool).toBeDefined(); expect(typeof createPostTool.inputSchema).toBe("object"); expect(createPostTool.inputSchema).toHaveProperty("properties"); expect(Object.keys(createPostTool.inputSchema.properties).length).toBeGreaterThan(0); // Check for title and content parameters in inputSchema.properties expect(createPostTool.inputSchema.properties).toHaveProperty("title"); expect(createPostTool.inputSchema.properties).toHaveProperty("content"); }); test("should have inputSchema for all tools", () => { const postTools = new PostTools(); const tools = postTools.getTools(); tools.forEach((tool) => { expect(typeof tool.inputSchema).toBe("object"); expect(tool.inputSchema).toHaveProperty("type"); expect(tool.inputSchema).toHaveProperty("properties"); // Each property should have type and description Object.values(tool.inputSchema.properties).forEach((prop) => { expect(prop).toHaveProperty("type"); expect(prop).toHaveProperty("description"); }); }); }); test("should have required fields properly defined", () => { const postTools = new PostTools(); const tools = postTools.getTools(); const createPostTool = tools.find((tool) => tool.name === "wp_create_post"); expect(createPostTool).toBeDefined(); // Check that required parameters exist in inputSchema expect(createPostTool.inputSchema.properties).toHaveProperty("title"); expect(createPostTool.inputSchema.properties).toHaveProperty("content"); expect(createPostTool.inputSchema.required).toContain("title"); }); }); describe("Tool naming conventions", () => { test("all tools should follow wp_ naming convention", () => { const allToolClasses = [PostTools, PageTools, MediaTools]; allToolClasses.forEach((ToolClass) => { const toolInstance = new ToolClass(); const tools = toolInstance.getTools(); tools.forEach((tool) => { expect(tool.name).toMatch(/^wp_/); }); }); }); test("tool names should be descriptive and consistent", () => { const postTools = new PostTools(); const tools = postTools.getTools(); const expectedPatterns = [ /^wp_(create|get|update|delete|list|search)_/, /^wp_\w+_(post|page|media|user|comment|category|tag)/, ]; tools.forEach((tool) => { const matchesPattern = expectedPatterns.some((pattern) => pattern.test(tool.name)); expect(matchesPattern).toBe(true); }); }); }); describe("Tool descriptions", () => { test("all tools should have meaningful descriptions", () => { const postTools = new PostTools(); const tools = postTools.getTools(); tools.forEach((tool) => { expect(tool.description).toBeTruthy(); expect(tool.description.length).toBeGreaterThan(10); // Allow descriptions with or without ending punctuation expect(tool.description.trim()).toBeTruthy(); }); }); test("descriptions should be informative", () => { const postTools = new PostTools(); const tools = postTools.getTools(); tools.forEach((tool) => { // Description should mention what the tool does expect(tool.description.toLowerCase()).toMatch(/post|create|update|delete|list|get|retrieve/); }); }); }); });

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/docdyhr/mcp-wordpress'

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