bruno-mcp
Bruno MCP
Bruno MCP — это локальный сервер Model Context Protocol для обнаружения, просмотра и выполнения API-коллекций Bruno. Он предоставляет MCP-клиентам семантический интерфейс к коллекциям Bruno, делегируя выполнение запросов, аутентификацию, скрипты, проверки и разрешение окружения интерфейсу командной строки Bruno.
Инструменты обнаружения и просмотра не изменяют файлы коллекций. Выполнение запросов делегируется Bruno и может запускать скрипты коллекций с побочными эффектами. Сервер взаимодействует с MCP-хостом через стандартный ввод и стандартный вывод (stdio).
Неофициальный проект: Bruno MCP — это независимый неофициальный MCP-сервер. Этот проект не связан с Bruno или его создателями, не одобрен и не спонсируется ими, а также не имеет с ними никакого иного отношения. Названия, логотипы и знаки Bruno, а также связанные с ними обозначения являются товарными знаками их соответствующих владельцев. Упоминания Bruno используются исключительно для описания совместимости с программным обеспечением Bruno.
Требования
Node.js 22 или новее
npm
Bruno CLI
>= 4.0.0 && < 5.0.0
Bruno MCP проверяет bru --version при запуске. Поддерживаются стабильные выпуски Bruno CLI 4.x; предварительные выпуски и другие основные версии отклоняются.
Related MCP server: Bruno MCP Server
Поддержка OpenCollection
Bruno MCP поддерживает коллекции OpenCollection в Bruno v4, идентифицируемые файлом opencollection.yml. Он обнаруживает запросы и окружения, представленные YAML-файлами OpenCollection.
Устаревшие коллекции .bru не поддерживаются. Обнаружение запросов игнорирует файлы .bru, а не разбирает и не преобразует их.
Установка
Установите Bruno MCP глобально из npm:
npm install --global @gpact/bruno-mcpУстановите поддерживаемый Bruno CLI отдельно, если его ещё нет:
npm install --global @usebruno/cli@^4.0.0Убедитесь, что обе точки входа доступны:
command -v bruno-mcp
bru --versionbruno-mcp не имеет параметров командной строки, поэтому его вызов запускает stdio-сервер, а не выводит справку. Обычно MCP-хосты запускают его самостоятельно.
Чтобы установить из клонированного репозитория, выполните:
npm ci
npm run build
npm linkКонфигурация MCP-хоста
MCP stdio transport определяет, как хост запускает дочерний процесс сервера и обменивается сообщениями через stdin и stdout. Он не определяет универсальный файл конфигурации хоста.
Настройте хост так, чтобы он запускал точку входа bruno-mcp как локальный stdio-сервер и передавал BRUNO_MCP_ROOT в окружение дочернего процесса. Используйте абсолютный корневой путь, поскольку не все хосты используют одну и ту же рабочую директорию.
Хосты, использующие mcpServers
Конфигурация проектов Claude Desktop и Claude Code использует объект mcpServers:
{
"mcpServers": {
"bruno": {
"command": "bruno-mcp",
"env": {
"BRUNO_MCP_ROOT": "/home/user/bruno"
}
}
}
}Сведения о расположении файлов конфигурации и параметрах области действия см. в официальном руководстве по локальным серверам и документации Claude Code MCP.
Visual Studio Code
VS Code использует объект servers в своей конфигурации mcp.json:
{
"servers": {
"bruno": {
"type": "stdio",
"command": "bruno-mcp",
"env": {
"BRUNO_MCP_ROOT": "/home/user/bruno"
}
}
}
}Сведения о расположении конфигурации рабочей области и пользователя см. в справочнике по конфигурации MCP в VS Code.
OpenCode
OpenCode использует локальную запись MCP в разделе mcp, представляет команду в виде массива и называет поле окружения environment:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"bruno": {
"type": "local",
"command": ["bruno-mcp"],
"environment": {
"BRUNO_MCP_ROOT": "/home/user/bruno"
}
}
}
}Сведения о приоритете конфигурации и дополнительных параметрах локального сервера см. в документации MCP-сервера OpenCode.
Другие хосты могут использовать другую схему или процесс настройки через командную строку. В любом случае требуемые концепции одинаковы: локальный stdio-транспорт, команда bruno-mcp и переменные окружения, описанные ниже. Если графический хост не может найти bruno-mcp или bru в своём PATH, используйте абсолютный путь, возвращаемый командой command -v bruno-mcp, для серверной команды и задайте BRUNO_MCP_BRU как абсолютный путь к Bruno CLI.
Вы также можете запустить сервер напрямую. Он будет ожидать сообщения MCP на stdin и записывать протокольные сообщения в stdout:
BRUNO_MCP_ROOT=/home/user/bruno bruno-mcpКонфигурация
Конфигурация задаётся через переменные окружения. Некорректная конфигурация не позволяет серверу запуститься.
Переменная | По умолчанию | Описание |
| Текущая рабочая директория | Существующая директория, содержащая доступные коллекции. Путь при запуске приводится к его каноническому расположению, а доступ к коллекциям ограничен этой директорией. |
|
| Имя или путь к исполняемому файлу Bruno CLI. Исполняемый файл вызывается напрямую, никогда через оболочку. |
|
| Тайм-аут одного запуска в миллисекундах. Должен быть положительным целым числом. Значения больше |
|
| При значении true разрешает вызывающим сторонам запрашивать песочницу разработчика Bruno. По умолчанию не включает режим разработчика. |
|
| При значении true разрешает вызывающим сторонам отключать обычную проверку TLS-сертификатов для запуска. По умолчанию не отключает проверку. |
|
| Максимально допустимый размер JSON-отчёта Bruno в байтах UTF-8 (по умолчанию 5 МиБ). Должен быть положительным целым числом. |
|
| Минимальный уровень журналирования в stderr: |
Логические параметры принимают true, 1, yes или on, а также false, 0, no или off без учёта регистра.
Пример с явными политиками выполнения:
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
Идентификаторы коллекций — это пути относительно BRUNO_MCP_ROOT. Пути запросов и окружений задаются относительно их коллекции. Возвращаемые URL-адреса и YAML-переменные не интерполируются.
bruno_list_collections
Перечисляет коллекции Bruno OpenCollection, доступные в настроенной рабочей области. Не принимает аргументов и возвращает идентификаторы коллекций, названия и версии OpenCollection.
bruno_list_requests
Перечисляет и ищет запросы в одной коллекции Bruno OpenCollection. Возвращает пути запросов, названия, типы, а также HTTP-методы и URL-адреса, когда они доступны.
Обязательный входной параметр:
collection— идентификатор коллекции
Необязательные фильтры:
query— подстрока без учёта регистра, сопоставляемая с названием, путём и URLmethod— точный HTTP-метод без учёта регистраtype— точный тип запроса без учёта регистра
bruno_search_requests
Ищет запросы во всех коллекциях одним вызовом. Каждый результат содержит идентификатор своей коллекции.
Обязательный входной параметр:
query— непустая подстрока без учёта регистра, сопоставляемая с названием, путём и URL
Необязательные фильтры method и type используют точное совпадение без учёта регистра.
bruno_get_request
Читает запрос Bruno OpenCollection и возвращает нормализованные метаданные вместе с разобранным YAML-документом.
Обязательные входные параметры:
collection— идентификатор коллекцииrequest— путь запроса относительно коллекции
Установите includeSource в true, чтобы также возвращать исходный YAML-код. По умолчанию — false. Разобранный документ и исходный код возвращаются без маскирования секретов, поэтому используйте пути запросов, полученные с помощью инструментов перечисления или поиска, и не встраивайте учётные данные непосредственно в YAML запроса.
bruno_list_environments
Перечисляет окружения, доступные коллекции, не раскрывая значения переменных. Каждый результат содержит название окружения, относительный путь, количество переменных и количество секретов.
Обязательный входной параметр:
collection— идентификатор коллекции
bruno_get_environment
Просматривает окружение Bruno. Переменные, помеченные как secret: true, возвращаются со значением [REDACTED]; несекретные значения возвращаются в нормализованной строковой форме.
Обязательные входные параметры:
collection— идентификатор коллекцииenvironment— простое имя, напримерLocal, или путь относительно коллекции, напримерenvironments/Local.yml
bruno_run
Выполняет запросы, папки или всю коллекцию с помощью Bruno CLI v4. Возвращает нормализованные результаты выполнения, запросов, ответов, тестов и проверок. Сбои тестов или проверок Bruno возвращаются как результаты, доступные для просмотра, а не как ошибки транспорта MCP.
Входные параметры:
Поле | По умолчанию | Описание |
| Обязательное | Идентификатор коллекции. |
|
| Пути запросов или папок. Пустой массив выполняет всю коллекцию. |
| Нет | Название окружения Bruno. |
| Нет | Несекретные строковые переопределения, передаваемые как переменные окружения Bruno. |
|
| Останавливается после первого запроса, теста или проверки, завершившихся неудачей. |
|
| Выполняет только запросы, содержащие тесты или активные проверки. |
| Нет | Неотрицательная задержка между запросами в миллисекундах. |
|
| Режим песочницы Bruno: |
|
| Запросы отключают проверку TLS-сертификатов. |
|
| Возвращаемые тела ответов: |
|
| Максимальный размер каждого включённого тела ответа в UTF-8 или сериализованном виде. Слишком большие тела заменяются метаданными о размере. |
Обработка секретов
Не передавайте учётные данные и другие секреты через
variables. Аргументы инструментов MCP могут быть видны модели и хосту, а переопределения также передаются процессу Bruno как аргументы. Вместо этого передавайте секреты через обычные механизмы окружения Bruno или окружения процесса.
Проверка окружения учитывает secret: true, но этот маркер не является общей границей доступа к файлам. bruno_get_request возвращает файлы без маскирования и в настоящее время принимает любой существующий файл внутри коллекции, а не только пути, найденные при обнаружении запросов. Поэтому авторизованный вызывающий, указавший путь к файлу окружения, может получить его исходное содержимое. Ограничьте доступ MCP доверенными хостами и пользователями, сузьте область действия BRUNO_MCP_ROOT и не храните секреты в открытом виде в производственной среде там, где их может прочитать вызывающий MCP.
Политики песочницы и TLS
bruno_run по умолчанию использует безопасную песочницу Bruno.
Выполнение в песочнице разработчика требует обоих следующих явных действий:
Оператор сервера устанавливает
BRUNO_MCP_ALLOW_DEVELOPER_SANDBOX=true.Вызывающая сторона устанавливает для запуска
sandboxв значениеdeveloper.
Без разрешения сервера запрос в режиме разработчика завершается ошибкой DEVELOPER_SANDBOX_DISABLED. Режим разработчика предоставляет сценариям Bruno более широкие возможности, поэтому включайте его только для доверенных коллекций.
Ограничение путей контролирует пути, передаваемые в Bruno MCP; оно не изолирует код внутри сценариев Bruno. Сценарии Bruno могут обновлять состояние коллекции или окружения, а сценарии в режиме разработчика могут использовать собственные возможности Node.js для доступа к путям за пределами BRUNO_MCP_ROOT или запуска других процессов.
Обычная проверка сертификатов TLS включена по умолчанию. Её отключение также требует как разрешения сервера (BRUNO_MCP_ALLOW_INSECURE=true), так и insecure: true для отдельного запуска. В противном случае запрос завершается ошибкой INSECURE_DISABLED. Небезопасный режим ослабляет защиту транспортного уровня и должен применяться только в контролируемых средах разработки.
Модель безопасности
Ограничение корневого каталога: Пути коллекций, запросов, окружений и выполнения, передаваемые в Bruno MCP, проверяются на соответствие каноническим границам файловой системы. Обходы путей и переходы по символическим ссылкам за пределы
BRUNO_MCP_ROOTили выбранной коллекции отклоняются. Это не ограничивает код сценариев в режиме разработчика.Без выполнения через оболочку: Bruno MCP передаёт фиксированную операцию и отдельные аргументы напрямую настроенному исполняемому файлу Bruno с отключённым выполнением через оболочку. Он не предоставляет универсальную оболочку или инструмент команд Bruno CLI, но сценарии Bruno в режиме разработчика могут сами запускать процессы.
Инспекция только для чтения: Обнаружение и инспекция намеренно не создают, не обновляют и не удаляют файлы коллекций.
bruno_runделегирует выполнение Bruno CLI и может запускать сценарии с побочными эффектами, включая сохраняемые изменения переменных.Целевое редактирование: Значения окружения, явно помеченные
secret: true, редактируются при инспекции окружения. Отчёты о выполнении рекурсивно редактируют распространённые чувствительные заголовки, включая authorization, cookies и заголовки API-ключей. Чтение необработанных файлов и запросов не редактируется.stdout только для протокола: stdout зарезервирован для трафика протокола MCP. Журналы и диагностика запуска записываются в stderr.
Ограниченные отчёты: Чрезмерно большие отчёты Bruno отклоняются, а включаемые тела ответов имеют отдельный лимит на каждое тело.
Редактирование — это защита в глубину, а не общее обнаружение секретов. Необработанные файлы, YAML запросов, исходный код запросов, URL-адреса, тела ответов и диагностика Bruno могут содержать значения, которые не распознаются как секреты. Настраивайте BRUNO_MCP_ROOT как можно более узко, избегайте встраивания учётных данных в файлы коллекций и при включении выполнения запросов используйте доверенные коллекции и вызывающие MCP-приложения.
Разработка
Установите зафиксированные зависимости:
npm ciПолезные команды:
Command | Назначение |
| Запуск точки входа TypeScript в режиме разработки. |
| Компиляция сервера в |
| Запуск скомпилированного stdio-сервера. |
| Запуск всех проверок, требуемых CI. |
| Проверка исходного кода, тестов и инструментов линтером. |
| Проверка типов исходного кода, тестов и инструментов без создания файлов. |
| Однократный запуск набора модульных тестов. |
| Запуск модульных тестов в режиме наблюдения. |
| Запуск набора интеграционных тестов. |
| Пересоздание фикстур отчётов Bruno при намеренном их обновлении. |
Перед отправкой изменения выполните:
npm run checkИзвестные ограничения
Поддерживается только YAML Bruno OpenCollection; устаревшие коллекции
.bruигнорируются.Инструменты MCP для изменения коллекций, запросов, окружений, папок или рабочих областей не предоставляются. Выполняемые сценарии Bruno по-прежнему могут иметь побочные эффекты.
Импорт и экспорт OpenAPI не поддерживаются.
Сервер не предоставляет произвольные команды Bruno CLI и не выполняет команды через оболочку.
Поддерживается только локальный транспорт stdio MCP. Удалённый и HTTP-транспорты MCP не включены.
Автоматическая интеграция с менеджером секретов не включена.
Bruno MCP не реализует собственный HTTP-клиент, интерполяцию переменных, аутентификацию, OAuth, сценарии, цепочки запросов, проверки, поведение прокси, перенаправления или работу с сертификатами. Эти возможности реализуются 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