/ index.js
index.js
1 // SPDX-License-Identifier: MIT 2 // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell 3 /** 4 * poly-observability-mcp - Unified MCP Server for Observability 5 * 6 * Supported Observability Tools: 7 * - Prometheus (Metrics) 8 * - Grafana (Dashboards) 9 * - Loki (Logs) 10 * - Jaeger (Tracing) 11 * - OpenTelemetry 12 * - Alertmanager 13 * - VictoriaMetrics 14 * - Tempo 15 */ 16 17 import { Server } from "@modelcontextprotocol/sdk/server/index.js"; 18 import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 19 import { 20 CallToolRequestSchema, 21 ListToolsRequestSchema, 22 } from "@modelcontextprotocol/sdk/types.js"; 23 24 // Import adapters (to be implemented) 25 // import { prometheusAdapter } from "./adapters/prometheus.js"; 26 // import { grafanaAdapter } from "./adapters/grafana.js"; 27 // import { lokiAdapter } from "./adapters/loki.js"; 28 // import { jaegerAdapter } from "./adapters/jaeger.js"; 29 // import { otelAdapter } from "./adapters/opentelemetry.js"; 30 31 const adapters = [ 32 // prometheusAdapter, 33 // grafanaAdapter, 34 // lokiAdapter, 35 // jaegerAdapter, 36 // otelAdapter, 37 ]; 38 39 const server = new Server( 40 { 41 name: "poly-observability-mcp", 42 version: "1.0.0", 43 }, 44 { 45 capabilities: { 46 tools: {}, 47 }, 48 } 49 ); 50 51 // Collect all tools from adapters 52 const allTools = adapters.flatMap((adapter) => adapter.tools || []); 53 54 server.setRequestHandler(ListToolsRequestSchema, async () => ({ 55 tools: allTools.map((tool) => ({ 56 name: tool.name, 57 description: tool.description, 58 inputSchema: tool.inputSchema, 59 })), 60 })); 61 62 server.setRequestHandler(CallToolRequestSchema, async (request) => { 63 const { name, arguments: args } = request.params; 64 65 for (const adapter of adapters) { 66 const tool = adapter.tools?.find((t) => t.name === name); 67 if (tool) { 68 try { 69 const result = await tool.handler(args); 70 return { 71 content: [{ type: "text", text: JSON.stringify(result, null, 2) }], 72 }; 73 } catch (error) { 74 return { 75 content: [{ type: "text", text: `Error: ${error.message}` }], 76 isError: true, 77 }; 78 } 79 } 80 } 81 82 return { 83 content: [{ type: "text", text: `Unknown tool: ${name}` }], 84 isError: true, 85 }; 86 }); 87 88 async function main() { 89 const transport = new StdioServerTransport(); 90 await server.connect(transport); 91 console.error("poly-observability-mcp server started"); 92 } 93 94 main().catch(console.error);