MCP, MCP server
Bruno MCP Studio
Turns an agent's API testing into files you keep: it authors and edits Bruno collections in place, then runs them — HTTP, WebSocket and gRPC, one identity or many — and reports per-request pass/fail you can re-run in CI.
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High finding. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit d1cef941fe38, unchanged since the check below.
INSTALL_LIFECYCLE_HOOK SECRETS_PATH_CREDENTIAL
Why this grade
- INSTALL_LIFECYCLE_HOOK Medium
A package install hook (preinstall, install, postinstall or prepare) runs a script.
package.json, line 36
prepare - SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
src/bruno/upload-path.ts, line 45
* collection could name `/etc/passwd`, `~/.ssh/id_rsa`, an env file, etc. and
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Concern
can delete files.
PERMISSION_DELETE_FILES
src/bruno/environment.ts, line 590
await fs.unlink(envFilePath);
src/bruno/request-move.ts, line 126
await fs.unlink(filePath);
src/tools/collection-lifecycle-tools.ts, line 206
await fs.rm(args.collectionPath, { recursive: true, force: true });
Show more
tools/comprehension/preflight.mjs, line 85
await fs.rm(gutted, { force: true });
tools/comprehension/preflight.mjs, line 150
await fs.rm(root, { recursive: true, force: true });
tools/comprehension/run.mjs, line 298
if (!keep) await fs.rm(root, { recursive: true, force: true });
tools/comprehension/run.mjs, line 301
if (guttedPath && !keep) await fs.rm(guttedPath, { force: true });
Install and update
Concern
runs a script at install time. The docs document an installer that pipes a download into a shell.
INSTALL_LIFECYCLE_HOOK INSTALL_DOCUMENTED_INSTALLER
package.json, line 36
prepare
docs/mcp.md, line 6823
curl -LsSf https://astral.sh/uv/install.sh | sh
Network
Concern
can reach a host that is not written as a fixed address. can reach api.weather.com. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
src/bruno/fetch-dispatcher.ts, line 81
* settings and nothing to pin - so the caller falls back to global fetch().
src/bruno/request-executor.ts, line 696
// TLS/proxy settings: without one the request would go through global fetch(),
src/bruno/request-redaction.ts, line 93
*. Real fetch() strips these on a cross-origin redirect; the
Show more
src/bruno/url-validator.ts, line 29
* fetch() re-resolves independently and an attacker-controlled short-TTL record
src/bruno/ws-transport.ts, line 562
socket = new WebSocket(dialUrl, terms.protocols, {
docs/MCP Typescript readme.md, line 219
const response = await fetch(`https://api.weather.com/${city}`);
docs/mcp.md, line 3863
fetch("/mcp", {
docs/mcp.md, line 4231
const response = await fetch(serverUrl, {
Secrets
Concern
reads a credential or environment file.
SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
src/bruno/collection.ts, line 69
ignore: input.ignore || ['node_modules', '.git', '.env']
src/bruno/collection.ts, line 343
.env
src/bruno/upload-path.ts, line 45
* collection could name `/etc/passwd`, `~/.ssh/id_rsa`, an env file, etc. and
Show more
src/bruno/collection.ts, line 344
.env.local
src/bruno/collection.ts, line 345
.env.*.local
src/bruno/upload-path.ts, line 53
* dotfiles and dot-directories (`~/.ssh`, `.aws`, `.env`, `.git`, …) are not
.gitignore, line 26
# Environment files
.gitignore, line 27
.env
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
a file was over the read cap and was not fully read.
OBFUSCATION_FILE_OVER_READ_CAP
package-lock.json, line 1
{
docs/mcp.md, line 1
# Example Clients
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit d1cef941fe38. can delete files. runs a script at install time. The docs document an installer that pipes a download into a shell. can reach a host that is not written as a fixed address. can reach api.weather.com. The description does not name that host. reads a credential or environment file. a file was over the read cap and was not fully read.
Date and source
Date checked:
github.com
Commit graded: d1cef941fe384e6e6a45ff59fc6389cce05d8c76
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.