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.
21 tools: 2 can delete or cancel things, 1 change things and 18 only read.
Scanned Oct 22, 2026
- Deletes or cancels2Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things1Claude Code: ask: see these tools
- Only reads18Claude Code: allow: see these tools
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/mcpTools
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.
- Reads text others write21
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- 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.
What this check looks forMatched 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)
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/mcpRun 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.
{
"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