Skip to main content
Glama
TocharianOU

Kibana MCP Server

by TocharianOU

get_kibana_api_detail

Retrieve detailed information for a specific Kibana API endpoint by specifying the HTTP method and path to streamline integration and debugging processes.

Instructions

Get details for a specific Kibana API endpoint

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
methodYesHTTP method, e.g. GET, POST, PUT, DELETE
pathYesAPI path, e.g. /api/actions/connector_types

Implementation Reference

  • Handler for 'get_kibana_api_detail': builds API index, finds endpoint by method/path, resolves OpenAPI refs for parameters/body/responses, returns detailed JSON or error if not found.
    async ({ method, path }): Promise<ToolResponse> => {
      await buildApiIndex();
      const endpoint = apiEndpointIndex.find(
        e => e.method === method.toUpperCase() && e.path === path
      );
      if (!endpoint) {
        return {
          content: [
            {
              type: "text",
              text: `API endpoint not found: ${method} ${path}`
            }
          ],
          isError: true
        };
      }
      // Recursively resolve parameters, requestBody, and responses references
      const detailed = {
        ...endpoint,
        parameters: resolveRef(endpoint.parameters, openApiDoc),
        requestBody: resolveRef(endpoint.requestBody, openApiDoc),
        responses: resolveRef(endpoint.responses, openApiDoc)
      };
      return {
        content: [
          {
            type: "text",
            text: `API endpoint details: ${JSON.stringify(detailed, null, 2)}`
          }
        ]
      };
    }
  • Input schema using Zod: requires 'method' (string) and 'path' (string) parameters.
    z.object({
      method: z.string().describe("HTTP method, e.g. GET, POST, PUT, DELETE"),
      path: z.string().describe("API path, e.g. /api/actions/connector_types")
    }),
  • Tool registration call in registerBaseTools function, specifying name, description, schema, and inline handler.
    server.tool(
      "get_kibana_api_detail",
      `Get details for a specific Kibana API endpoint`,
      z.object({
        method: z.string().describe("HTTP method, e.g. GET, POST, PUT, DELETE"),
        path: z.string().describe("API path, e.g. /api/actions/connector_types")
      }),
      async ({ method, path }): Promise<ToolResponse> => {
        await buildApiIndex();
        const endpoint = apiEndpointIndex.find(
          e => e.method === method.toUpperCase() && e.path === path
        );
        if (!endpoint) {
          return {
            content: [
              {
                type: "text",
                text: `API endpoint not found: ${method} ${path}`
              }
            ],
            isError: true
          };
        }
        // Recursively resolve parameters, requestBody, and responses references
        const detailed = {
          ...endpoint,
          parameters: resolveRef(endpoint.parameters, openApiDoc),
          requestBody: resolveRef(endpoint.requestBody, openApiDoc),
          responses: resolveRef(endpoint.responses, openApiDoc)
        };
        return {
          content: [
            {
              type: "text",
              text: `API endpoint details: ${JSON.stringify(detailed, null, 2)}`
            }
          ]
        };
      }
    );
  • Recursive helper to resolve $ref references in OpenAPI objects, preventing circular refs, used in the tool handler for parameters, requestBody, responses.
    function resolveRef(obj: any, doc: any, seen = new Set()): any {
      if (!obj || typeof obj !== 'object') return obj;
      if (Array.isArray(obj)) return obj.map(item => resolveRef(item, doc, seen));
      if (obj.$ref) {
        const ref = obj.$ref;
        if (seen.has(ref)) return { circularRef: ref };
        seen.add(ref);
    
        const parts = ref.replace(/^#\//, '').split('/');
        let target = doc;
        for (const p of parts) {
          if (target && typeof target === 'object') target = target[p];
          else return { invalidRef: ref };
        }
        return resolveRef(target, doc, seen);
      }
    
      const result: any = {};
      for (const k of Object.keys(obj)) {
        result[k] = resolveRef(obj[k], doc, seen);
      }
      return result;
    }
  • Builds the global apiEndpointIndex by parsing kibana-openapi-source.yaml file, populating endpoints list, called by the tool handler.
    async function buildApiIndex(): Promise<void> {
      if (isIndexBuilt) return;
      
      // Enhanced path resolution for both compiled JS and direct TS execution
      const possiblePaths = [
        // Environment variable takes highest priority
        process.env.KIBANA_OPENAPI_YAML_PATH,
        // Current working directory
        path.join(process.cwd(), 'kibana-openapi-source.yaml'),
        // Relative to the source file
        path.join(__dirname, 'kibana-openapi-source.yaml'),
        // One level up from source file (for ts-node execution)
        path.resolve(__dirname, '..', 'kibana-openapi-source.yaml'),
        // dist directory for compiled JS
        path.join(process.cwd(), 'dist', 'src', 'kibana-openapi-source.yaml')
      ].filter((p): p is string => typeof p === 'string' && p.length > 0);
    
      for (const p of possiblePaths) {
        if (fs.existsSync(p)) {
          YAML_FILE_PATH = p;
          console.warn(`Using YAML file from: ${p}`);
          break;
        }
      }
    
      if (!YAML_FILE_PATH) {
        console.error('Could not find kibana-openapi-source.yaml file');
        isIndexBuilt = true;
        return;
      }
    
      try {
        const yamlContent = fs.readFileSync(YAML_FILE_PATH, 'utf8');
        openApiDoc = yaml.load(yamlContent);
        
        if (!openApiDoc || !openApiDoc.paths) {
          throw new Error('Invalid YAML file structure: missing paths');
        }
    
        for (const [pathStr, pathObj] of Object.entries(openApiDoc.paths)) {
          for (const [method, methodObj] of Object.entries(pathObj as Record<string, any>)) {
            if (["get", "post", "put", "delete", "patch"].includes(method)) {
              apiEndpointIndex.push({
                path: pathStr as string,
                method: method.toUpperCase(),
                description: (methodObj as any).description,
                summary: (methodObj as any).summary,
                parameters: (methodObj as any).parameters,
                requestBody: (methodObj as any).requestBody,
                responses: (methodObj as any).responses,
                deprecated: (methodObj as any).deprecated,
                tags: (methodObj as any).tags
              });
            }
          }
        }
        isIndexBuilt = true;
      } catch (error) {
        console.error('Error loading or parsing YAML file:', error);
        throw error;
      }
    }

Tool Definition Quality

Score is being calculated. Check back soon.

Install Server

Other Tools

Related Tools

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/TocharianOU/mcp-server-kibana'

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