Skip to main content
Glama

๐Ÿ”Œ Bruno MCP Server for Python

Python MCP Bruno License: MIT

Python MCP server for running Bruno collections. It exposes a Model Context Protocol server over stdio with tools that run collections through the bru CLI and return normalized JSON results.

Note: All examples in this repository use placeholder names (project1, /home/user/project/bruno, example.test). Replace them with your own paths and collection names.


โœจ Features

  • Run Bruno collections natively using the Bruno CLI.

  • Discover collections and sibling environment files automatically.

  • Support environment files and dynamic environment variables.

  • Secure Secret Injection: Pass secrets to Bruno without exposing values to the LLM via inherited_variables. Secret values are injected through a temporary, owner-only --env-file and the child process environment โ€” they never appear in CLI arguments (ps output) or logs.

  • Filter Inspection: Inspect documented query filters and run temporary filter scenarios without modifying the source collection.

  • Two-Phase Full Validation: Execute baseline tests + all documented filters in a single tool call.

  • Normalized Outputs: Return structured execution results containing success, summary, failures, and timings.


Related MCP server: Bruno MCP Server

๐Ÿ“ฆ Requirements

  • Python: 3.10 or newer

  • Package Manager: uv

  • Node Package Manager: npm (only if the Bruno CLI is not already installed)

The installer checks whether the Bruno CLI command bru is available. If it is missing, the server fails with an explicit error instead of silently installing packages. To install the pinned version manually:

npm install -g @usebruno/cli@4.2.0

Runtime auto-install is available but opt-in: set BRUNO_MCP_AUTO_INSTALL_BRU=1 (or auto_install = true under [bruno] in the config file) and the server installs exactly the pinned version from cli_version / BRUNO_MCP_BRU_VERSION.


๐Ÿš€ Installation & Running

1. Installation

Install dependencies using uv:

uv sync

