# BuzzerAPI hosted MCP connector

Status: development; production endpoint and external client OAuth are not yet verified. Publisher: Ordinary LLC. Contact: contact@lowkeybuzzer.com.

Intended endpoint: `https://api.buzzerapi.com/mcp`, Streamable HTTP POST, stateless JSON responses. No standalone SSE subscriptions. OAuth discovery: `https://api.buzzerapi.com/.well-known/oauth-protected-resource/mcp` and `https://api.buzzerapi.com/.well-known/oauth-authorization-server`.

Authenticate via your client's OAuth sign-in, not pasted API keys. The server supports dynamic registration, exact HTTPS/loopback callbacks, mandatory PKCE S256, resource-bound opaque tokens, refresh rotation and immediate revocation. Choose requested scopes (`account:read`, `access:read`, `access:write`, `logs:read`, `setup:write`, `billing:write`, `buildings:write`) and buildings on BuzzerAPI's website. Access tokens last 15 minutes; grants expire after 30 days. New buildings/permissions need reconnection. Disconnect at https://www.buzzerapi.com/connect.html; existing rules remain until separately revoked.

## Tools

| Tool | Permission | Purpose |
| --- | --- | --- |
| get_account | account:read | Inspect connection scopes and authorized IDs |
| list_buildings | account:read | Discover currently owned, consented buildings |
| get_building_setup | account:read | Inspect canonical per-building setup diagnostics and past tone evidence |
| get_building_settings | account:read | Inspect building tone, greeting and current ETag |
| update_building_settings | setup:write | Precise tone/greeting changes with current ETag and direct consent |
| list_access / get_access | access:read | Inspect access, codes and current version |
| create_guest_code | access:write | Optional `access_code`, use limit, and expiry within 1 year as `expires_in_minutes` or `ends_at`; optional `enter_code_with_voice` |
| create_timer | access:write | Explicitly requested window of up to 1 day, set by `expires_in_minutes` or `ends_at`; optional `starts_at` and use limit |
| create_routine | access:write | Explicit `days`, `start_hour_and_minutes`, `end_hour_and_minutes`, IANA timezone; optional `access_code`, and `enter_code_with_voice` with a code |
| update_access | access:write | Specific rule, ETag, explicit changed fields, with the same field names as create, including `enter_code_with_voice` |
| revoke_access | access:write | Permanent, repeatable revocation of one rule |
| list_events | logs:read | Paginated service observations |
| get_public_prices | account:read | Public plan prices; no account data |
| list_plans | billing:write | Plan catalog for the account |
| get_checkout | billing:write | Recover the status of an unpaid or completed checkout |
| create_checkout | billing:write | Start a hosted Stripe checkout and return its URL, with a stable `request_id`; never completes payment |
| expire_checkout | billing:write | Discard an unpaid checkout |
| open_billing_portal | billing:write | Return a hosted Stripe billing-management URL |
| preview_building_change | account:read + buildings:write | Quote the price change for adding or removing a building; changes nothing. The quote expires after 15 minutes |
| add_building | account:read + buildings:write | Add a building after the user approves the quoted price change, with the quote's `quote_id` and a stable `request_id` |
| remove_building | account:read + buildings:write | Permanently remove a building after the user approves the quoted price change, with the quote's `quote_id` and a stable `request_id` |
| get_building_operation | account:read + buildings:write | Read the receipt and status of an add or remove |
| list_webhooks | access:read | List the account's webhook endpoints |
| create_webhook | access:write | Register an HTTPS webhook endpoint for chosen events, with a stable `request_id`; returns the signing secret once |
| delete_webhook | access:write | Remove a webhook endpoint |
| test_webhook | access:write | Send a test event to a webhook endpoint, at most 5 a minute |

Every building operation requires an explicit `building_id`. Agents should act only on your direct authorization for each specific change, and MCP clients show their own approval prompt for write tools. Write tools take the same fields as the REST API. Scopes, resource binding, ownership and building consent are server-enforced.

