Skip to main content
Glama
handlers.ts5.03 kB
import { parseComponentsFromHtml, fetchWithRetry, validateRuntime, createResponse, handleError, fetchAndCacheComponentData, fetchAndCacheBlocks, resourceCache, PackageManager, BASE_URL } from "./helpers.js"; export const listComponents = async () => { try { const response = await fetchWithRetry(`${BASE_URL}/components`); const html = await response.text(); const components = parseComponentsFromHtml(html); return createResponse(JSON.stringify(components, null, 2)); } catch (error) { return handleError(error, "Error fetching components list"); } } export const getComponentDocs = async ({component}: {component: string}) => { try { if (!component) { return createResponse("Component name is required", true); } const componentData = await fetchAndCacheComponentData(component); if (!componentData.description && !componentData.doc) { return createResponse(`No documentation found for component '${component}'`, true); } return createResponse( `${componentData.doc}`, false, "text/markdown" ); } catch (error) { return handleError(error, "Error fetching component documentation"); } } export const installComponent = async ({component, runtime}: {component: string, runtime?: string}) => { try { if (!component) { return createResponse("Component name is required", true); } if (runtime && !validateRuntime(runtime)) { return createResponse(`Invalid runtime: ${runtime}. Must be one of: npm, pnpm, yarn, bun`, true); } const componentData = await fetchAndCacheComponentData(component); if (!componentData.commands?.[0]) { return createResponse(`No installation command found for component '${component}'`, true); } const commands = componentData.commands[0]; const selectedRuntime = runtime as PackageManager | undefined; const command = selectedRuntime ? commands[selectedRuntime] : commands.npm; if (!command) { return createResponse(`No installation command found for runtime '${runtime}'`, true); } return createResponse(command); } catch (error) { return handleError(error, "Error generating installation command"); } } export const listBlocks = async () => { try { const blocks = await fetchAndCacheBlocks(); const blockNames = blocks.map(block => block.name); return createResponse(JSON.stringify(blockNames, null, 2)); } catch (error) { return handleError(error, "Error fetching blocks"); } } async function getBlockData(block: string) { if (!block) { return { error: "Block name is required" }; } let blockData = resourceCache.get(block); if (!blockData) { await fetchAndCacheBlocks(); blockData = resourceCache.get(block); } if (!blockData) { return { error: `Block '${block}' not found. Use list-blocks to see available blocks.` }; } return { blockData }; } export const getBlockDocs = async ({block}: {block: string}) => { try { const { blockData, error } = await getBlockData(block); if (error) return createResponse(error, true); if (!blockData) return createResponse("Unexpected error: block data missing", true); if (!blockData.doc) { return createResponse(`No documentation found for block '${block}'`, true); } return createResponse( `${JSON.stringify(blockData, null, 2)}`, false, "application/json" ); } catch (error) { return handleError(error, "Error fetching block documentation"); } } export const installBlock = async ({block, runtime}: {block: string, runtime?: string}) => { try { if (runtime && !validateRuntime(runtime)) { return createResponse(`Invalid runtime: ${runtime}. Must be one of: npm, pnpm, yarn, bun`, true); } const { blockData, error } = await getBlockData(block); if (error) return createResponse(error, true); if (!blockData) return createResponse("Unexpected error: block data missing", true); if (!blockData.commands?.[0]) { return createResponse(`No installation command found for block '${block}'`, true); } const commands = blockData.commands[0]; const selectedRuntime = runtime as PackageManager | undefined; const command = selectedRuntime ? commands[selectedRuntime] : commands.npm; if (!command) { return createResponse(`No installation command found for runtime '${runtime}'`, true); } return createResponse(command); } catch (error) { return handleError(error, "Error generating installation command"); } }

Implementation Reference

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/heilgar/shadcn-ui-mcp-server'

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