Run your flower shop from an AI assistant. Connect Meta Muse, Claude, ChatGPT or any MCP client to your BouquetOS workspace to look up and record orders, track purchase orders, and ask how the shop is doing.
Last updated 14 October 2026
The BouquetOS connector is a remote Model Context Protocol (MCP) server. Once you connect it, your assistant can call the tools listed below on your behalf. It always acts as you, in your workspace, with no more access than you have in the BouquetOS console.
https://mcp.bouquetos.com/mcpIn your assistant — ChatGPT, Claude, Meta Muse or another MCP client — add a custom connector (it may be called an “MCP server”, “app” or “plugin”) with the URL https://mcp.bouquetos.com/mcp. No client id or secret is needed: the assistant registers itself. Then:
You are returned to the assistant, which can now call the tools your account allows. To disconnect, remove the connector in your assistant. If a shop admin disables your BouquetOS account, the connection stops working on the assistant’s next request.
For developers and directory reviewers:
/mcp return 401 with WWW-Authenticate: Bearer resource_metadata=….https://mcp.bouquetos.com/.well-known/oauth-protected-resource/mcphttps://mcp.bouquetos.com/.well-known/oauth-authorization-server/api/connector/authS256 is required. Grant types: authorization_code and refresh_token.bouquetos:read (every read tool), bouquetos:write (create and update tools), offline_access (refresh tokens).https://mcp.bouquetos.com/mcp. Each refresh issues a new refresh token valid for 30 days, so a connection left unused for 30 days has to sign in again.The connector mirrors the console. A tool you couldn’t use in BouquetOS is never offered to your assistant, so it never shows up in the tool list:
bouquetos:write scope. A read-only connection lists only read tools.Read tools only look. Write tools change records inside BouquetOS. Sensitive write tools can also act outside BouquetOS in ways that can’t be undone, such as making Shopify email your customer; assistants should confirm with you before calling them. Date inputs are in the shop’s time zone (America/Los_Angeles); returned times are ISO 8601 in UTC; every tool returns JSON text.
Every tool declares all three MCP hints — readOnlyHint, destructiveHint and openWorldHint — explicitly; the Hints column lists those set to true. Destructive tools overwrite existing data or trigger something that can’t be recalled. Open-world tools reach beyond your workspace: create_order sends a delivery address to Google Maps and can publish booked-slot counts to your Shopify storefront, update_status and update_order can make Shopify email your customer, and upload_image publishes the image at a public URL.
| Tool | Type | What it does | Key inputs | Returns | Side effects | Hints | Who · scope |
|---|---|---|---|---|---|---|---|
list_orders_for_day | Read | Orders whose fulfillment falls on a date, earliest first. | date (YYYY-MM-DD, shop time) | Array of orders (fields below) | None | read-only | Any role · read |
get_order | Read | One order by id. | id | Order (fields below) | None | read-only | Any role · read |
search_order | Read | Find orders from a name, phone, item or date range. | at least one of query, date_from, date_to, status, source, fulfillment_type; optional limit (1–100, default 20) | Trimmed summaries (id, order number, customer, fulfillment time and type, status, total, currency, items summary) | None | read-only | Any role · read |
create_order | Write | Record a new sales order (source “chat”). | customer_name, items_summary, fulfillment_at (ISO 8601), fulfillment_type (pickup | delivery), payment_method, total_amount; fulfillment_address for delivery; optional phone, recipient, paid_amount, items, notes, image_url, override_date_rules, idempotency_key | { id, summary }, plus duplicate: true on an idempotent repeat | Notifies no customer. A delivery address is sent to Google Maps for a drive-time estimate. If the shop caps bookings per storefront time slot, the new booked count is published to its Shopify storefront. | open-world | Any role · write; override_date_rules admin only |
update_status | Sensitive write | Move an order (and all its items) to a new status. | id, status | The updated order (fields below) | For orders imported from the shop’s Shopify store, the change is pushed to Shopify and Shopify emails the customer (see status side effects). Emails can’t be recalled. | destructive · open-world | Any role · write |
update_order | Sensitive write | Change any supplied fields of an order; items, if given, replace the list. | id plus any of: customer and recipient details, fulfillment type, time and address, driver, items, image URLs, design and card notes, amounts, payment method, currency, status, notes | The updated order (fields below) | Overwrites the supplied fields. A status change behaves exactly like update_status. A new delivery address is sent to Google Maps. | destructive · open-world | Any role · write |
upload_image | Write | Store a bouquet reference image to attach to an order. | image_base64 (≤ 10 MB), mime_type (JPEG/PNG/WEBP/GIF), optional filename | { url, bytes } | Uploads to object storage at a public URL: anyone with the URL can view it. | open-world | Any role · write |
| Tool | Type | What it does | Key inputs | Returns | Side effects | Hints | Who · scope |
|---|---|---|---|---|---|---|---|
list_purchase_orders | Read | Purchase orders created in a month, newest first. | optional month (YYYY-MM, default current), supplier, status, currency | POs (fields below), per-currency totals for the filtered set, past supplier names | None | read-only | Admin · Purchase orders module · read |
get_purchase_order | Read | One purchase order by id. | id | The PO (fields below) | None | read-only | Admin · Purchase orders module · read |
create_purchase_order | Write | Record a purchase from a supplier. | currency, items (name, quantity, unit_price, optional unit and notes); optional supplier, status, expected_at, shipping_amount, tax_amount, notes, idempotency_key | The created PO (fields below), plus duplicate: true on an idempotent repeat | Internal record only — the supplier is not contacted. | none | Admin · Purchase orders module · write |
update_purchase_order | Write | Change supplied fields, e.g. mark received or fix a price. | id plus any create field; items, if given, replace the list | The updated PO (fields below) | Overwrites the supplied fields. Supplier is not contacted. | destructive | Admin · Purchase orders module · write |
| Tool | Type | What it does | Key inputs | Returns | Side effects | Hints | Who · scope |
|---|---|---|---|---|---|---|---|
get_sales_dashboard | Read | Today’s KPIs, month-to-date revenue, top products, orders needing attention. | optional weeks (heatmap span) | Dashboard snapshot | None | read-only | Admin · Orders module · read |
get_sales_series | Read | Revenue (or purchase-order cost) over a range, with the change vs the previous period. | metric (revenue | cost), range (7d | 30d | quarter | year | ytd) | Bucketed series | None | read-only | Admin · Orders module · read (cost needs Purchase orders) |
get_expense_series | Read | Overhead and labor costs over a range. | range | Bucketed series | None | read-only | Admin · Orders + Cost center modules · read |
get_cost_center_summary | Read | Recurring burn, one-off overhead and labor for a period. | optional period (mtd | last_month | last_7d | last_30d) | Summary with flags for missing figures | None | read-only | Admin · Cost center module · read |
Tools return only the fields an assistant needs to answer you and to make a correct change — never whole database rows.
Order: id, orderNumber (the shop’s own number, e.g. a Shopify order’s #1001), source, status, fulfillmentType, fulfillmentAt, fulfillmentWindowEnd, pickupTimeUnknown, customer name, phone and email, recipient name and phone, fulfillmentAddress, driver, driverPickupAt, estimatedDriveMinutes, itemsSummary, items (name, qty, price, notes), imageUrls, exactDesign, designNote, noteCard, notes, totalAmount, paidAmount, paymentPending, paymentMethod (a label such as “cash” or “zelle”), currency.
Purchase order: id, supplier, status, currency, totalAmount, shippingAmount, taxAmount, createdAt (the order date the monthly list filters on), expectedAt, receivedAt, notes, items (name, quantity, unit, unitPrice, subtotal, notes).
Never returned: internal workspace and sync identifiers, raw Shopify or import payloads, receipt links, request or trace ids, internal timestamps, and payment card details (BouquetOS stores none). Money amounts are plain numbers in the record’s currency.
Order statuses:
new → confirmed → in_prep → ready_for_pickup (pickup) or delivering (delivery) → completed; or cancelled at any point.
Changing the status of an order that came from the shop’s connected Shopify store is mirrored to Shopify, and Shopify sends its own customer emails:
Orders created in BouquetOS or by the assistant notify no one when their status changes. Setting the status an order already has changes nothing.
Purchase-order statuses: ordered, in_transit, received (stamps the received date), cancelled. They are internal and notify no one.
create_order and create_purchase_order accept an optional idempotency_key (8–200 characters). Send a fresh key, such as a UUID, for each record you mean to create, and the same key again if you retry after a timeout or error. A repeat call with a key your workspace has already used creates nothing: it returns the record the first call created, with "duplicate": true. Two simultaneous calls with the same key also produce one record. Keys are scoped to your workspace and to the kind of record, and they don’t expire. Without a key, every call creates a new record.
Updates are naturally safe to repeat: applying the same change twice leaves the same result.
401 — missing, expired or invalid access token, or the BouquetOS account was disabled. The WWW-Authenticate header points to the metadata above; refresh the token or sign in again.403 insufficient_scope — the token lacks bouquetos:read.403 access_denied — the workspace is suspended.isError: true and a plain-language message the assistant can relay: invalid arguments, a record that doesn’t exist, a tool that isn’t available to the account, or a business rule. For example, create_order refuses a date the shop has closed or hasn’t opened for booking yet, and says an admin can override it with override_date_rules.Sign-in and token endpoints are rate-limited per IP address: token requests 20 a minute, authorization 30 a minute, client registration 5 a minute, token revocation 30 a minute. Exceeding them returns 429. The /mcp endpoint itself has no fixed per-call limit today; please keep request rates reasonable. We may throttle traffic that degrades the service for other shops, and will update this page if we add a limit.
See the privacy policy and merchant terms for the full picture.
Questions, problems or a security report: support@bouquetos.com.