PostBruno

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.

Connector addresshttps://postbruno.klevrx.com/mcp

Claude

  1. Settings → Connectors → Add custom connector.
  2. Name it PostBruno and paste the address.
  3. 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

  1. Turn on developer mode: Settings → Apps & Connectors → Advanced.
  2. Create a connector with the address and OAuth authentication.
  3. 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.

"What APIs are in our Payments workspace?""Show me the Create order request and explain its auth.""Add a POST /orders request to the Orders collection with a JSON body and a test that checks for 201.""Run the Payments folder on Staging and tell me which tests failed and why.""Set host in the Staging environment to https://staging.example.com.""Send GET https://api.example.com/health and summarise the response.""Create a monitor that runs the Orders collection every 15 minutes on Production."

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 member

list_workspacesList workspaces

read only

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

read only

Overview of a workspace: its collections, environments, mock servers and monitors, with their ids.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id

get_collectionGet collection

read only

A collection's folders and requests (ids, methods, URLs), plus its variables, auth and scripts. Use get_request for a request's full details.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
collectionIdtextyesCollection id

search_requestsSearch requests

read only

Finds saved requests in a workspace whose name, method or URL contains the text (case-insensitive).

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
querytextyesText to look for, e.g. "login" or "/orders"

get_requestGet request

read only

Full details of a saved request: method, URL, headers, body, auth, Before request / After response scripts, description and saved examples.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
collectionIdtextyesCollection id
requestIdtextyesRequest id

get_environmentGet environment

read only

Variables of an environment, or of the workspace globals when environmentId is "globals". Secret values are hidden.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
environmentIdtextyesEnvironment id, or "globals"

Create and edit

Role needed: Editor or admin

create_collectionCreate collection

makes changes

Creates an empty collection in a workspace. Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
nametextyesCollection name
descriptiontext

create_folderCreate folder

makes changes

Adds a folder to a collection, at the top level or inside another folder. Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
collectionIdtextyesCollection id
nametextyesFolder name
parentFolderIdtextFolder to create it in; omit for the top level
descriptiontext

create_requestCreate request

makes changes

Saves a new HTTP request in a collection (optionally inside a folder). Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
collectionIdtextyesCollection id
folderIdtextFolder to save it in; omit for the top level
nametextyesRequest name
methodtextyesHTTP method, e.g. GET, POST
urltextyesFull URL; may contain {{variables}}, :pathParams and a ?query
headerslistRequest headers (replaces all headers)
headers[].keytext
headers[].valuetext
headers[].disabledtrue / false
bodyobjectRequest body
body.mode"none" | "raw" | "urlencoded" | "formdata" | "graphql"
body.rawtextmode "raw": the body text
body.language"json" | "text" | "xml" | "html" | "javascript"mode "raw": content language (default json)
body.fieldslistmodes "urlencoded" and "formdata": text fields
body.fields[].keytext
body.fields[].valuetext
body.fields[].disabledtrue / false
body.querytextmode "graphql": the query
body.variablestextmode "graphql": variables as a JSON string
authobjectAuthorization
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.paramsmap of textPostman auth fields, e.g. bearer {token}; basic {username, password}; apikey {key, value, in: "header"|"query"}. Values may use {{variables}}.
beforeRequestScripttext"Before request" script (Postman pre-request JavaScript). Empty string removes it.
afterResponseScripttext"After response" script (Postman tests, e.g. pm.test(...)). Empty string removes it.
descriptiontext

update_requestUpdate request

makes changes

