UNPKG

mcp-cisco-support

Version:

MCP server for Cisco Support APIs including Bug Search and future tools

194 lines 9.07 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const mcp_server_1 = require("../src/mcp-server"); const mockData_1 = require("./mockData"); const setup_1 = require("./setup"); // Skip this entire test suite if mockFetch is unavailable (integration test mode) const isIntegrationMode = !setup_1.mockFetch; (isIntegrationMode ? describe.skip : describe)('MCP Server', () => { beforeEach(() => { jest.clearAllMocks(); // Default successful responses setup_1.mockFetch.mockImplementation((url, init) => { if (typeof url === 'string' && url.includes('oauth2')) { return Promise.resolve({ ok: true, status: 200, json: () => Promise.resolve(mockData_1.mockOAuthResponse) }); } return Promise.resolve({ ok: true, status: 200, json: () => Promise.resolve(mockData_1.mockBugResponse) }); }); }); describe('Server Creation', () => { test('should create MCP server instance', () => { const server = (0, mcp_server_1.createMCPServer)(); expect(server).toBeDefined(); }); }); describe('Tools Management', () => { test('should list available tools', () => { const tools = (0, mcp_server_1.getAvailableTools)(); expect(tools).toBeDefined(); expect(Array.isArray(tools)).toBe(true); expect(tools.length).toBeGreaterThan(0); // Should include Bug API tools const bugTools = tools.filter(t => t.name.includes('bug')); expect(bugTools.length).toBeGreaterThan(0); }); test('should have valid tool schemas', () => { const tools = (0, mcp_server_1.getAvailableTools)(); tools.forEach(tool => { expect(tool.name).toBeDefined(); expect(tool.description).toBeDefined(); expect(tool.inputSchema).toBeDefined(); expect(tool.inputSchema.type).toBe('object'); expect(tool.inputSchema.properties).toBeDefined(); }); }); test('should include only Bug API tools', () => { const tools = (0, mcp_server_1.getAvailableTools)(); const bugTools = tools.filter(t => t.name.includes('bug')); expect(bugTools.length).toBe(8); // Only bug API tools expect(tools.every(t => t.name.startsWith('get_bug') || t.name.startsWith('search_bugs'))).toBe(true); }); }); describe('Prompts Management', () => { test('should list available prompts', () => { const prompts = (0, mcp_server_1.getAvailablePrompts)(); expect(prompts).toBeDefined(); expect(Array.isArray(prompts)).toBe(true); expect(prompts.length).toBeGreaterThan(0); }); test('should include cisco-high-severity-search prompt', () => { const prompts = (0, mcp_server_1.getAvailablePrompts)(); const highSevPrompt = prompts.find(p => p.name === 'cisco-high-severity-search'); expect(highSevPrompt).toBeDefined(); expect(highSevPrompt.description).toContain('severity 3 or higher'); }); test('should generate cisco-high-severity-search prompt content', () => { const messages = (0, mcp_server_1.generatePrompt)('cisco-high-severity-search', { product_keyword: 'CallManager', version: '12.5', max_severity: '3' }); expect(messages).toHaveLength(1); expect(messages[0].role).toBe('user'); expect(messages[0].content.type).toBe('text'); expect(messages[0].content.text).toContain('CallManager version 12.5'); expect(messages[0].content.text).toContain('severity="1"'); expect(messages[0].content.text).toContain('severity="2"'); expect(messages[0].content.text).toContain('severity="3"'); }); test('should generate cisco-incident-investigation prompt content', () => { const messages = (0, mcp_server_1.generatePrompt)('cisco-incident-investigation', { symptom: 'memory leak', product: 'CallManager', severity: '2', software_version: '12.5' }); expect(messages).toHaveLength(1); expect(messages[0].content.text).toContain('memory leak'); expect(messages[0].content.text).toContain('CallManager'); expect(messages[0].content.text).toContain('12.5'); }); test('should throw error for unknown prompt', () => { expect(() => (0, mcp_server_1.generatePrompt)('unknown-prompt', {})).toThrow('Unknown prompt: unknown-prompt'); }); }); describe('Server Handlers', () => { let server; beforeEach(() => { server = (0, mcp_server_1.createMCPServer)(); }); test('should handle ping requests', async () => { // Note: This is a simplified test. In practice, you'd need to properly set up the server // and use the actual MCP protocol to test handlers expect(server).toBeDefined(); }); test('should handle list tools requests', async () => { // This tests the underlying function that the handler uses const tools = (0, mcp_server_1.getAvailableTools)(); expect(tools.length).toBeGreaterThan(0); }); test('should handle list prompts requests', async () => { // This tests the underlying function that the handler uses const prompts = (0, mcp_server_1.getAvailablePrompts)(); expect(prompts.length).toBeGreaterThan(0); }); }); describe('API Configuration', () => { test('should respect SUPPORT_API environment variable', () => { // Test that only bug API tools are available when SUPPORT_API=bug const tools = (0, mcp_server_1.getAvailableTools)(); const apiTypes = new Set(); tools.forEach(tool => { if (tool.name.includes('bug')) apiTypes.add('bug'); if (tool.name.includes('case')) apiTypes.add('case'); if (tool.name.includes('eox')) apiTypes.add('eox'); }); // Should have bug tools expect(apiTypes.has('bug')).toBe(true); // Should only have bug tools (no case tools implemented yet) const caseTools = tools.filter(t => t.name.includes('case')); expect(caseTools.length).toBe(0); // No case tools yet }); }); describe('Error Handling in Handlers', () => { test('should handle tool execution errors gracefully', async () => { // Mock a fetch failure setup_1.mockFetch.mockImplementationOnce(() => Promise.reject(new Error('Network error'))); // The actual server would handle this error and return an error response // Here we test the underlying function try { const { executeTool } = await Promise.resolve().then(() => __importStar(require('../src/mcp-server'))); await executeTool('search_bugs_by_keyword', { keyword: 'test' }); } catch (error) { expect(error).toBeInstanceOf(Error); expect(error.message).toBe('Network error'); } }); }); }); //# sourceMappingURL=mcpServer.test.js.map