Skip to main content
Glama

Grafana MCP Server

by levalhq
cli.tsโ€ข5.04 kB
#!/usr/bin/env node import { Command } from 'commander'; import { MCPServer } from './server/mcp-server'; import { ServerConfig } from './types/config'; import { loadGrafanaConfig, validateGrafanaConfig } from './config/environment'; import { TOOL_CATEGORIES } from './types'; // Import tool registrations import { registerSearchTools } from './tools/search'; import { registerDashboardTools } from './tools/dashboard'; import { registerDatasourceTools } from './tools/datasource'; import { registerPrometheusTools } from './tools/prometheus'; import { registerLokiTools } from './tools/loki'; import { registerIncidentTools } from './tools/incident'; import { registerAlertingTools } from './tools/alerting'; import { registerOncallTools } from './tools/oncall'; import { registerAdminTools } from './tools/admin'; import { registerSiftTools } from './tools/sift'; import { registerPyroscopeTools } from './tools/pyroscope'; import { registerNavigationTools } from './tools/navigation'; import { registerAssertsTools } from './tools/asserts'; const program = new Command(); program .name('mcp-grafana') .description('Model Context Protocol server for Grafana') .version('1.0.3'); // Transport options program .option('-t, --transport <type>', 'Transport type (stdio, sse, streamable-http)', 'stdio') .option('-a, --address <address>', 'Server address for HTTP transports', '127.0.0.1') .option('-p, --port <port>', 'Server port for HTTP transports', '3000') .option('--path <path>', 'Server path for SSE transport', '/events'); // Tool category options TOOL_CATEGORIES.forEach(category => { program.option( `--disable-${category.name}`, `Disable ${category.description.toLowerCase()}` ); }); // Grafana options program .option('--grafana-url <url>', 'Grafana instance URL (overrides GRAFANA_URL env var)') .option('--grafana-token <token>', 'Grafana service account token (overrides env var)') .option('--debug', 'Enable debug logging', false); // Parse command line arguments program.parse(); const options = program.opts(); async function main() { try { // Load configuration const grafanaConfig = loadGrafanaConfig(); // Override with CLI options if (options.grafanaUrl) { grafanaConfig.url = options.grafanaUrl; } if (options.grafanaToken) { grafanaConfig.serviceAccountToken = options.grafanaToken; } if (options.debug) { grafanaConfig.debug = true; } // Validate configuration const validatedConfig = validateGrafanaConfig(grafanaConfig); // Determine enabled tools const enabledTools = new Set<string>(); TOOL_CATEGORIES.forEach(category => { const disableKey = `disable${category.name.charAt(0).toUpperCase() + category.name.slice(1)}`; if (!options[disableKey]) { enabledTools.add(category.name); } }); // Create server configuration const serverConfig: ServerConfig = { transport: options.transport as 'stdio' | 'sse' | 'streamable-http', address: options.address, port: parseInt(options.port), path: options.path, enabledTools, grafanaConfig: validatedConfig, }; // Create and configure server const server = new MCPServer(serverConfig); // Register tools based on enabled categories if (enabledTools.has('search')) { registerSearchTools(server); } if (enabledTools.has('dashboard')) { registerDashboardTools(server); } if (enabledTools.has('datasource')) { registerDatasourceTools(server); } if (enabledTools.has('prometheus')) { registerPrometheusTools(server); } if (enabledTools.has('loki')) { registerLokiTools(server); } if (enabledTools.has('incident')) { registerIncidentTools(server); } if (enabledTools.has('alerting')) { registerAlertingTools(server); } if (enabledTools.has('oncall')) { registerOncallTools(server); } if (enabledTools.has('admin')) { registerAdminTools(server); } if (enabledTools.has('sift')) { registerSiftTools(server); } if (enabledTools.has('pyroscope')) { registerPyroscopeTools(server); } if (enabledTools.has('navigation')) { registerNavigationTools(server); } if (enabledTools.has('asserts')) { registerAssertsTools(server); } // Handle shutdown signals process.on('SIGINT', async () => { console.log('\nShutting down MCP server...'); await server.stop(); process.exit(0); }); process.on('SIGTERM', async () => { await server.stop(); process.exit(0); }); // Start the server console.log(`Starting MCP Grafana server with ${options.transport} transport...`); console.log(`Enabled tool categories: ${Array.from(enabledTools).join(', ')}`); await server.start(); } catch (error: any) { console.error('Failed to start MCP server:', error.message); process.exit(1); } } main();

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/levalhq/mcp-grafana'

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