Skip to main content
Glama
datasource.ts4.17 kB
import { GrafanaHttpClient } from '../http-client.js'; import { Datasource } from '../types.js'; /** * Service for managing Grafana datasources */ export class DatasourceService { constructor(private httpClient: GrafanaHttpClient) {} /** * List all datasources */ async listDatasources(): Promise<Datasource[]> { return this.httpClient.get<Datasource[]>('/api/datasources'); } /** * Get datasource by UID */ async getDatasourceByUid(uid: string): Promise<Datasource> { return this.httpClient.get<Datasource>(`/api/datasources/uid/${uid}`); } /** * Get datasource by name */ async getDatasourceByName(name: string): Promise<Datasource> { return this.httpClient.get<Datasource>( `/api/datasources/name/${encodeURIComponent(name)}`, ); } /** * Get datasource by ID */ async getDatasourceById(id: number): Promise<Datasource> { return this.httpClient.get<Datasource>(`/api/datasources/${id}`); } /** * Create datasource */ async createDatasource(datasource: Partial<Datasource>): Promise<any> { return this.httpClient.post('/api/datasources', datasource); } /** * Update datasource */ async updateDatasource( id: number, datasource: Partial<Datasource>, ): Promise<any> { return this.httpClient.put(`/api/datasources/${id}`, datasource); } /** * Delete datasource by ID */ async deleteDatasourceById(id: number): Promise<void> { await this.httpClient.delete(`/api/datasources/${id}`); } /** * Delete datasource by UID */ async deleteDatasourceByUid(uid: string): Promise<void> { await this.httpClient.delete(`/api/datasources/uid/${uid}`); } /** * Delete datasource by name */ async deleteDatasourceByName(name: string): Promise<void> { await this.httpClient.delete( `/api/datasources/name/${encodeURIComponent(name)}`, ); } /** * Test datasource connection */ async testDatasource(datasource: Partial<Datasource>): Promise<any> { return this.httpClient.post('/api/datasources/test', datasource); } /** * Test datasource connection by UID */ async testDatasourceByUid(uid: string): Promise<any> { return this.httpClient.get(`/api/datasources/uid/${uid}/health`); } /** * Proxy request to datasource */ async proxyDatasourceRequest( uid: string, path: string, method: 'GET' | 'POST' = 'GET', data?: any, params?: Record<string, any>, ): Promise<any> { const url = `/api/datasources/proxy/uid/${uid}/${path}`; switch (method) { case 'GET': return this.httpClient.get(url, params); case 'POST': return this.httpClient.post(url, data); default: throw new Error(`Unsupported HTTP method: ${method}`); } } /** * Get datasource permissions */ async getDatasourcePermissions(id: number): Promise<any[]> { return this.httpClient.get(`/api/datasources/${id}/permissions`); } /** * Update datasource permissions */ async updateDatasourcePermissions( id: number, permissions: any[], ): Promise<void> { await this.httpClient.post( `/api/datasources/${id}/permissions`, permissions, ); } /** * Get datasources by type */ async getDatasourcesByType(type: string): Promise<Datasource[]> { const datasources = await this.listDatasources(); return datasources.filter((ds) => ds.type === type); } /** * Get default datasource */ async getDefaultDatasource(): Promise<Datasource | null> { const datasources = await this.listDatasources(); return datasources.find((ds) => ds.isDefault) || null; } /** * Check if datasource exists by UID */ async datasourceExists(uid: string): Promise<boolean> { try { await this.getDatasourceByUid(uid); return true; } catch (_error) { return false; } } /** * Check if datasource exists by name */ async datasourceExistsByName(name: string): Promise<boolean> { try { await this.getDatasourceByName(name); return true; } catch (_error) { return false; } } }

Latest Blog Posts

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

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