Developers · MCP server v2
Book any ManyMore business from your agent
Every business on ManyMore is bookable by an AI assistant through one MCP server, with no work on the business's side. Your agent finds a business, reads its real open times, places a booking request, and can check, move or cancel it or leave a message later. The owner approves the request; the customer gets the same texts and emails as any other booking. Ready for Meta Muse, OpenAI Dots, ChatGPT and Claude.
Endpoint
POST https://manymore.ca/slotsmith/api/mcp- Protocol: Model Context Protocol over streamable HTTP, protocol version
2025-06-18, plain JSON-RPC 2.0 bodies. Responses are always JSON (no server-sent events), whatever theAcceptheader says. Methods:initialize(answers with anMcp-Session-Id; the server is stateless and accepts any session id back),notifications/initialized,ping,tools/list,tools/call. Every tool carriesannotations(readOnlyHint, destructiveHint, idempotentHint, openWorldHint) and anoutputSchema; every result comes back as both text andstructuredContent, withok: false+error+messageon failure. - Authentication:none required. Reads are public business information; writes carry the customer's own details and are gated by them (a booking is only ever shown to a caller holding its confirmation code and the phone number it was made with). Partners can send
Authorization: Bearer <partner key>for higher limits; an unknown key is a 401. Keys: hello@manymore.ca. - Attribution: send
X-ManyMore-Agent: muse(ordots, or your product's name). It is recorded on every booking and message, so businesses see which assistant sent the job. With a partner key the partner name is the default. - Limits and region: 60 requests a minute per IP (burst 30) without a key; 600 a minute with one. Businesses in Canada and the US.
Tools
find_pros read-only
Find bookable trades and service businesses: appliance repair, HVAC, plumbing, electrical, handyman, detailing, cleaning, restoration and more. Returns each business's services (ids, durations, prices where set, whether it quotes first), hours, service area, country, timezone, its phone line (answered by Wren) and booking page. Only businesses that are set up and listed are returned.
| trade | string, optional | What kind of work, e.g. "appliance repair", "plumber". |
| near | string, optional | City or area, e.g. "Kingston, Ontario", "Austin". |
get_availability read-only
Real open appointment slots for one service at one business, read from the business's own calendar. Defaults to today through 14 days ahead. Slot times are ISO 8601 in the business's own timezone (offset included, timezone named). A slot returned here is one a human customer could book too; booking it never double-books the business.
| slug | string, required | The business slug from find_pros. |
| serviceId | string, required | The service id from find_pros. |
| fromDate | YYYY-MM-DD, optional | First day to include, in the business's timezone. Default: today. |
| toDate | YYYY-MM-DD, optional | Last day to include. Default: fromDate + 14 days. |
request_booking write
Place a booking request for the customer at a slot from get_availability. On most businesses this creates a request the owner accepts or declines (status REQUESTED); it is not a guaranteed confirmed booking. Returns a confirmationCode (give it to the customer), a manage link, and whatHappensNext. Call it only with the customer's explicit consent and real contact details: they will be texted and emailed directly. Idempotent: repeating the same request returns the same booking.
| slug | string, required | From find_pros. |
| serviceId | string, required | From find_pros. |
| startISO | string, required | Slot start, ISO 8601, exactly as returned by get_availability. |
| customerName | string, required | |
| customerPhone | string, required | The customer's mobile, E.164 preferred. |
| customerEmail | string | Required unless smsConsent is true. |
| smsConsent | boolean, optional | True only if the customer explicitly agreed to appointment texts at that number. Never assume it. |
| address | string, required | Where the work happens. |
| problem | string, required | What the customer needs, in their own words. |
| idempotencyKey | string, optional | Your own stable id for this request. |
get_booking_status read-only
Look up one booking by its confirmation code and the phone number it was made with. Both must match or the answer is not_found. Returns status, when, service, business, and whether it can still be moved or cancelled. Nothing else about any customer is ever returned.
| confirmationCode | string, required | From request_booking, or the customer's confirmation text/email. |
| customerPhone | string, required | The phone number the booking was made with. |
reschedule_booking write
Move the booking to a new open time from get_availability. Same code + phone check. The new time is re-validated against live availability. A tentative request stays a request; a confirmed booking is moved on the business's calendar and both parties are notified.
| confirmationCode | string, required | |
| customerPhone | string, required | |
| newStartISO | string, required | A slot start from get_availability, unchanged. |
cancel_booking write, destructive
Cancel the booking. Same code + phone check. Frees the slot and notifies the business. Only with the customer's explicit confirmation; it cannot be undone (they would book again). Safe to retry.
| confirmationCode | string, required | |
| customerPhone | string, required | |
| reason | string, optional | In the customer's words. |
leave_message write
Leave a message for the business: a question, a callback, a quote request, something a booking doesn't cover. The owner is texted and emailed at once and sees it on their dashboard. Needs a name and a real callback number. The same message twice is delivered once.
| slug | string, required | From find_pros. |
| customerName | string, required | |
| customerPhone | string, required | A number the business can call or text back. |
| message | string, required | Up to 1000 characters. |
| urgent | boolean, optional | True if it can't wait (a leak, no heat, no power). |
Example
curl -X POST https://manymore.ca/slotsmith/api/mcp \
-H "content-type: application/json" -H "X-ManyMore-Agent: my-agent" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"find_pros","arguments":{"trade":"appliance repair","near":"Kingston, Ontario"}}}'
# then, with a slug and serviceId from the result:
curl -X POST https://manymore.ca/slotsmith/api/mcp \
-H "content-type: application/json" -H "X-ManyMore-Agent: my-agent" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"get_availability","arguments":{"slug":"northside-demo","serviceId":"<id>"}}}'
# book a slot (the demo business confirms on the spot):
curl -X POST https://manymore.ca/slotsmith/api/mcp \
-H "content-type: application/json" -H "X-ManyMore-Agent: my-agent" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{"name":"request_booking","arguments":{"slug":"northside-demo","serviceId":"<id>",
"startISO":"<a slot>","customerName":"Pat Test","customerPhone":"+16135550199",
"customerEmail":"pat@example.com","address":"12 King St, Kingston","problem":"Washer won't drain"}}}'
# later: {"name":"get_booking_status","arguments":{"confirmationCode":"<code>","customerPhone":"+16135550199"}}For testing, use the demo business northside-demo (Northside Appliance Repair, a fictional business in Kingston). Its requests are confirmed automatically and cleared nightly, so nobody is dispatched. Requests to real businesses reach a real owner.
Guarantees
- Availability comes from the business's own calendar, the same source its booking page uses. An agent is never offered a slot a person couldn't book.
- Every write goes through the same engine as every other channel: idempotent, no double-booking, notice and buffer rules enforced, the same reschedule and cancel paths the customer's own link uses.
- On businesses that screen requests, the owner accepts or declines. An agent cannot force a confirmed job onto anyone's calendar.
- No tool returns another customer's information. A booking is shown only to a caller holding both its confirmation code and the phone number it was made with — the same trust as the customer's texted link.
- Every agent booking and message is recorded with its source and the agent's name, so businesses can see which assistant sent what.
- A business that has paused new requests answers with a clear message instead of taking the booking.
Connecting from Meta Muse
Muse connects to services through connectors; this server is ready as an existing MCPconnector. In Muse's connector settings, add a connector with:
- Endpoint:
https://manymore.ca/slotsmith/api/mcp - Connection type: Existing MCP
- Authentication: none (or Other, with a partner key as a Bearer token)
Then ask Muse things like:
- “Find me an appliance repair place in Kingston that can come this week — my washer won't drain.”
- “Book the Thursday 10am slot with Northside Appliance Repair and send them my address.”
- “What's the status of my booking? The code is in my texts.”
Connecting from OpenAI Dots
A dot uses the plugins (connectors) on your ChatGPT account. In ChatGPT: Settings → Connectors → Developer mode → Add connector (a paid plan is needed for custom connectors):
- Name: ManyMore
- MCP server URL:
https://manymore.ca/slotsmith/api/mcp - Authentication: No authentication
Then tell your dot things like:
- “What's the status of my booking? The code is in my texts.”
- “Move my appliance appointment to next Tuesday morning.”
- “Leave a message for Northside asking for a quote on a new dishwasher install.”
Building a connector?
Email hello@manymore.ca for a partner key, a test business of your own, and a heads-up before schema changes.