Skip to main content
Glama
server.test.ts3.58 kB
/** * Unit tests for MCP server */ import { type ToolDefinition, getAvailableTools } from '../../src/tools'; describe('MCP Server', () => { describe('Server Creation', () => { test('should create MCP server instance', async () => { const { createMCPServer } = await import('../../src/server'); const server = createMCPServer(); expect(server).toBeDefined(); // Server class from @modelcontextprotocol/sdk/server has specific methods expect(typeof server.setRequestHandler).toBe('function'); }); test('should have proper server configuration', async () => { const { getConfig } = await import('../../src/config'); const config = getConfig(); expect(config.mcp).toBeDefined(); expect(config.mcp.name).toBe('teamcity-mcp'); expect(config.mcp.version).toBeDefined(); }); // Removed env-var dependent test: MCP_MODE handling }); describe('Tool Registration', () => { test('should have ping tool available', () => { const tools = getAvailableTools(); const pingTool = tools.find((t: ToolDefinition) => t.name === 'ping'); expect(pingTool).toBeDefined(); expect(pingTool?.description).toContain('connectivity'); expect(pingTool?.inputSchema).toBeDefined(); }); test('should have list_projects tool available', () => { const tools = getAvailableTools(); const listProjectsTool = tools.find((t: ToolDefinition) => t.name === 'list_projects'); expect(listProjectsTool).toBeDefined(); expect(listProjectsTool?.description).toContain('TeamCity projects'); }); test('should have proper number of tools registered', () => { const tools = getAvailableTools(); expect(tools.length).toBeGreaterThan(0); expect( tools.every( (t: ToolDefinition) => Boolean(t.name) && Boolean(t.description) && typeof t.handler === 'function' ) ).toBe(true); }); }); describe('Configuration', () => { // Removed env-var dependent test: configuration from environment // Removed env-var dependent test: default values when env vars missing // Removed env-var dependent test: TeamCity configuration via environment }); describe('Logging', () => { test('should create logger instance', async () => { const { createLogger } = await import('../../src/utils/logger'); const logger = createLogger(); expect(logger).toBeDefined(); expect(logger).toHaveProperty('info'); expect(logger).toHaveProperty('error'); expect(logger).toHaveProperty('warn'); expect(logger).toHaveProperty('debug'); }); // Removed env-var dependent test: log level via environment }); describe('Error Handling', () => { test('should handle MCP errors properly', async () => { const { MCPError } = await import('../../src/types'); const error = new MCPError('Test error', 'TEST_ERROR', 400); expect(error).toBeInstanceOf(Error); expect(error.message).toBe('Test error'); expect(error.code).toBe('TEST_ERROR'); expect(error.statusCode).toBe(400); }); test('should handle TeamCity API errors', async () => { const { TeamCityAPIError } = await import('../../src/types'); const error = new TeamCityAPIError('API error', 500, { detail: 'Server error' }); expect(error).toBeInstanceOf(Error); expect(error.message).toBe('API error'); expect(error.statusCode).toBe(500); expect(error.response).toEqual({ detail: 'Server error' }); }); }); });

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/Daghis/teamcity-mcp'

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