Zenbooker MCP by usefulapi

Read Zenbooker jobs, customers, invoices and timeslots; add customers and job notes.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
95%
Naming quality
77%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • LOWTool 'zenbooker_list_recurring_bookings' name length outside 3-30 rangein zenbooker_list_recurring_bookings
  • LOWTool 'zenbooker_get_recurring_booking' name length outside 3-30 rangein zenbooker_get_recurring_booking
  • LOWTool 'zenbooker_list_service_requests' name length outside 3-30 rangein zenbooker_list_service_requests

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~6,801Tokens (tool definitions)
~2.5 KBTypical response size
Significant attention impact (5.31% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "zenbooker": {
      "url": "https://zenbooker.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://zenbooker.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (21)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢zenbooker_list_jobs(customer, assigned, territory, recurring_booking, status, ...)

List jobs (booked appointments), by start time by default, with filters: customer id, assigned team member id, territory id, recurring booking id, status, canceled flag, creation time and scheduled start window. Returns { results, count, has_more, next_cursor }; pass next_cursor as cursor for the next page. GET /v1/jobs.

Input Schema

{
  "type": "object",
  "properties": {
    "customer": {
      "description": "Only jobs of this customer id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "assigned": {
      "description": "Only jobs assigned to this team member (service provider) id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "territory": {
      "description": "Only jobs in this service territory id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "recurring_booking": {
      "description": "Only jobs that belong to this recurring booking id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "status": {
      "description": "Only jobs with this status.",
      "type": "string",
      "enum": [
        "Scheduled",
        "En-route",
        "Started",
        "Complete"
      ]
    },
    "canceled": {
      "description": "true = only canceled jobs, false = only jobs that are not canceled.",
      "type": "boolean"
    },
    "start_date_min": {
      "description": "Only jobs scheduled to start on or after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "start_date_max": {
      "description": "Only jobs scheduled to start on or before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_by": {
      "description": "Sort field (default start_time).",
      "type": "string",
      "enum": [
        "start_time",
        "creation_date"
      ]
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_job(job_id)

One job by id: appointment time, status, customer, service address, services and fields, assigned providers, notes and invoice summary. GET /v1/jobs/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "job_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴zenbooker_add_job_note(job_id, text)

WRITE: add an internal note (text) to a job. Notes are appended, never replaced, and cannot be deleted through this server, so check the job first. POST /v1/jobs/{id}/notes.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    },
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 5000,
      "description": "The note text."
    }
  },
  "required": [
    "job_id",
    "text"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_recurring_bookings(status, customer, assigned, territory, created_after, ...)

List recurring bookings (repeating job series), by status (active or canceled), customer id, assigned team member id, territory id or creation time. Max 40 per page. Returns { results, count, has_more, next_cursor }. GET /v1/recurring.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "description": "Only recurring bookings with this status.",
      "type": "string",
      "enum": [
        "active",
        "canceled"
      ]
    },
    "customer": {
      "description": "Only recurring bookings of this customer id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "assigned": {
      "description": "Only recurring bookings assigned to this team member id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "territory": {
      "description": "Only recurring bookings in this service territory id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-40 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 40
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_recurring_booking(recurring_booking_id)

One recurring booking by id: first job date, job count, time slot, status, territory, service, pricing and its job ids. GET /v1/recurring/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "recurring_booking_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "recurring_booking_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_customers(name, email, phone, location, radius, ...)

List or search customers by name, email or phone, by creation time, or by default address near a place (location + radius in miles). Returns { results, count, has_more, next_cursor }. GET /v1/customers.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Search by customer name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "email": {
      "description": "Search by customer email.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "phone": {
      "description": "Search by phone number.",
      "type": "string",
      "minLength": 1,
      "maxLength": 60
    },
    "location": {
      "description": "A place or address; finds customers whose default address is near it (geocoded by Zenbooker).",
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "radius": {
      "description": "Search radius in miles, used with location.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_customer(customer_id)

One customer by id: contact details, notes, addresses, job and recurring booking ids and linked Stripe customer. GET /v1/customers/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "customer_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴zenbooker_create_customer(name, phone, email)

WRITE: create a new customer record in Zenbooker (name required; phone and email optional). It does not look for an existing customer, so search with zenbooker_list_customers first to avoid duplicates. POST /v1/customers.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "The customer's name."
    },
    "phone": {
      "description": "The customer's default phone number.",
      "type": "string",
      "minLength": 1,
      "maxLength": 60
    },
    "email": {
      "description": "The customer's email address.",
      "type": "string",
      "minLength": 3,
      "maxLength": 200
    }
  },
  "required": [
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_invoices(status, customer, territory, created_after, created_before, ...)

List invoices, optionally by status (draft, unpaid, partial_paid, paid, void), customer id, territory id or creation time. Each invoice has line items, totals, amount paid and due and its transactions. Returns { results, count, has_more, next_cursor }. GET /v1/invoices.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "description": "Only invoices in this status (default: any status).",
      "type": "string",
      "enum": [
        "draft",
        "unpaid",
        "partial_paid",
        "paid",
        "void"
      ]
    },
    "customer": {
      "description": "Only invoices of this customer id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "territory": {
      "description": "Only invoices in this service territory id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_by": {
      "description": "Sort field (default creation_date).",
      "type": "string",
      "enum": [
        "creation_date",
        "total_paid",
        "total_due"
      ]
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_invoice(invoice_id)

One invoice by id: recipient, line items, discounts, tax, totals, amount paid and due, status and transactions. GET /v1/invoices/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "invoice_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_transactions(type, payment_method, status, customer, territory, ...)

List payment transactions, optionally by type (stripe_payment, external_transaction), payment method, status (succeeded, failed, voided), customer id, territory id, creation time or payment date. Returns { results, count, has_more, next_cursor }. GET /v1/transactions.

Input Schema

{
  "type": "object",
  "properties": {
    "type": {
      "description": "Only transactions of this type.",
      "type": "string",
      "enum": [
        "stripe_payment",
        "external_transaction"
      ]
    },
    "payment_method": {
      "description": "Only transactions paid by this method.",
      "type": "string",
      "enum": [
        "stripe",
        "credit_card",
        "check",
        "cash",
        "custom"
      ]
    },
    "status": {
      "description": "Only transactions in this status.",
      "type": "string",
      "enum": [
        "succeeded",
        "failed",
        "voided"
      ]
    },
    "customer": {
      "description": "Only transactions of this customer id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "territory": {
      "description": "Only transactions in this service territory id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "transaction_date_after": {
      "description": "Only transactions dated after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "transaction_date_before": {
      "description": "Only transactions dated before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_by": {
      "description": "Sort field (default creation_date).",
      "type": "string",
      "enum": [
        "creation_date",
        "total_paid",
        "total_due"
      ]
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_transaction(transaction_id)

One payment transaction by id: status, type, method, amount, invoice and customer ids, Stripe references. GET /v1/transactions/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "transaction_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "transaction_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_services(is_visible, category_id, created_after, created_before, sort_order, ...)

List the services a business offers, with pricing method, base price and duration, option sections and recurring frequencies. GET /v1/services.

Input Schema

{
  "type": "object",
  "properties": {
    "is_visible": {
      "description": "true = only services visible in online booking.",
      "type": "boolean"
    },
    "category_id": {
      "description": "Only services in this category id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_service(service_id)

One service by id: pricing, duration, option sections and their options. GET /v1/services/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "service_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "service_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_territories(enabled, name, created_after, created_before, sort_order, ...)

List the service territories (areas a business serves) with timezone, service area, providers and operating hours. Use the ids to filter jobs and invoices or to look up time slots. GET /v1/territories.

Input Schema

{
  "type": "object",
  "properties": {
    "enabled": {
      "description": "true = only active territories, false = only deactivated ones (default both).",
      "type": "boolean"
    },
    "name": {
      "description": "Search by territory name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_territory(territory_id)

One service territory by id. GET /v1/territories/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "territory_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "territory_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_team_members(service_provider, deactivated, territory, email, created_after, ...)

List team members (staff and service providers) with role, status, assigned territories, skill tags and work hours. Use the ids to filter jobs by assigned provider. GET /v1/team_members.

Input Schema

{
  "type": "object",
  "properties": {
    "service_provider": {
      "description": "true = only team members who can be assigned jobs.",
      "type": "boolean"
    },
    "deactivated": {
      "description": "true = only deactivated team members, false = only active ones.",
      "type": "boolean"
    },
    "territory": {
      "description": "Only providers assigned to this service territory id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "email": {
      "description": "Find a team member by email address.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_team_member(team_member_id)

One team member by id: contact details, role, status, territories, skill tags and work hours. GET /v1/team_members/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "team_member_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The Zenbooker id (the id field of a list result)."
    }
  },
  "required": [
    "team_member_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_list_service_requests(request_type, customer, territory, created_after, created_before, ...)

List incoming service requests (booking requests and quote requests) with status, customer, territory, duration, requested dates, services and pricing. Returns { results, count, has_more, next_cursor }. GET /v1/service_requests.

Input Schema

{
  "type": "object",
  "properties": {
    "request_type": {
      "description": "Only this kind of request.",
      "type": "string",
      "enum": [
        "booking_request",
        "quote_request"
      ]
    },
    "customer": {
      "description": "Only requests of this customer id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "territory": {
      "description": "Only requests in this service territory id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "created_after": {
      "description": "Only items created after this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "created_before": {
      "description": "Only items created before this ISO 8601 date-time.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2})?)?$"
    },
    "sort_order": {
      "description": "Sort order (default ascending).",
      "type": "string",
      "enum": [
        "ascending",
        "descending"
      ]
    },
    "cursor": {
      "description": "Where to start in the list (default 0). Pass the previous reply's next_cursor.",
      "type": "integer",
      "minimum": 0,
      "maximum": 2147483647
    },
    "limit": {
      "description": "Results per page, 1-100 (default 20).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_check_service_area(postal_code, address, lat, lng)

Check whether a location is inside the business's service area: returns in_service_area, the matching territory and other territories that serve it (or the closest territory when it is outside every area). Give a postal code, an address, or lat + lng. GET /v1/scheduling/service_area_check.

Input Schema

{
  "type": "object",
  "properties": {
    "postal_code": {
      "description": "ZIP or postal code.",
      "type": "string",
      "minLength": 1,
      "maxLength": 20
    },
    "address": {
      "description": "Street address (needed only when there is no postal code or lat/lng).",
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "lat": {
      "description": "Latitude; send together with lng.",
      "type": "number",
      "minimum": -90,
      "maximum": 90
    },
    "lng": {
      "description": "Longitude; send together with lat.",
      "type": "number",
      "minimum": -180,
      "maximum": 180
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢zenbooker_get_timeslots(territory, duration, date, days, lat, ...)

Available booking time slots for a service territory, grouped by day (days[].timeslots[] with start, end and id). Needs the territory id (zenbooker_list_territories or zenbooker_check_service_area) and the service duration in minutes. GET /v1/scheduling/timeslots.

Input Schema

{
  "type": "object",
  "properties": {
    "territory": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "The service territory id (required)."
    },
    "duration": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10000,
      "description": "Service length in minutes (required)."
    },
    "date": {
      "description": "First day to check, yyyy-mm-dd (default today).",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "days": {
      "description": "How many days to return (default 7, max 60).",
      "type": "integer",
      "minimum": 1,
      "maximum": 60
    },
    "lat": {
      "description": "Customer latitude (for drive-time aware availability); send with lng.",
      "type": "number",
      "minimum": -90,
      "maximum": 90
    },
    "lng": {
      "description": "Customer longitude; send with lat.",
      "type": "number",
      "minimum": -180,
      "maximum": 180
    },
    "min_providers_needed": {
      "description": "Minimum number of providers a slot needs (default 1).",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "service_providers": {
      "description": "Comma-separated team member ids to restrict slots to.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "required_skills": {
      "description": "Comma-separated skill tag ids a provider must have.",
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "timeslot_template": {
      "description": "A timeslot template id.",
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    }
  },
  "required": [
    "territory",
    "duration"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded21 tools