Skip to main content
Glama
gpact
by gpact

Bruno MCP

Bruno MCP is a local Model Context Protocol server for discovering, inspecting, and executing Bruno API collections. It gives MCP clients a semantic interface to Bruno collections while delegating request execution, authentication, scripting, assertions, and environment resolution to the Bruno CLI.

The discovery and inspection tools do not modify collection files. Request execution is delegated to Bruno and can run collection scripts with side effects. The server communicates with an MCP host over standard input and standard output (stdio).

Unofficial project: Bruno MCP is an independent, unofficial MCP server. This project is not affiliated with, endorsed by, sponsored by, or otherwise associated with Bruno or its creators. Bruno and related names, logos, and marks are trademarks of their respective owners. References to Bruno are used solely to describe compatibility with the Bruno software.

Requirements

  • Node.js 22 or newer

  • npm

  • Bruno CLI >= 4.0.0 && < 5.0.0

Bruno MCP validates bru --version at startup. Stable Bruno CLI 4.x releases are supported; prerelease and other major versions are rejected.

Related MCP server: Bruno MCP Server

OpenCollection support

Bruno MCP supports Bruno v4 OpenCollection collections identified by an opencollection.yml file. It discovers requests and environments represented by OpenCollection YAML files.

Legacy .bru collections are not supported. Request discovery ignores .bru files rather than parsing or converting them.

Installation

Install Bruno MCP globally from npm:

npm install --global @gpact/bruno-mcp

Install a supported Bruno CLI separately if it is not already available:

npm install --global @usebruno/cli@^4.0.0

Confirm that both entry points resolve:

command -v bruno-mcp
bru --version

bruno-mcp has no command-line options, so invoking it starts the stdio server rather than printing help. MCP hosts normally start it for you.

To install from a repository checkout instead:

npm ci
npm run build
npm link

MCP host configuration

The MCP stdio transport defines how a host launches a server subprocess and exchanges messages over stdin and stdout. It does not define a universal host configuration file.

Configure your host to run the bruno-mcp entry point as a local stdio server and pass BRUNO_MCP_ROOT in the child process environment. Use an absolute root path because hosts do not all use the same working directory.

Hosts using mcpServers

Claude Desktop and Claude Code project configuration use an mcpServers object:

{
  "mcpServers": {
    "bruno": {
      "command": "bruno-mcp",
      "env": {
        "BRUNO_MCP_ROOT": "/home/user/bruno"
      }
    }
  }
}

See the official local server guide and Claude Code MCP documentation for configuration locations and scope options.

Visual Studio Code

VS Code uses a servers object in its mcp.json configuration:

{
  "servers": {
    "bruno": {
      "type": "stdio",
      "command": "bruno-mcp",
      "env": {
        "BRUNO_MCP_ROOT": "/home/user/bruno"
      }
    }
  }
}

See the VS Code MCP configuration reference for workspace and user configuration locations.

OpenCode

OpenCode uses a local MCP entry under mcp, represents the command as an array, and names the environment field environment:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bruno": {
      "type": "local",
      "command": ["bruno-mcp"],
      "environment": {
        "BRUNO_MCP_ROOT": "/home/user/bruno"
      }
    }
  }
}

See the OpenCode MCP server documentation for configuration precedence and additional local server options.

Other hosts may use another schema or a command-line setup flow. In every case, the required concepts are the same: a local stdio transport, the bruno-mcp command, and the environment variables described below. If a GUI host cannot find bruno-mcp or bru on its PATH, use the absolute path reported by command -v bruno-mcp for the server command and set BRUNO_MCP_BRU to an absolute Bruno CLI path.

You can also start the server directly. It will wait for MCP messages on stdin and write protocol messages to stdout:

BRUNO_MCP_ROOT=/home/user/bruno bruno-mcp

Configuration

Configuration is supplied through environment variables. Invalid configuration prevents the server from starting.

Variable

Default

Description

BRUNO_MCP_ROOT

Current working directory

Existing directory that contains the accessible collections. The path is resolved to its canonical location at startup, and collection access is confined to it.

BRUNO_MCP_BRU

bru

Bruno CLI executable name or path. The executable is invoked directly, never through a shell.

BRUNO_MCP_TIMEOUT_MS

120000

Per-run timeout in milliseconds. It must be a positive integer. Values above 900000 are capped at 900000 (15 minutes).

BRUNO_MCP_ALLOW_DEVELOPER_SANDBOX

false

Permits callers to request Bruno's developer sandbox when true. It does not enable developer mode by default.

BRUNO_MCP_ALLOW_INSECURE

false

Permits callers to disable normal TLS certificate verification for a run when true. It does not disable verification by default.

BRUNO_MCP_MAX_REPORT_BYTES

5242880

Maximum accepted Bruno JSON reporter size in UTF-8 bytes (5 MiB by default). It must be a positive integer.

BRUNO_MCP_LOG_LEVEL

info

Minimum stderr log level: error, warn, info, or debug.

Boolean settings accept true, 1, yes, or on, and false, 0, no, or off, without case sensitivity.

Example with explicit execution policies:

BRUNO_MCP_ROOT=/home/user/bruno \
BRUNO_MCP_BRU=/usr/local/bin/bru \
BRUNO_MCP_TIMEOUT_MS=180000 \
BRUNO_MCP_ALLOW_DEVELOPER_SANDBOX=false \
BRUNO_MCP_ALLOW_INSECURE=false \
BRUNO_MCP_MAX_REPORT_BYTES=5242880 \
BRUNO_MCP_LOG_LEVEL=info \
bruno-mcp

