delete_test_cycle
Delete a test cycle and all its execution records permanently. Specify the test cycle ID; action is irreversible. Returns 204 on success.
Instructions
Permanently delete a test cycle and all its execution records. This is irreversible. Returns 204 on success.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Test cycle ID |
Implementation Reference
- src/index.ts:172-184 (registration)The `tool` wrapper function that registers tools with the MCP server. It wraps server.registerTool with a concise signature.
const tool = <Shape extends z.ZodRawShape>( name: string, description: string, inputSchema: Shape, // eslint-disable-next-line @typescript-eslint/no-explicit-any callback: (args: z.infer<z.ZodObject<Shape>>) => Promise<any> ) => server.registerTool( name, { description, inputSchema }, // eslint-disable-next-line @typescript-eslint/no-explicit-any callback as any ); - src/index.ts:411-419 (handler)The actual handler/implementation of the 'delete_test_cycle' tool. It takes an 'id' parameter, sends a DELETE request to /testcycles/{id}, and returns a success message.
tool( "delete_test_cycle", "Permanently delete a test cycle and all its execution records. This is irreversible. Returns 204 on success.", { id: ID.describe("Test cycle ID") }, async ({ id }) => { await qtmFetch(`/testcycles/${id}`, { method: "DELETE" }); return ok({ message: `Test cycle ${id} deleted` }); } ); - src/index.ts:414-414 (schema)The input schema for delete_test_cycle: an 'id' parameter (union of string or number) described as 'Test cycle ID'.
{ id: ID.describe("Test cycle ID") }, - src/index.ts:25-66 (helper)The qtmFetch helper function used by the delete_test_cycle handler to make the HTTP DELETE request to the QMetry API.
async function qtmFetch( path: string, options: RequestInit = {}, attempt = 1 ): Promise<unknown> { const url = `${BASE_URL}${path}`; const headers: Record<string, string> = { apiKey: API_KEY ?? "", "Content-Type": "application/json", Accept: "application/json", ...(options.headers as Record<string, string> | undefined), }; const response = await fetch(url, { ...options, headers }); // Exponential back-off for rate limiting (max 3 attempts) if (response.status === 429 && attempt < 3) { const retryAfter = Number.parseInt( response.headers.get("Retry-After") ?? "1", 10 ); const delay = Math.max(retryAfter * 1000, 1000) * attempt; await new Promise((r) => setTimeout(r, delay)); return qtmFetch(path, options, attempt + 1); } const text = await response.text(); let body: unknown; try { body = text ? JSON.parse(text) : null; } catch { body = text; } if (!response.ok) { throw new Error( `HTTP ${response.status} ${response.statusText}: ${JSON.stringify(body)}` ); } return body; } - src/index.ts:68-73 (helper)The ok helper function used to wrap the success response as MCP tool content.
/** Wrap a successful API response as MCP tool content. */ function ok(data: unknown) { return { content: [{ type: "text" as const, text: JSON.stringify(data, null, 2) }], }; }