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, unmetered

Every bookable event type on a workspace: slug, title, duration, location, price. Input: { workspace }.

get_availabilityfree, unmetered

Open 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 call

Book 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 call

Move an existing booking to a new slot. Input: { booking_id, slot_start }. Both sides get the update email.

cancel_booking1 metered call

Cancel 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.