@razorpay/blade-mcp
Version:
Model Context Protocol server for Blade
96 lines • 4.56 kB
JavaScript
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