Changes a saved request. Only the fields given are changed; headers, body and auth are replaced as a whole when given. Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
collectionIdtextyesCollection id
requestIdtextyesRequest id
nametext
methodtextHTTP method, e.g. GET, POST
urltextFull URL; may contain {{variables}}, :pathParams and a ?query
headerslistRequest headers (replaces all headers)
headers[].keytext
headers[].valuetext
headers[].disabledtrue / false
bodyobjectRequest body
body.mode"none" | "raw" | "urlencoded" | "formdata" | "graphql"
body.rawtextmode "raw": the body text
body.language"json" | "text" | "xml" | "html" | "javascript"mode "raw": content language (default json)
body.fieldslistmodes "urlencoded" and "formdata": text fields
body.fields[].keytext
body.fields[].valuetext
body.fields[].disabledtrue / false
body.querytextmode "graphql": the query
body.variablestextmode "graphql": variables as a JSON string
authobjectAuthorization
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.paramsmap of textPostman auth fields, e.g. bearer {token}; basic {username, password}; apikey {key, value, in: "header"|"query"}. Values may use {{variables}}.
beforeRequestScripttext"Before request" script (Postman pre-request JavaScript). Empty string removes it.
afterResponseScripttext"After response" script (Postman tests, e.g. pm.test(...)). Empty string removes it.
descriptiontext

create_environmentCreate environment

makes changes

Creates an environment with variables. Values are shared with the whole workspace. Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
nametextyesEnvironment name, e.g. Staging
variableslist
variables[].keytext
variables[].valuetext
variables[].secrettrue / false

set_variablesSet variables

makes changes

Adds or changes variables in an environment (or the workspace globals with environmentId "globals"), and removes the keys listed in remove. Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
environmentIdtextyesEnvironment id, or "globals"
setlist
set[].keytext
set[].valuetext
set[].secrettrue / false
set[].enabledtrue / false
removelist of textKeys to delete

Send and run

Role needed: Any member

send_requestSend saved request

makes changessends HTTP requests

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.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
collectionIdtextyesCollection id
requestIdtextyesRequest id
environmentIdtextEnvironment whose variables to use

send_http_requestSend HTTP request

makes changessends HTTP requests

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.

InputTypeRequiredDescription
methodtextyesHTTP method, e.g. GET, POST
urltextyesFull URL; may contain {{variables}}, :pathParams and a ?query
headerslistRequest headers (replaces all headers)
headers[].keytext
headers[].valuetext
headers[].disabledtrue / false
bodyobjectRequest body
body.mode"none" | "raw" | "urlencoded" | "formdata" | "graphql"
body.rawtextmode "raw": the body text
body.language"json" | "text" | "xml" | "html" | "javascript"mode "raw": content language (default json)
body.fieldslistmodes "urlencoded" and "formdata": text fields
body.fields[].keytext
body.fields[].valuetext
body.fields[].disabledtrue / false
body.querytextmode "graphql": the query
body.variablestextmode "graphql": variables as a JSON string
authobjectAuthorization
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.paramsmap of textPostman auth fields, e.g. bearer {token}; basic {username, password}; apikey {key, value, in: "header"|"query"}. Values may use {{variables}}.
beforeRequestScripttext"Before request" script (Postman pre-request JavaScript). Empty string removes it.
afterResponseScripttext"After response" script (Postman tests, e.g. pm.test(...)). Empty string removes it.
workspaceIdtextWorkspace whose globals (and environment) to use for {{variables}}
environmentIdtext

run_collectionRun collection

makes changessends HTTP requests

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.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
collectionIdtextyesCollection id
folderIdtextRun only this folder
environmentIdtextEnvironment whose variables to use

Mock servers and monitors

Role needed: Editor or admin; reading runs: any member

create_mock_serverCreate mock server

makes changes

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.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
nametextyes
collectionIdtextyesCollection id
environmentIdtext
delayMswhole number (-9007199254740991–9007199254740991)Response delay in ms (0–30000)
isPrivatetrue / false

create_monitorCreate monitor

makes changes

Schedules a collection to run automatically on the server (cron, in UTC) and record results. Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
nametextyes
collectionIdtextyesCollection id
environmentIdtext
crontextyes5-field cron in UTC, e.g. "*/15 * * * *" for every 15 minutes
enabledtrue / false

run_monitorRun monitor now

makes changessends HTTP requests

Runs a monitor immediately and returns the result (also saved to the monitor's history). Requires editor role.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
monitorIdtextyesMonitor id

get_monitor_runsGet monitor runs

read only

Recent runs of a monitor (newest first), or the full results of one run when runId is given.

InputTypeRequiredDescription
workspaceIdtextyesWorkspace id
monitorIdtextyesMonitor id
runIdtext
limitwhole 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.