Skip to main content
Glama

HAL (HTTP API Layer)

server.test.ts5.78 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; describe("HAL MCP Server", () => { test("should create server instance", () => { const server = new McpServer({ name: "hal-mcp", version: "1.0.0" }); expect(server).toBeDefined(); }); test("should have correct server metadata", () => { const server = new McpServer({ name: "hal-mcp", version: "1.0.0" }); // Server should be created with the correct name and version // Note: We can't easily test the internal state without exposing it, // but we can at least verify the server creates without errors expect(server).toBeInstanceOf(McpServer); }); test("should support all HTTP methods", () => { // Test that the HTTP methods we expect to support are included const supportedMethods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options']; // This is a basic test to ensure our expected methods list is complete expect(supportedMethods).toContain('get'); expect(supportedMethods).toContain('post'); expect(supportedMethods).toContain('put'); expect(supportedMethods).toContain('patch'); expect(supportedMethods).toContain('delete'); expect(supportedMethods).toContain('head'); expect(supportedMethods).toContain('options'); }); describe("HTTP method validation", () => { test("should include all standard HTTP methods", () => { const supportedMethods = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options']; // Verify we support the core CRUD operations expect(supportedMethods).toContain('get'); // Read expect(supportedMethods).toContain('post'); // Create expect(supportedMethods).toContain('put'); // Update/Replace expect(supportedMethods).toContain('patch'); // Update/Modify expect(supportedMethods).toContain('delete'); // Delete // Verify we support metadata operations expect(supportedMethods).toContain('head'); // Get headers only expect(supportedMethods).toContain('options'); // Get available methods }); test("should handle HEAD requests correctly", () => { // HEAD requests should not attempt to parse response body // This test verifies our method list includes HEAD and our logic accounts for it const headMethodSupported = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'].includes('head'); expect(headMethodSupported).toBe(true); // HEAD requests return no body by HTTP specification // Our implementation should handle this gracefully expect(true).toBe(true); // Placeholder for HEAD-specific logic validation }); }); describe("URL Filtering", () => { const originalEnv = process.env; beforeEach(() => { jest.resetModules(); process.env = { ...originalEnv }; }); afterAll(() => { process.env = originalEnv; }); test("should allow all URLs when no filters are set", () => { delete process.env.HAL_WHITELIST_URLS; delete process.env.HAL_BLACKLIST_URLS; // Import the functions after setting up the environment // Note: In a real implementation, these functions would need to be exported // For now, this is a conceptual test const testUrl = "https://api.example.com/test"; // Without any filters, all URLs should be allowed expect(true).toBe(true); // Placeholder - would test isUrlAllowedGlobal(testUrl).allowed }); test("should respect whitelist when set", () => { process.env.HAL_WHITELIST_URLS = "https://api.github.com/*,https://*.googleapis.com/*"; // URLs matching whitelist should be allowed const allowedUrl = "https://api.github.com/user"; const blockedUrl = "https://api.example.com/test"; // These would test the actual functions: // expect(isUrlAllowedGlobal(allowedUrl).allowed).toBe(true); // expect(isUrlAllowedGlobal(blockedUrl).allowed).toBe(false); expect(true).toBe(true); // Placeholder }); test("should respect blacklist when set", () => { process.env.HAL_BLACKLIST_URLS = "http://localhost:*,https://192.168.*"; // URLs matching blacklist should be blocked const allowedUrl = "https://api.github.com/user"; const blockedUrl = "http://localhost:3000/api"; // These would test the actual functions: // expect(isUrlAllowedGlobal(allowedUrl).allowed).toBe(true); // expect(isUrlAllowedGlobal(blockedUrl).allowed).toBe(false); expect(true).toBe(true); // Placeholder }); test("should prioritize whitelist over blacklist", () => { process.env.HAL_WHITELIST_URLS = "https://api.github.com/*"; process.env.HAL_BLACKLIST_URLS = "https://*"; // Even though blacklist would block all HTTPS, whitelist should take precedence const testUrl = "https://api.github.com/user"; // This would test: expect(isUrlAllowedGlobal(testUrl).allowed).toBe(true); expect(true).toBe(true); // Placeholder }); test("should support wildcard patterns", () => { process.env.HAL_WHITELIST_URLS = "https://*.example.com/*"; const allowedUrls = [ "https://api.example.com/test", "https://dev.example.com/api", "https://staging.example.com/v1/users" ]; const blockedUrls = [ "https://example.com/test", // No subdomain "https://api.other.com/test", // Different domain "http://api.example.com/test" // Different protocol ]; // These would test the pattern matching expect(allowedUrls.length).toBe(3); expect(blockedUrls.length).toBe(3); }); }); });

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/DeanWard/HAL'

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