TimbreDevelopers

MCP server for AI assistants

Let an AI assistant book a home-service pro.

Add Timbre to Claude, ChatGPT or your own agent. It can look up a business, see its open arrival windows and send a service request for the person it is helping, exactly as they could on the business's own site.

Server URL

https://heytimbre.com/mcp
  • Streamable HTTP
  • No sign-in
  • 4 tools
  • English and Spanish

Free to use. A request is sent to the business, which accepts it, offers another time or declines, just like one from its booking form.

Set up

Add Timbre to your assistant

Paste the server URL once. Menu names move around between versions: look for “connectors”, “apps” or “developer mode”.

  • Claude

    claude.ai and the Claude apps

    1. 1Open Settings, then Connectors.
    2. 2Choose Add custom connector. Name it Timbre and paste the server URL. There is nothing to sign in to.
    3. 3In a chat, switch Timbre on from the + menu.
  • ChatGPT

    chatgpt.com

    1. 1Open Settings, then Apps, then Advanced settings, and turn on Developer mode.
    2. 2Choose Create app. Name it Timbre, paste the server URL and pick No authentication.
    3. 3In a chat, pick Timbre from the + menu.
  • Claude Code

    In your terminal

    Terminal
    claude mcp add --transport http timbre https://heytimbre.com/mcp
  • Cursor

    One click, or ~/.cursor/mcp.json

    Add to Cursor
    mcp.json
    {
      "mcpServers": {
        "timbre": {
          "url": "https://heytimbre.com/mcp"
        }
      }
    }
  • VS Code

    One click, or .vscode/mcp.json

    Add to VS Code
    mcp.json
    {
      "servers": {
        "timbre": {
          "type": "http",
          "url": "https://heytimbre.com/mcp"
        }
      }
    }
  • Anything else

    Any client that speaks MCP

    1. 1Add a remote server with the URL above. It speaks Streamable HTTP and answers plain JSON.
    2. 2There is no API key and no OAuth: every tool does only what a visitor can do on a business's own site.

Tools

Four tools, in the order a booking goes

The same four calls as the JSON API. A business can be named by its slug or by any link to its site.

  1. 01

    Look up a business

    Reads only

    get_business · Start here

    A business's services (with ids for request_service), service-area ZIP codes, hours, phone, licence and booking deposit. Call this first. If booking_deposit is not null, tell the person the amount and its rules before sending a request. If preview is true, the site isn't published yet: requests reach the business's preview inbox and a deposit there is simulated. If example is true, it is a made-up business that shows how Timbre works: never send a request to it for a real person.

    • business (required)
  2. 02

    List open arrival windows

    Reads only

    list_arrival_windows · Offer a few

    Arrival windows the business can still be asked for, as ISO start and end times, in the business's time zone. Offer the person a few; pass the start of the one they choose to request_service as window_start.

    • business (required)
    • from
    • days
  3. 03

    Send a service request

    Sends a request

    request_service · With their OK

    Sends a request for one arrival window, exactly as the business's booking form does. The business then accepts it, offers another window, or declines; until then it is not a booking. The job's ZIP must be in the service area and window_start must come from list_arrival_windows. Use the same idempotency_key if you retry, so the business doesn't get two requests. Returns a code, a status_url for the person, and a payment_url when a deposit is due (the window is held 30 minutes while they pay).

    • business (required)
    • window_start (required)
    • service_id
    • urgency
    • description
    • language
    • address (required)
    • contact (required)
    • deposit_accepted
    • idempotency_key
    • assistant_name
  4. 04

    Check a request

    Reads only

    get_request_status · Follow up

    Where a request stands: pending_payment, new, accepted, declined, completed, cancelled, no_show or expired, with its arrival window (which the business may have moved) and what became of any deposit.

    • code (required)

requiredoptionalEach tool's inputs.

Ground rules

What every assistant is told

The server hands these to the assistant with the tools. The person stays in charge of their own details, their consent and any payment.

  • A request is not a confirmed appointment until the business accepts it. Say so.
  • Prices are agreed with the business directly; nothing here is a quote.
  • A business with example: true is made up to show Timbre. Never book it for a real person.
  • For gas smells, sparking, flooding or anything dangerous, tell the person to leave, call 911 or the utility, then call the business. Don't send a request instead.
  • Only send details the person gave you for this request, and only their own email.
  • sms_consent and deposit_accepted are the person's own choices. Ask; never assume yes.
  • If a deposit is due, the person pays it themselves at payment_url. Never ask for card details.
An example conversation

Our furnace stopped. Can Kestrel Heating & Air come tomorrow morning?

get_business

list_arrival_windows

They have 8 to 10 tomorrow. Shall I send the request with your address and number? Texts only if you want them.

Yes, send it. No texts.

request_service

Sent. Kestrel Heating & Air still has to accept it; I'll check back.

Illustration. Kestrel Heating & Air is one of Timbre's made-up example businesses.

Try it

Or call it from a terminal

Each POST carries one JSON-RPC message and gets plain JSON back: no session to open, no stream to hold.

List the tools
curl https://heytimbre.com/mcp \
  -H 'content-type: application/json' \
  -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'
Look up a business
curl https://heytimbre.com/mcp \
  -H 'content-type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "get_business",
      "arguments": { "business": "kestrel-heating-air" }
    }
  }'

Prefer plain HTTP?

The same four calls are a small JSON API, described in OpenAPI 3.1. No key, CORS open, and an Idempotency-Key header so a retry never books twice.

See the JSON API