MCP tools

Collection identifiers are paths relative to BRUNO_MCP_ROOT. Request and environment paths are relative to their collection. Returned URLs and YAML variables are not interpolated.

bruno_list_collections

Lists Bruno OpenCollection collections available in the configured workspace. It takes no arguments and returns collection identifiers, names, and OpenCollection versions.

bruno_list_requests

Lists and searches requests in one Bruno OpenCollection collection. It returns request paths, names, types, and HTTP methods and URLs when available.

Required input:

  • collection: collection identifier

Optional filters:

  • query: case-insensitive substring matched against name, path, and URL

  • method: case-insensitive exact HTTP method

  • type: case-insensitive exact request type

bruno_search_requests

Searches requests across all collections in one call. Each result includes its collection identifier.

Required input:

  • query: non-empty, case-insensitive substring matched against name, path, and URL

Optional method and type filters use case-insensitive exact matching.

bruno_get_request

Reads a Bruno OpenCollection request and returns normalized metadata plus its parsed YAML document. Every result includes a stable 22-character revision derived from the exact source. Pass that value to bruno_update_request to prevent stale writes.

Required inputs:

  • collection: collection identifier

  • request: request path relative to the collection

Set responseMode to revision to return only collection, path, and revision. This compact mode is intended for update preflight calls that do not need to inspect the request. It defaults to full, which returns normalized metadata and the parsed document. In full mode, set includeSource to true to also return the raw YAML source. includeSource cannot be combined with revision mode.

The parsed document and source are returned without secret redaction, so use request paths produced by the listing or search tools and do not embed credentials directly in request YAML.

bruno_create_request

Creates a new Bruno v4 OpenCollection HTTP request from structured fields. The tool creates missing parent directories, but never overwrites an existing file. The request is available to the listing, search, inspection, and execution tools immediately after creation.

Required inputs:

  • collection: collection identifier

  • request: normalized path relative to the collection, including .yml

  • name: request display name

  • method: HTTP method

  • url: request URL, with Bruno variables stored verbatim

Optional inputs cover the full Bruno v4 HTTP request representation:

  • Request metadata: sequence, tags, and description

  • HTTP details: headers, query or path params, body, and auth

  • Execution behavior: runtime variables, scripts, assertions, and actions

  • Additional data: settings, examples, docs, and app

Supported bodies include raw JSON, text, XML, and SPARQL content, URL-encoded forms, multipart forms, and files. A request may provide one body or named body variants. Authentication supports Bruno's OpenCollection auth types and Bruno's Akamai EdgeGrid extension. The advertised MCP input schema describes each nested field and validates incompatible variants. Request YAML is serialized and written directly; Bruno CLI is not used for file creation.

The path must not target collection metadata, the root environments directory, or a nested collection. Absolute paths, non-normalized paths, unsupported file extensions, traversal outside the collection, and symlink escapes are rejected.

bruno_update_request

Patches an existing Bruno v4 OpenCollection HTTP request in place. The tool only accepts valid HTTP request targets and applies the same path and collection eligibility policies as bruno_create_request. Renaming and moving files are not supported.

Required inputs:

  • collection: collection identifier

  • request: normalized request path relative to the collection, including .yml

  • expectedRevision: revision returned by bruno_get_request, or * to patch the latest version without a preliminary read

Every structured field accepted by bruno_create_request can be supplied as a patch. Omitted top-level fields remain unchanged. runtime, settings, and app are nested patches: omitted children remain unchanged, a child set to null is removed, and supplied child arrays replace their whole arrays. Setting one of these three top-level fields to null removes the whole block. An empty nested patch is a no-op, while removing its final child leaves an explicit empty mapping.

All other supplied fields replace their whole value. This includes auth, body, structured descriptions, tags, headers, params, and examples. Individual array-entry operations are not supported. name, method, and url accept only concrete non-blank replacements; null removes any other optional top-level field. A field cannot be removed when doing so would leave an alias without its YAML anchor; that patch is rejected as an invalid mutation target.

Updates preserve untouched YAML fields, comments, ordering, scalar styles, line endings, and final-newline state where supported by the YAML document model. Unknown and unrelated legacy fields are not revalidated or removed. A semantic no-op returns changed: false without rewriting the file. A changed request is staged beside the original and atomically replaced while preserving its file mode. If the source no longer matches expectedRevision, the tool returns a REVISION_CONFLICT error without applying the patch. Concurrent updates from Bruno MCP server instances are serialized per request; a currently locked request returns MUTATION_CONFLICT. Locks are short-lived leases. Locks abandoned by a terminated process are recovered after a grace period, and all locks expire after 24 hours to avoid permanently blocking a request.

When expectedRevision is *, the server captures the revision after acquiring the request lock and applies the same commit-time checks used for explicit revisions. This saves the preflight call and remains guarded against concurrent Bruno MCP updates. Use an explicit revision when the patch was chosen based on previously inspected request content. As with explicit revisions, a non-cooperating process that writes in the final interval between the portable filesystem check and replacement is outside this coordination guarantee.

bruno_list_environments

Lists environments available to a collection without exposing variable values. Each result includes the environment name, relative path, variable count, and secret count.

Required input:

  • collection: collection identifier

bruno_get_environment

