/ 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);