bruno-mcp
Bruno MCP is a local MCP server that lets you discover, inspect, create, and run Bruno v4 OpenCollection API requests through MCP clients, while delegating execution to the Bruno CLI.
List collections (
bruno_list_collections): enumerate available OpenCollection collections in the workspace.List/search requests (
bruno_list_requests,bruno_search_requests): browse requests in a collection or across all collections with filters by name, path, URL, method, and type.Inspect requests (
bruno_get_request): retrieve normalized request metadata and parsed YAML, optionally including raw source.Create requests (
bruno_create_request): add new HTTP requests from structured fields (method, URL, headers, params, body, auth, scripts, assertions, etc.) without overwriting existing files.List/inspect environments (
bruno_list_environments,bruno_get_environment): see available environments and variable metadata, with secret values redacted.Run requests (
bruno_run): execute a single request, folder, or whole collection with options for environment, variable overrides, bailing on failures, tests-only mode, delays, sandbox mode, TLS verification, and response body capture.Security/policy controls: path containment, no shell execution, optional developer sandbox and insecure TLS only when explicitly allowed, and redaction of secrets in environment inspection and execution reports.
Provides tools for discovering, inspecting, and executing Bruno API collections, including listing collections and requests, reading request definitions and environments, and running requests, folders, or entire collections with environment variables, tests, and assertions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bruno-mcpList all API requests in the OpenCollection"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-mcpInstall a supported Bruno CLI separately if it is not already available:
npm install --global @usebruno/cli@^4.0.0Confirm that both entry points resolve:
command -v bruno-mcp
bru --versionbruno-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 linkMCP 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-mcpConfiguration
Configuration is supplied through environment variables. Invalid configuration prevents the server from starting.
Variable | Default | Description |
| 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 CLI executable name or path. The executable is invoked directly, never through a shell. |
|
| Per-run timeout in milliseconds. It must be a positive integer. Values above |
|
| Permits callers to request Bruno's developer sandbox when true. It does not enable developer mode by default. |
|
| Permits callers to disable normal TLS certificate verification for a run when true. It does not disable verification by default. |
|
| Maximum accepted Bruno JSON reporter size in UTF-8 bytes (5 MiB by default). It must be a positive integer. |
|
| Minimum stderr log level: |
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-mcpMCP 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 URLmethod: case-insensitive exact HTTP methodtype: 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 identifierrequest: 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 identifierrequest: normalized path relative to the collection, including.ymlname: request display namemethod: HTTP methodurl: request URL, with Bruno variables stored verbatim
Optional inputs cover the full Bruno v4 HTTP request representation:
Request metadata:
sequence,tags, anddescriptionHTTP details:
headers, query or pathparams,body, andauthExecution behavior:
runtimevariables, scripts, assertions, and actionsAdditional data:
settings,examples,docs, andapp
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 identifierrequest: normalized request path relative to the collection, including.ymlexpectedRevision: revision returned bybruno_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 identifierenvironment: bare name such asLocalor a collection-relative path such asenvironments/Local.yml
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 |
| Required | Collection identifier. |
|
| Request or folder paths. An empty array runs the entire collection. |
| None | Bruno environment name. |
| None | Non-secret string overrides passed as Bruno environment variables. |
|
| Stops after the first failing request, test, or assertion. |
|
| Runs only requests that contain tests or active assertions. |
| None | Non-negative delay between requests in milliseconds. |
|
| Bruno sandbox mode: |
|
| Requests disabled TLS certificate verification. |
|
| Returned response bodies: |
|
| 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 asauthorheaders, 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:
The server operator sets
BRUNO_MCP_ALLOW_DEVELOPER_SANDBOX=true.The tool caller sets
sandboxtodeveloperfor 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_ROOTor 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 request mutation: Discovery and inspection are read-only.
bruno_create_requestuses an exclusive write and never replaces an existing path.bruno_update_requestaccepts either the revision returned by inspection or an explicit*latest-version guard, rejects non-HTTP targets, and atomically replaces changed files.bruno_rundelegates to Bruno CLI and can execute scripts with side effects, including persisted variable changes.Targeted redaction: Environment values explicitly marked
secret: trueare 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 ciUseful commands:
Command | Purpose |
| Run the TypeScript entry point in development. |
| Compile the server to |
| Run the compiled stdio server. |
| Run all checks required by CI. |
| Lint source, tests, and tooling. |
| Type-check source, tests, and tooling without emitting files. |
| Run the unit test suite once. |
| Run unit tests in watch mode. |
| Run the integration test suite. |
| Regenerate Bruno reporter fixtures when intentionally updating them. |
Before submitting a change, run:
npm run checkKnown limitations
Only Bruno OpenCollection YAML is supported; legacy
.brucollections are ignored.Request creation and in-place HTTP request updates are the only direct MCP mutations. Collection, environment, 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_runbehavior 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
7 toolsbruno_get_environmentGet Bruno environmentA
Inspect a Bruno environment. Variables marked as secrets are always redacted.
| Name | Required | Description | Default |
|---|---|---|---|
| collection | Yes | 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. | |
| environment | Yes | Environment reference, either a bare name (Local) or a collection-relative path (environments/Local.yml). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral burden. It does add a useful, non-obvious behavior: 'Variables marked as secrets are always redacted.' However, it does not disclose other important traits such as read-only/no-side-effect behavior, not-found/error responses, or whether the full variable list is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The first sentence states the action and target, and the second adds an important caveat about secrets. It is front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two well-documented parameters and no nested schema, the description plus schema is sufficient for correct invocation. The redaction behavior is a key context detail. The main gaps are unspecified return format and failure behavior, but the low complexity makes those minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers both parameters at 100%, including detailed explanations of collection path conventions and environment reference forms. The description adds no additional parameter-level meaning, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Inspect a Bruno environment.' It clearly identifies a single-environment inspection action, and the redaction note implies the output contains variables. It doesn't explicitly contrast itself with sibling tools like bruno_list_environments, but the singular 'environment' and title make 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is only implied: an agent would infer this is for inspecting one Bruno environment rather than listing all environments. There is no explicit statement of when to use this vs. alternatives such as bruno_list_environments or when not to use it, so the guidance 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_get_requestGet Bruno requestA
Read a Bruno OpenCollection request and return its parsed YAML representation.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Request path relative to the collection root (as returned by bruno_list_requests), for example Hotel/Search.yml. | |
| collection | Yes | 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. | |
| includeSource | No | When true, also return the raw request source text alongside the parsed document. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It clearly indicates this is a read operation that returns parsed YAML, and the includeSource parameter (described in the schema) adds transparency about optional raw-source output. It does not mention error behavior or permissions, but the read-only nature is explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that states the core action and result without repetition or filler. It earns its place and is easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with fully documented parameters, the description plus schema provides enough information for correct invocation. A brief note about when to prefer this over bruno_run or bruno_search_requests would make it complete, but nothing essential is missing for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents all three parameters. The main description adds no parameter-level meaning beyond 'parsed YAML representation,' but the high schema coverage means the description does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific verb ('Read') and resource ('a Bruno OpenCollection request') and states the output format ('parsed YAML representation'). This distinguishes it from sibling list/search/run tools, making its purpose immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description itself does not explicitly state when to use this tool versus alternatives like bruno_run or bruno_search_requests. However, the parameter descriptions do provide useful context by explaining how to obtain valid collection and request identifiers from the sibling listing tools, so usage is implied rather than fully spelled out.
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 collectionsA
List Bruno OpenCollection collections available in the configured workspace.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. 'List' implies a read-only operation and 'available in the configured workspace' adds scope context, but the description does not disclose output format, pagination, ordering, or error behavior. It is minimally adequate for a simple list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that states the action, resource, and scope with no filler or redundant explanation. It is well-sized and immediately understandable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with no output schema, the description is largely sufficient: it names the action, resource, and scope. It could mention what information is returned or how the workspace is determined, but these are minor gaps for this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, so there is no parameter documentation burden. The description adds workspace context but no parameter semantics are needed. Baseline 4 is appropriate for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a precise resource ('Bruno OpenCollection collections') and scopes it to the configured workspace. It is clearly distinguishable from the sibling tools, which target requests and environments rather than collections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by the verb 'List' and the collection resource, but the description does not explicitly state when to choose this tool over siblings or mention any exclusions. It provides context (configured workspace) but no direct routing guidance.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| collection | Yes | 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. |
TDQS
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 usefully states that variable values will not be exposed, which is a meaningful guarantee. However, it says nothing about output shape, error behavior, or ordering, so transparency is adequate 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured sentence that front-loads the action and resource, then adds the important caveat about not 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool with no output schema, the description covers the essential context: scope is the collection and variable values are intentionally withheld. It is slightly light on return-value expectations, but 'List environments' reasonably implies the returned artifact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the parameter description already explains that 'collection' is a path relative to the workspace root with a nested example. The tool description reinforces the collection-scoped nature but does not add significant parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List environments available to a Bruno collection') and adds a distinguishing safety scope: 'without exposing variable values.' This clearly separates it from bruno_get_environment, which presumably returns variable values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use the tool: to enumerate environments for a collection while deliberately avoiding variable value exposure. It does not explicitly name a sibling alternative, but the caveat makes the intended use case clear enough.
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 requestsA
List and search requests in a Bruno OpenCollection collection. Returns request paths, names, types, and HTTP metadata when available.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter to requests of this type (case-insensitive), for example http or graphql. | |
| query | No | Case-insensitive substring filter matched against each request's name, path, and URL. | |
| method | No | Filter to requests with this HTTP method (case-insensitive), for example GET or POST. | |
| collection | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It handles this well for a read-only list tool by explicitly stating that it returns request paths, names, types, and HTTP metadata when available, and by avoiding destructive or write semantics. Minor operational details like pagination or empty-result behavior are not disclosed, but the core behavior is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. The primary action and resource are front-loaded, followed immediately by the key return information, so an agent can quickly determine what the tool offers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema and the absence of an output schema, the description usefully states the kind of data returned. It is sufficiently complete for a list-style tool, though it could be stronger with an explicit contrast to bruno_search_requests.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 four parameters clearly, including collection path semantics and filter behavior. The tool description itself does not add parameter-level meaning beyond this, matching the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('List and search') and resource ('requests in a Bruno OpenCollection collection'), and it specifies the returned data (paths, names, types, HTTP metadata). However, it does not differentiate this tool from the sibling bruno_search_requests, whose purpose likely overlaps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as bruno_search_requests or bruno_get_request. It also fails to clarify whether this tool's search behavior is a substitute for the dedicated search sibling or only a lightweight filter.
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 request, response, test, and assertion results. Variable overrides must not contain secrets. Do not pass credentials or other secrets through variables. MCP tool arguments may be visible to the model and host. Provide secrets through Bruno's normal environment or process environment mechanisms instead.
| Name | Required | Description | Default |
|---|---|---|---|
| bail | No | Stop after the first failing request, test, or assertion. | |
| delayMs | No | Delay between requests in milliseconds. | |
| sandbox | No | JavaScript sandbox mode. Developer mode must be enabled by server policy. | safe |
| targets | No | Request files or folders relative to the collection root. An empty list runs the entire collection. | |
| insecure | No | Disable normal TLS certificate verification. Must be enabled by server policy. | |
| testsOnly | No | Only run requests containing tests or active assertions. | |
| variables | No | Non-secret environment variable overrides. Do not include credentials or other secrets. | |
| collection | Yes | Collection identifier: the collection's path relative to the workspace root (as returned by bruno_list_collections), not its display name. | |
| environment | No | Bruno environment name to use for this run. | |
| responseBodyMode | No | Response bodies to return in the MCP payload: none, only results with failed tests or assertions, or all results. | onFailure |
| maxResponseBodyBytes | No | Maximum serialized UTF-8 size of each returned response body. Oversized bodies are replaced by size metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It does well by disclosing that execution returns structured request/response/test/assertion results, that variable overrides must not contain secrets, and that MCP tool arguments may be visible to the model and host. This goes beyond the schema by explaining why secrets must be excluded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately front-loaded with purpose and return-value information, then turns to security guidance. It is slightly repetitive around secrets ('must not contain secrets' and 'do not pass credentials or other secrets'), but every sentence contributes useful information and the overall length is reasonable for a tool with 11 parameters and no annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter execution tool with no output schema, the description is largely complete: it states what is executed, what results are returned, and critical security constraints. The schema covers parameter semantics and policy-gated flags, while the description adds the secret-handling context. Minor missing guidance around explicit sibling routing prevents a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 11 parameters. The description does not add new parameter-level meaning beyond repeating the variables security warning, which is already present in the schema's variable parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb, 'Execute,' and names the exact resources: 'requests, folders, or an entire Bruno collection.' It also states the underlying implementation ('Bruno CLI v4') and describes the outcome, which clearly distinguishes this executor tool from the sibling list/get/search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While there is no explicit 'use this instead of X' statement, the description makes the tool's role unmistakable: it is the execution tool, contrasting with siblings that only list, get, or search. The scope ('requests, folders, or an entire collection') plus return-value description gives clear context for when an agent should invoke it.
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 requestsA
Search requests across all Bruno OpenCollection collections in the workspace in a single call. Returns each matching request tagged with its collection id.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter to requests of this type (case-insensitive), for example http or graphql. | |
| query | Yes | Required case-insensitive substring matched against each request's name, path, and URL. | |
| method | No | Filter to requests with this HTTP method (case-insensitive), for example GET or POST. |
TDQS
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 discloses the scope ('all collections'), the execution model ('in a single call'), and the result shape ('each matching request tagged with its collection id'). It lacks explicit statements about pagination or error behavior, so it is not a 5, but it is transparent about the core behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core behavior and scope are front-loaded, and the result behavior is stated succinctly. Every clause contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple search tool, the description plus schema covers scope, matching behavior, filters, and result tagging well. The lack of an output schema keeps it from a 5, since the exact structure of 'tagged' results is not fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage for all three parameters, including semantics for query, type, and method. The description adds no parameter-level detail beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search requests'), a clear resource scope ('across all Bruno OpenCollection collections in the workspace'), and highlights the 'single call' nature. The mention that results are tagged with collection id further distinguishes this from collection-scoped siblings like bruno_list_requests and bruno_get_request.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for cross-collection searching rather than per-collection listing or fetching, but it never explicitly names alternatives or states when not to use it. The usage context is clear enough, but there is no direct routing to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have clearly distinct purposes: collections, requests, environments, and execution are cleanly separated. The only minor overlap is bruno_list_requests vs bruno_search_requests, but their scoping within a single collection vs across all collections is sufficiently differentiated.
All tool names follow the same bruno_<verb>_<noun> pattern with consistent verbs: list, get, run, and search. This makes the tool surface predictable and easy for an agent to navigate.
Seven tools is a well-scoped size for a Bruno-focused MCP server. Each tool covers a necessary operation for browsing and executing collections without unnecessary bloat.
The set covers the core lifecycle for the apparent purpose of inspecting and running Bruno collections: list collections, list/search requests, read request details, inspect environments, and execute. It lacks create/update/delete operations, which may be intentional for a read/run-oriented server, but would be needed for full authoring workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A basic MCP server to operate on the Postman API.
- SupabaseOAuthcom.supabase
MCP server for interacting with the Supabase platform
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
The official MCP Server from Mia-Platform to interact with Mia-Platform Console
Related MCP Servers
- MIT
- AlicenseBqualityFmaintenanceA Model Context Protocol (MCP) server that enables programmatic creation and management of Bruno API testing collections, environments, and requests through standardized MCP tools.18731MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that executes requests from Bruno API collections via the Bruno CLI tool, enabling API request execution and collection management.4MIT
- AlicenseNot gradedqualityDmaintenanceExposes Bruno CLI as tools for AI agents, allowing them to discover, inspect, and execute Bruno API collections through the MCP protocol.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gpact/bruno-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server