Inspects a Bruno environment. Variables marked secret: true are returned with the value [REDACTED]; non-secret values are returned in normalized string form.

Required inputs:

  • collection: collection identifier

  • environment: bare name such as Local or a collection-relative path such as environments/Local.yml

bruno_create_environment

Creates a new Bruno environment file within the collection's environments directory. The tool creates missing environments directories, but never overwrites an existing file.

Required inputs:

  • collection: collection identifier

  • name: environment name or collection-relative path, such as Local or environments/Local.yml

Optional input:

  • variables: array of environment variables to initialize

Variables support plain string values, OpenCollection typed values (string, number, boolean, object), optional descriptions, and disabled status. Selectable variant lists and the null type are rejected because Bruno v4 does not resolve them to their intended values. Marking a variable with secret: true defines an externally supplied secret. Pass [REDACTED] or omit value to store its definition without a plaintext value. Plaintext secret input is rejected because Bruno v4 does not load secret values from environment YAML. Supply secret values through Bruno's secret storage or runtime overrides when running Bruno directly.

bruno_update_environment

Replaces the variable definitions of an existing Bruno environment in place. The update preserves untouched YAML fields (such as environment color), comments, ordering, flow styles, YAML anchors on the variables sequence, line endings, UTF-8 BOM, and file permissions.

Required inputs:

  • collection: collection identifier

  • name: environment reference, either a bare name (Local) or a collection-relative path (environments/Local.yml)

  • variables: full replacement array of environment variables

Variables have the same restrictions as bruno_create_environment: selectable variant lists, the null type, and plaintext secret input are rejected.

Every existing secret must remain in the replacement array under its exact name with secret: true. Renaming, omitting, or converting an existing secret to a non-secret is rejected before the file is changed. Use Bruno's application to rename or remove secrets so its stored values stay associated with their definitions. Secret metadata changes and new secret definitions are allowed.

Secret definitions are always written without a value field. Omit value or pass [REDACTED]; updates remove any previous plaintext secret values from the replaced variables block. Bruno manages secret values separately in its application store. These tools do not read, write, or migrate that store.

bruno_run

Executes requests, folders, or an entire collection using Bruno CLI v4. It returns normalized execution, request, response, test, and assertion results. Bruno test or assertion failures remain inspectable results rather than MCP transport errors.

Inputs:

Field

Default

Description

collection

Required

Collection identifier.

targets

[]

Request or folder paths. An empty array runs the entire collection.

environment

None

Bruno environment name.

variables

None

Non-secret string overrides passed as Bruno environment variables.

bail

false

Stops after the first failing request, test, or assertion.

testsOnly

false

Runs only requests that contain tests or active assertions.

delayMs

None

Non-negative delay between requests in milliseconds.

sandbox

safe

Bruno sandbox mode: safe or developer.

insecure

false

Requests disabled TLS certificate verification.

responseBodyMode

onFailure

Returned response bodies: none, onFailure, or full.

maxResponseBodyBytes

262144

Maximum UTF-8 or serialized size of each included response body. Oversized bodies are replaced by size metadata.

Secret handling

Do not pass credentials or other secrets through variables, request creation or update fields such as auth or headers, or other MCP arguments. MCP tool arguments may be visible to the model and host. Created and updated request fields are also persisted to YAML, and variable overrides are passed to the Bruno process as arguments. Provide secrets through Bruno's normal environment or process environment mechanisms instead.

Environment inspection honors secret: true, but this marker is not a general file-access boundary. bruno_get_request returns files without redaction and currently accepts any existing file inside a collection, not only paths found by request discovery. An authorized caller that supplies an environment file path could therefore receive its raw contents. Restrict MCP access to trusted hosts and users, scope BRUNO_MCP_ROOT narrowly, and avoid plaintext production secrets anywhere an MCP caller can read them.

Sandbox and TLS policies

bruno_run uses Bruno's safe sandbox by default.

Developer sandbox execution requires both of these explicit choices:

  1. The server operator sets BRUNO_MCP_ALLOW_DEVELOPER_SANDBOX=true.

  2. The tool caller sets sandbox to developer for the run.

Without server permission, a developer-mode request fails with DEVELOPER_SANDBOX_DISABLED. Developer mode gives Bruno scripts greater capabilities, so enable it only for trusted collections.

Path containment controls paths supplied to Bruno MCP; it does not sandbox code inside Bruno scripts. Bruno scripts can update collection or environment state, and developer-mode scripts can use native Node.js capabilities to access paths outside BRUNO_MCP_ROOT or start other processes.

Normal TLS certificate verification is enabled by default. Disabling it also requires both server permission (BRUNO_MCP_ALLOW_INSECURE=true) and insecure: true on an individual run. Otherwise the request fails with INSECURE_DISABLED. Insecure mode weakens transport security and should be limited to controlled development environments.

