UNPKG

@razorpay/blade-mcp

Version:

Model Context Protocol server for Blade

96 lines 4.56 kB
import { readFileSync } from 'fs'; import { join, basename } from 'path'; import { z } from 'zod'; import { analyticsToolCallEventName, GENERAL_KNOWLEDGEBASE_DIRECTORY } from '../utils/tokens.js'; import { commonBladeMCPToolSchema, httpTransportCursorRuleVersionSchema, } from '../utils/getCommonSchema.js'; import { getBladeDocsList } from '../utils/generalUtils.js'; import { handleError, sendAnalytics } from '../utils/analyticsUtils.js'; import { getBladeDocsResponseText } from '../utils/getBladeDocsResponseText.js'; import { shouldCreateOrUpdateCursorRule } from '../utils/cursorRulesUtils.js'; const bladeGeneralDocsList = getBladeDocsList('general'); const getBladeGeneralDocsToolName = 'get_blade_general_docs'; const whichGeneralDocsToUse = readFileSync(join(GENERAL_KNOWLEDGEBASE_DIRECTORY, 'index.md'), 'utf8'); const getBladeGeneralDocsToolDescription = `Fetch general Blade Design System documentation. Use this to get information about setup, installation, theming, tokens, and general guidelines.`; // Schema for stdio transport const getBladeGeneralDocsStdioSchema = { topicsList: z .string() .describe(`Comma separated list of general documentation topics. E.g. "Installation, Theming". Possible values: ${bladeGeneralDocsList.join(', ')}. Here is guide on how to decide which general docs you might need:\n ${whichGeneralDocsToUse}`), ...commonBladeMCPToolSchema, }; // Schema for HTTP transport const getBladeGeneralDocsHttpSchema = { ...getBladeGeneralDocsStdioSchema, ...httpTransportCursorRuleVersionSchema, }; // Core business logic function const getBladeGeneralDocsCore = ({ topicsList, currentProjectRootDirectory, skipLocalCursorRuleChecks = false, cursorRuleVersion = '0', clientName, }) => { const topics = topicsList.split(',').map((s) => s.trim()); const invalidTopics = topics.filter((topic) => !bladeGeneralDocsList.includes(topic)); if (invalidTopics.length > 0) { return handleError({ toolName: getBladeGeneralDocsToolName, mcpErrorMessage: `Invalid argument topicsList. Invalid values: ${invalidTopics.join(', ')}. Valid general docs values: ${bladeGeneralDocsList.join(', ')}`, }); } // Check cursor rules using shouldCreateOrUpdateCursorRule which handles both file system and version checks if (currentProjectRootDirectory) { const createOrUpdateCursorRule = shouldCreateOrUpdateCursorRule(cursorRuleVersion, clientName, currentProjectRootDirectory, skipLocalCursorRuleChecks, getBladeGeneralDocsToolName); if (createOrUpdateCursorRule) { return createOrUpdateCursorRule; } } try { const responseText = getBladeDocsResponseText({ docsList: topicsList, documentationType: 'general', }); sendAnalytics({ eventName: analyticsToolCallEventName, properties: { toolName: getBladeGeneralDocsToolName, topicsList, rootDirectoryName: currentProjectRootDirectory ? basename(currentProjectRootDirectory) : undefined, cursorRuleVersion, clientName, }, }); return { content: [ { type: 'text', text: responseText.trim(), }, ], }; } catch (error) { return handleError({ toolName: getBladeGeneralDocsToolName, errorObject: error, }); } }; // Callback for stdio transport const getBladeGeneralDocsStdioCallback = ({ topicsList, currentProjectRootDirectory, clientName, }) => { return getBladeGeneralDocsCore({ topicsList, currentProjectRootDirectory, skipLocalCursorRuleChecks: false, // Perform cursor rule checks for stdio clientName, }); }; // Callback for HTTP transport const getBladeGeneralDocsHttpCallback = ({ topicsList, cursorRuleVersion, clientName, currentProjectRootDirectory, }) => { return getBladeGeneralDocsCore({ topicsList, currentProjectRootDirectory, skipLocalCursorRuleChecks: true, // Skip cursor rule checks for HTTP cursorRuleVersion, clientName, }); }; export { getBladeGeneralDocsToolName, getBladeGeneralDocsToolDescription, getBladeGeneralDocsHttpCallback, getBladeGeneralDocsStdioCallback, getBladeGeneralDocsHttpSchema, getBladeGeneralDocsStdioSchema, }; //# sourceMappingURL=getBladeGeneralDocs.js.map