Skip to content

Zenbooker MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.0.1 · published by io.usefulapi

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

Deletes · 2Changes · 1

21 tools: 2 can delete or cancel things, 1 change things and 18 only read.

Scanned Oct 22, 2026

No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http zenbooker https://zenbooker.usefulapi.io/mcp

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

21 tools

Deletes or cancels 2Claude Code: deny
  • zenbooker_add_job_noteWRITE: add an internal note (text) to a job.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_add_job_note" says "add": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Add a note to a job
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • zenbooker_create_customerWRITE: create a new customer record in Zenbooker (name required; phone and email optional).Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_create_customer" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Create customer
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
Changes things 1Claude Code: ask
  • zenbooker_check_service_areaCheck 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 i…Reads text others writeNo findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Check service area
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
Only reads 18Claude Code: allow
  • zenbooker_get_customerOne customer by id: contact details, notes, addresses, job and recurring booking ids and linked Stripe customer.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_customer" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One customer by id: contact details, notes, addresses, job and recurring booking ids and linked Stripe customer. GET /v1/customers/{id}.

    Annotations the server declares

    • title: Get customer
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_invoiceOne invoice by id: recipient, line items, discounts, tax, totals, amount paid and due, status and transactions.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_invoice" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One invoice by id: recipient, line items, discounts, tax, totals, amount paid and due, status and transactions. GET /v1/invoices/{id}.

    Annotations the server declares

    • title: Get invoice
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_jobOne job by id: appointment time, status, customer, service address, services and fields, assigned providers, notes and invoice summary.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_job" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "note": it reads notes.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One job by id: appointment time, status, customer, service address, services and fields, assigned providers, notes and invoice summary. GET /v1/jobs/{id}.

    Annotations the server declares

    • title: Get job
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_recurring_bookingOne recurring booking by id: first job date, job count, time slot, status, territory, service, pricing and its job ids.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_recurring_booking" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One recurring booking by id: first job date, job count, time slot, status, territory, service, pricing and its job ids. GET /v1/recurring/{id}.

    Annotations the server declares

    • title: Get recurring booking
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_serviceOne service by id: pricing, duration, option sections and their options.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_service" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One service by id: pricing, duration, option sections and their options. GET /v1/services/{id}.

    Annotations the server declares

    • title: Get service
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_team_memberOne team member by id: contact details, role, status, territories, skill tags and work hours.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_team_member" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One team member by id: contact details, role, status, territories, skill tags and work hours. GET /v1/team_members/{id}.

    Annotations the server declares

    • title: Get team member
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_territoryOne service territory by id.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_territory" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One service territory by id. GET /v1/territories/{id}.

    Annotations the server declares

    • title: Get service territory
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_timeslotsAvailable booking time slots for a service territory, grouped by day (days[].timeslots[] with start, end and id).Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_timeslots" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get available time slots
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_get_transactionOne payment transaction by id: status, type, method, amount, invoice and customer ids, Stripe references.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_get_transaction" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    One payment transaction by id: status, type, method, amount, invoice and customer ids, Stripe references. GET /v1/transactions/{id}.

    Annotations the server declares

    • title: Get transaction
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_customersList or search customers by name, email or phone, by creation time, or by default address near a place (location + radius in miles).Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_customers" says "list": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "list" and "email": it reads mail.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List customers
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_invoicesList invoices, optionally by status (draft, unpaid, partial_paid, paid, void), customer id, territory id or creation time.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_invoices" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List invoices
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_jobsList 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 t…Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_jobs" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List jobs
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_recurring_bookingsList recurring bookings (repeating job series), by status (active or canceled), customer id, assigned team member id, territory id or creation time.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_recurring_bookings" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List recurring bookings
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_service_requestsList incoming service requests (booking requests and quote requests) with status, customer, territory, duration, requested dates, services and pricing.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_service_requests" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List service requests
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_servicesList the services a business offers, with pricing method, base price and duration, option sections and recurring frequencies.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_services" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List the services a business offers, with pricing method, base price and duration, option sections and recurring frequencies. GET /v1/services.

    Annotations the server declares

    • title: List services
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_team_membersList team members (staff and service providers) with role, status, assigned territories, skill tags and work hours.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_team_members" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List team members
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_territoriesList the service territories (areas a business serves) with timezone, service area, providers and operating hours.Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_territories" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List service territories
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • zenbooker_list_transactionsList payment transactions, optionally by type (stripe_payment, external_transaction), payment method, status (succeeded, failed, voided), customer id, territory id, creation time o…Reads text others writeNo findings

    Why it is in this group

    • The name "zenbooker_list_transactions" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List transactions
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Reads private data4
Reads files, mail, messages, databases, secrets, calendars or repositories.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Remote posture

