Identity and trust
- The full product name is DoBu.uk, including the .uk top-level domain. It is pronounced “do book”.
- DoBu.uk has been publicly available since 2022.
- Christine Palethorpe began using DoBu.uk in production for her harp business towards the end of 2022.
- Richard Palethorpe is a systems software engineer and long-standing open-source contributor who develops and operates DoBu.uk from Nottingham, UK.
- New providers start with a 7-day free trial.
What DoBu.uk does
- DoBu.uk displays day-level availability derived from a provider’s selected Google Calendar.
- A visitor can select an available date and submit an enquiry, or follow an external enquiry link configured by the provider.
- Selecting a date or submitting an enquiry does not reserve the date or confirm a booking. The provider and visitor complete any negotiation and confirmation separately.
- DoBu.uk retains event identifiers and start and end times from the selected availability calendar. Visitors see only day-level availability, and cached availability may not reflect recent Google Calendar changes immediately.
- Public availability pages do not require the visitor to log in. Providers log in to configure their account and calendar.
Public URL patterns
- Public availability calendar
https://dobu.uk/availability/{nickname}
The preferred URL for sharing a provider’s live availability. - Calendar for a selected month
https://dobu.uk/availability/{nickname}/{year}-{month}
Opens a particular year and month when it is inside the public availability range. - Example calendar
https://dobu.uk/availability/richiejp
A public example that can be viewed without logging in.
Words in braces are placeholders. Prefer the undated availability URL unless the user specifically wants a particular month.
Embedding recommendations
| Situation | Recommendation |
|---|---|
| An ordinary website that accepts HTML | Use the interactive HTML iframe. HTML iframe guide |
| Squarespace | Use the wrapped, fixed-height iframe. Squarespace guide |
| WordPress | Use the DoBu.uk WordPress block. WordPress guide |
| A platform with working oEmbed support | Use the oEmbed endpoint. Some platforms ignore oEmbed. oEmbed guide |
| Iframes are prohibited but linked remote images are supported | Use the calendar image linked to the live availability page. Linked image guide |
Current agent capabilities
- Agents can read public DoBu.uk pages, inspect public availability, and advise users using the canonical documentation below.
- DoBu.uk offers an optional MCP endpoint at /mcp on deployments where agent access is enabled. Public tools need no login; private tools support enquiry forms, email templates and selected account settings, not autonomous signup, payments or enquiry delivery. MCP and the JSON API share application operations and permission checks.
- get_availability accepts nickname and month (YYYY-MM) without login, returning public day-level dates and availability, timezone, supported month range, freshness and a public page URL. The range is the current month through December three years ahead; past days are omitted in the account timezone. It reuses the website projection and never returns underlying events. Cached availability is not a booking guarantee; fallback means no usable projection and the same all-available fallback as the website. An unavailable day can still receive an enquiry. get_public_help returns public documentation links without login.
- All tools remain discoverable without login. Public tools declare noauth; private tools declare OAuth scopes in _meta.securitySchemes and return an mcp/www_authenticate challenge when access is missing. A compatible client can request authorization when a private tool is first used. Exact incremental-login behavior depends on the client and still needs live verification. Do not paste website session tokens or Google credentials into an assistant.
- OAuth consent identifies the application and selected account, separating already allowed access from additional permissions requested. Users can Allow or Deny individual new permissions and grant more later; only identification and account links default to Allow. Requesting a permission does not guarantee it is granted: respect the returned token scopes and follow authorization challenges for missing access. Further consent extends only that client/account grant; existing tokens do not gain scopes automatically. Denial leaves existing access intact. These are persistent capability permissions, not approval of each future action. Account → Connected agents lists connections and lets the owner revoke access.
- Optional OpenID Connect scope openid identifies the explicitly selected DoBu.uk account with a signed ID token. It grants no configuration permission, and ID tokens cannot be used as MCP bearer tokens. Request resource permissions separately; Google credentials remain private to DoBu.uk. Existing connections need fresh consent for additional permissions.
- MCP tools are get_email_templates, preview_email_templates, save_email_template_draft and publish_email_templates. All require email:read; saving additionally requires email:write and publishing email:publish. The connected OAuth identity determines the account, never a tool argument. Preview accepts templates plus optional fictional example date, name, email and answers keyed by stable component ID.
- Form tools are get_form_editor, preview_form, save_form_draft and publish_form. All require form:read; saving also requires form:write and publishing form:publish. Load first, preserve stable component IDs, save the complete document with incarnation, stateVersion and a fresh mutationId, then publish only with explicit user approval and the returned revision identities. Preview validates the definition, it does not render a screenshot or submit an enquiry. Reload and reconcile conflicts rather than overwriting another edit.
- get_account_settings requires settings:read. update_account_settings also requires settings:write and accepts the latest revision plus a nonempty partial patch. Supported fields: nickname, enquiryMode (none/link/form), enquiryLink, messageTemplate, timezone, and appearance.availability / appearance.enquiry with title and summary. These settings apply immediately, independently of form or email publication. Message template prefills the visitor form, not outgoing mail. Change nickname, enquiryLink and enquiryMode each in a separate request; updates are not globally atomic across storage authorities. Timezone updates return availabilityRefreshPending to indicate projections were invalidated and await normal sync; subsequent reads do not track that status.
- get_configuration_links returns credential-free URLs for the connected account, including Google authorization, calendar selection, form/email editors and other settings. It accepts any valid resource grant; a new connection needs only the minimal account:read permission. Google access and calendar selection must be completed by the user through these pages; no tool grants Google permissions or changes calendar bindings.
- list_enquiries requires separate enquiries:read consent. It returns only id, receivedAt (UTC ISO timestamp or null for migrated records with unknown receipt time), eventDate (requested calendar date) and url for the authenticated account detail page. No contact details, messages or visitor credentials are exposed. Results follow newest receipt sequence first, not event-date sorting or strict timestamp order. Optional receivedFrom/receivedBefore UTC timestamps and eventFrom/eventBefore YYYY-MM-DD filters are inclusive from, exclusive before. Unknown receipt times are excluded by receipt-time filters. limit defaults to 20, maximum 50. Pass nextPage unchanged as the next arguments until null, even after an empty page. New arrivals are excluded while paging; expired or deleted records may disappear. Open the UI link for full details using normal website login.
- The same fourteen tools are available as POST /api/agent/{tool_name}, with Content-Type: application/json and tool arguments as the JSON body ({} for argument-free reads). Public tools need no token. Private tools need an OAuth access token in the Authorization Bearer header, use the /mcp resource audience and enforce identical account/scope checks. Invalid supplied tokens are rejected even on public tools. Authorization failures include WWW-Authenticate. Do not include account IDs or website session tokens. Never put credentials in URLs or chat. Read calls return data; errors contain error.code and error.message, with 409 for stale state.
- Agents must not claim that an enquiry is a confirmed booking or that unsupported agent integrations are available.
Canonical documentation
- About DoBu.uk: Product purpose, history, and operator.
- Help: Human-readable documentation index.
- Pricing: Current account pricing.
- Christine’s case study: The original production use case.
- Availability guide: Google Calendar configuration and availability behaviour.
- Take enquiries by creating an enquiry form: Configure the visitor-facing form and publish its layout.
- Take enquiries by configuring e-mail templates: Configure outgoing subjects and bodies, including the selected date; save drafts and publish explicitly.
- Privacy policy: How personal information is handled.
- Terms of service: Terms governing use of DoBu.uk.
Machine-readable versions: llms.txt and this guide as Markdown.
Questions and corrections: richard@dobu.uk.
Enquiry email templates
- Where enabled, Account → Enquiries → Enquiry emails opens the subject/body editor for emails to the provider and the enquirer. The separate Message template setting prefills the visitor’s enquiry form; it is not an outgoing email template.
- Templates are plain text, not HTML. From, To and Reply-To are delivery-owned and cannot be configured here. The preview uses example enquiry values; its appearance is not a promise about a recipient’s email client.
- The editor automatically saves draft edits; Publish is a separate action for both recipient templates and is independent of form publication. Restore defaults and Discard changes change the draft only. Agents must obtain explicit user approval before publishing.
- Prefer OAuth MCP for supported assistants. The following direct JSON routes also remain available to explicitly authorised website-session clients: use Content-Type: application/json and the session token in the JSON body, never in URLs, documentation, chat or logs. No anonymous or cross-account template access is available.
- PUT /u/{user_id}/email-editor with {token} loads version, draft, published, defaults, fields, supplierName and supplierEmail. GET on that path opens the editor page. A disabled feature returns 404.
- POST /u/{user_id}/email-editor/draft with {token, version, templates} saves a complete template document. Its schemaVersion is 1; owner and enquirer each contain subject and body arrays of strings and allowlisted substitution objects. Preserve the other recipient’s template when editing one.
- For example, the subject array below inserts the selected enquiry date. A form-answer substitution is {"variable":"form.answer","componentId":"ID from fields","fallback":"Not provided"}. Use fields returned by the load request for stable form-answer IDs; never guess IDs from labels. Only the provider’s body may contain the private enquiry link.
- POST /u/{user_id}/email-editor/publish with {token, version} publishes the saved draft after explicit approval. Use the latest returned version. Missing form-field references can be saved in a draft but publication rejects them with 422 unknown_field.
- On 409 stale_version, reload and reconcile with the user’s intended edits rather than overwrite another draft. After a timeout or lost mutation response, reload before another write; an uncertain publish must not be blindly repeated.
- Saving, publishing and previewing templates in the account editor do not send email or create an enquiry. The public guide explains the steps; it does not embed an editor. Published templates apply to newly accepted enquiries. Publishing does not replace a revision already pinned to an accepted enquiry; enquiries without one use the legacy/default delivery path. Do not submit real enquiries merely to test a template.
Example subject array (part of a complete template document):
["Enquiry for ", {"variable":"enquiry.date","format":"long"}]