Security model

  • Root containment: Collection, request, environment, and execution paths supplied to Bruno MCP are checked against canonical filesystem boundaries. Traversal and symlink escapes outside BRUNO_MCP_ROOT or a selected collection are rejected. This does not restrict developer-mode script code.

  • No shell execution: Bruno MCP passes a fixed operation and separate arguments directly to the configured Bruno executable with shell execution disabled. It does not expose a generic shell or Bruno CLI command tool, but developer-mode Bruno scripts can start processes themselves.

  • Controlled mutation: Discovery and inspection are read-only. bruno_create_request and bruno_create_environment use exclusive writes and never replace existing files. bruno_update_request accepts either the revision returned by inspection or an explicit * latest-version guard, rejects non-HTTP targets, and atomically replaces changed files. bruno_update_environment replaces variable definitions in place while preserving existing secrets. bruno_run delegates to Bruno CLI and can execute scripts with side effects, including persisted variable changes.

  • Targeted redaction: Environment values explicitly marked secret: true are redacted by environment inspection. Execution reports recursively redact common sensitive headers including authorization, cookies, and API key headers. Raw file and request reads are not redacted.

  • Protocol-only stdout: stdout is reserved for MCP protocol traffic. Logs and startup diagnostics are written to stderr.

  • Bounded reports: Oversized Bruno reports are rejected, and included response bodies have a separate per-body limit.

Redaction is defense in depth, not general secret detection. Raw files, request YAML, request source, URLs, response bodies, and Bruno diagnostics can contain values that are not recognized as secrets. Configure BRUNO_MCP_ROOT as narrowly as practical, avoid embedding credentials in collection files, and use trusted collections and MCP callers when enabling request execution.

Development

Install the locked dependencies:

npm ci

Useful commands:

Command

Purpose

npm run dev

Run the TypeScript entry point in development.

npm run build

Compile the server to dist/.

npm start

Run the compiled stdio server.

npm run check

Run all checks required by CI.

npm run lint

Lint source, tests, and tooling.

npm run typecheck

Type-check source, tests, and tooling without emitting files.

npm test

Run the unit test suite once.

npm run test:watch

Run unit tests in watch mode.

npm run test:integration

Run the integration test suite.

npm run fixtures:capture-reports

Regenerate Bruno reporter fixtures when intentionally updating them.

Before submitting a change, run:

npm run check

Known limitations

  • Only Bruno OpenCollection YAML is supported; legacy .bru collections are ignored.

  • Request and environment creation and in-place updates are the only direct MCP mutations. Collection, explicit folder, and workspace mutation are not supported, and no rename, move, or delete tools are provided. Executed Bruno scripts can still have side effects.

  • Some valid OpenCollection fields are not executed by Bruno CLI 4.0.0. Creation preserves those fields in YAML, but subsequent bruno_run behavior remains limited by the configured Bruno CLI version.

  • OpenAPI import and export are not supported.

  • The server does not expose arbitrary Bruno CLI commands or shell execution.

  • Only local stdio MCP transport is supported. Remote and HTTP MCP transports are not included.

  • Automatic secret-manager integration is not included.

  • Bruno MCP does not implement its own HTTP client, variable interpolation, authentication, OAuth, scripts, request chaining, assertions, proxy behavior, redirects, or certificate behavior. Those behaviors are owned by Bruno CLI.

Available Tools

11 tools
bruno_create_environmentCreate Bruno environmentA

Create a new Bruno environment file. Secret values must be omitted or [REDACTED].

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesEnvironment name or path (e.g. Local or environments/Local.yml).
variablesNoInitial list of environment variables.
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).

TDQS

A3.9/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 behavioral disclosure burden. It does add a meaningful constraint: 'Secret values must be omitted or [REDACTED].' However, it does not disclose behavior around overwriting existing files, permission requirements, or what happens after creation. This is a mutation tool, so more detail would be valuable.

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 short sentences: one states the primary action, the other communicates the one critical rule. There is no filler or repetition of schema details. The structure is appropriately concise and front-loaded.

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?

The schema covers all parameters and the description highlights the key secret-handling rule, so an agent can likely call the tool correctly. However, there is no output schema and the description does not mention what the tool returns, whether it will overwrite an existing environment at the same path, or any side effects. For a file-creating mutation tool, these are notable 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%, so the schema fully documents all three parameters. The description adds the security rule about secrets, but this mostly restates what the schema already specifies via the '[REDACTED]' const and corresponding descriptions. Thus the description provides minimal added value 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?

The description clearly states the action: 'Create a new Bruno environment file.' This is specific and unambiguous, naming both the verb and the resource. It distinguishes this tool from siblings like bruno_update_environment and bruno_get_environment simply by emphasizing 'new'.

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 establishes when to use the tool: when creating a new environment, not updating or listing existing ones. It does not explicitly name alternatives, but the 'new' qualifier makes the intended use clear enough. It stops short of explaining what not to use it for, so it lacks explicit exclusion guidance.

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

bruno_create_requestCreate Bruno requestA

Create a Bruno HTTP request YAML file. Missing parent folders are created and existing files are not overwritten.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoApp extension settings.
urlYesRequest URL, optionally with Bruno {{variables}}.
authNoAuthentication config object (e.g. { type: 'bearer', token: '...' }) or 'inherit'. Use Bruno variables for secrets.
bodyNoRequest body: { type, data } object or list of variants.
docsNoDocumentation text.
nameYesRequest display name.
tagsNoRequest tags.
methodYesHTTP method, for example GET or POST.
paramsNoQuery and path parameters.
headersNoRequest headers.
requestYesNew request path relative to collection root, including .yml extension (e.g. Users/Create.yml).
runtimeNo
examplesNoRequest and response examples.
sequenceNoExecution sequence order.
settingsNo
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).
descriptionNoRequest description.

TDQS

A3.9/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 behavioral burden. It does disclose two non-obvious file behaviors: missing parent folders are auto-created and existing files are not overwritten. But it omits what happens when a file already exists (error vs no-op), what the successful response contains, and any other side effects beyond file creation.

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 one front-loaded sentence that conveys the essential action plus two important edge-case behaviors with no filler. Every clause earns its place.

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?