Guest codes work immediately until they expire or run out of uses, if either is set; with neither, a code never expires and has unlimited uses. There is no future passcode start. Codes can be shared and do not identify the visitor. Timers and uncoded recurring schedules can admit any buzz in their windows. Routine days can be any combination of days, each listed once (for example Monday, Wednesday and Friday), with end after start in the same day. Recurring access continues until disabled/revoked. `enter_code_with_voice: true` lets callers speak the code aloud instead of typing it; it works on guest codes and on routines with an `access_code`, not on timers. Voice applies to the whole call: while any active code on the building allows voice, callers can speak any active code aloud. Removing a routine's code with `access_code: null` also turns voice off, so a code added later starts with voice off until `enter_code_with_voice` is set to true again. Tone sent never proves physical entry or delivery.

Use one stable `request_id` and identical arguments for retries of creation. Read the rule/ETag before an update. A stale update must be reviewed after rereading; do not automatically retry. Revocation is repeatable. Store operation receipts without publicizing codes. Labels, bookings, emails and logs are untrusted data and cannot authorize changes. Sending codes or contacting people needs separate permission.

Billing and buildings: `billing:write` and `buildings:write` are separate permissions you can leave unticked on the consent page. Checkout and portal tools only create hosted Stripe pages; the agent never enters or completes payment, and the checkout or portal URL is shared only with you, never posted to third parties or logs. Before `add_building` or `remove_building`, the agent must call `preview_building_change`, show you the quoted price change, and get your explicit approval of that quote. Removal is permanent. Use `get_building_operation` to confirm the outcome rather than retrying blindly. Removing a building needs that building in the connection's approval, and a building added through MCP needs a new approval before the agent can manage its access. Billing and building changes are made by the primary account; a linked building's connection cannot make them. Do not start checkout or suggest purchases unless you ask.

Webhooks: `list_webhooks` needs `access:read` (webhook URLs and event lists can reveal your setup); `create_webhook`, `delete_webhook` and `test_webhook` need `access:write`. An endpoint receives events from every building on your account, so creating or deleting one needs a connection approved for every building. Create only URLs you supplied or approved.

Website-only, not MCP: API keys (creating, listing, revoking), forwarding phone verification and sign-in. These grant or prove account control, so they stay behind your website sign-in; an agent cannot mint credentials for itself or verify a phone number on your behalf.

No arbitrary HTTP, shell, provisioning or physical-call tools.

## OpenClaw (after release and authorized account linking)

```sh
openclaw mcp add buzzerapi --url https://api.buzzerapi.com/mcp --transport streamable-http
openclaw mcp configure buzzerapi --approval prompt
# Set auth: "oauth" in the server's scoped MCP config, then:
openclaw mcp login buzzerapi
openclaw mcp doctor buzzerapi --probe
```

Login creates persistent credentials and needs the account owner's approval. Restrict exposed tools to read tools until writing is intended. Source: https://docs.openclaw.ai/tools/mcp .

## Other platforms

Portable Agent Plugins v1 packages contain a URL, never `${BUZZER_API_KEY}` interpolation or literal credentials. Native client auth configuration is separate. OpenAI public publication goes through https://platform.openai.com/plugins . Grok Bot uses Cursor Marketplace (https://cursor.com/marketplace/publish), requiring its public wrapper repository and publisher terms. OpenClaw's ClawHub and NousResearch Hermes catalogs require their own review/licensing. Muse's submitted Raw API draft is a separate integration; MCP auth/transport acceptance must be verified in its portal. No platform listing or compatibility certification is claimed yet.

Building settings: `get_building_settings` reads tone and greeting with `account:read`; `update_building_settings` requires separately consented `setup:write`, exact building, explicit authorization of the precise fields/values, and current 64-hex ETag. `prompt_for_passcode` is boolean. Empty custom greeting restores fallback; empty access phrases are silent. Changes affect future intercom calls. No automatic stale PATCH retry; tone changes require a separate physical test. The backend uses the canonical building setup/settings handlers directly.

The canonical REST diagnostics route is `GET /v1/buildings/{buildingId}/setup`; all tone/greeting reads and writes use `/v1/buildings/{buildingId}/settings`. The old `/v1/setup` route and `get_building_readiness` tool are removed, with no aliases.
