Skip to main content
Glama
Derrbal
by Derrbal

get_projects

Retrieve all projects from TestRail test management system to view available testing initiatives and organize test planning workflows.

Instructions

List all TestRail projects.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • MCP tool handler for 'get_projects': calls service getProjects(), returns JSON-stringified list of projects or error message.
    async () => { logger.debug('Get projects tool called'); try { const result = await getProjects(); logger.debug(`Get projects tool completed successfully. Found ${result.length} projects`); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } catch (err) { logger.error({ err }, 'Get projects tool failed'); const e = err as { type?: string; status?: number; message?: string }; let message = 'Unexpected error'; if (e?.type === 'auth') message = 'Authentication failed: check TESTRAIL_USER/API_KEY'; else if (e?.type === 'rate_limited') message = 'Rate limited by TestRail; try again later'; else if (e?.type === 'server') message = 'TestRail server error'; else if (e?.type === 'network') message = 'Network error contacting TestRail'; else if (e?.message) message = e.message; return { content: [ { type: 'text', text: message }, ], isError: true, }; } },
  • src/server.ts:190-228 (registration)
    Registers the 'get_projects' tool on the MCP server with empty input schema (no parameters) and associated handler.
    server.registerTool( 'get_projects', { title: 'Get TestRail Projects', description: 'List all TestRail projects.', inputSchema: {}, // No parameters required }, async () => { logger.debug('Get projects tool called'); try { const result = await getProjects(); logger.debug(`Get projects tool completed successfully. Found ${result.length} projects`); return { content: [ { type: 'text', text: JSON.stringify(result, null, 2), }, ], }; } catch (err) { logger.error({ err }, 'Get projects tool failed'); const e = err as { type?: string; status?: number; message?: string }; let message = 'Unexpected error'; if (e?.type === 'auth') message = 'Authentication failed: check TESTRAIL_USER/API_KEY'; else if (e?.type === 'rate_limited') message = 'Rate limited by TestRail; try again later'; else if (e?.type === 'server') message = 'TestRail server error'; else if (e?.type === 'network') message = 'Network error contacting TestRail'; else if (e?.message) message = e.message; return { content: [ { type: 'text', text: message }, ], isError: true, }; } }, );
  • TypeScript interface defining the normalized ProjectSummary structure used in tool output.
    export interface ProjectSummary { id: number; name: string; announcement?: string; show_announcement?: boolean; is_completed: boolean; completed_on?: number | null; suite_mode: number; url: string; created_on?: number; created_by?: number; custom?: Record<string, unknown> | undefined; }
  • Helper function that fetches raw TestRail projects via client and normalizes response by isolating custom fields.
    export async function getProjects(): Promise<ProjectSummary[]> { const projects: TestRailProjectDto[] = await testRailClient.getProjects(); return projects.map((project) => { const { id, name, announcement, show_announcement, is_completed, completed_on, suite_mode, url, created_on, created_by, ...rest } = project; const custom: Record<string, unknown> = {}; for (const [key, value] of Object.entries(rest)) { if (key.startsWith('custom_')) custom[key] = value; } return { id, name, announcement, show_announcement, is_completed, completed_on, suite_mode, url, created_on, created_by, custom: Object.keys(custom).length ? custom : undefined, }; }); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Derrbal/testrail-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server