PostBruno MCP server
Connect Claude, ChatGPT or another AI assistant to PostBruno. It can read and edit your team's collections, send requests and run tests, as you and with your role in each workspace.
Connect
Add PostBruno as a connector using this address. The assistant opens a PostBruno page where you sign in with your PostBruno email and password and click Allow.
https://postbruno.klevrx.com/mcpClaude
- Settings → Connectors → Add custom connector.
- Name it PostBruno and paste the address.
- Click Connect, sign in with your PostBruno account and click Allow.
On Team and Enterprise plans, an owner may need to add the connector first.
ChatGPT
- Turn on developer mode: Settings → Apps & Connectors → Advanced.
- Create a connector with the address and OAuth authentication.
- Sign in with your PostBruno account and click Allow.
Claude Code
Run this, then /mcp in Claude Code and choose Authenticate:
claude mcp add --transport http --scope user postbruno https://postbruno.klevrx.com/mcp
Cursor and other apps
Apps without sign-in use an API key: in PostBruno, account menu → API Keys → generate one, then:
{
"mcpServers": {
"postbruno": {
"url": "https://postbruno.klevrx.com/mcp",
"headers": { "Authorization": "Bearer crr_..." }
}
}
}Connected apps appear in PostBruno under account menu → API Keys → Connected apps, where you can disconnect them. A sign-in lasts 90 days from the app's last use. API keys work until you delete them.
Things to ask
Talk to the assistant normally; it picks the tools. Name the workspace, collection or environment when you have more than one.
Tools
19 tools. Every tool works as the signed-in user: you see the workspaces you belong to, and viewers can read and send requests but not change anything. There are no delete tools.
Browse
Role needed: Any memberlist_workspacesList workspaces
Lists the team workspaces the user belongs to, with their role (admin, editor or viewer). Viewers can read and send but not change anything.
No inputs.
get_workspaceGet workspace
Overview of a workspace: its collections, environments, mock servers and monitors, with their ids.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
get_collectionGet collection
A collection's folders and requests (ids, methods, URLs), plus its variables, auth and scripts. Use get_request for a request's full details.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
collectionId | text | yes | Collection id |
search_requestsSearch requests
Finds saved requests in a workspace whose name, method or URL contains the text (case-insensitive).
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
query | text | yes | Text to look for, e.g. "login" or "/orders" |
get_requestGet request
Full details of a saved request: method, URL, headers, body, auth, Before request / After response scripts, description and saved examples.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
collectionId | text | yes | Collection id |
requestId | text | yes | Request id |
get_environmentGet environment
Variables of an environment, or of the workspace globals when environmentId is "globals". Secret values are hidden.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
environmentId | text | yes | Environment id, or "globals" |
Create and edit
Role needed: Editor or admincreate_collectionCreate collection
Creates an empty collection in a workspace. Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
name | text | yes | Collection name |
description | text |
create_folderCreate folder
Adds a folder to a collection, at the top level or inside another folder. Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
collectionId | text | yes | Collection id |
name | text | yes | Folder name |
parentFolderId | text | Folder to create it in; omit for the top level | |
description | text |
create_requestCreate request
Saves a new HTTP request in a collection (optionally inside a folder). Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
collectionId | text | yes | Collection id |
folderId | text | Folder to save it in; omit for the top level | |
name | text | yes | Request name |
method | text | yes | HTTP method, e.g. GET, POST |
url | text | yes | Full URL; may contain {{variables}}, :pathParams and a ?query |
headers | list | Request headers (replaces all headers) | |
headers[].key | text | ||
headers[].value | text | ||
headers[].disabled | true / false | ||
body | object | Request body | |
body.mode | "none" | "raw" | "urlencoded" | "formdata" | "graphql" | ||
body.raw | text | mode "raw": the body text | |
body.language | "json" | "text" | "xml" | "html" | "javascript" | mode "raw": content language (default json) | |
body.fields | list | modes "urlencoded" and "formdata": text fields | |
body.fields[].key | text | ||
body.fields[].value | text | ||
body.fields[].disabled | true / false | ||
body.query | text | mode "graphql": the query | |
body.variables | text | mode "graphql": variables as a JSON string | |
auth | object | Authorization | |
auth.type | "inherit" | "noauth" | "bearer" | "basic" | "apikey" | "digest" | "oauth1" | "oauth2" | "jwt" | "hawk" | "awsv4" | "ntlm" | "edgegrid" | "asap" | "inherit" uses the parent folder or collection auth; "noauth" sends none | |
auth.params | map of text | Postman auth fields, e.g. bearer {token}; basic {username, password}; apikey {key, value, in: "header"|"query"}. Values may use {{variables}}. | |
beforeRequestScript | text | "Before request" script (Postman pre-request JavaScript). Empty string removes it. | |
afterResponseScript | text | "After response" script (Postman tests, e.g. pm.test(...)). Empty string removes it. | |
description | text |
update_requestUpdate request
Changes a saved request. Only the fields given are changed; headers, body and auth are replaced as a whole when given. Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
collectionId | text | yes | Collection id |
requestId | text | yes | Request id |
name | text | ||
method | text | HTTP method, e.g. GET, POST | |
url | text | Full URL; may contain {{variables}}, :pathParams and a ?query | |
headers | list | Request headers (replaces all headers) | |
headers[].key | text | ||
headers[].value | text | ||
headers[].disabled | true / false | ||
body | object | Request body | |
body.mode | "none" | "raw" | "urlencoded" | "formdata" | "graphql" | ||
body.raw | text | mode "raw": the body text | |
body.language | "json" | "text" | "xml" | "html" | "javascript" | mode "raw": content language (default json) | |
body.fields | list | modes "urlencoded" and "formdata": text fields | |
body.fields[].key | text | ||
body.fields[].value | text | ||
body.fields[].disabled | true / false | ||
body.query | text | mode "graphql": the query | |
body.variables | text | mode "graphql": variables as a JSON string | |
auth | object | Authorization | |
auth.type | "inherit" | "noauth" | "bearer" | "basic" | "apikey" | "digest" | "oauth1" | "oauth2" | "jwt" | "hawk" | "awsv4" | "ntlm" | "edgegrid" | "asap" | "inherit" uses the parent folder or collection auth; "noauth" sends none | |
auth.params | map of text | Postman auth fields, e.g. bearer {token}; basic {username, password}; apikey {key, value, in: "header"|"query"}. Values may use {{variables}}. | |
beforeRequestScript | text | "Before request" script (Postman pre-request JavaScript). Empty string removes it. | |
afterResponseScript | text | "After response" script (Postman tests, e.g. pm.test(...)). Empty string removes it. | |
description | text |
create_environmentCreate environment
Creates an environment with variables. Values are shared with the whole workspace. Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
name | text | yes | Environment name, e.g. Staging |
variables | list | ||
variables[].key | text | ||
variables[].value | text | ||
variables[].secret | true / false |
set_variablesSet variables
Adds or changes variables in an environment (or the workspace globals with environmentId "globals"), and removes the keys listed in remove. Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
environmentId | text | yes | Environment id, or "globals" |
set | list | ||
set[].key | text | ||
set[].value | text | ||
set[].secret | true / false | ||
set[].enabled | true / false | ||
remove | list of text | Keys to delete |
Send and run
Role needed: Any membersend_requestSend saved request
Sends a saved request from the PostBruno server, with its collection/folder auth, scripts and variables, and returns status, headers, body (first 20,000 characters) and test results. Public hosts only.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
collectionId | text | yes | Collection id |
requestId | text | yes | Request id |
environmentId | text | Environment whose variables to use |
send_http_requestSend HTTP request
Sends a one-off HTTP request from the PostBruno server without saving it. Give workspaceId (and optionally environmentId) to use that workspace's variables. Public hosts only.
| Input | Type | Required | Description |
|---|---|---|---|
method | text | yes | HTTP method, e.g. GET, POST |
url | text | yes | Full URL; may contain {{variables}}, :pathParams and a ?query |
headers | list | Request headers (replaces all headers) | |
headers[].key | text | ||
headers[].value | text | ||
headers[].disabled | true / false | ||
body | object | Request body | |
body.mode | "none" | "raw" | "urlencoded" | "formdata" | "graphql" | ||
body.raw | text | mode "raw": the body text | |
body.language | "json" | "text" | "xml" | "html" | "javascript" | mode "raw": content language (default json) | |
body.fields | list | modes "urlencoded" and "formdata": text fields | |
body.fields[].key | text | ||
body.fields[].value | text | ||
body.fields[].disabled | true / false | ||
body.query | text | mode "graphql": the query | |
body.variables | text | mode "graphql": variables as a JSON string | |
auth | object | Authorization | |
auth.type | "inherit" | "noauth" | "bearer" | "basic" | "apikey" | "digest" | "oauth1" | "oauth2" | "jwt" | "hawk" | "awsv4" | "ntlm" | "edgegrid" | "asap" | "inherit" uses the parent folder or collection auth; "noauth" sends none | |
auth.params | map of text | Postman auth fields, e.g. bearer {token}; basic {username, password}; apikey {key, value, in: "header"|"query"}. Values may use {{variables}}. | |
beforeRequestScript | text | "Before request" script (Postman pre-request JavaScript). Empty string removes it. | |
afterResponseScript | text | "After response" script (Postman tests, e.g. pm.test(...)). Empty string removes it. | |
workspaceId | text | Workspace whose globals (and environment) to use for {{variables}} | |
environmentId | text |
run_collectionRun collection
Runs every request in a collection (or one folder) in order, like the Collection Runner, and reports status and test results per request. Runs stop after 100 seconds. Public hosts only.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
collectionId | text | yes | Collection id |
folderId | text | Run only this folder | |
environmentId | text | Environment whose variables to use |
Mock servers and monitors
Role needed: Editor or admin; reading runs: any membercreate_mock_serverCreate mock server
Creates a mock server that answers with the saved examples of a collection's requests, and returns its URL. Private mocks need an x-api-key header. Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
name | text | yes | |
collectionId | text | yes | Collection id |
environmentId | text | ||
delayMs | whole number (-9007199254740991–9007199254740991) | Response delay in ms (0–30000) | |
isPrivate | true / false |
create_monitorCreate monitor
Schedules a collection to run automatically on the server (cron, in UTC) and record results. Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
name | text | yes | |
collectionId | text | yes | Collection id |
environmentId | text | ||
cron | text | yes | 5-field cron in UTC, e.g. "*/15 * * * *" for every 15 minutes |
enabled | true / false |
run_monitorRun monitor now
Runs a monitor immediately and returns the result (also saved to the monitor's history). Requires editor role.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
monitorId | text | yes | Monitor id |
get_monitor_runsGet monitor runs
Recent runs of a monitor (newest first), or the full results of one run when runId is given.
| Input | Type | Required | Description |
|---|---|---|---|
workspaceId | text | yes | Workspace id |
monitorId | text | yes | Monitor id |
runId | text | ||
limit | whole number (1–100) | Runs to list (default 10) |
How it works and limits
Where things happen
- Team workspaces only. Your Local Workspace is stored on your computer, so the server can't see it.
- Requests are sent from the PostBruno server, not your computer. Only public hosts can be reached: not localhost, private network, office-only or VPN-only addresses.
- Variables: runs use the shared (initial) values of environments and globals. Your local current values, vault secrets, cookies and client certificates are not available.
- HTTP and GraphQL only. WebSocket, Socket.IO, gRPC and MQTT requests can only be sent from the app.
Limits and safety
- Runs stop after 100 seconds; a single request times out after 30 seconds.
- Response bodies are returned up to 20,000 characters.
- Rate limit: 300 calls per minute per person.
- Secret variables are shown as •••••• but are still used when sending.
- Every change appears live in the app and in the workspace activity under your name.
- Edits are safe alongside teammates: if someone saves the same collection meanwhile, the change is applied on top of theirs.
Troubleshooting
- "Blocked: … is a private, loopback or link-local address": the request targets localhost or a private network. Use a public URL, or send it from the PostBruno app.
- "Viewers have read-only access to this workspace": ask a workspace admin to make you an Editor.
- "Workspace not found": you're not a member of that workspace, or the id is wrong. Ask the assistant to list your workspaces.
- The assistant asks you to sign in again: the app was disconnected, or unused for 90 days. Connect it again.
- A variable isn't replaced: it probably only has a local current value. Give it an initial value in the environment, or ask the assistant to set it.
- Wrong email or password on the sign-in page: use your PostBruno account, the one you sign in to the app with.