mcp-cisco-support
Version:
MCP server for Cisco Support APIs including Bug Search and future tools
194 lines • 9.07 kB
JavaScript
;
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