For a 17-parameter mutation tool with no output schema and no annotations, the description is not fully complete: it lacks success/error signaling, what happens on an existing-file conflict, and explicit routing to bruno_update_request. The schema compensates for parameter details, and the description covers the most important file-system behaviors, so it is adequate but has clear gaps.

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 high at 88%, so the schema already documents most parameters and the baseline is 3. The description adds extra meaning by clarifying request-path behavior: nested parent folders are automatically created and an existing target file is not overwritten, which is not stated in the schema's parameter descriptions.

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 names a concrete action ('Create') and a concrete resource ('Bruno HTTP request YAML file'), so an agent immediately knows what the tool does. The phrase 'existing files are not overwritten' also distinguishes it from bruno_update_request, which is the main sibling it could be confused with.

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 'create' verb and the warning that existing files are not overwritten imply this tool is for new request files, giving some usage context. However, it never explicitly says to use bruno_update_request when the target already exists, nor does it state any other when-to-use/when-not-to-use guidance relative to sibling tools.

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

bruno_get_environmentGet Bruno environmentB

Inspect a Bruno environment. Variables marked as secrets are always redacted.

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).
environmentYesEnvironment name or path (e.g. Local or environments/Local.yml).

TDQS

B3.4/5.0
Behavior3/5

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

The description discloses one important behavior: secret variables are always redacted in the output. However, it does not explicitly state that the operation is read-only, nor does it mention potential errors or permission requirements. Since no annotations are provided, the description carries the burden of behavior disclosure, but it only partially fulfills this.

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 a single sentence that leads with the core purpose and then adds a crucial detail about secret redaction. It is concise, free of filler, and well-structured; every word contributes to the tool's understanding.

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 simple get operation with two well-documented parameters, the description provides sufficient context: it names the action, the resource, and a key output behavior (redaction). It does not explicitly state the return format, but 'inspect' implies retrieving the environment's details, and the absence of an output schema makes this a minor gap.

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?

The input schema provides full descriptions for both parameters (collection and environment), so the baseline is 3. The description adds no additional parameter-level semantics beyond what the schema already states, making this a neutral score.

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?

The description clearly states the action ('Inspect') and the resource ('a Bruno environment'), which distinguishes it from create/update/delete operations. It does not explicitly contrast with bruno_list_environments, but 'inspect' implies fetching details of a specific environment, making the purpose reasonably clear.

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?

The description does not provide explicit guidance on when to use this tool versus alternatives. It does not mention that this is for retrieving a single environment's details as opposed to listing environments or running requests, leaving the selection decision to the agent's interpretation.

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

bruno_get_requestGet Bruno requestB

Read a Bruno request. Use responseMode=revision for revision check, or full for parsed content.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesRequest path relative to collection root (e.g. Users/Create.yml).
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).
responseModeNoDetail level: "full" for document and metadata, or "revision" for revision check only.
includeSourceNoInclude raw YAML source in full mode.

TDQS

B3.3/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 convey that the operation is a read and that 'full' returns parsed content while 'revision' performs a revision check, which gives some behavioral insight. However, it does not describe the exact response shape, error behavior, or explicitly confirm that no side effects occur.

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 two short sentences with the core operation front-loaded and mode guidance immediately following. Every phrase earns its place, and there is no redundancy or filler.

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?

The schema covers parameter semantics well, but with no annotations and no output schema, the description should more clearly explain return behavior and how this tool relates to sibling tools. It sketches the difference between revision and full modes but leaves the exact response and tool-selection context to inference. This is adequate but has clear 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?

All four parameters already have descriptive comments in the input schema, so the baseline is 3. The description's mode sentence mostly restates the responseMode schema, though 'parsed content' adds a small nuance. It adds no meaningful detail for collection, request, or includeSource 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?

The description clearly states the operation: 'Read a Bruno request.' The mention of responseMode further clarifies that the tool supports both full content retrieval and revision checks, which is specific and useful. It is distinguishable from create/update/run siblings, though it does not explicitly contrast with list/search tools.

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?

The description provides guidance for choosing between responseMode values, but it says nothing about when to use this tool instead of bruno_list_requests, bruno_search_requests, or bruno_run. No alternatives or exclusion conditions are mentioned, so an agent must infer the tool's appropriate context from its name alone.

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

bruno_list_collectionsList Bruno collectionsB

List Bruno collections available in the workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior2/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 disclosure burden. It only restates the listing action and does not mention read-only behavior, return format, ordering, pagination, or potential side effects.

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?

A single, front-loaded sentence that states the essential purpose with no filler or repetition. It is appropriately sized for such a simple tool.

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 zero-parameter listing tool, the description is functionally sufficient: the agent knows what the tool does and that it operates on workspace collections. The only minor gap is the lack of explicit return-shape details, but no output schema exists and the tool is simple enough to infer a list of collections.

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?

The tool has zero parameters, so there is no parameter semantics burden. The description does not need to explain inputs, and the empty input schema is trivially complete.

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?

The description states a specific action ('List') and resource ('Bruno collections') with a clear workspace scope. It is unambiguous, though it does not explicitly contrast with sibling listing tools such as bruno_list_requests or bruno_list_environments.

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?

There is no guidance about when to use this tool versus alternatives. The agent must infer from the resource name that this is for collections, with no explicit exclusions or context for choosing among the sibling list tools.

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

