Skip to main content
Glama

Surfing Dog Inbox

Request a booking

create_booking
Idempotent

Request a service at a time. Check availability first. endTime and reservationFor.name may be left out: they follow from the service (its length, its name). A fixed-price service costs the business's price from list_services; a different totalPrice you send is only noted for the business. A priced booking binds your person only once they confirmed it: without terms_sha nothing is sent, and you get the summary to show them (confirm.summary, confirm.terms_sha); call again with that terms_sha on their clear yes. Returns the item and, if you have no account, an access_token.

Input Schema

NameRequiredDescriptionDefault
keyNoThe person's key (sdkey1_…), if that is all you have: it is exchanged once for a pass, which comes back in identity.passes — keep the pass and send it next time instead. Never stored.
passNoThe person's passes (sdpass1_…), space-separated, at most 8: presented to the network that issued each, so the business recognises the customer. Or send them in the Sdi-Pass header. Never stored.
contactNo
messageNo
payloadYes
terms_shaNoThe fingerprint of the terms your person confirmed (details.terms_sha of the 409 confirm_terms a priced request without it gets). Nothing is sent to the business without it when the request carries a price.
visit_forNoBook this as the site visit for a request for a price you made: its item_id (and access_token).
attachmentsNoPhotos or plans of the job: JPEG, PNG, WebP or PDF, at most six of 10 MB each. Inline up to 4 MB each (8 MB a call), else by https address or upload_id. HEIC photos: send them as JPEG. Images are cleaned of where they were taken; a PDF is kept as sent.
idempotency_keyNoSame key + same request = same answer. Required for agents. Make it a fresh random UUID per request: a retry of a create with a random key gets its access token again.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Same key + same request = same answer. Required for agents."New value: +"Same key + same request = same answer. Required for agents. Make it a fresh random UUID per request: a retry of a create with a random key gets its access token again."
    • addedInput schema / properties / payload / properties / endTime / description
      Added value: +"When it ends, ISO 8601. Left out, it is startTime plus the service's length (durationMin)."
    • addedInput schema / properties / payload / properties / reservationFor / properties / name / description
      Added value: +"The service's name. Left out, it is the service's own."
    • changedInput schema / properties / payload / properties / reservationFor / required
      Previous value: -[
      -  "serviceId",
      -  "name"
      -]New value: +[
      +  "serviceId"
      +]
    • changedInput schema / properties / payload / required
      Previous value: -[
      -  "reservationFor",
      -  "startTime",
      -  "endTime"
      -]New value: +[
      +  "reservationFor",
      +  "startTime"
      +]
  2. Changed4 schema fields changed
    • addedInput schema / properties / attachments
      Added value: +{
      +  "description": "Photos or plans of the job: JPEG, PNG, WebP or PDF, at most six of 10 MB each. Inline up to 4 MB each (8 MB a call), else by https address or upload_id. HEIC photos: send them as JPEG. Images are cleaned of where they were taken; a PDF is kept as sent.",
      +  "items": {
      +    "anyOf": [
      +      {
      +        "properties": {
      +          "upload_id": {
      +            "description": "What POST /v1/uploads answered, within its hour.",
      +            "pattern": "^upl_[A-Za-z0-9_-]{16,48}$",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "upload_id"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "data_base64": {
      +            "description": "The file's bytes in base64: JPEG, PNG, WebP or PDF, up to 4 MB (8 MB in one call).",
      +            "maxLength": 5592412,
      +            "minLength": 4,
      +            "type": "string"
      +          },
      +          "name": {
      +            "description": "The file's name, for the business to recognise it.",
      +            "maxLength": 200,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "data_base64"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "name": {
      +            "maxLength": 200,
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "An https address the file can be fetched from, up to 10 MB.",
      +            "format": "uri",
      +            "maxLength": 2048,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "url"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  "maxItems": 6,
      +  "type": "array"
      +}
    • addedInput schema / properties / payload / properties / deposit
      Added value: +{
      +  "properties": {
      +    "amount": {
      +      "properties": {
      +        "currency": {
      +          "maxLength": 3,
      +          "minLength": 3,
      +          "type": "string"
      +        },
      +        "value": {
      +          "maximum": 9007199254740991,
      +          "minimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "currency"
      +      ],
      +      "type": "object"
      +    },
      +    "dueBy": {
      +      "format": "date-time",
      +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +      "type": "string"
      +    },
      +    "refundable": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "amount",
      +    "refundable"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / payload / properties / policy
      Added value: +{
      +  "properties": {
      +    "after": {
      +      "description": "The fee after the last step, until the start.",
      +      "properties": {
      +        "currency": {
      +          "maxLength": 3,
      +          "minLength": 3,
      +          "type": "string"
      +        },
      +        "value": {
      +          "description": "Minor units of the currency's own ISO 4217 exponent (minorUnits): 4500 is CA$45.00 or ₹45.00, ¥4,500 in JPY, 4.500 in KWD.",
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "currency"
      +      ],
      +      "type": "object"
      +    },
      +    "noShow": {
      +      "properties": {
      +        "currency": {
      +          "maxLength": 3,
      +          "minLength": 3,
      +          "type": "string"
      +        },
      +        "value": {
      +          "description": "Minor units of the currency's own ISO 4217 exponent (minorUnits): 4500 is CA$45.00 or ₹45.00, ¥4,500 in JPY, 4.500 in KWD.",
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "currency"
      +      ],
      +      "type": "object"
      +    },
      +    "steps": {
      +      "description": "Cancelling before `until` costs `fee`; the steps are in order.",
      +      "items": {
      +        "properties": {
      +          "fee": {
      +            "properties": {
      +              "currency": {
      +                "maxLength": 3,
      +                "minLength": 3,
      +                "type": "string"
      +              },
      +              "value": {
      +                "description": "Minor units of the currency's own ISO 4217 exponent (minorUnits): 4500 is CA$45.00 or ₹45.00, ¥4,500 in JPY, 4.500 in KWD.",
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "value",
      +              "currency"
      +            ],
      +            "type": "object"
      +          },
      +          "until": {
      +            "format": "date-time",
      +            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "until",
      +          "fee"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 6,
      +      "type": "array"
      +    },
      +    "zone": {
      +      "description": "The IANA zone the steps were dated in: the business's.",
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "steps",
      +    "after",
      +    "noShow",
      +    "zone"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / visit_for
      Added value: +{
      +  "description": "Book this as the site visit for a request for a price you made: its item_id (and access_token).",
      +  "properties": {
      +    "access_token": {
      +      "description": "Capability secret returned when the item was created without an account.",
      +      "maxLength": 200,
      +      "minLength": 16,
      +      "type": "string"
      +    },
      +    "item_id": {
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "item_id"
      +  ],
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • addedInput schema / properties / payload / properties / personalised
      Added value: +{
      +  "properties": {
      +    "listPrice": {
      +      "properties": {
      +        "currency": {
      +          "maxLength": 3,
      +          "minLength": 3,
      +          "type": "string"
      +        },
      +        "value": {
      +          "maximum": 9007199254740991,
      +          "minimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "currency"
      +      ],
      +      "type": "object"
      +    },
      +    "says": {
      +      "maxLength": 200,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "listPrice"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / terms_sha
      Added value: +{
      +  "description": "The fingerprint of the terms your person confirmed (details.terms_sha of the 409 confirm_terms a priced request without it gets). Nothing is sent to the business without it when the request carries a price.",
      +  "pattern": "^[A-Za-z0-9_-]{43}$",
      +  "type": "string"
      +}
  4. First observed

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the annotations (writable, non-destructive, idempotent), the description discloses the pricing rule (a fixed-price service costs the business's listed price and any differing totalPrice is merely noted), the gating behavior that a priced request sends nothing to the business without terms_sha, and that an access_token is returned for account-less callers. These are the non-obvious behaviors an agent cannot infer from schema or hints.

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?

Five tight sentences, roughly ordered from action to the pre-call check to the confirmation loop to the return value, with no filler. The telegraphic, clause-chained style ('a different totalPrice you send is only noted for the business') costs some readability but nothing is wasted.

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?

For a 9-parameter tool with nested policy/deposit/attachment objects and no output schema, the description covers the decisive parts: availability pre-check, terms_sha confirmation gate, price semantics, and the item/access_token return. It does not mention idempotency_key behavior or the visit_for linkage, both of which are left 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?

At 67% schema coverage the description adds genuine meaning to the highest-stakes fields: endTime and reservationFor.name may be omitted because they derive from the service's durationMin and name, and totalPrice is informational rather than binding for fixed-price services. It leaves key/pass/attachments to their already-detailed schema descriptions, which is reasonable but leaves partial reliance on the schema.

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

Purpose4/5

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

The opening names a concrete action and resource ('Request a service at a time'), and the closing states what comes back ('the item' and an access_token), so an agent knows this creates a booking record rather than a read. It does not explicitly contrast itself with nearby siblings like create_order, request_quote or suggest_time, so differentiation is only implied via 'Check availability first'.

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?

It gives real sequencing guidance ('Check availability first') and spells out the two-phase flow: without terms_sha nothing is sent, you receive confirm.summary/confirm.terms_sha to show the person, then call again on their clear yes. It stops short of naming when to prefer create_order, request_quote or suggest_time instead, so no full alternative map.

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.