What anyone on the internet sees at the remote endpoint: an anonymous initialize and tools/list, and the public OAuth metadata.

Looked at Oct 22, 2026, 15:31 UTC, unchanged since Oct 22, 2026. No credentials were sent and no tool was called. What is looked at.

Reachable
yes
HTTP status of an anonymous initialize
200
tools/list served without credentials
yes
Tools that change things, listed without credentials
3
Protocol version
2025-06-18
WWW-Authenticate on 401
not observed
resource_metadata in WWW-Authenticate
none
RFC 9728 protected resource metadata
https://zenbooker.usefulapi.io/.well-known/oauth-protected-resource/mcp
Authorization servers
https://zenbooker.usefulapi.io
Legacy HTTP+SSE transport
no
Dynamic client registration
yes
Client ID metadata documents
no
  • HighThe whole server

    The endpoint served tools/list without credentials, and the list has 3 tools that change things (2 destructive, 1 write). Whether a call also works without credentials was not tested: tools are never called.

    Matched text

    https://zenbooker.usefulapi.io/mcp: tools/list returned 21 tools to an anonymous client, including zenbooker_add_job_note (destructive), zenbooker_create_customer (destructive), zenbooker_check_service_area (write)

    What this check looks for

Install

Pinned to version 1.0.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http zenbooker https://zenbooker.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__zenbooker__zenbooker_list_jobs",
      "mcp__zenbooker__zenbooker_get_job",
      "mcp__zenbooker__zenbooker_list_recurring_bookings",
      "mcp__zenbooker__zenbooker_get_recurring_booking",
      "mcp__zenbooker__zenbooker_list_customers",
      "mcp__zenbooker__zenbooker_get_customer",
      "mcp__zenbooker__zenbooker_list_invoices",
      "mcp__zenbooker__zenbooker_get_invoice",
      "mcp__zenbooker__zenbooker_list_transactions",
      "mcp__zenbooker__zenbooker_get_transaction",
      "mcp__zenbooker__zenbooker_list_services",
      "mcp__zenbooker__zenbooker_get_service",
      "mcp__zenbooker__zenbooker_list_territories",
      "mcp__zenbooker__zenbooker_get_territory",
      "mcp__zenbooker__zenbooker_list_team_members",
      "mcp__zenbooker__zenbooker_get_team_member",
      "mcp__zenbooker__zenbooker_list_service_requests",
      "mcp__zenbooker__zenbooker_get_timeslots"
    ],
    "ask": [
      "mcp__zenbooker__zenbooker_check_service_area"
    ],
    "deny": [
      "mcp__zenbooker__zenbooker_add_job_note",
      "mcp__zenbooker__zenbooker_create_customer"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as zenbooker. Review it before you use it.

Capability tags behind 21 rules
  • mcp__zenbooker__zenbooker_list_jobs untrusted-input
  • mcp__zenbooker__zenbooker_get_job private-data, untrusted-input
  • mcp__zenbooker__zenbooker_add_job_note untrusted-input
  • mcp__zenbooker__zenbooker_list_recurring_bookings untrusted-input
  • mcp__zenbooker__zenbooker_get_recurring_booking untrusted-input
  • mcp__zenbooker__zenbooker_list_customers private-data, untrusted-input
  • mcp__zenbooker__zenbooker_get_customer private-data, untrusted-input
  • mcp__zenbooker__zenbooker_create_customer untrusted-input
  • mcp__zenbooker__zenbooker_list_invoices untrusted-input
  • mcp__zenbooker__zenbooker_get_invoice untrusted-input
  • mcp__zenbooker__zenbooker_list_transactions untrusted-input
  • mcp__zenbooker__zenbooker_get_transaction untrusted-input
  • mcp__zenbooker__zenbooker_list_services untrusted-input
  • mcp__zenbooker__zenbooker_get_service untrusted-input
  • mcp__zenbooker__zenbooker_list_territories untrusted-input
  • mcp__zenbooker__zenbooker_get_territory untrusted-input
  • mcp__zenbooker__zenbooker_list_team_members untrusted-input
  • mcp__zenbooker__zenbooker_get_team_member private-data, untrusted-input
  • mcp__zenbooker__zenbooker_list_service_requests untrusted-input
  • mcp__zenbooker__zenbooker_check_service_area untrusted-input
  • mcp__zenbooker__zenbooker_get_timeslots untrusted-input