Skip to main content
Glama
kadykov

OpenAPI Schema Explorer

utils.ts5.58 kB
// NOTE: This block replaces the previous import block to ensure types/interfaces are defined correctly. import { OpenAPIV3 } from 'openapi-types'; import { RenderContext, RenderResultItem } from './types.js'; // Add .js import { buildComponentDetailUriSuffix, buildComponentMapUriSuffix, buildOperationUriSuffix, // buildPathItemUriSuffix, // Not currently used by generateListHint } from '../utils/uri-builder.js'; // Added .js extension // Define possible types for list items to guide hint generation type ListItemType = 'componentType' | 'componentName' | 'pathMethod'; // Define context needed for generating the correct detail URI suffix interface HintContext { itemType: ListItemType; firstItemExample?: string; // Example value from the first item in the list // For componentName hints, the parent component type is needed parentComponentType?: string; // For pathMethod hints, the parent path is needed parentPath?: string; } /** * Safely retrieves the summary from an Operation object. * Handles cases where the operation might be undefined or lack a summary. * * @param operation - The Operation object or undefined. * @returns The operation summary or operationId string, truncated if necessary, or null if neither is available. */ export function getOperationSummary( operation: OpenAPIV3.OperationObject | undefined ): string | null { // Return summary or operationId without truncation return operation?.summary || operation?.operationId || null; } /** * Helper to generate a standard hint text for list views, using the centralized URI builders. * @param renderContext - The rendering context containing the base URI. * @param hintContext - Context about the type of items being listed and their parent context. * @returns The hint string. */ export function generateListHint(renderContext: RenderContext, hintContext: HintContext): string { let detailUriSuffixPattern: string; let itemTypeName: string; // User-friendly name for the item type in the hint text let exampleUriSuffix: string | undefined; // To hold the generated example URI switch (hintContext.itemType) { case 'componentType': // Listing component types (e.g., schemas, responses) at openapi://components // Hint should point to openapi://components/{type} detailUriSuffixPattern = buildComponentMapUriSuffix('{type}'); // Use placeholder itemTypeName = 'component type'; if (hintContext.firstItemExample) { exampleUriSuffix = buildComponentMapUriSuffix(hintContext.firstItemExample); } break; case 'componentName': // Listing component names (e.g., MySchema, User) at openapi://components/{type} // Hint should point to openapi://components/{type}/{name} if (!hintContext.parentComponentType) { console.warn('generateListHint called for componentName without parentComponentType'); return ''; // Avoid generating a broken hint } // Use the actual parent type and a placeholder for the name detailUriSuffixPattern = buildComponentDetailUriSuffix( hintContext.parentComponentType, '{name}' ); itemTypeName = hintContext.parentComponentType.slice(0, -1); // e.g., 'schema' from 'schemas' if (hintContext.firstItemExample) { exampleUriSuffix = buildComponentDetailUriSuffix( hintContext.parentComponentType, hintContext.firstItemExample ); } break; case 'pathMethod': // Listing methods (e.g., get, post) at openapi://paths/{path} // Hint should point to openapi://paths/{path}/{method} if (!hintContext.parentPath) { console.warn('generateListHint called for pathMethod without parentPath'); return ''; // Avoid generating a broken hint } // Use the actual parent path and a placeholder for the method detailUriSuffixPattern = buildOperationUriSuffix(hintContext.parentPath, '{method}'); itemTypeName = 'operation'; // Or 'method'? 'operation' seems clearer if (hintContext.firstItemExample) { // Ensure the example method is valid if needed, though usually it's just 'get', 'post' etc. exampleUriSuffix = buildOperationUriSuffix( hintContext.parentPath, hintContext.firstItemExample ); } break; default: // Explicitly cast to string to avoid potential 'never' type issue in template literal console.warn(`Unknown itemType in generateListHint: ${String(hintContext.itemType)}`); return ''; // Avoid generating a hint if context is unknown } // Construct the full hint URI pattern using the base URI const fullHintPattern = `${renderContext.baseUri}${detailUriSuffixPattern}`; const fullExampleUri = exampleUriSuffix ? `${renderContext.baseUri}${exampleUriSuffix}` : undefined; let hintText = `\nHint: Use '${fullHintPattern}' to view details for a specific ${itemTypeName}.`; if (fullExampleUri) { hintText += ` (e.g., ${fullExampleUri})`; } return hintText; } /** * Helper to generate a standard error item for RenderResultItem arrays. * @param uriSuffix - The URI suffix for the error context. * @param message - The error message. * @returns A RenderResultItem array containing the error. */ export function createErrorResult(uriSuffix: string, message: string): RenderResultItem[] { return [ { uriSuffix: uriSuffix, data: null, isError: true, errorText: message, renderAsList: true, // Errors are typically plain text }, ]; }

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/kadykov/mcp-openapi-schema-explorer'

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