mcp-openapi-schema-explorer
Version:
MCP OpenAPI schema explorer
97 lines • 4.96 kB
JavaScript
import { buildComponentDetailUriSuffix, buildComponentMapUriSuffix, buildOperationUriSuffix,
// buildPathItemUriSuffix, // Not currently used by generateListHint
} from '../utils/uri-builder.js'; // Added .js extension
/**
* 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) {
// 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, hintContext) {
let detailUriSuffixPattern;
let itemTypeName; // User-friendly name for the item type in the hint text
let exampleUriSuffix; // 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, message) {
return [
{
uriSuffix: uriSuffix,
data: null,
isError: true,
errorText: message,
renderAsList: true, // Errors are typically plain text
},
];
}
//# sourceMappingURL=utils.js.map