curl --request GET \
--url https://{host}/api/registry/v1/servers \
--header 'Authorization: Bearer <token>'import requests
url = "https://{host}/api/registry/v1/servers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/api/registry/v1/servers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{host}/api/registry/v1/servers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{host}/api/registry/v1/servers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{host}/api/registry/v1/servers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/api/registry/v1/servers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"enabled": true,
"configuration": {},
"name": "<string>",
"slug": "<string>",
"oauth_base_url_override": "<string>",
"client_id": "<string>",
"client_secret": "<string>",
"uses_managed_credentials": true,
"ema_enabled": false,
"scopes": [
"<string>"
],
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mcp_server_directory_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"meta": "<unknown>",
"tools_fetch_status": "<string>",
"tools_fetch_error": "<unknown>",
"tools_fetched_at": "2023-11-07T05:31:56Z",
"tools_fetch_requested_at": "2023-11-07T05:31:56Z",
"published_at": "2023-11-07T05:31:56Z",
"mcp_server_directory": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"runtime": {},
"configuration_schema": {},
"tool_manifest": [
{}
],
"name": "<string>",
"description": "<string>",
"icon": "<string>",
"slug": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"url": "<string>",
"protocol": "mcp",
"source": "barndoor",
"provider": "custom",
"provider_options": "<unknown>",
"scopes": [
"<string>"
],
"oauth_metadata": {},
"protected_resource_metadata": {},
"allow_oauth_override": false,
"meta": {},
"auth_params": "<unknown>",
"credential_schema": "<unknown>",
"public": false,
"requires_auth": false,
"requires_auth_observed_at": "2023-11-07T05:31:56Z"
},
"mcp_server_service_connection": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mcp_server_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"user_id": "<string>",
"application_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"error_message": "<string>",
"connected_at": "2023-11-07T05:31:56Z",
"last_accessed_at": "2023-11-07T05:31:56Z",
"connected_by_user_id": "<string>",
"account_email": "<string>",
"error_reason": "authorization_not_completed"
},
"connection_status": "pending",
"connection_error_reason": "authorization_not_completed",
"url": "<string>",
"proxy_url": "<string>",
"can_manage_policies": true,
"attention_tier": "pending_publish",
"publish_blockers": [
"not_operationally_available"
],
"deleted_at": "2023-11-07T05:31:56Z",
"credential_mode": "managed",
"uses_cimd": false,
"tools_count": 123,
"resources_count": 123
}
],
"pagination": {
"page": 123,
"limit": 123,
"total": 123,
"pages": 123,
"previous_page": 123,
"next_page": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Mcp Servers
curl --request GET \
--url https://{host}/api/registry/v1/servers \
--header 'Authorization: Bearer <token>'import requests
url = "https://{host}/api/registry/v1/servers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{host}/api/registry/v1/servers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{host}/api/registry/v1/servers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{host}/api/registry/v1/servers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{host}/api/registry/v1/servers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{host}/api/registry/v1/servers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"enabled": true,
"configuration": {},
"name": "<string>",
"slug": "<string>",
"oauth_base_url_override": "<string>",
"client_id": "<string>",
"client_secret": "<string>",
"uses_managed_credentials": true,
"ema_enabled": false,
"scopes": [
"<string>"
],
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mcp_server_directory_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"meta": "<unknown>",
"tools_fetch_status": "<string>",
"tools_fetch_error": "<unknown>",
"tools_fetched_at": "2023-11-07T05:31:56Z",
"tools_fetch_requested_at": "2023-11-07T05:31:56Z",
"published_at": "2023-11-07T05:31:56Z",
"mcp_server_directory": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"runtime": {},
"configuration_schema": {},
"tool_manifest": [
{}
],
"name": "<string>",
"description": "<string>",
"icon": "<string>",
"slug": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"url": "<string>",
"protocol": "mcp",
"source": "barndoor",
"provider": "custom",
"provider_options": "<unknown>",
"scopes": [
"<string>"
],
"oauth_metadata": {},
"protected_resource_metadata": {},
"allow_oauth_override": false,
"meta": {},
"auth_params": "<unknown>",
"credential_schema": "<unknown>",
"public": false,
"requires_auth": false,
"requires_auth_observed_at": "2023-11-07T05:31:56Z"
},
"mcp_server_service_connection": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mcp_server_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"user_id": "<string>",
"application_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"error_message": "<string>",
"connected_at": "2023-11-07T05:31:56Z",
"last_accessed_at": "2023-11-07T05:31:56Z",
"connected_by_user_id": "<string>",
"account_email": "<string>",
"error_reason": "authorization_not_completed"
},
"connection_status": "pending",
"connection_error_reason": "authorization_not_completed",
"url": "<string>",
"proxy_url": "<string>",
"can_manage_policies": true,
"attention_tier": "pending_publish",
"publish_blockers": [
"not_operationally_available"
],
"deleted_at": "2023-11-07T05:31:56Z",
"credential_mode": "managed",
"uses_cimd": false,
"tools_count": 123,
"resources_count": 123
}
],
"pagination": {
"page": 123,
"limit": 123,
"total": 123,
"pages": 123,
"previous_page": 123,
"next_page": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
A Barndoor API key, sent as Authorization: Bearer <key>. Keys are prefixed bdai_ and are opaque — do not attempt to decode one. Interchangeable with an OAuth 2.0 access token.
Query Parameters
Search servers by name, slug, or source
Filter by availability status. With the publishing flag on (BCP-3039), True means the state an admin listing renders as Available — published AND still operationally sound — and False is every other state (Pending Publish, Connection Error, Pending Credentials, Pending Connection). Publishing itself is one-way: a published server that later degrades answers False here but stays published, so audience_scoped listings still consider it.
Order by field: name, created_at, or attention (default: name). attention (BCP-3664) sorts attention-needing servers first — Pending Publish, Connection Error, Pending Credentials, Pending Connection, then Available — tie-broken by name ASC, then id ASC (the id term is what makes the order total, so paging is deterministic); order is ignored for this field. The rank is computed in SQL from DB-derived state, so it can disagree with the Bao-recomputed can_manage_policies the legacy (non-DB-first) listing path returns. Unrecognized values fall back to created_at rather than erroring — this parameter is under the public API stability contract, so the advertised enum narrows generated clients without tightening server-side validation.
name, created_at, attention Order direction: asc or desc (default: asc)
Include service account connections for can_manage_policies computation (does not affect connection_status)
Include connection_status computation (requires Bao calls). Set to false for better performance when connection_status is not needed.
BCP-3661: restrict the listing to servers this user may discover — published AND named by an active allow rule on one of the server's ACTIVE policies. Opt-in, because this same endpoint serves admin surfaces (policy authoring, connector pickers) that must keep seeing every server; filtering those would make a new server impossible to write its first policy for. Set it on end-user surfaces (My Apps) only. NOT gated by the mcp-server-publishing flag — an explicit request is always honoured (a flag-eval outage must not silently serve the unfiltered listing); the rollout gate is whether a surface sends the parameter at all (BCP-3735). Fails closed with HTTP 503 when the visible set cannot be resolved.
BCP-4300: include servers that run locally through the Barndoor CLI (embedded and local catalogs). Omitted, the registry resolves it from the org's local-cli-mcp-tooling flag (fail-closed); an explicit value is always honoured.
Page number (1-based)
x >= 1Number of items per page (max 100)
1 <= x <= 100Filter by connection status: connected, available, pending, error, not_connected. For multiple values, repeat the parameter (e.g., ?connection_status=connected&connection_status=available). 'not_connected' expands to ['pending', 'error', 'available'].
Filter by server status: pending, active, error. For multiple values, repeat the parameter (e.g., ?status=active&status=error)