(If your configured package index does not mirror the MCP Python SDK, point uv at PyPI for the sync: UV_DEFAULT_INDEX=https://pypi.org/simple uv sync)

2. Running the Server

You can run the server directly using uv:

uv run bruno-mcp

Alternatively, run the module directly inside the uv environment: uv run python -m bruno_mcp


โš™๏ธ Configuration

MCP Configuration

Example MCP stdio configuration from this workspace root:

{
  "mcpServers": {
    "bruno-runner": {
      "command": "uv",
      "args": ["run", "bruno-mcp"]
    }
  }
}

Configuration File (bruno-mcp.toml)

Default roots and auth aliases can be configured in bruno-mcp.toml in the current working directory, or globally in ~/.config/bruno-mcp/config.toml.

See bruno-mcp.example.toml for a commented template:

[workspace]
roots = [
  "/home/user/project/bruno"
]

[bruno]
cli_version = "4.2.0"   # pinned Bruno CLI version
auto_install = false     # never install bru silently at runtime

[limits]
run_timeout_seconds = 300
max_output_bytes = 8388608
max_concurrent_runs = 2

[artifacts]
ttl_hours = 24           # raw reports are auto-deleted after this
max_files = 50

[security]
enforce_root_confinement = true   # reject collection paths outside workspace roots

[auth]
inherited_variables = [
  "BRUNO_AUTH_TOKEN",
  "BRUNO_API_KEY"
]

[defaults]
environment = "dev"

Every setting can also be set via environment variables (BRUNO_MCP_BRU_VERSION, BRUNO_MCP_AUTO_INSTALL_BRU, BRUNO_MCP_RUN_TIMEOUT, BRUNO_MCP_MAX_OUTPUT_BYTES, BRUNO_MCP_MAX_CONCURRENT_RUNS, BRUNO_MCP_ARTIFACTS_DIR, BRUNO_MCP_ARTIFACT_TTL_HOURS, BRUNO_MCP_ARTIFACT_MAX_FILES, BRUNO_MCP_ENFORCE_ROOT_CONFINEMENT, BRUNO_MCP_LOG_LEVEL), which take precedence over the file.

Note: The installer creates ~/.config/bruno-mcp/config.toml with a dummy root. Local bruno-mcp.toml files are git-ignored so real paths and environment names are never committed.


๐Ÿ’ป Local VS Code Installation

From the project root, install dependencies with uv:

UV_DEFAULT_INDEX=[https://pypi.org/simple](https://pypi.org/simple) uv sync

Ensure the Bruno CLI is available (bru --version). This repository includes .vscode/mcp.json, allowing VS Code to discover the local MCP server from the workspace:

{
  "servers": {
    "bruno-runner": {
      "type": "stdio",
      "command": "uv",
      "args": ["run", "bruno-mcp"]
    }
  }
}

Reload the VS Code window after syncing dependencies. The bruno-runner server should now be available in the MCP servers list.

Global Installation

To install the MCP server in the VS Code user profile so it is available from any workspace:

uv run python scripts/install_vscode.py

(To also install the reusable Copilot prompt and agent globally, append --with-copilot-customizations to the command above).

To install it manually in another local VS Code workspace, change the command args to include --directory:

"args": ["--directory", "/home/user/mcp-bruno", "run", "bruno-mcp"]

๐Ÿงฐ Available Tools

๐Ÿ” list-collections

Lists Bruno collections below a root directory or configured roots. Use it when the user provides a partial collection name instead of a full path.

  • root (optional): Bruno root directory (usually contains collections/ and environments/).

  • query (optional): Case-insensitive text used to filter collection names and paths.

โ–ถ๏ธ run-collection

Runs a Bruno collection and returns normalized execution results.

  • collection (required): Path to the Bruno collection.

  • environment (optional): Path to an environment file.

  • variables (optional): Environment variables as KEY=value strings.

  • inherited_variables (optional): Names of environment variables to read from the MCP server process and inject into Bruno without exposing values to the LLM. Values travel via a temporary owner-only --env-file and the child process environment ({{process.env.NAME}} also works) โ€” never in CLI arguments.

Auth Handling: For secrets, prefer inherited_variables instead of writing values in chat. By default, the secure MCP input BRUNO_AUTH_TOKEN can satisfy Bruno variables named bearerToken, BEARER_TOKEN, AUTH_TOKEN, TOKEN, accessToken, or access_token. Secrets are injected via a temporary private --env-file; if the selected --env environment file declares the same variable (which would take precedence inside bru), the run transparently switches to a temporary sanitized copy of the collection with the conflicting entry removed, so the injected secret always wins and source files are never modified.

Workspace confinement: When [workspace] roots are configured (and at least one exists on disk), collection paths outside those roots are rejected with a clear error. Set enforce_root_confinement = false to disable.

Execution limits: Each bru run has a configurable timeout (run_timeout_seconds, default 300s), bounded stdout/stderr capture (max_output_bytes), and a concurrency cap (max_concurrent_runs). Raw JSON reports are stored as artifacts with owner-only (0600) permissions and expire automatically (ttl_hours / max_files). Structured logs go to stderr (BRUNO_MCP_LOG_LEVEL).

Supported Collection Inputs:

  • Collection directory: /path/to/bruno/collections/project1

  • Bruno request file: /path/to/bruno/collections/project1/request.bru

  • Internal .vru request file: /path/to/bruno/collections/project1/request.vru

  • Open collection descriptor: /path/to/bruno/collections/project1/opencollection.yml

When Bruno failures look like authentication problems, the response includes auth_failure: true and an auth_message.

Example with inherited secrets:

{
  "collection": "/home/user/project/bruno/collections/project1",
  "environment": "dev",
  "inherited_variables": ["BRUNO_AUTH_TOKEN"]
}

๐ŸŒ discover-environments

Inspects the folder structure around a Bruno collection and returns the sibling environments directory, available environment names, and variable names (without returning secret values).

๐Ÿ“– read-result-artifact

Reads a bounded, redacted summary from the raw Bruno JSON artifact path returned by run-collection.

  • path (required): The artifact.path value returned by a previous run.

  • max_items (optional): Number of response items to sample per request (default 3, max 20).

๐Ÿงช list-request-filters & run-filter-scenarios

  • list-request-filters: Inspects YAML request files and returns query params split into enabled and disabled groups.

  • run-filter-scenarios: Runs temporary request variants with selected disabled query params enabled without modifying the source files.

๐Ÿ›ก๏ธ run-full-validation

Two-phase orchestration in a single tool call:

  1. Baseline: Runs the collection once and checks every endpoint responds without errors (no 4xx/5xx).

  2. Filters: Only runs if the baseline is green. Automatically discovers and tests every disabled query filter across every endpoint.


๐Ÿค– Prompt and Agent Automation

The project includes reusable Copilot prompt and agent templates:

  • Prompt template: copilot/prompts/run-bruno-collection.prompt.md

  • Agent template: copilot/agents/bruno-runner.agent.md

Install them globally with:

uv run python scripts/install_vscode.py --with-copilot-customizations

The agent will seamlessly navigate the workspace, discover collections/environments, handle credentials securely via inherited_variables, and return detailed execution summaries:

{
  "success": true,
  "summary": {
    "total": 5,
    "failed": 0,
    "passed": 5
  },
  "failures": [],
  "auth_failure": false,
  "auth_message": null,
  "timings": {
    "started": "2024-03-14T10:00:00.000000Z",
    "completed": "2024-03-14T10:00:01.000000Z",
    "duration": 1000
  }
}

๐Ÿณ Docker

The Docker image installs both this Python server and the Bruno CLI:

docker build -t bruno-mcp-python .
docker run --rm -i bruno-mcp-python

๐Ÿ› ๏ธ Development & Project Structure

Commands:

  • Compile-check the sources: uv run python -m compileall src

  • Run the test suite: uv run python -m unittest discover -s tests -v

Structure:

.
โ”œโ”€โ”€ src/bruno_mcp/         # MCP server, runner, config, and types
โ”œโ”€โ”€ scripts/               # VS Code installer script
โ”œโ”€โ”€ copilot/               # Reusable Copilot prompt and agent templates
โ”œโ”€โ”€ tests/                 # Unit tests
โ”œโ”€โ”€ .vscode/mcp.json       # Workspace MCP server entry
โ””โ”€โ”€ bruno-mcp.example.toml # Commented configuration template

mcp-name: io.github.kta41/mcp-bruno

๐Ÿ“„ License

Released under the MIT License.

Available Tools

7 tools
discover-environmentsDiscover Bruno environmentsB

Inspect the folder structure around a Bruno collection and return the sibling environments directory, available environment names, and variable names. Secret values are not returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionYesPath to a Bruno collection under a bruno/collections-style tree. The server will look for a sibling environments directory.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose a meaningful behavioral trait โ€” secret values are not returned โ€” which is useful data-safety context. However, it does not confirm the operation is read-only, mention side effects, error behavior, or traversal limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the return payload front-loaded before the secret-value caveat. Nothing that could be cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description correctly spells out the return shape (sibling directory, environment names, variable names) and the secret-value exclusion. It is nearly complete for a single-parameter read tool; only the read-only/no-side-effect confirmation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter with 100% schema description coverage, so the schema already documents the collection path and the sibling-environments lookup. The description restates the directory behavior but adds no format or syntax detail beyond the schema. Baseline 3 for full coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (inspect) and resource (folder structure around a Bruno collection) and enumerates the return payload: environments directory, environment names, variable names. Sibling differentiation is not explicit, but the resource is distinct from list-collections/run-collection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to reach for this tool versus siblings like list-collections or run-collection. The purpose implies a discovery step before a run, but nothing states it, and there are no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-collectionsList Bruno collectionsA

List Bruno collections below a root directory or configured roots. Use this when the user gives a partial collection name instead of a full path.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoOptional Bruno root directory. When omitted, the server uses roots from bruno-mcp.toml or ~/.config/bruno-mcp/config.toml.
queryNoOptional case-insensitive text used to filter collection names and paths.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. 'List' does imply a read-only, non-destructive operation, which is useful, but the description says nothing about recursion depth, result size, or behavior when the root is missing or invalid, and the root-resolution note duplicates the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the capability front-loaded and the usage trigger second; there is no filler. The second sentence is slightly elliptical ('instead of a full path' relative to what?), which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the agent gets no sense of the return shape (collection objects, paths, counts) or failure modes. For a zero-required-parameter list tool this is adequate but leaves real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with examples for both optional parameters, so the baseline is 3. The phrase 'below a root directory or configured roots' loosely mirrors the root parameter and 'partial collection name' gestures at query, but adds no syntax or matching rules beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List Bruno collections') plus scope ('below a root directory or configured roots'), which is clearly distinct from siblings like list-request-filters and discover-environments. It does not name any sibling explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit usage trigger: 'Use this when the user gives a partial collection name instead of a full path.' That tells the agent the discovery scenario this tool serves, but there are no when-not conditions and no named alternatives for the full-path case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-request-filtersList Bruno request filtersA

Inspect OpenCollection YAML requests and return enabled and disabled query params that can be used as filter scenarios. Secret values are not returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionYesPath to the Bruno collection directory or opencollection.yml file to inspect for query filters.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden but does disclose a meaningful behavioral trait: 'Secret values are not returned', which tells the agent about output sanitization. It does not state that this is a read-only inspection (only implied), nor mention error behavior for invalid/unreadable collection paths.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler; the core action and return payload are front-loaded, and the security caveat is a brief, worthwhile addition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only inspection tool with no output schema, the description covers what is inspected and what is returned (enabled/disabled params, secrets withheld). It would be marginally stronger if it clarified the read-only nature and behavior on a missing or malformed collection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single parameter, so the schema already documents the collection path argument fully, including examples and length constraints. The description adds no additional semantics about the path or parsing behavior, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description pairs a specific verb ('Inspect') with a precise resource ('OpenCollection YAML requests') and states exactly what is returned: enabled and disabled query params usable as filter scenarios. This distinguishes it from siblings like list-collections and run-filter-scenarios without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'can be used as filter scenarios' implies this tool feeds a downstream workflow (likely run-filter-scenarios), which hints at when to use it. However, there is no explicit when-to-use statement, no prerequisites, and no named alternative for cases where you want to list collections versus request filters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read-result-artifactRead Bruno result artifactA

Read a bounded, redacted summary from a raw Bruno JSON artifact path returned by run-collection or run-filter-scenarios. Use this when response data is too large to include directly in a tool result.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath returned by run-collection or run-filter-scenarios as artifact_path.
max_itemsNoMaximum response items to sample per request.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does disclose two meaningful traits: output is 'bounded' and 'redacted', which tells the agent results are truncated/sampled and sanitized. However, it omits error behavior for bad paths, permission needs, and what the summary actually contains beyond the redaction/bounding note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, and the purpose is front-loaded ahead of the usage condition. Nothing is redundant or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with no output schema or annotations, the description covers purpose, provenance of the path, and the sampling/redaction behavior, which is enough to invoke it correctly. It could say slightly more about the summary's contents or failure modes, but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both the 'path' and 'max_items' semantics (default 3, max 20) are already documented in the schema. The description only restates that the path comes from run-collection or run-filter-scenarios, adding minimal meaning over the schema. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and resource ('Bruno result artifact'), and scopes it precisely as a 'bounded, redacted summary' from a path produced by run-collection or run-filter-scenarios. This clearly separates it from the sibling run-* and list-* tools, which produce rather than consume artifacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition: 'Use this when response data is too large to include directly in a tool result.' It also identifies the upstream tools that supply the path. It stops short of stating when NOT to use it (e.g., prefer direct output when data is small), so it is clear context without full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run-collectionRun Bruno collectionA

Run a Bruno collection with the local bru CLI and return normalized JSON with success, request summary, per-request details, failures, and execution timings. Provide collection as the collection path; optionally pass environment and non-secret variables as KEY=value strings. For secrets, pass only names through inherited_variables; values are read from the MCP server process and injected via a temporary private --env-file, never via CLI arguments. Collection paths must stay inside the configured workspace roots.

ParametersJSON Schema
NameRequiredDescriptionDefault
variablesNoOptional Bruno environment variables passed as repeated `--env-var` values. Use KEY=value strings.
collectionYesPath to the Bruno collection directory, a .bru/.vru request file, or an opencollection.yml file. When opencollection.yml is provided, the server runs its parent collection directory.
environmentNoOptional Bruno environment name or environment file accepted by `bru run --env`.
inherited_variablesNoOptional names of environment variables to read from the MCP server process and inject into Bruno via a temporary private --env-file (values never appear in CLI arguments or logs). Use this for secrets so the LLM only provides variable names, never values.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the security mechanism (secrets read from the MCP server process, injected via a temporary private --env-file, never through CLI arguments) and the workspace-root path restriction. It does not state side effects of actually executing requests (real network calls to target systems, possible mutation, timeouts, or failure semantics), which is a notable gap for an execution tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and return shape, followed by parameter and safety guidance. Four dense sentences with little waste, though the phrasing is tightly packed and could be marginally trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param execution tool with no output schema or annotations, the description covers what the tool does, its return shape, secret handling, and path constraints. It omits runtime behavior such as failure/timeout handling and whether execution is destructive to the target system, which leaves a small but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the secret-handling protocol for `inherited_variables` and the workspace-root constraint on `collection`, which the schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run a Bruno collection with the local `bru` CLI') plus the return shape ('normalized JSON with success, request summary, per-request details, failures, and execution timings'). An agent can distinguish it from the sibling run-filter-scenarios / run-full-validation tools by the explicit reference to running a whole collection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional guidance: pass KEY=value variables normally, but for secrets pass only names via `inherited_variables`, and collection paths must stay inside configured workspace roots. It stops short of naming alternative tools (e.g. run-filter-scenarios) or stating when not to use this one, so it is context-rich but not a full routing guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run-filter-scenariosRun Bruno filter scenariosA

Run temporary Bruno request variants with selected disabled query params enabled, then validate HTTP status and response payload consistency. Each request is also run once without filters (baseline) to distinguish an ignored filter (response identical to baseline) from a filter that legitimately returns zero matches. Infrastructure failures (auth, routing, timeout, connectivity) are reported as inconclusive, never as filter defects. Source collection files are not modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
scenariosNoOptional explicit filter scenarios. When omitted, scenarios are generated from disabled query params.
variablesNoOptional non-secret KEY=value variables.
collectionYesPath to the Bruno collection directory or opencollection.yml file.
environmentNoOptional Bruno environment name.
max_scenariosNoMaximum number of generated scenarios when scenarios are omitted.
inherited_variablesNoOptional secret variable names to inherit from the MCP server process.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does well: it discloses that each request also runs a baseline, that infrastructure failures are reported as inconclusive rather than defects, and that source collection files are not modified. Missing details on auth requirements and whether requests hit live endpoints (side effects) keep it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the core action and followed by the baseline rationale, failure semantics, and the non-mutation guarantee. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description could say more about the shape of the returned results (per-scenario status, baseline comparison fields), but it covers the key behavioral and side-effect questions an agent needs before invoking a multi-request execution tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter; baseline is 3. The description adds conceptual context about disabled query params and baseline runs but no syntax or formatting detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run temporary Bruno request variants with selected disabled query params enabled') plus the validation goal, which cleanly separates it from siblings like run-collection and run-full-validation. An agent can tell this is the filter-scenario verifier without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description sets up the use case clearly: run filter variants to distinguish an ignored filter (identical to baseline) from one that legitimately returns zero matches. It does not explicitly say when NOT to use this or name run-collection/run-full-validation as alternatives, but the context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run-full-validationRun full Bruno validation (endpoints then filters)A

Two-phase validation. Phase 1 runs the collection once and checks every endpoint is reachable (HTTP status, no request errors). Phase 2 only runs if phase 1 passes: it tests every documented disabled query filter across every endpoint in temporary request copies, without modifying source files. Each scenario is compared against an unfiltered baseline to distinguish ignored filters from legitimate zero-match results, and infrastructure failures are marked inconclusive instead of failed. Returns a consolidated result stating which phase ran, per-endpoint baseline status, and per-endpoint per-filter pass/fail/skip with the reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
variablesNoOptional non-secret KEY=value variables.
collectionYesPath to the Bruno collection directory or opencollection.yml file.
environmentNoOptional Bruno environment name.
max_scenariosNoMaximum number of filter scenarios to run in phase 2, across all endpoints combined.
inherited_variablesNoOptional secret variable names to inherit from the MCP server process.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and discloses several important traits: Phase 2 is conditional on Phase 1 passing, filters are tested in temporary request copies without modifying source files, baseline comparisons distinguish ignored filters from zero-match results, and infrastructure failures are marked inconclusive. It stops short of covering authentication requirements, external side effects of running the collection, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four tightly written sentences with the core concept ('Two-phase validation') front-loaded. Every sentence contributes necessary detail about phases, behavior, and return values, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, five-parameter tool with no annotations and no output schema, the description provides substantial context: it explains both phases, the conditional execution, the temporary-copy approach, baseline comparison logic, inconclusive handling, and the shape of the consolidated result. It leaves some prerequisites and external side-effect details unspecified, but is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all five parameters in detail. The description adds no parameter-specific syntax, format, or constraint information beyond what the schema provides, which makes the baseline score of 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Two-phase validation' of a Bruno collection, with Phase 1 checking endpoint reachability and Phase 2 testing disabled query filters. It clearly distinguishes this tool's combined scope from siblings like run-collection or run-filter-scenarios, which cover only one phase each.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through its two-phase explanation and the condition that Phase 2 only runs if Phase 1 passes. However, it never explicitly says when to choose this tool over alternatives such as run-collection or run-filter-scenarios, nor does it state any exclusions or prerequisites. Guidance is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.1
    • First observeddiscover-environments
    • First observedlist-collections
    • First observedlist-request-filters
    • First observedread-result-artifact
    • First observedrun-collection
    • First observedrun-filter-scenarios
    • First observedrun-full-validation

TDQS

A3.9/5.0

Scored across 7 tools

Disambiguation4/5

Tools have distinct primary purposes (listing, running, discovering, reading, validating). However, run-filter-scenarios and run-full-validation overlap in testing disabled query filters, requiring careful reading to choose between targeted filter testing and comprehensive two-phase validation.

Naming Consistency5/5

All tool names follow a consistent lowercase hyphen-separated verb_noun pattern (list-, run-, discover-, read-), with no mixed casing or verb styles.

Tool Count5/5

Seven tools is well-scoped for a Bruno collection runner/validator; each tool covers a distinct stage (discovery, execution, filtering, validation, artifact reading) without bloat.

Completeness4/5

The surface covers discovery, execution, filter validation, and artifact reading, which are the core lifecycle for running and validating collections. Minor gaps exist (e.g., no dedicated single-request execution or collection editing), but agents can work around them via run-collection and filter scenarios.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    A Model Context Protocol (MCP) server that enables programmatic creation and management of Bruno API testing collections, environments, and requests through standardized MCP tools.
    1
    74 npm
    33
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that executes requests from Bruno API collections via the Bruno CLI tool, enabling API request execution and collection management.
    4
    MIT