bruno_list_environmentsList Bruno environmentsA

List environments available to a Bruno collection without exposing variable values.

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure. It explicitly promises that variable values are not exposed, which is a meaningful safety/security behavior. It does not describe error handling or return format, but for a simple listing operation this is a solid level of transparency.

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 a single sentence with no filler. It front-loads the core purpose ('List environments...') and immediately adds the key differentiator ('without exposing variable values'). Every word earns its place.

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 low-complexity tool with one required parameter and no output schema, the description is largely sufficient. It covers purpose, scope, and the security-relevant behavior. It could be more complete by stating the return shape more explicitly, but the core selection and invocation needs are met.

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?

The schema has 100% coverage with a clear parameter description: 'Collection path relative to workspace root (as returned by bruno_list_collections).' The tool description adds no parameter details itself, but the schema already provides sufficient meaning, 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 states a specific verb and resource ('List environments') and adds the scope 'available to a Bruno collection'. It also includes a distinctive qualifier, 'without exposing variable values', which differentiates it from a tool like bruno_get_environment that would return variable values.

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 clearly scopes the tool to listing environments for a collection and points to bruno_list_collections as the source of the collection path. It does not explicitly name alternatives or say when not to use it, but the 'without exposing variable values' phrasing gives helpful context for choosing between this and a more detailed environment tool.

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

bruno_list_requestsList Bruno requestsB

List and search requests in a Bruno collection. Returns request paths, names, types, and HTTP metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by request type (e.g. http or graphql).
queryNoCase-insensitive substring filter for request name, path, and URL.
methodNoFilter by HTTP method (e.g. GET or POST).
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the burden of explaining behavior. It does disclose that the tool returns request paths, names, types, and HTTP metadata, but it does not mention error behavior, pagination, or whether the operation is strictly read-only. The read-only nature is implied by 'list and search' but not explicit.

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 compact and front-loaded: it states the core action and return contents in two short sentences with no filler. Every phrase contributes meaningful information.

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?

The description covers the main inputs and return fields, but with no output schema and no annotations, it is only minimally complete. The lack of any distinction from bruno_search_requests is a notable gap for an agent deciding which tool to invoke.

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?

Input schema coverage is 100%, so all parameters already have descriptions. The tool description adds no extra parameter-level semantics beyond confirming the collection context, which the schema already provides. A baseline score of 3 is appropriate.

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?

The description clearly states the operation: listing and searching requests in a Bruno collection, and it lists what is returned. However, it does not differentiate itself from the sibling tool bruno_search_requests, whose name suggests overlapping search functionality.

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 is given about when to use this tool instead of bruno_search_requests or bruno_get_request. The description implies it is for exploring requests but never states exclusions or alternative selection criteria, leaving the agent to guess.

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

bruno_runRun Bruno requestsA

Execute requests, folders, or an entire Bruno collection using Bruno CLI v4. Returns structured execution results. Do not pass credentials or other secrets through variables. MCP tool arguments may be visible to the model and host.

ParametersJSON Schema
NameRequiredDescriptionDefault
bailNoStop after the first failing request, test, or assertion.
delayMsNoDelay between requests in milliseconds.
sandboxNoJavaScript sandbox mode (safe or developer).safe
targetsNoRequest files or folders relative to collection root, or empty array for entire collection.
insecureNoDisable normal TLS certificate verification.
testsOnlyNoOnly run requests containing tests or active assertions.
variablesNoNon-secret environment variable overrides.
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).
environmentNoBruno environment name to use for this run.
responseBodyModeNoWhen to return response bodies: none, onFailure, or full.onFailure
maxResponseBodyBytesNoMaximum bytes for each returned response body.

TDQS

A3.6/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 behavioral disclosure burden. It does provide useful warnings about not passing secrets and MCP argument visibility, and it mentions structured results. However, it does not disclose that executing requests may perform live network calls, cause side effects, or take a long time, which are significant behavioral traits 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.

Conciseness5/5

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

The description is three concise sentences that front-load the core action, then state the return type, then add a critical security warning. There is no filler or redundant wording, and every sentence earns its place.

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

Completeness2/5

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

Despite having 11 parameters and no output schema or annotations, the description stays very brief. It does not explain the structure of the execution results, warn about side effects, or provide guidance on selecting targets or interpreting failures. For such a complex, potentially side-effectful tool, the description is insufficiently complete on its own.

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 parameters are already well-documented in the schema. The description adds a security warning about variables, reinforcing but not extending the schema's note that variables are non-secret overrides. It provides no additional semantic value for the other ten parameters, so the baseline score of 3 is 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 uses the specific verb 'Execute' and clearly identifies the resource: 'requests, folders, or an entire Bruno collection' via 'Bruno CLI v4'. It also states the result type ('structured execution results'), making the tool's purpose unambiguous and easily distinguishable from the listing/getting/creating siblings.

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 this tool is for running Bruno requests rather than managing them, but it does not explicitly state when to choose it over alternatives or when not to use it. There is no mention of sibling tools like bruno_list_collections or bruno_get_request, leaving usage context to inference. It is adequate but not explicit.

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

bruno_search_requestsSearch Bruno requestsB

Search requests across all collections in the workspace. Returns matching requests with collection id.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by request type (e.g. http or graphql).
queryYesCase-insensitive substring filter for request name, path, and URL.
methodNoFilter by HTTP method (e.g. GET or POST).

