MCP servers and secrets
Your MCP servers and the tools they offer, and the secrets Bash uses but never shows.
POST/v1/mcp-serversRegister one: URL, auth (none, or headers using ${secret:NAME} or ${user_secret:NAME}), and its tool policy floor: tools never run and tools that always need approval, for every deployment in both modes.
A deployment version's own tool policy adds to the floor and never removes from it.
Request6 fields
Headers
Idempotency-KeystringSend the same key to retry this call safely for 24 hours.
- Type
string
Body
namestringrequiredIts name, as people read it, 1 to 80 characters.
- Limits
- 1 to 80 characters.
- Example
Travel desk
slugstringrequiredThe name Bash calls it by: lowercase letters, digits and hyphens, starting with a letter, up to 40.
- Example
travel-desk
urlstring (URL)requiredThe server's public https URL, up to 2,048 characters.
- Limits
- At most 2048 characters.
- Example
https://mcp.example.com/travel
authobjectHow Bash signs in to it. Default { "type": "none" }.
- Default
{"type":"none"}- One of
{ type },{ type, headers },{ type }
toolsobjectWhich of its tools Bash never calls (deny), and which wait for the person's yes (require_approval), in every deployment that uses the server. A deployment may add to either list, never take from it. Default: no rule.
- Default
{"deny":[],"require_approval":[]}
denystring[]Tools of the server Bash never calls, by name, at most 200. Every deployment that names the server runs under it.
- Default
[]- Limits
- At most 200 items.
require_approvalstring[]Tools of the server that always wait for the person's yes, by name, at most 200.
- Default
[]- Limits
- At most 200 items.
Answers 20111 fields
object"mcp_server"Always mcp_server.
- Type
"mcp_server"
idstringThe MCP server's id.
- Example
mcp_8f2k
slugstringThe name Bash calls it by.
- Type
string
namestringIts name, as people read it.
- Type
string
urlstringThe server's https URL.
- Type
string
authobjectHow Bash signs in to it.
type"none" | "headers"none, or headers sent with every call.
- Type
"none" | "headers"
headersmap of stringmay be absentThe headers, as written: a credential shows as its ${secret:NAME}, never its value.
- Type
map of string
toolsobjectWhich of its tools Bash never calls (deny), and which wait for the person's yes (require_approval), in every deployment that uses the server. A deployment may add to either list, never take from it.
denystring[]Tools of the server Bash never calls, by name, at most 200. Every deployment that names the server runs under it.
- Type
string[]
require_approvalstring[]Tools of the server that always wait for the person's yes, by name, at most 200.
- Type
string[]
secretsstring[]The company secrets it needs (${secret:NAME}), by name: store each with PUT /v1/secrets/{name}.
- Type
string[]
user_secretsstring[]The secrets each user needs (${user_secret:NAME}), by name: store each user's with PUT /v1/secrets/{name} and their user_id.
- Type
string[]
created_atstringWhen it was made, as an ISO 8601 date and time in UTC.
- Type
string
updated_atstringWhen it last changed, as an ISO 8601 date and time in UTC.
- Type
string
No sample in your language for this route, so here it is over HTTP.
curl -X POST "$VESTRA_BASE_URL/v1/mcp-servers" \ -H "Authorization: Bearer $VESTRA_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Travel desk", "slug": "travel-desk", "url": "https://mcp.example.com/travel" }'