Skip to main content
Glama

Create a bookable offering

create_booking_unit

Adds something people can book — appointments on a weekly schedule ("slots"), or stays ("nights"). It is not on the page until a booking block places it there with put_page. The two modes take different config fields and mixing them is refused; if a field is wrong the error says exactly which, so read it and try again. Show the name, the mode, the price and currency, and the TIMEZONE — a wrong timezone moves every slot. Before calling, show the person exactly what will be saved and get their explicit yes in the conversation. Never assume a currency.

Input Schema

NameRequiredDescriptionDefault
modeYes"slots" for appointments of a fixed length on a weekly schedule; "nights" for stays. They take different config fields and mixing them is refused.
nameYesWhat the offering is called.
configYestimezone and pricing are always required. The rest depends on the mode.
statusNoDefaults to active.
businessYesThe page handle, as it appears in keepp.link/<handle>.

Output Schema

NameRequiredDescriptionDefault
nameNo
createdYesFalse when the person declined, and nothing was created.
bookingUnitIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / config / properties / googleConnectorId / description
      Previous value: -"The Google account whose calendar this offering checks: an account id from list_connectors. New bookings are refused at any time that calendar shows as busy, bookings are added to that account's Keepp Events calendar, and Google Meet links are made there. Leave it out to check no calendar. Required when meeting.provider is \"google_meet\"."New value: +"The Google account whose calendar this offering checks: an account id from list_connectors. Appointments are refused at any time that calendar shows as busy, and a night of a stay when the calendar is busy for that whole day. Bookings are added to that account's Keepp Events calendar, and Google Meet links are made there. Leave it out to check no calendar. Required when meeting.provider is \"google_meet\"."
  2. Changed1 schema field changed
    • addedInput schema / properties / config / properties / googleConnectorId
      Added value: +{
      +  "description": "The Google account whose calendar this offering checks: an account id from list_connectors. New bookings are refused at any time that calendar shows as busy, bookings are added to that account's Keepp Events calendar, and Google Meet links are made there. Leave it out to check no calendar. Required when meeting.provider is \"google_meet\".",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / config / properties / pricing / description
      Previous value: -"How it is paid for. \"stripe\" takes real money and needs Stripe connected; \"display\" only shows a price; \"free\" is no charge. Free and display need a Pro plan. Ask the person which currency they charge in before suggesting a price — never assume US dollars, and say the currency whenever you quote an amount."New value: +"How it is paid for. \"stripe\" takes real money and needs Stripe connected; \"display\" only shows a price; \"free\" is no charge. Ask the person which currency they charge in before suggesting a price — never assume US dollars, and say the currency whenever you quote an amount."
  4. First observed

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only tell the agent this is a non-idempotent, open-world, non-destructive write. The description adds substantial unannotated behavior: the created offering is invisible until put_page links it, mixed mode/config combinations are rejected, validation errors name the offending field and are safe to retry, and a wrong timezone silently shifts all slots. That is exactly the kind of consequence-level disclosure annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and mode split, then ordered by risk (publication, mode config, timezone, confirmation). Dense but every sentence carries an operational instruction; the imperative tone is appropriate for a write tool, though the confirmation and currency guidance is repeated in both the description and the pricing schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Rich nested schema plus an output schema means the description need not explain return values, and it correctly focuses on preconditions, failure behavior, and user-confirmation duties. The one gap is that it never surfaces the mode-dependent required fields (schedule/durationMinutes in slots mode) at the description level, leaving mode branching entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds decision-relevant emphasis the schema buries in prose — the timezone is the seller's zone and drives every slot, and currency must be asked for, never defaulted to USD. It does not restate the mode-specific required fields (durationMinutes, schedule) at the top level, so the agent must still read the schema for mode branching.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Adds something people can book') and immediately disambiguates the two modes: appointments on a weekly schedule vs. stays. It also distinguishes itself from the sibling that publishes it ('It is not on the page until a booking block places it there with put_page'), so an agent can separate create_booking_unit from put_page/update_booking_unit without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition ('not on the page until put_page') and an explicit gating step ('show the person exactly what will be saved and get their explicit yes'). It does not name update_booking_unit as the alternative for modifying an existing offering, so the when-to-use story is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources