{"name":"io.github.Ostico/bruno-mcp-studio","slug":"ostico-bruno-mcp-studio","title":"Bruno MCP Studio","description":"Author, edit and run Bruno collections as files: HTTP, WebSocket, gRPC, per-request pass/fail.","url":"https://mcp.market/server/ostico-bruno-mcp-studio","rating":null,"grade":"A","score":88,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":37,"stars":11,"forks":1,"downloads_week":538,"last_push_at":"2026-09-24T14:33:44.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Ostico/bruno-mcp-studio","website":"https://github.com/Ostico/bruno-mcp-studio#readme","version":"2.5.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@ostico/bruno-mcp","version":"2.5.0","runtimeHint":"npx","transport":{"type":"stdio"}}],"tools":[{"name":"add_test_script","description":"Add pre-request, post-response, or tests scripts to a Bruno request. Canonical scriptType values are pre-request/post-response/tests; the aliases before-request (\\u2192 pre-request) and after-response (\\u2192 post-response) are also accepted. Appends to any existing script of that type by default \\u2014 pass scriptMode:\"replace\" to overwrite it, or use remove_script to clear it. Assertions must be","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_collection","description":"Create a new Bruno API testing collection with configuration. outputPath is the PARENT directory and name is appended to it: outputPath \"/work/apis\" with name \"Billing\" creates the collection at /work/apis/Billing. Do not put the collection name in outputPath as well. The new collection is also added to the workspace registry that `list_collections` reads rather than the disk, so a collection miss","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_environment","description":"Create an environment file for a Bruno collection. Writes the WHOLE file, so it REFUSES a name that already exists rather than overwriting it \\u2014 the error names the existing variables and which ones a replace would delete, so you can merge with update_environment, pick another name, or retry with overwrite: true.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_collection","description":"Permanently delete a Bruno collection: the collection directory and everything inside it is removed from disk, and its workspace registry entry with it. Nothing here can be recovered through this server. Only a directory that is itself a collection root \\u2014 one holding opencollection.yml or bruno.json \\u2014 can be deleted. To keep the files and only stop the collection being listed, use unregi","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_request","description":"Permanently delete request files from a Bruno collection. One confirm covers the whole list. Each file is unlinked and cannot be recovered through this server. Only .yml/.bru files inside a detected collection can be deleted. Every path is checked before the first unlink, so one unusable path deletes nothing. The result names each file's outcome. To clear a script and keep the request, use remove_","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_collection_stats","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_collections","description":"List the Bruno collections REGISTERED IN workspace.yml, with their names and paths. This is a registry listing, not a filesystem scan: a collection that exists on disk but is not registered will NOT appear, and registered entries that no longer exist are returned with \"exists\": false. A known absolute path works in the other tools without appearing here. Use the returned path as collectionPath in ","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_requests","description":"List all request files (.yml/.bru) in a Bruno collection. Returns absolute file paths, each usable as an entry in the requests list of run_collection, or of one of its groups.","write_action":false,"price_micros":0,"input_schema":null},{"name":"move_request","description":"Relocate a request file to another folder, or to another collection entirely. Pass copy:true to duplicate it instead of moving it. The bytes are moved verbatim, nothing is parsed and rewritten, so seq arrives unchanged and may tie with a request already there; that is reported, and Bruno breaks such a tie by filename. The file keeps its name: use write_request with filename to rename it. The new p","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_environment","description":"Read an environment back as structured JSON: every variable with its value, plus its disabled and secret flags. Omit \"name\" to list the collection's environments instead. Secret variables are returned by name only \\u2014 no file format stores a secret's value, so there is none to return.","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_request","description":"Read a single request file back as structured JSON: method, url, headers, query and path params, body, auth mode, scripts, assertions, vars, settings and docs. Both .bru and .yml return the same shape, so the on-disk format stays invisible. Use this before write_request to see current state, and after it to confirm what was written. A websocket or grpc request also carries its stored messages in f","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_environment_variable","description":"Remove a single variable from an existing Bruno environment. MERGES into the environment \\u2014 all other variables are preserved.","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_script","description":"Delete a pre-request, post-response, or tests script from a Bruno request, leaving the rest of the request intact, including duplicate blocks accumulated by appending. Canonical scriptType values are pre-request/post-response/tests; the aliases before-request and after-response are accepted. Removing all scripts also drops the now-empty script container.","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_collection","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_environment_variable","description":"Set (add or update) a single variable in an existing Bruno environment. MERGES into the environment \\u2014 all other variables are preserved.","write_action":false,"price_micros":0,"input_schema":null},{"name":"unregister_collection","description":"Remove a collection from the workspace registry, leaving every file on disk untouched. list_collections reads that registry, so this is how an entry stops being listed, including a stale entry whose directory is gone. To delete the collection itself, use delete_collection.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_environment","description":"Partially update an existing Bruno environment by MERGING the provided variables into the existing ones. Variables not listed are preserved, unlike create_environment, which replaces the whole file.","write_action":true,"price_micros":0,"input_schema":null},{"name":"write_request","description":"","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":88,"grade":"A","scanned_at":"2026-11-02T16:00:41.853Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-02T16:00:41.803Z","components":{"code":{"score":25,"max":25,"notes":["7 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":12,"max":15,"notes":["last push 39 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@ostico/bruno-mcp","version":"2.5.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":12,"publishedAt":"2026-08-19T23:57:13.940Z","repositoryUrl":"git+https://github.com/Ostico/bruno-mcp-studio.git","weeklyDownloads":538}],"repo":{"found":true,"owner":"Ostico","repo":"bruno-mcp-studio","archived":false,"pushedAt":"2026-09-24T14:33:44Z","stars":11,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/8008416?v=4","ownerCreatedAt":"2014-06-27T19:34:02Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/8008416?v=4&s=128","source":"registry"},"presence":{"stars":11,"forks":1,"downloadsWeek":538,"license":"MIT","lastPushAt":"2026-09-24T14:33:44.000Z","score":37}}}},"grade_history":[],"reviews":[]}