@smartbear/mcp
Version:
MCP server for interacting SmartBear Products
107 lines (106 loc) • 3.79 kB
JavaScript
import { QMetryToolsHandlers } from "../config/constants.js";
/**
* Registry of all modules that support auto-resolution
* Add new modules here to automatically support viewId/folderPath resolution
*/
export const AUTO_RESOLVE_MODULES = [
{
handler: QMetryToolsHandlers.FETCH_TEST_CASES,
viewIdPath: "latestViews.TC.viewId",
moduleName: "Test Cases",
},
{
handler: QMetryToolsHandlers.CREATE_TEST_CASE,
folderIdPath: "rootFolders.TC.id",
folderIdField: "tcFolderID",
moduleName: "Test Cases",
},
{
handler: QMetryToolsHandlers.FETCH_REQUIREMENTS,
viewIdPath: "latestViews.RQ.viewId",
moduleName: "Requirements",
},
{
handler: QMetryToolsHandlers.FETCH_TEST_SUITES,
viewIdPath: "latestViews.TS.viewId",
moduleName: "Test Suites",
},
{
handler: QMetryToolsHandlers.FETCH_TESTCASE_RUNS_BY_TESTSUITE_RUN,
viewIdPath: "latestViews.TE.viewId",
moduleName: "Test Case Run By Test Suite Run",
},
{
handler: QMetryToolsHandlers.FETCH_EXECUTIONS_BY_TESTSUITE,
viewIdPath: "latestViews.TEL.viewId",
moduleName: "Executions By Test Suites",
},
{
handler: QMetryToolsHandlers.FETCH_TESTSUITES_FOR_TESTCASE,
viewIdPath: "latestViews.TSFS.viewId",
folderIdPath: "rootFolders.TS.id",
folderIdField: "tsFolderID",
moduleName: "Test Suites",
},
{
handler: QMetryToolsHandlers.CREATE_TEST_SUITE,
folderIdPath: "rootFolders.TS.id",
folderIdField: "parentFolderId",
moduleName: "Test Suites",
},
{
handler: QMetryToolsHandlers.FETCH_ISSUES,
viewIdPath: "latestViews.IS.viewId",
moduleName: "Issues",
},
];
/**
* Helper function to safely get nested property value using dot notation
* @param obj - Object to traverse
* @param path - Dot notation path (e.g., 'latestViews.TC.viewId')
* @returns The value at the path or undefined if not found
*/
export function getNestedProperty(obj, path) {
return path.split(".").reduce((current, key) => current?.[key], obj);
}
/**
* Generic auto-resolve function for viewId, folderPath, and folderID
* @param args - Tool arguments that may contain viewId/folderPath/folderID
* @param projectInfo - Project information from QMetry API
* @param config - Module configuration for this specific handler
* @returns Updated args with resolved values
*/
export function autoResolveViewIdAndFolderPath(args, projectInfo, config) {
const updatedArgs = { ...args };
let viewId = updatedArgs.viewId;
const folderPath = updatedArgs.folderPath;
// Auto-resolve viewId if not provided and config has viewIdPath
if (!viewId && config.viewIdPath) {
viewId = getNestedProperty(projectInfo, config.viewIdPath);
if (viewId) {
updatedArgs.viewId = viewId;
}
}
// Auto-resolve folderPath if not provided (defaults to root)
if (folderPath === undefined) {
updatedArgs.folderPath = "";
}
// Auto-resolve folder ID if not provided and config has folderIdPath
if (config.folderIdPath &&
config.folderIdField &&
!updatedArgs[config.folderIdField]) {
const folderId = getNestedProperty(projectInfo, config.folderIdPath);
if (folderId) {
updatedArgs[config.folderIdField] = folderId;
}
}
return updatedArgs;
}
/**
* Find the auto-resolve configuration for a given handler
* @param handler - The handler name to find config for
* @returns Module configuration or undefined if not found
*/
export function findAutoResolveConfig(handler) {
return AUTO_RESOLVE_MODULES.find((module) => module.handler === handler);
}