Skip to main content
Glama

1MCP Server

registry-show.test.ts15.1 kB
import { TestFixtures } from '@test/e2e/fixtures/TestFixtures.js'; import { CliTestRunner, CommandTestEnvironment } from '@test/e2e/utils/index.js'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; describe('Registry Show Command E2E', () => { let environment: CommandTestEnvironment; let runner: CliTestRunner; beforeEach(async () => { environment = new CommandTestEnvironment(TestFixtures.createTestScenario('registry-show-test', 'basic')); await environment.setup(); runner = new CliTestRunner(environment); }); afterEach(async () => { await environment.cleanup(); }); describe('Basic Show Functionality', () => { it('should handle server not found gracefully', async () => { // Test with a server ID that doesn't exist in the registry const result = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); // Should show appropriate error message runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should handle detailed format request gracefully', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); // Should show error message instead of server details runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); }); it('should handle table format request gracefully', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--format=table'], expectError: true, timeout: 20000, }); runner.assertFailure(result); // Should show error message instead of table runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); }); it('should handle JSON format request gracefully', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); // Should show error message instead of JSON runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); }); }); describe('Version Specific Requests', () => { it('should handle specific version request with --ver flag', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--ver=1.0.0'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should handle specific version request with -v alias', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '-v', '1.0.0'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); }); it('should handle version request in different output formats', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--ver=1.0.0', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); }); it('should default to latest version when version not specified', async () => { const result1 = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); const result2 = await runner.runRegistryCommand('show', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result1); runner.assertFailure(result2); runner.assertOutputContains(result1, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result2, 'Failed to fetch server with ID: file-system'); }); }); describe('Server Information Content', () => { it('should show comprehensive server metadata', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should show package information details', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should show installation instructions', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); }); describe('Output Format Validation', () => { it('should format detailed output consistently', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should format table output properly', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--format=table'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should format JSON output with proper structure', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--format=json'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); }); describe('Error Handling', () => { it('should handle non-existent server ID', async () => { const result = await runner.runRegistryCommand('show', { args: ['non-existent-server-xyz-12345'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: non-existent-server-xyz-12345'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should handle non-existent version', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--ver=999.999.999'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should handle malformed version number', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--ver=invalid-version'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); it('should handle invalid output format', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system', '--format=invalid'], expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Invalid values:', true); runner.assertOutputContains(result, 'Argument: format', true); runner.assertOutputContains(result, 'Given: "invalid"', true); }); it('should handle missing server ID', async () => { const result = await runner.runRegistryCommand('show', { expectError: true, timeout: 20000, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Not enough non-option arguments', true); runner.assertOutputContains(result, 'got 0, need at least 1', true); }); it('should handle network timeout', async () => { const result = await runner.runRegistryCommand('show', { args: ['file-system'], timeout: 5000, // Short timeout expectError: true, }); runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); }); describe('Help Command', () => { it('should show help for show command', async () => { const result = await runner.runRegistryCommand('show', { args: ['--help'], }); runner.assertSuccess(result); runner.assertOutputContains(result, 'Show detailed information'); runner.assertOutputContains(result, 'Positionals:'); runner.assertOutputContains(result, 'server-id'); runner.assertOutputContains(result, 'Options:'); runner.assertOutputContains(result, '--ver'); runner.assertOutputContains(result, '--format'); }); }); describe('Performance and Reliability', () => { it('should complete show request within reasonable time', async () => { const startTime = Date.now(); const result = await runner.runRegistryCommand('show', { args: ['file-system'], timeout: 30000, // 30 second timeout expectError: true, }); const duration = Date.now() - startTime; runner.assertFailure(result); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); // Should complete within 15 seconds even for errors expect(duration).toBeLessThan(15000); }); it('should handle repeated show requests consistently', async () => { const results = []; // Run multiple show requests for (let i = 0; i < 3; i++) { const result = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); results.push(result); runner.assertFailure(result); } // All should fail and have consistent error messages results.forEach((result) => { expect(result.exitCode).not.toBe(0); runner.assertOutputContains(result, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); }); it('should cache results appropriately', async () => { const result1 = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); const startTime = Date.now(); const result2 = await runner.runRegistryCommand('show', { args: ['file-system'], expectError: true, timeout: 20000, }); const duration = Date.now() - startTime; runner.assertFailure(result1); runner.assertFailure(result2); // Second request might be faster due to caching (even for errors) expect(duration).toBeLessThan(5000); // Both should contain same error message runner.assertOutputContains(result1, 'Failed to fetch server with ID: file-system'); runner.assertOutputContains(result2, 'Failed to fetch server with ID: file-system'); }); it('should handle different servers efficiently', async () => { const serverIds = ['file-system', 'git', 'database']; const results = []; const startTime = Date.now(); for (const serverId of serverIds) { const result = await runner.runRegistryCommand('show', { args: [serverId], timeout: 30000, expectError: true, }); results.push(result); // Note: These might not exist, which is fine for testing error handling } const duration = Date.now() - startTime; // Should complete all requests within reasonable time expect(duration).toBeLessThan(60000); // 60 seconds for 3 requests // All should fail since these server IDs don't exist const failureCount = results.filter((r) => r.exitCode !== 0).length; expect(failureCount).toBe(serverIds.length); // All should have error messages with their respective server IDs results.forEach((result, index) => { const serverId = serverIds[index]; runner.assertOutputContains(result, `Failed to fetch server with ID: ${serverId}`); runner.assertOutputContains(result, 'HTTP 404: Not Found'); }); }); }); describe('Input Validation', () => { it('should handle special characters in server ID', async () => { const result = await runner.runRegistryCommand('show', { args: ['test@#$%^&*()'], expectError: true, timeout: 20000, }); runner.assertFailure(result); // Should handle gracefully without crashing expect(result.exitCode !== 0).toBe(true); }); it('should handle very long server ID', async () => { const longServerId = 'a'.repeat(1000); const result = await runner.runRegistryCommand('show', { args: [longServerId], expectError: true, timeout: 20000, }); runner.assertFailure(result); // Should handle gracefully expect(result.exitCode !== 0).toBe(true); }); it('should handle empty string server ID', async () => { const result = await runner.runRegistryCommand('show', { args: [''], expectError: true, timeout: 20000, }); runner.assertFailure(result); // Should handle gracefully expect(result.exitCode !== 0).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/1mcp-app/agent'

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