@smartbear/mcp
Version:
MCP server for interacting SmartBear Products
187 lines (186 loc) • 6.49 kB
JavaScript
import { QMETRY_DEFAULTS } from "../config/constants.js";
import { QMETRY_PATHS } from "../config/rest-endpoints.js";
import { DEFAULT_CREATE_CYCLE_PAYLOAD, DEFAULT_CREATE_RELEASE_PAYLOAD, DEFAULT_FETCH_BUILD_PAYLOAD, DEFAULT_FETCH_PLATFORMS_PAYLOAD, DEFAULT_FETCH_PROJECTS_PAYLOAD, } from "../types/project.js";
import { qmetryRequest } from "./api/client-api.js";
import { resolveDefaults } from "./utils.js";
/**
* Retrieves project information from QMetry
*
* This function serves dual purpose:
* 1. SET_PROJECT_INFO - Sets/switches the current project context
* 2. FETCH_PROJECT_INFO - Retrieves project details and configuration
*
* Both operations use the same API endpoint as QMetry handles project context
* switching and information retrieval through the same GET request.
*
* @param token - QMetry API authentication token
* @param baseUrl - QMetry instance base URL (defaults to configured URL)
* @param project - Project key to retrieve info for (defaults to configured project)
* @returns Promise resolving to project information including viewIds, folders, and configuration
*/
export async function getProjectInfo(token, baseUrl, project) {
return qmetryRequest({
method: "GET",
path: QMETRY_PATHS.PROJECT.GET_INFO,
token,
baseUrl: baseUrl || QMETRY_DEFAULTS.BASE_URL,
project: project || QMETRY_DEFAULTS.PROJECT_KEY,
});
}
/**
* Fetches a List of projects.
*/
export async function getProjects(token, baseUrl, project, payload) {
const body = {
...DEFAULT_FETCH_PROJECTS_PAYLOAD,
...payload,
};
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.PROJECT.GET_PROJECTS,
token,
baseUrl: baseUrl || QMETRY_DEFAULTS.BASE_URL,
project: project || QMETRY_DEFAULTS.PROJECT_KEY,
body,
});
}
export async function getReleasesCycles(token, baseUrl, project, payload = {}) {
let showArchiveValue;
if (payload.showArchive !== undefined) {
showArchiveValue = payload.showArchive;
}
else {
showArchiveValue = false;
}
const body = {
showArchive: showArchiveValue,
};
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.PROJECT.GET_RELEASES_CYCLES,
token,
baseUrl: baseUrl || QMETRY_DEFAULTS.BASE_URL,
project: project || QMETRY_DEFAULTS.PROJECT_KEY,
body,
});
}
/**
* Fetches a List of Builds of the current project.
*/
export async function getBuilds(token, baseUrl, project, payload) {
const body = {
...DEFAULT_FETCH_BUILD_PAYLOAD,
...payload,
};
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.PROJECT.GET_BUILD,
token,
baseUrl: baseUrl || QMETRY_DEFAULTS.BASE_URL,
project: project || QMETRY_DEFAULTS.PROJECT_KEY,
body,
});
}
/**
* Fetches platforms from the current QMetry project
*
*/
export async function getPlatforms(token, baseUrl, project, payload) {
const body = {
...DEFAULT_FETCH_PLATFORMS_PAYLOAD,
...payload,
};
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.PROJECT.GET_PLATFORMS,
token,
baseUrl: baseUrl || QMETRY_DEFAULTS.BASE_URL,
project: project || QMETRY_DEFAULTS.PROJECT_KEY,
body,
});
}
/**
* Creates a new release in QMetry with optional cycle
*
* @param token - QMetry API authentication token
* @param baseUrl - QMetry instance base URL
* @param project - Project key
* @param payload - Release and cycle data
* @returns Promise resolving to the created release information
*/
export async function createRelease(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_CREATE_RELEASE_PAYLOAD,
...payload,
};
if (typeof body.release.name !== "string") {
throw new Error("[createRelease] Missing or invalid required parameter: 'release.name'.");
}
if (body.cycle && typeof body.cycle.name !== "string") {
throw new Error("[createRelease] Missing or invalid required parameter: 'cycle.name'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.PROJECT.CREATE_RELEASE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Creates a new cycle within an existing release in QMetry
*
* @param token - QMetry API authentication token
* @param baseUrl - QMetry instance base URL
* @param project - Project key
* @param payload - Cycle data including releaseID
* @returns Promise resolving to the created cycle information
*/
export async function createCycle(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
const body = {
...DEFAULT_CREATE_CYCLE_PAYLOAD.cycle,
...payload,
};
if (typeof body.cycle.name !== "string") {
throw new Error("[createCycle] Missing or invalid required parameter: 'cycle.name'.");
}
if (typeof body.cycle.releaseID !== "number") {
throw new Error("[createCycle] Missing or invalid required parameter: 'cycle.releaseID'.");
}
return qmetryRequest({
method: "POST",
path: QMETRY_PATHS.PROJECT.CREATE_CYCLE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body,
});
}
/**
* Updates an existing cycle in QMetry
* @param token - QMetry API token
* @param baseUrl - QMetry base URL
* @param project - Project key
* @param payload - Cycle data including buildID and releaseID for identification
* @returns Promise resolving to the updated cycle information
*/
export async function updateCycle(token, baseUrl, project, payload) {
const { resolvedBaseUrl, resolvedProject } = resolveDefaults(baseUrl, project);
if (typeof payload.cycle.buildID !== "number") {
throw new Error("[updateCycle] Missing or invalid required parameter: 'cycle.buildID'.");
}
if (typeof payload.cycle.releaseID !== "number") {
throw new Error("[updateCycle] Missing or invalid required parameter: 'cycle.releaseID'.");
}
return qmetryRequest({
method: "PUT",
path: QMETRY_PATHS.PROJECT.UPDATE_CYCLE,
token,
project: resolvedProject,
baseUrl: resolvedBaseUrl,
body: payload,
});
}