Enterprise Agent Access docs.
Everything an agent needs to book, reschedule, and cancel meetings on Buildout Schedule: one endpoint, five tools, a bearer token, and a monthly cap you can read off the response.
Auth
A workspace owner mints an enterprise token under Dashboard → Settings → MCP access. The plaintext shows once; store it in your secret manager. Every write call sends it as Authorization: Bearer bos_mcp_…. Reads (event types, availability) need no token. Rotating a token mints a fresh one and revokes the old in the same action; the old token fails on its next request.
Endpoint
One URL, JSON-RPC 2.0 over HTTP POST, MCP Streamable HTTP transport. MCP-native clients can also connect directly:
https://buildoutschedule.com/api/mcp
# MCP-native clients (Claude Code shown):
claude mcp add --transport http buildout-schedule https://buildoutschedule.com/api/mcp \
--header "Authorization: Bearer bos_mcp_YOUR_TOKEN"Tools
list_public_event_typesfree, unmeteredEvery bookable event type on a workspace: slug, title, duration, location, price. Input: { workspace }.
get_availabilityfree, unmeteredOpen slots for one event type over a date range, from the same engine the booking page uses. Input: { workspace, event_type, start_date?, days? }. Free and unmetered: check before every booking.
create_booking1 metered callBook a returned slot. Input: { event_type, slot_start, attendee_name, attendee_email, attendee_time_zone, notes? }. The server re-checks the slot at write time.
reschedule_booking1 metered callMove an existing booking to a new slot. Input: { booking_id, slot_start }. Both sides get the update email.
cancel_booking1 metered callCancel as the host. Input: { booking_id }. Paid bookings refund in full per the host-cancel policy.
The cap
Each metered call draws one unit from the monthly cap, atomically, before the tool runs. The counter resets on the billing cycle date. Once 90% is consumed, every response carries X-BS-Agent-Cap-Warning: 90-percent-consumed. At the cap, metered calls return HTTP 429 with this body and nothing books:
HTTP/1.1 429 Too Many Requests
{
"error": "agent_cap_exceeded",
"cap": 10000,
"used": 10000,
"resets_at": "2026-09-01T00:00:00.000Z",
"upgrade_url": "https://buildoutschedule.com/enterprise-agent-access"
}A paused subscription answers the same way with agent_access_paused, and a token whose workspace holds no active cap answers agent_cap_missing. Availability reads keep working in every case.
curl
# 1. List a workspace's event types (no auth)
curl -s https://buildoutschedule.com/api/mcp -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "list_public_event_types",
"arguments": { "workspace": "acme" } }
}'
# 2. Get availability (no auth, unmetered — check freely)
curl -s https://buildoutschedule.com/api/mcp -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": { "name": "get_availability",
"arguments": { "workspace": "acme",
"event_type": "intro-call", "days": 7 } }
}'
# 3. Create a booking (enterprise token, 1 metered call)
curl -s https://buildoutschedule.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer bos_mcp_YOUR_TOKEN' -d '{
"jsonrpc": "2.0", "id": 3, "method": "tools/call",
"params": { "name": "create_booking", "arguments": {
"event_type": "intro-call",
"slot_start": "2026-08-25T15:00:00Z",
"attendee_name": "Jordan Wells",
"attendee_email": "jordan@example.com",
"attendee_time_zone": "America/Chicago" } }
}'
# 4. Reschedule (1 metered call)
curl -s https://buildoutschedule.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer bos_mcp_YOUR_TOKEN' -d '{
"jsonrpc": "2.0", "id": 4, "method": "tools/call",
"params": { "name": "reschedule_booking", "arguments": {
"booking_id": "BOOKING_UUID",
"slot_start": "2026-08-26T16:00:00Z" } }
}'
# 5. Cancel (1 metered call)
curl -s https://buildoutschedule.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer bos_mcp_YOUR_TOKEN' -d '{
"jsonrpc": "2.0", "id": 5, "method": "tools/call",
"params": { "name": "cancel_booking",
"arguments": { "booking_id": "BOOKING_UUID" } }
}'Python
import requests
ENDPOINT = "https://buildoutschedule.com/api/mcp"
TOKEN = "bos_mcp_YOUR_TOKEN"
def call_tool(name, arguments, authed=False):
headers = {"Content-Type": "application/json"}
if authed:
headers["Authorization"] = "Bearer " + TOKEN
res = requests.post(ENDPOINT, headers=headers, json={
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": name, "arguments": arguments},
})
if res.status_code == 429:
body = res.json() # error, cap, used, resets_at, upgrade_url
raise RuntimeError("cap hit, resets " + body["resets_at"])
if res.headers.get("X-BS-Agent-Cap-Warning"):
print("warning: 90% of the monthly cap is consumed")
return res.json()
# Unmetered read, then one metered write
slots = call_tool("get_availability",
{"workspace": "acme", "event_type": "intro-call"})
booked = call_tool("create_booking", {
"event_type": "intro-call",
"slot_start": "2026-08-25T15:00:00Z",
"attendee_name": "Jordan Wells",
"attendee_email": "jordan@example.com",
"attendee_time_zone": "America/Chicago",
}, authed=True)TypeScript
const ENDPOINT = "https://buildoutschedule.com/api/mcp";
const TOKEN = "bos_mcp_YOUR_TOKEN";
async function callTool(name: string, args: object, authed = false) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: {
"Content-Type": "application/json",
...(authed ? { Authorization: "Bearer " + TOKEN } : {}),
},
body: JSON.stringify({
jsonrpc: "2.0", id: 1, method: "tools/call",
params: { name, arguments: args },
}),
});
if (res.status === 429) {
const body = await res.json(); // error, cap, used, resets_at, upgrade_url
throw new Error("cap hit, resets " + body.resets_at);
}
if (res.headers.get("X-BS-Agent-Cap-Warning")) {
console.warn("90% of the monthly cap is consumed");
}
return res.json();
}
const slots = await callTool("get_availability", {
workspace: "acme", event_type: "intro-call",
});
const booked = await callTool("create_booking", {
event_type: "intro-call",
slot_start: "2026-08-25T15:00:00Z",
attendee_name: "Jordan Wells",
attendee_email: "jordan@example.com",
attendee_time_zone: "America/Chicago",
}, true);Ready to point an agent at it?
Tiers and caps are on the Enterprise Agent Access page. Past a million bookings a month, email chase@whited.consulting.