bruno_run_request
Execute API requests from Bruno collections with environment variables and generate test reports in JSON, JUnit, or HTML formats.
Instructions
Run a specific request from a Bruno collection
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| collectionPath | Yes | Path to the Bruno collection | |
| requestName | Yes | Name of the request to run | |
| environment | No | Name or path of the environment to use | |
| enviroment | No | Alias for environment (to handle common typo) | |
| envVariables | No | Environment variables as key-value pairs | |
| reporterJson | No | Path to write JSON report | |
| reporterJunit | No | Path to write JUnit XML report | |
| reporterHtml | No | Path to write HTML report | |
| dryRun | No | Validate request without executing HTTP call |
Implementation Reference
- The RunRequestHandler class implements IToolHandler for the bruno_run_request tool. It validates parameters, performs security checks, executes the request via BrunoCLI.runRequest or handles dry-run mode, and formats the output.export class RunRequestHandler implements IToolHandler { private readonly brunoCLI: IBrunoCLI; private readonly formatter: RunResultFormatter; constructor(brunoCLI: IBrunoCLI) { this.brunoCLI = brunoCLI; this.formatter = new RunResultFormatter(); } getName(): string { return 'bruno_run_request'; } async handle(args: unknown): Promise<ToolResponse> { const params = RunRequestSchema.parse(args); // Security validation const validation = await validateToolParameters({ collectionPath: params.collectionPath, requestName: params.requestName, envVariables: params.envVariables }); if (!validation.valid) { logSecurityEvent({ type: 'access_denied', details: `Run request blocked: ${validation.errors.join(', ')}`, severity: 'error' }); throw new McpError( ErrorCode.InvalidRequest, `Security validation failed: ${validation.errors.join(', ')}` ); } // Log warnings if any if (validation.warnings.length > 0) { validation.warnings.forEach(warning => { logSecurityEvent({ type: 'env_var_validation', details: warning, severity: 'warning' }); }); } // Handle dry run mode if (params.dryRun) { return await this.handleDryRun(params); } const result = await this.brunoCLI.runRequest( params.collectionPath, params.requestName, { environment: params.environment || params.enviroment, envVariables: params.envVariables, reporterJson: params.reporterJson, reporterJunit: params.reporterJunit, reporterHtml: params.reporterHtml } ); return { content: [ { type: 'text', text: this.formatter.format(result) } as TextContent ] }; } private async handleDryRun(params: RunRequestParams): Promise<ToolResponse> { try { // Get request details to validate structure const details = await this.brunoCLI.getRequestDetails( params.collectionPath, params.requestName ); const output: string[] = []; output.push('=== DRY RUN: Request Validation ==='); output.push(''); output.push(`✅ Request validated successfully (HTTP call not executed)`); output.push(''); output.push(`Request: ${details.name}`); output.push(`Method: ${details.method}`); output.push(`URL: ${details.url}`); output.push(''); // Show what would be executed output.push('Configuration Summary:'); output.push(` Headers: ${Object.keys(details.headers).length}`); output.push(` Body: ${details.body ? details.body.type : 'none'}`); output.push(` Auth: ${details.auth}`); output.push(` Tests: ${details.tests?.length || 0}`); output.push(''); if (params.environment) { output.push(`Environment: ${params.environment}`); output.push(''); } if (params.envVariables && Object.keys(params.envVariables).length > 0) { output.push(`Environment Variables: ${Object.keys(params.envVariables).length} provided`); output.push(''); } output.push('ℹ️ This was a dry run - no HTTP request was sent.'); output.push(' Remove dryRun parameter to execute the actual request.'); return { content: [ { type: 'text', text: output.join('\n') } as TextContent ] }; } catch (error) { const maskedError = error instanceof Error ? maskSecretsInError(error) : error; throw new McpError( ErrorCode.InternalError, `Dry run validation failed: ${maskedError}` ); } } }
- Zod schema (RunRequestSchema) used in the handler to parse and validate input parameters for the bruno_run_request tool.const RunRequestSchema = z.object({ collectionPath: z.string().describe('Path to the Bruno collection'), requestName: z.string().describe('Name of the request to run'), environment: z.string().optional().describe('Name or path of the environment to use'), enviroment: z.string().optional().describe('Alias for environment (to handle common typo)'), envVariables: z.record(z.string()).optional().describe('Environment variables as key-value pairs'), reporterJson: z.string().optional().describe('Path to write JSON report'), reporterJunit: z.string().optional().describe('Path to write JUnit XML report'), reporterHtml: z.string().optional().describe('Path to write HTML report'), dryRun: z.boolean().optional().describe('Validate request without executing HTTP call') });
- src/index.ts:289-289 (registration)Instantiation and registration of RunRequestHandler with the ToolRegistry in BrunoMCPServer.registerToolHandlers().this.toolRegistry.register(new RunRequestHandler(this.brunoCLI));
- src/index.ts:30-76 (registration)Tool definition in the TOOLS array, including name, description, and JSON inputSchema for MCP protocol listing.{ name: 'bruno_run_request', description: 'Run a specific request from a Bruno collection', inputSchema: { type: 'object', properties: { collectionPath: { type: 'string', description: 'Path to the Bruno collection' }, requestName: { type: 'string', description: 'Name of the request to run' }, environment: { type: 'string', description: 'Name or path of the environment to use' }, enviroment: { type: 'string', description: 'Alias for environment (to handle common typo)' }, envVariables: { type: 'object', description: 'Environment variables as key-value pairs', additionalProperties: { type: 'string' } }, reporterJson: { type: 'string', description: 'Path to write JSON report' }, reporterJunit: { type: 'string', description: 'Path to write JUnit XML report' }, reporterHtml: { type: 'string', description: 'Path to write HTML report' }, dryRun: { type: 'boolean', description: 'Validate request without executing HTTP call' } }, required: ['collectionPath', 'requestName'] } },
- src/index.ts:30-76 (schema)JSON Schema in the tool definition used by MCP server for input validation and tool listing.{ name: 'bruno_run_request', description: 'Run a specific request from a Bruno collection', inputSchema: { type: 'object', properties: { collectionPath: { type: 'string', description: 'Path to the Bruno collection' }, requestName: { type: 'string', description: 'Name of the request to run' }, environment: { type: 'string', description: 'Name or path of the environment to use' }, enviroment: { type: 'string', description: 'Alias for environment (to handle common typo)' }, envVariables: { type: 'object', description: 'Environment variables as key-value pairs', additionalProperties: { type: 'string' } }, reporterJson: { type: 'string', description: 'Path to write JSON report' }, reporterJunit: { type: 'string', description: 'Path to write JUnit XML report' }, reporterHtml: { type: 'string', description: 'Path to write HTML report' }, dryRun: { type: 'boolean', description: 'Validate request without executing HTTP call' } }, required: ['collectionPath', 'requestName'] } },