Skip to main content
Glama
0xteamhq

Grafana MCP Server

by 0xteamhq

list_pyroscope_label_names

Retrieve all label names from Pyroscope profile data within a specified time range and filtering criteria to analyze application performance metrics.

Instructions

Lists all available label names found in profiles within a Pyroscope datasource

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
data_source_uidYesThe UID of the datasource to query
end_rfc_3339NoEnd time in RFC3339 format
matchersNoPrometheus-style matchers
start_rfc_3339NoStart time in RFC3339 format

Implementation Reference

  • The ToolDefinition export for 'list_pyroscope_label_names' including the core handler function that executes the tool logic: creates an axios client for the Pyroscope datasource, handles time ranges and matchers, queries the /pyroscope/api/v1/label-names endpoint, filters out internal labels (starting with '__'), and returns the list of label names.
    export const listPyroscopeLabelNames: ToolDefinition = {
      name: 'list_pyroscope_label_names',
      description: 'Lists all available label names found in profiles within a Pyroscope datasource',
      inputSchema: ListPyroscopeLabelNamesSchema,
      handler: async (params, context: ToolContext) => {
        try {
          const client = createPyroscopeClient(context.config.grafanaConfig, params.data_source_uid);
          const timeRange = params.start_rfc_3339 || params.end_rfc_3339 
            ? { start: '', end: '' } 
            : getDefaultTimeRange();
          
          const queryParams: any = {
            start: params.start_rfc_3339 || timeRange.start,
            end: params.end_rfc_3339 || timeRange.end,
          };
          
          if (params.matchers) {
            queryParams.matchers = params.matchers;
          }
          
          const response = await client.get('/pyroscope/api/v1/label-names', { params: queryParams });
          
          // Filter out internal labels (those starting with __)
          const labels = (response.data.data || []).filter((label: string) => !label.startsWith('__'));
          
          return createToolResult(labels);
        } catch (error: any) {
          return createErrorResult(error.response?.data?.message || error.message);
        }
      },
    };
  • Zod schema defining the input parameters for the list_pyroscope_label_names tool: data_source_uid (required), optional start/end times in RFC3339, and optional Prometheus-style matchers.
    const ListPyroscopeLabelNamesSchema = z.object({
      data_source_uid: z.string().describe('The UID of the datasource to query'),
      start_rfc_3339: z.string().optional().describe('Start time in RFC3339 format'),
      end_rfc_3339: z.string().optional().describe('End time in RFC3339 format'),
      matchers: z.string().optional().describe('Prometheus-style matchers'),
    });
  • The server.registerTool call that registers the list_pyroscope_label_names tool within the registerPyroscopeTools function.
    server.registerTool(listPyroscopeLabelNames);
  • Helper function createPyroscopeClient used by the handler to create an axios instance configured for the specific Pyroscope datasource with authentication.
    function createPyroscopeClient(config: any, datasourceUid: string) {
      const headers: any = {
        'User-Agent': 'mcp-grafana/1.0.0',
      };
      
      if (config.serviceAccountToken) {
        headers['Authorization'] = `Bearer ${config.serviceAccountToken}`;
      } else if (config.apiKey) {
        headers['Authorization'] = `Bearer ${config.apiKey}`;
      }
      
      return axios.create({
        baseURL: `${config.url}/api/datasources/proxy/uid/${datasourceUid}`,
        headers,
        timeout: 30000,
      });
    }
  • Helper function getDefaultTimeRange used by the handler to provide default start/end times (last hour) if not specified in parameters.
    function getDefaultTimeRange(): { start: string; end: string } {
      const now = new Date();
      const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
      return {
        start: oneHourAgo.toISOString(),
        end: now.toISOString(),
      };
    }

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

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