TDQS

B3.4/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 of disclosing side effects and behavior. It mentions it returns matching requests, implying a read-only operation, but does not explicitly state that it does not modify data or that it is safe to call. The transparency is moderate but not thorough.

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 two sentences, direct, and free of unnecessary detail. It efficiently conveys the tool's purpose and a key aspect of the output, with no fluff or redundancy.

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?

The description provides the essential information needed to invoke the tool: that it searches across all collections and returns matching requests with collection id. Even though there is no output schema, the mention of the return content satisfies basic completeness. It lacks details on pagination or filtering specifics, but these are minor for a search 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?

The schema already provides descriptions for all three parameters: query, type, and method. The tool description does not add any extra context about how these parameters interact or affect the search, so the value added beyond the schema is minimal. Baseline 3 is appropriate.

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?

The description clearly states the tool searches for requests across all collections, using the specific verb 'search' and resource 'requests'. It also mentions it returns matching requests with collection id, which distinguishes it from simply listing requests. However, it does not explicitly contrast with the sibling tool bruno_list_requests, so it stops short of a perfect 5.

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?

The description says what the tool does but does not explicitly state when to use it over alternatives (e.g., bruno_list_requests or bruno_get_request). There is no guidance about using search when a filter is needed versus listing when a full enumeration is required, leaving the agent to infer usage.

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

bruno_update_environmentUpdate Bruno environmentB

Update an existing Bruno environment file. Existing secrets must be preserved with secret: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesEnvironment name or path (e.g. Local or environments/Local.yml).
variablesYesReplacement list of variables. Existing secrets must keep secret: true.
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description must carry the full behavioral disclosure burden. It does disclose one important constraint (preserving secrets with secret: true), but it omits that variables form a replacement list, whether unspecified variables are removed, and what the operation returns. This is a significant gap for a mutating tool.

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 short sentences with no redundancy. The primary purpose is stated first, and the critical secret-preservation constraint is added immediately without unnecessary detail.

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

Completeness2/5

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

For a mutating tool with no annotations and no output schema, the description is too thin. It does not explain the replacement semantics, the effect on omitted variables, or the expected return value. The secret warning is helpful but leaves important operational context uncovered.

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 all parameters. The description's secret-preservation note adds emphasis but largely duplicates the schema's 'Existing secrets must keep secret: true.' Baseline 3 is appropriate.

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?

The description clearly states the action ('Update') and the resource ('an existing Bruno environment file'), which distinguishes it from environment creation tools. It does not explicitly name sibling alternatives, so it stops short of full differentiation.

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?

'Existing' implies this tool is for modifying an already-created environment rather than creating one, providing weak usage context. However, it does not explicitly state when to use this tool over bruno_create_environment, bruno_get_environment, or other siblings.

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

bruno_update_requestUpdate Bruno requestA

Patch an existing Bruno HTTP request while preserving untouched content. Use expectedRevision="*" to patch latest version without preflight.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNo
urlNoRequest URL, optionally with Bruno {{variables}}.
authNo
bodyNo
docsNo
nameNoRequest display name.
tagsNo
methodNoHTTP method, for example GET or POST.
paramsNo
headersNo
requestYesExisting HTTP request path relative to collection root, including .yml extension.
runtimeNo
examplesNo
sequenceNo
settingsNo
collectionYesCollection path relative to workspace root (as returned by bruno_list_collections).
descriptionNoRequest description.
expectedRevisionYesRevision returned by bruno_get_request, or "*" to patch latest version without preflight.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It does reveal the partial-update nature and the preflight bypass behavior. However, it does not state side effects like persistence, what happens on a revision mismatch, or what the response contains, so it is adequate but not comprehensive.

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 no filler: the core patch behavior is front-loaded, and the operational revision tip follows immediately. The description avoids repeating parameter-level schema details.

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 an 18-parameter mutation tool with no annotations and no output schema, the description plus the rich schema provides enough to select and invoke the tool correctly: patch an existing request, preserve untouched content, and optionally bypass preflight. Missing details like return shape and conflict behavior are minor but would make it more complete.

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?

The schema already documents most parameter meanings in detail. The description adds the cross-cutting patch semantics that omitted content is preserved, which is essential for constructing correct patches. The expectedRevision wildcard tip mostly reinforces existing schema text, so this is above baseline but not exceptional.

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?

Uses a specific verb ('Patch'), a clear resource ('existing Bruno HTTP request'), and the critical scope 'preserving untouched content'. This unmistakably distinguishes it from bruno_create_request and from read/run siblings without needing 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 Guidelines3/5

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

