Skip to main content
Glama
tools.test.ts8.17 kB
/** * Integration tests for MCP tools */ import { describe, it, expect, beforeEach } from "vitest"; import { createMockServer } from "./setup.js"; import { registerModelTools } from "../tools/models.js"; describe("MCP Tools Integration", () => { let mockServer: any; beforeEach(() => { mockServer = createMockServer(); registerModelTools(mockServer); }); describe("Tool Registration", () => { it("should register all 6 tools", () => { expect(mockServer.tools.size).toBe(6); }); it("should register get_model tool", () => { expect(mockServer.getTool("get_model")).toBeDefined(); }); it("should register list_all_models tool", () => { expect(mockServer.getTool("list_all_models")).toBeDefined(); }); it("should register search_models tool", () => { expect(mockServer.getTool("search_models")).toBeDefined(); }); it("should register recommend_models tool", () => { expect(mockServer.getTool("recommend_models")).toBeDefined(); }); it("should register get_transformation tool", () => { expect(mockServer.getTool("get_transformation")).toBeDefined(); }); it("should register search_problem_patterns tool", () => { expect(mockServer.getTool("search_problem_patterns")).toBeDefined(); }); }); describe("get_model tool", () => { it("should return model for valid code", async () => { const tool = mockServer.getTool("get_model"); const result = await tool.handler({ code: "P1" }); expect(result.content).toBeDefined(); expect(result.structuredContent).toBeDefined(); expect(result.structuredContent.code).toBe("P1"); expect(result.structuredContent.name).toBeTruthy(); expect(result.structuredContent.definition).toBeTruthy(); }); it("should handle invalid code", async () => { const tool = mockServer.getTool("get_model"); const result = await tool.handler({ code: "INVALID" }); expect(result.isError).toBe(true); expect(result.content[0].text).toContain("not found"); }); it("should normalize code to uppercase", async () => { const tool = mockServer.getTool("get_model"); const result = await tool.handler({ code: "p1" }); expect(result.structuredContent.code).toBe("P1"); }); }); describe("list_all_models tool", () => { it("should return all 120 models by default", async () => { const tool = mockServer.getTool("list_all_models"); const result = await tool.handler({}); expect(result.structuredContent.total).toBe(120); expect(result.structuredContent.models).toHaveLength(120); }); it("should filter by transformation", async () => { const tool = mockServer.getTool("list_all_models"); const result = await tool.handler({ transformation_filter: "P" }); expect(result.structuredContent.total).toBe(20); expect(result.structuredContent.models).toHaveLength(20); expect(result.structuredContent.models.every((m: any) => m.code.startsWith("P"))).toBe(true); }); it("should include transformation info", async () => { const tool = mockServer.getTool("list_all_models"); const result = await tool.handler({}); result.structuredContent.models.forEach((model: any) => { expect(model.transformation).toBeTruthy(); expect(["P", "IN", "CO", "DE", "RE", "SY"]).toContain(model.transformation); }); }); }); describe("search_models tool", () => { it("should find models by keyword", async () => { const tool = mockServer.getTool("search_models"); const result = await tool.handler({ query: "principle" }); expect(result.structuredContent.resultCount).toBeGreaterThan(0); expect(result.structuredContent.results.length).toBeGreaterThan(0); }); it("should return query in response", async () => { const tool = mockServer.getTool("search_models"); const result = await tool.handler({ query: "test" }); expect(result.structuredContent.query).toBe("test"); }); it("should handle no results", async () => { const tool = mockServer.getTool("search_models"); const result = await tool.handler({ query: "xyznonexistent123" }); expect(result.structuredContent.resultCount).toBe(0); expect(result.structuredContent.results).toEqual([]); }); }); describe("recommend_models tool", () => { it("should return recommendations for problem", async () => { const tool = mockServer.getTool("recommend_models"); const result = await tool.handler({ problem: "Our startup is growing rapidly but systems are breaking", }); expect(result.structuredContent.recommendationCount).toBeGreaterThan(0); expect(result.structuredContent.recommendations.length).toBeGreaterThan(0); }); it("should include problem in response", async () => { const problem = "Need to make strategic decision"; const tool = mockServer.getTool("recommend_models"); const result = await tool.handler({ problem }); expect(result.structuredContent.problem).toBe(problem); }); it("should return transformations and models", async () => { const tool = mockServer.getTool("recommend_models"); const result = await tool.handler({ problem: "innovation challenge" }); const rec = result.structuredContent.recommendations[0]; expect(rec.transformations).toBeDefined(); expect(rec.topModels).toBeDefined(); expect(Array.isArray(rec.transformations)).toBe(true); expect(Array.isArray(rec.topModels)).toBe(true); }); }); describe("get_transformation tool", () => { it("should return transformation details", async () => { const tool = mockServer.getTool("get_transformation"); const result = await tool.handler({ key: "P" }); expect(result.structuredContent.key).toBe("P"); expect(result.structuredContent.name).toBeTruthy(); expect(result.structuredContent.description).toBeTruthy(); expect(result.structuredContent.modelCount).toBe(20); expect(result.structuredContent.models).toHaveLength(20); }); it("should handle invalid key", async () => { const tool = mockServer.getTool("get_transformation"); const result = await tool.handler({ key: "INVALID" }); expect(result.isError).toBe(true); expect(result.content[0].text).toContain("not found"); }); it("should work for all transformations", async () => { const tool = mockServer.getTool("get_transformation"); const keys = ["P", "IN", "CO", "DE", "RE", "SY"]; for (const key of keys) { const result = await tool.handler({ key }); expect(result.structuredContent.key).toBe(key); expect(result.structuredContent.modelCount).toBe(20); } }); }); describe("search_problem_patterns tool", () => { it("should find problem patterns", async () => { const tool = mockServer.getTool("search_problem_patterns"); const result = await tool.handler({ query: "decision" }); expect(result.structuredContent.query).toBe("decision"); expect(result.structuredContent.patternCount).toBeGreaterThanOrEqual(0); }); it("should return empty for no matches", async () => { const tool = mockServer.getTool("search_problem_patterns"); const result = await tool.handler({ query: "xyznonexistent" }); expect(result.structuredContent.patternCount).toBe(0); expect(result.structuredContent.patterns).toEqual([]); }); it("should include transformations and models in patterns", async () => { const tool = mockServer.getTool("search_problem_patterns"); const result = await tool.handler({ query: "growth" }); if (result.structuredContent.patternCount > 0) { const pattern = result.structuredContent.patterns[0]; expect(pattern.transformations).toBeDefined(); expect(pattern.topModels).toBeDefined(); expect(Array.isArray(pattern.transformations)).toBe(true); expect(Array.isArray(pattern.topModels)).toBe(true); } }); }); });

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/hummbl-dev/mcp-server'

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