The usage is implied: this is for modifying an existing request, not creating one. However, it never explicitly names alternatives such as bruno_create_request or advises calling bruno_get_request first to fetch a revision. The expectedRevision='*' tip is a useful operational detail but not a full when-to-use vs. when-not-to-use guideline.

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. 10 tool updatesv0.2.0
    • Addedbruno_create_environment
    • Addedbruno_create_request
    • Changedbruno_get_environment2 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection identifier: the collection's path relative to the workspace root (as returned by bruno_list_collections), not its display name. It may be nested, for example collections/hotel."New value: +"Collection path relative to workspace root (as returned by bruno_list_collections)."
      • changedInput schema / properties / environment / description
        Previous value: -"Environment reference, either a bare name (Local) or a collection-relative path (environments/Local.yml)."New value: +"Environment name or path (e.g. Local or environments/Local.yml)."
    • Changedbruno_get_request4 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection identifier: the collection's path relative to the workspace root (as returned by bruno_list_collections), not its display name. It may be nested, for example collections/hotel."New value: +"Collection path relative to workspace root (as returned by bruno_list_collections)."
      • changedInput schema / properties / includeSource / description
        Previous value: -"When true, also return the raw request source text alongside the parsed document. Defaults to false."New value: +"Include raw YAML source in full mode."
      • changedInput schema / properties / request / description
        Previous value: -"Request path relative to the collection root (as returned by bruno_list_requests), for example Hotel/Search.yml."New value: +"Request path relative to collection root (e.g. Users/Create.yml)."
      • addedInput schema / properties / responseMode
        Added value: +{
        +  "description": "Detail level: \"full\" for document and metadata, or \"revision\" for revision check only.",
        +  "enum": [
        +    "full",
        +    "revision"
        +  ],
        +  "type": "string"
        +}
    • Changedbruno_list_environments1 field changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection identifier: the collection's path relative to the workspace root (as returned by bruno_list_collections), not its display name. It may be nested, for example collections/hotel."New value: +"Collection path relative to workspace root (as returned by bruno_list_collections)."
    • Changedbruno_list_requests4 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection identifier: the collection's path relative to the workspace root (as returned by bruno_list_collections), not its display name. It may be nested, for example collections/hotel."New value: +"Collection path relative to workspace root (as returned by bruno_list_collections)."
      • changedInput schema / properties / method / description
        Previous value: -"Filter to requests with this HTTP method (case-insensitive), for example GET or POST."New value: +"Filter by HTTP method (e.g. GET or POST)."
      • changedInput schema / properties / query / description
        Previous value: -"Case-insensitive substring filter matched against each request's name, path, and URL."New value: +"Case-insensitive substring filter for request name, path, and URL."
      • changedInput schema / properties / type / description
        Previous value: -"Filter to requests of this type (case-insensitive), for example http or graphql."New value: +"Filter by request type (e.g. http or graphql)."
    • Changedbruno_run7 fields changed
      • changedInput schema / properties / collection / description
        Previous value: -"Collection identifier: the collection's path relative to the workspace root (as returned by bruno_list_collections), not its display name."New value: +"Collection path relative to workspace root (as returned by bruno_list_collections)."
      • changedInput schema / properties / insecure / description
        Previous value: -"Disable normal TLS certificate verification. Must be enabled by server policy."New value: +"Disable normal TLS certificate verification."
      • changedInput schema / properties / maxResponseBodyBytes / description
        Previous value: -"Maximum serialized UTF-8 size of each returned response body. Oversized bodies are replaced by size metadata."New value: +"Maximum bytes for each returned response body."
      • changedInput schema / properties / responseBodyMode / description
        Previous value: -"Response bodies to return in the MCP payload: none, only results with failed tests or assertions, or all results."New value: +"When to return response bodies: none, onFailure, or full."
      • changedInput schema / properties / sandbox / description
        Previous value: -"JavaScript sandbox mode. Developer mode must be enabled by server policy."New value: +"JavaScript sandbox mode (safe or developer)."
      • changedInput schema / properties / targets / description
        Previous value: -"Request files or folders relative to the collection root. An empty list runs the entire collection."New value: +"Request files or folders relative to collection root, or empty array for entire collection."
      • changedInput schema / properties / variables / description
        Previous value: -"Non-secret environment variable overrides. Do not include credentials or other secrets."New value: +"Non-secret environment variable overrides."
    • Changedbruno_search_requests3 fields changed
      • changedInput schema / properties / method / description
        Previous value: -"Filter to requests with this HTTP method (case-insensitive), for example GET or POST."New value: +"Filter by HTTP method (e.g. GET or POST)."
      • changedInput schema / properties / query / description
        Previous value: -"Required case-insensitive substring matched against each request's name, path, and URL."New value: +"Case-insensitive substring filter for request name, path, and URL."
      • changedInput schema / properties / type / description
        Previous value: -"Filter to requests of this type (case-insensitive), for example http or graphql."New value: +"Filter by request type (e.g. http or graphql)."
    • Addedbruno_update_environment
    • Addedbruno_update_request
  2. 7 tool updatesv0.1.0
    • First observedbruno_get_environment
    • First observedbruno_get_request
    • First observedbruno_list_collections
    • First observedbruno_list_environments
    • First observedbruno_list_requests
    • First observedbruno_run
    • First observedbruno_search_requests

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target distinct resources and actions clearly. The main ambiguity is between bruno_list_requests, which can also search within a collection, and bruno_search_requests, which searches across all collections.

Naming Consistency4/5

The bruno_ prefix with verb_noun naming is highly consistent across nearly all tools. bruno_run is a minor deviation because it lacks a noun object, but it is still understandable given it runs requests, folders, or collections.

Tool Count5/5

Eleven tools is well-scoped for a Bruno API client server covering collections, requests, environments, and execution. Each tool has a clear role in the overall workflow.

Completeness4/5

The tool surface covers listing, getting, creating, updating, searching, and running requests, plus environment management. The notable gap is the absence of delete operations for requests, environments, or collections.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

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
    52 npm
    32
    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
  • A
    license
    Not graded
    quality
    D
    maintenance
    Exposes Bruno CLI as tools for AI agents, allowing them to discover, inspect, and execute Bruno API collections through the MCP protocol.
    1
    MIT