{"openapi":"3.1.0","info":{"title":"Backbone connector API","version":"1.0.0","summary":"Read a shop's Backbone inventory and, only after the person confirms, change a stock count or receive a delivery.","description":"Backbone is inventory software for independent shops. This API lets an AI assistant, such as Meta's Muse, work with ONE business's Backbone account as the person who connected it, with that person's Backbone permissions.\n\nIt can read stock levels, products, low-stock alerts, purchase orders, the last stock count and stock reports. It can make exactly two kinds of change: adjust a stock count, and receive a delivery against a purchase order. Both are **preview, then confirm**: the preview tool changes nothing and returns a plain summary plus a `preview_token`; only `confirm_change`, called after the person says yes, applies it. Previews expire after 10 minutes, work once, and are refused (`stale_preview`) if the numbers changed since. Stock count changes can be undone the same way (`undo_change`).\n\n**MCP.** The primary transport is MCP (Streamable HTTP, stateless, protocol 2025-06-18) at `POST https://app.backbonesolutions.ai/api/connector/mcp`, with the same tools. This document describes the REST and tool-call forms of the same registry.\n\n**Connecting.** OAuth 2.0 authorization code with PKCE (S256). Register with Dynamic Client Registration at `POST https://app.backbonesolutions.ai/api/connector/oauth/register`. Discovery: `https://app.backbonesolutions.ai/.well-known/oauth-authorization-server` and `https://app.backbonesolutions.ai/.well-known/oauth-protected-resource`.\n\n**Retries.** Send an `Idempotency-Key` header (or `idempotency_key`) with `confirm_change`: the same key returns the first result and never applies a change twice.\n\n**Rate limits.** 120 requests per minute per connection; changes (preview, confirm, undo) also count against 20 per minute per connection. Over the limit: `429 rate_limited` with `retry_after`.\n\nHuman-readable reference: https://app.backbonesolutions.ai/api/connector/docs"},"servers":[{"url":"https://app.backbonesolutions.ai/api/connector/v1","description":"Backbone"}],"tags":[{"name":"Reads","description":"Read-only. These cannot change anything in Backbone."},{"name":"Changes","description":"Preview, then confirm. A preview changes nothing; only confirm_change applies a change, after the person says yes."},{"name":"Tool calls","description":"The same tools, called by name: POST /tools/<name> with the tool input as the JSON body."},{"name":"Manifest","description":"Which tools this connection may use."}],"paths":{"/manifest":{"get":{"operationId":"get_manifest","summary":"List the tools this connection may use","description":"The tools this connection's scopes allow, with their input and output schemas. Change tools are left out while the business owner has turned changes through Muse off, and so is any change tool the connected person's Backbone permissions could never complete (for example every change tool for a view-only member). Any valid connection may call it.","tags":["Manifest"],"security":[{"oauth2":[]}],"responses":{"200":{"description":"The manifest.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Manifest"}}}},"401":{"$ref":"#/components/responses/Error401"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/inventory":{"get":{"operationId":"query_inventory","summary":"Check stock levels","description":"Read-only. This cannot change anything in Backbone. Shows how many of an item you have on hand, how many are held for orders, and how many are on the way, at each of your store locations. Use it for questions like \"how many AA batteries do we have?\" or \"what is low at the Front Rack?\". Search by part of the name, the exact SKU, or the exact barcode, and optionally one location or only items at or below their reorder point. Never shows cost or price. Scope: `inventory:read`. Tool-call form: `POST /tools/query_inventory`.","tags":["Reads"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"query_inventory","x-backbone-kind":"read","parameters":[{"name":"variant_query","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"Part of the product name, for example \"AA batteries\" or \"2in emblem\"."},{"name":"sku","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"The exact SKU."},{"name":"barcode","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"The exact barcode (UPC or EAN) as scanned."},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"Only this store location. Leave out for every location."},{"name":"low_stock_only","in":"query","required":false,"schema":{"type":"boolean"},"description":"Only items at or below their reorder point."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many rows to return, 1 to 50. Default 20."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/query_inventory_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/products/lookup":{"get":{"operationId":"lookup_product","summary":"Find a product","description":"Read-only. This cannot change anything in Backbone. Finds items in your catalog by exact SKU, exact barcode, or part of the name, brand or code, and shows the item's name, codes, selling price, reorder point and case size. Unit cost appears only for people allowed to see financials. Age-restriction flags are shown for information only. For stock on hand, use query_inventory. Scope: `inventory:read`. Tool-call form: `POST /tools/lookup_product`.","tags":["Reads"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"lookup_product","x-backbone-kind":"read","parameters":[{"name":"sku","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"The exact SKU."},{"name":"barcode","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"The exact barcode (UPC or EAN) as scanned."},{"name":"query","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"Part of the product name, brand or code. Used only when no SKU or barcode is given."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many matches to return, 1 to 50. Default 10."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lookup_product_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/alerts":{"get":{"operationId":"list_low_stock_alerts","summary":"See low-stock alerts","description":"Read-only. This cannot change anything in Backbone. Lists the low-stock and out-of-stock alerts Backbone has raised for your items, newest first, with the item, the location and the level that triggered each one. The list is as fresh as Backbone's last stock check; for a live count use query_inventory. Open alerts only unless you ask to include ones already marked as seen. Scope: `inventory:read`. Tool-call form: `POST /tools/list_low_stock_alerts`.","tags":["Reads"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"list_low_stock_alerts","x-backbone-kind":"read","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["low_stock","out_of_stock"]},"description":"Only \"low_stock\" or only \"out_of_stock\". Leave out for both."},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"Only this store location. Leave out for every location."},{"name":"include_acknowledged","in":"query","required":false,"schema":{"type":"boolean"},"description":"Also include alerts someone has already marked as seen. Default false (open alerts only)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many alerts to return, 1 to 50. Default 20."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_low_stock_alerts_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/purchase-orders":{"get":{"operationId":"list_purchase_orders","summary":"List purchase orders","description":"Read-only. This cannot change anything in Backbone. Lists your purchase orders, newest first, with the supplier, the status, and how many units have arrived and how many are still to come. Use status \"open\" for orders still waiting on a delivery. Order totals appear only for people allowed to see financials. Scope: `purchasing:read`. Tool-call form: `POST /tools/list_purchase_orders`.","tags":["Reads"],"security":[{"oauth2":["purchasing:read"]}],"x-backbone-tool":"list_purchase_orders","x-backbone-kind":"read","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["open","draft","pending_approval","sent","partially_received","received","cancelled","closed"]},"description":"\"open\" = ordered and still waiting for some or all of the delivery. Or one exact status. Leave out for every status."},{"name":"vendor","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"Part of the supplier name."},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"Only orders shipping to this store location."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many orders to return, 1 to 50. Default 20."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_purchase_orders_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/purchase-orders/{purchase_order_id}":{"get":{"operationId":"get_purchase_order","summary":"Open a purchase order","description":"Read-only. This cannot change anything in Backbone. Shows one purchase order, by id or PO number, line by line: what was ordered, what has arrived so far, and what is still to come. Use it before receiving a delivery. Costs appear only for people allowed to see financials. Scope: `purchasing:read`. Tool-call form: `POST /tools/get_purchase_order`.","tags":["Reads"],"security":[{"oauth2":["purchasing:read"]}],"x-backbone-tool":"get_purchase_order","x-backbone-kind":"read","parameters":[{"name":"purchase_order_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"The purchase order id (from list_purchase_orders)."},{"name":"po_number","in":"query","required":false,"schema":{"type":"string","maxLength":40},"description":"The PO number as printed, for example \"PO-00001234\". Used when no id is given."},{"name":"line_limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many lines to return, 1 to 50. Default 50."},{"name":"line_offset","in":"query","required":false,"schema":{"type":"integer","minimum":0},"description":"Skip this many lines first, to page through a long order. Default 0."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/get_purchase_order_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/stock-counts/latest":{"get":{"operationId":"last_stock_count","summary":"See the last stock count","description":"Read-only. This cannot change anything in Backbone. Shows the most recent finished stock count at each of your locations: when it was done, how many items were counted, how many units were missing or extra, and the biggest differences. Use it for questions like \"when did we last count the back room, and what was off?\". Scope: `inventory:read`. Tool-call form: `POST /tools/last_stock_count`.","tags":["Reads"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"last_stock_count","x-backbone-kind":"read","parameters":[{"name":"location_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"Only this store location. Leave out for the latest count at each location."},{"name":"include_in_progress","in":"query","required":false,"schema":{"type":"boolean"},"description":"Also consider counts that are not finished yet. Default false (finished counts only)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many locations to return, 1 to 50. Default 5."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/last_stock_count_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/reports/{report}":{"get":{"operationId":"run_report","summary":"Run a stock report","description":"Read-only. This cannot change anything in Backbone. Runs one of your stock reports: \"reorder\" (what is at or below its reorder point and needs ordering), \"dead_stock\" (what has stock but has not sold in 90 days or more) or \"velocity\" (your best sellers, by units sold per day). Quantities and dates for everyone; cost and value figures only for people allowed to see financials. Scope: `reports:read`. Tool-call form: `POST /tools/run_report`.","tags":["Reads"],"security":[{"oauth2":["reports:read"]}],"x-backbone-tool":"run_report","x-backbone-kind":"read","parameters":[{"name":"report","in":"path","required":true,"schema":{"type":"string","enum":["reorder","dead_stock","velocity"]},"description":"\"reorder\" = what is at or below its reorder point and needs ordering; \"dead_stock\" = what has stock but has not sold in 90 days or more; \"velocity\" = the best sellers, by units sold per day."},{"name":"location_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"Only this store location. Leave out for every location."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":90},"description":"dead_stock only: at least this many days without a sale (90 or more)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many rows to return, 1 to 50. Default 20."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/run_report_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/changes":{"get":{"operationId":"list_recent_changes","summary":"See recent changes","description":"Read-only. This cannot change anything in Backbone. Lists the recent stock changes made through Muse for this business, newest first: what changed, whether you or someone else made it, and whether it was undone. Use it for questions like \"what did you change today?\". Each stock count change shows whether undo_change can still undo it. Scope: `activity:read`. Tool-call form: `POST /tools/list_recent_changes`.","tags":["Reads"],"security":[{"oauth2":["activity:read"]}],"x-backbone-tool":"list_recent_changes","x-backbone-kind":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"How many changes to return, 1 to 50. Default 20."}],"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_recent_changes_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/inventory/adjustments/preview":{"post":{"operationId":"adjust_inventory_count","summary":"Prepare a stock count change","description":"Prepares a change to the stock count of one item at one location, for example after a recount or when items are damaged. This step changes NOTHING: it returns a plain summary such as \"Set Chrome Emblem 2in at Front Rack from 12 to 9 (-3). Reason: damaged.\" and a preview_token. Show the summary to the person, and only if they say yes, call confirm_change with the preview_token. The preview expires after 10 minutes. Needs the person's Backbone permission \"Edit inventory\". Scope: `inventory:write`. Tool-call form: `POST /tools/adjust_inventory_count`.","tags":["Changes"],"security":[{"oauth2":["inventory:write"]}],"x-backbone-tool":"adjust_inventory_count","x-backbone-kind":"preview","x-backbone-confirm-with":"confirm_change","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/adjust_inventory_count_input"}}}},"responses":{"200":{"description":"The prepared change. Nothing has changed yet.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/adjust_inventory_count_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/purchase-orders/{purchase_order_id}/receipts/preview":{"post":{"operationId":"receive_purchase_order","summary":"Prepare receiving a delivery","description":"Prepares receiving a delivery against one of your purchase orders: everything still outstanding, or line by line. This step changes NOTHING: it returns a plain summary of what would be added to stock and a preview_token. Show the summary to the person, and only if they say yes, call confirm_change with the preview_token. The preview expires after 10 minutes. Needs the person's Backbone permission \"Receive POs\". Scope: `purchasing:write`. Tool-call form: `POST /tools/receive_purchase_order`.","tags":["Changes"],"security":[{"oauth2":["purchasing:write"]}],"x-backbone-tool":"receive_purchase_order","x-backbone-kind":"preview","x-backbone-confirm-with":"confirm_change","parameters":[{"name":"purchase_order_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"The purchase order the delivery is for. Or give po_number."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"po_number":{"type":"string","maxLength":40,"description":"The PO number as printed, for example \"PO-00001234\"."},"receive_all":{"type":"boolean","description":"Receive everything still outstanding on the order."},"receipts":{"type":"array","maxItems":200,"description":"What arrived, line by line. Leave out when receive_all is true.","items":{"type":"object","properties":{"line_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The PO line (from get_purchase_order). Or give sku."},"sku":{"type":"string","maxLength":120},"quantity":{"type":"integer","minimum":1,"maximum":1000000,"description":"Single units that arrived."},"notes":{"type":"string","maxLength":500}},"required":["quantity"],"additionalProperties":false}}},"additionalProperties":false}}}},"responses":{"200":{"description":"The prepared change. Nothing has changed yet.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/receive_purchase_order_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/changes/confirm":{"post":{"operationId":"confirm_change","summary":"Confirm a prepared change","description":"Confirms and applies ONE change that was prepared by adjust_inventory_count, receive_purchase_order or undo_change, using its preview_token. Call this ONLY after showing the person the preview summary and hearing them say yes. It fails safely, changing nothing, if the preview expired, was already used, or the numbers changed since it was prepared. Send an idempotency_key so a retry can never apply the change twice. Needs the Backbone permission the prepared change needs (\"Edit inventory\" or \"Receive POs\"). Scope: `inventory:write` or `purchasing:write`. Tool-call form: `POST /tools/confirm_change`.","tags":["Changes"],"security":[{"oauth2":["inventory:write"]},{"oauth2":["purchasing:write"]}],"x-backbone-tool":"confirm_change","x-backbone-kind":"confirm","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/confirm_change_input"}}}},"responses":{"200":{"description":"The change was applied.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/confirm_change_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"409":{"$ref":"#/components/responses/Error409"},"410":{"$ref":"#/components/responses/Error410"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/changes/{action_id}/undo":{"post":{"operationId":"undo_change","summary":"Prepare undoing a stock change","description":"Prepares undoing one stock count change that was made through Muse. This step changes NOTHING: it returns a summary of the reversing change and a preview_token. Show the summary to the person, and only if they say yes, call confirm_change with the preview_token. Received deliveries cannot be undone through Muse. Needs the person's Backbone permission \"Edit inventory\". Scope: `inventory:write`. Tool-call form: `POST /tools/undo_change`.","tags":["Changes"],"security":[{"oauth2":["inventory:write"]}],"x-backbone-tool":"undo_change","x-backbone-kind":"undo","x-backbone-confirm-with":"confirm_change","parameters":[{"name":"action_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},"description":"The applied stock adjustment to undo (from confirm_change or list_recent_changes)."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"The prepared change. Nothing has changed yet.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/undo_change_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"409":{"$ref":"#/components/responses/Error409"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/query_inventory":{"post":{"operationId":"call_query_inventory","summary":"Check stock levels (tool call)","description":"Read-only. This cannot change anything in Backbone. Shows how many of an item you have on hand, how many are held for orders, and how many are on the way, at each of your store locations. Use it for questions like \"how many AA batteries do we have?\" or \"what is low at the Front Rack?\". Search by part of the name, the exact SKU, or the exact barcode, and optionally one location or only items at or below their reorder point. Never shows cost or price. Scope: `inventory:read`. Called by name: the JSON body is the tool input. REST form: `GET /inventory`.","tags":["Tool calls"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"query_inventory","x-backbone-kind":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/query_inventory_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/query_inventory_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/lookup_product":{"post":{"operationId":"call_lookup_product","summary":"Find a product (tool call)","description":"Read-only. This cannot change anything in Backbone. Finds items in your catalog by exact SKU, exact barcode, or part of the name, brand or code, and shows the item's name, codes, selling price, reorder point and case size. Unit cost appears only for people allowed to see financials. Age-restriction flags are shown for information only. For stock on hand, use query_inventory. Scope: `inventory:read`. Called by name: the JSON body is the tool input. REST form: `GET /products/lookup`.","tags":["Tool calls"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"lookup_product","x-backbone-kind":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lookup_product_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/lookup_product_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/list_low_stock_alerts":{"post":{"operationId":"call_list_low_stock_alerts","summary":"See low-stock alerts (tool call)","description":"Read-only. This cannot change anything in Backbone. Lists the low-stock and out-of-stock alerts Backbone has raised for your items, newest first, with the item, the location and the level that triggered each one. The list is as fresh as Backbone's last stock check; for a live count use query_inventory. Open alerts only unless you ask to include ones already marked as seen. Scope: `inventory:read`. Called by name: the JSON body is the tool input. REST form: `GET /alerts`.","tags":["Tool calls"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"list_low_stock_alerts","x-backbone-kind":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_low_stock_alerts_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_low_stock_alerts_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/list_purchase_orders":{"post":{"operationId":"call_list_purchase_orders","summary":"List purchase orders (tool call)","description":"Read-only. This cannot change anything in Backbone. Lists your purchase orders, newest first, with the supplier, the status, and how many units have arrived and how many are still to come. Use status \"open\" for orders still waiting on a delivery. Order totals appear only for people allowed to see financials. Scope: `purchasing:read`. Called by name: the JSON body is the tool input. REST form: `GET /purchase-orders`.","tags":["Tool calls"],"security":[{"oauth2":["purchasing:read"]}],"x-backbone-tool":"list_purchase_orders","x-backbone-kind":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_purchase_orders_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_purchase_orders_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/get_purchase_order":{"post":{"operationId":"call_get_purchase_order","summary":"Open a purchase order (tool call)","description":"Read-only. This cannot change anything in Backbone. Shows one purchase order, by id or PO number, line by line: what was ordered, what has arrived so far, and what is still to come. Use it before receiving a delivery. Costs appear only for people allowed to see financials. Scope: `purchasing:read`. Called by name: the JSON body is the tool input. REST form: `GET /purchase-orders/{purchase_order_id}`.","tags":["Tool calls"],"security":[{"oauth2":["purchasing:read"]}],"x-backbone-tool":"get_purchase_order","x-backbone-kind":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/get_purchase_order_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/get_purchase_order_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/last_stock_count":{"post":{"operationId":"call_last_stock_count","summary":"See the last stock count (tool call)","description":"Read-only. This cannot change anything in Backbone. Shows the most recent finished stock count at each of your locations: when it was done, how many items were counted, how many units were missing or extra, and the biggest differences. Use it for questions like \"when did we last count the back room, and what was off?\". Scope: `inventory:read`. Called by name: the JSON body is the tool input. REST form: `GET /stock-counts/latest`.","tags":["Tool calls"],"security":[{"oauth2":["inventory:read"]}],"x-backbone-tool":"last_stock_count","x-backbone-kind":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/last_stock_count_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/last_stock_count_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/run_report":{"post":{"operationId":"call_run_report","summary":"Run a stock report (tool call)","description":"Read-only. This cannot change anything in Backbone. Runs one of your stock reports: \"reorder\" (what is at or below its reorder point and needs ordering), \"dead_stock\" (what has stock but has not sold in 90 days or more) or \"velocity\" (your best sellers, by units sold per day). Quantities and dates for everyone; cost and value figures only for people allowed to see financials. Scope: `reports:read`. Called by name: the JSON body is the tool input. REST form: `GET /reports/{report}`.","tags":["Tool calls"],"security":[{"oauth2":["reports:read"]}],"x-backbone-tool":"run_report","x-backbone-kind":"read","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/run_report_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/run_report_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/list_recent_changes":{"post":{"operationId":"call_list_recent_changes","summary":"See recent changes (tool call)","description":"Read-only. This cannot change anything in Backbone. Lists the recent stock changes made through Muse for this business, newest first: what changed, whether you or someone else made it, and whether it was undone. Use it for questions like \"what did you change today?\". Each stock count change shows whether undo_change can still undo it. Scope: `activity:read`. Called by name: the JSON body is the tool input. REST form: `GET /changes`.","tags":["Tool calls"],"security":[{"oauth2":["activity:read"]}],"x-backbone-tool":"list_recent_changes","x-backbone-kind":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_recent_changes_input"}}}},"responses":{"200":{"description":"The answer.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/list_recent_changes_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/adjust_inventory_count":{"post":{"operationId":"call_adjust_inventory_count","summary":"Prepare a stock count change (tool call)","description":"Prepares a change to the stock count of one item at one location, for example after a recount or when items are damaged. This step changes NOTHING: it returns a plain summary such as \"Set Chrome Emblem 2in at Front Rack from 12 to 9 (-3). Reason: damaged.\" and a preview_token. Show the summary to the person, and only if they say yes, call confirm_change with the preview_token. The preview expires after 10 minutes. Needs the person's Backbone permission \"Edit inventory\". Scope: `inventory:write`. Called by name: the JSON body is the tool input. REST form: `POST /inventory/adjustments/preview`.","tags":["Tool calls"],"security":[{"oauth2":["inventory:write"]}],"x-backbone-tool":"adjust_inventory_count","x-backbone-kind":"preview","x-backbone-confirm-with":"confirm_change","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/adjust_inventory_count_input"}}}},"responses":{"200":{"description":"The prepared change. Nothing has changed yet.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/adjust_inventory_count_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/receive_purchase_order":{"post":{"operationId":"call_receive_purchase_order","summary":"Prepare receiving a delivery (tool call)","description":"Prepares receiving a delivery against one of your purchase orders: everything still outstanding, or line by line. This step changes NOTHING: it returns a plain summary of what would be added to stock and a preview_token. Show the summary to the person, and only if they say yes, call confirm_change with the preview_token. The preview expires after 10 minutes. Needs the person's Backbone permission \"Receive POs\". Scope: `purchasing:write`. Called by name: the JSON body is the tool input. REST form: `POST /purchase-orders/{purchase_order_id}/receipts/preview`.","tags":["Tool calls"],"security":[{"oauth2":["purchasing:write"]}],"x-backbone-tool":"receive_purchase_order","x-backbone-kind":"preview","x-backbone-confirm-with":"confirm_change","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/receive_purchase_order_input"}}}},"responses":{"200":{"description":"The prepared change. Nothing has changed yet.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/receive_purchase_order_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/confirm_change":{"post":{"operationId":"call_confirm_change","summary":"Confirm a prepared change (tool call)","description":"Confirms and applies ONE change that was prepared by adjust_inventory_count, receive_purchase_order or undo_change, using its preview_token. Call this ONLY after showing the person the preview summary and hearing them say yes. It fails safely, changing nothing, if the preview expired, was already used, or the numbers changed since it was prepared. Send an idempotency_key so a retry can never apply the change twice. Needs the Backbone permission the prepared change needs (\"Edit inventory\" or \"Receive POs\"). Scope: `inventory:write` or `purchasing:write`. Called by name: the JSON body is the tool input. REST form: `POST /changes/confirm`.","tags":["Tool calls"],"security":[{"oauth2":["inventory:write"]},{"oauth2":["purchasing:write"]}],"x-backbone-tool":"confirm_change","x-backbone-kind":"confirm","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/confirm_change_input"}}}},"responses":{"200":{"description":"The change was applied.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/confirm_change_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"409":{"$ref":"#/components/responses/Error409"},"410":{"$ref":"#/components/responses/Error410"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}},"/tools/undo_change":{"post":{"operationId":"call_undo_change","summary":"Prepare undoing a stock change (tool call)","description":"Prepares undoing one stock count change that was made through Muse. This step changes NOTHING: it returns a summary of the reversing change and a preview_token. Show the summary to the person, and only if they say yes, call confirm_change with the preview_token. Received deliveries cannot be undone through Muse. Needs the person's Backbone permission \"Edit inventory\". Scope: `inventory:write`. Called by name: the JSON body is the tool input. REST form: `POST /changes/{action_id}/undo`.","tags":["Tool calls"],"security":[{"oauth2":["inventory:write"]}],"x-backbone-tool":"undo_change","x-backbone-kind":"undo","x-backbone-confirm-with":"confirm_change","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/undo_change_input"}}}},"responses":{"200":{"description":"The prepared change. Nothing has changed yet.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/undo_change_output"}}}},"400":{"$ref":"#/components/responses/Error400"},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"409":{"$ref":"#/components/responses/Error409"},"429":{"$ref":"#/components/responses/Error429"},"500":{"$ref":"#/components/responses/Error500"},"503":{"$ref":"#/components/responses/Error503"}}}}},"components":{"schemas":{"ErrorEnvelope":{"type":"object","description":"Every connector error has this shape. `message` is plain English for the shop owner and `what_to_do` is one concrete next step. A body never contains database, vendor or stack text.","properties":{"error":{"type":"string","enum":["invalid_token","token_expired","link_revoked","insufficient_scope","forbidden_capability","writes_disabled_for_business","feature_not_available","not_found","invalid_input","invalid_preview","preview_expired","stale_preview","already_applied","not_reversible","idempotency_conflict","rate_limited","upstream_unavailable","internal_error"],"description":"A stable snake_case code."},"message":{"type":"string","description":"What happened, in plain English."},"what_to_do":{"type":"string","description":"One concrete next step."},"request_id":{"type":["string","null"],"description":"Backbone's reference for this request (also the X-Request-Id header)."},"retryable":{"type":"boolean","description":"True only when sending the same request again later can succeed without anyone changing anything."},"retry_after":{"type":"integer","minimum":0,"description":"Seconds to wait before retrying (also the Retry-After header). Present only when known."}},"required":["error","message","what_to_do","request_id","retryable"],"additionalProperties":false},"Manifest":{"type":"object","properties":{"name":{"type":"string","const":"backbone"},"title":{"type":"string"},"manifest_version":{"type":"string"},"business_id":{"type":"string","description":"The one business this connection is linked to."},"scopes":{"type":"array","items":{"type":"string"}},"tools":{"type":"array","items":{"$ref":"#/components/schemas/ToolDescriptor"}}},"required":["name","title","manifest_version","business_id","scopes","tools"]},"ToolDescriptor":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string","enum":["read","preview","confirm","undo"]},"scope":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"capability":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":{"type":"string"}}]},"input_schema":{"type":"object"},"output_schema":{"type":"object"},"annotations":{"type":"object","properties":{"readOnlyHint":{"type":"boolean"},"destructiveHint":{"type":"boolean"},"idempotentHint":{"type":"boolean"},"openWorldHint":{"type":"boolean"}}},"rest":{"type":"object","properties":{"method":{"type":"string"},"path":{"type":"string"}}},"confirm_with":{"type":"string","description":"For preview and undo tools: the tool that applies the prepared change."}},"required":["name","title","description","kind","scope","input_schema","output_schema","annotations"]},"query_inventory_input":{"type":"object","properties":{"variant_query":{"type":"string","maxLength":120,"description":"Part of the product name, for example \"AA batteries\" or \"2in emblem\"."},"sku":{"type":"string","maxLength":120,"description":"The exact SKU."},"barcode":{"type":"string","maxLength":120,"description":"The exact barcode (UPC or EAN) as scanned."},"location_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Only this store location. Leave out for every location."},"low_stock_only":{"type":"boolean","description":"Only items at or below their reorder point."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many rows to return, 1 to 50. Default 20."}},"additionalProperties":false},"query_inventory_output":{"type":"object","properties":{"count":{"type":"integer","description":"How many rows came back."},"items":{"type":"array","items":{"type":"object","properties":{"product_name":{"type":["string","null"]},"variant_name":{"type":["string","null"]},"sku":{"type":["string","null"]},"barcode":{"type":["string","null"]},"location_id":{"type":["string","null"]},"location_name":{"type":["string","null"]},"qty_available":{"type":"number","description":"Units on hand and free to sell."},"qty_reserved":{"type":"number","description":"Units held for open orders."},"qty_incoming":{"type":"number","description":"Units on the way from suppliers."},"reorder_point":{"type":["number","null"],"description":"Reorder when stock falls to this number."}}}},"note":{"type":"string"}},"required":["count","items"]},"lookup_product_input":{"type":"object","properties":{"sku":{"type":"string","maxLength":120,"description":"The exact SKU."},"barcode":{"type":"string","maxLength":120,"description":"The exact barcode (UPC or EAN) as scanned."},"query":{"type":"string","maxLength":120,"description":"Part of the product name, brand or code. Used only when no SKU or barcode is given."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many matches to return, 1 to 50. Default 10."}},"additionalProperties":false},"lookup_product_output":{"type":"object","properties":{"match":{"type":"string","enum":["sku","barcode","name"],"description":"How the items were found."},"count":{"type":"integer"},"items":{"type":"array","items":{"type":"object","properties":{"variant_id":{"type":"string"},"product_id":{"type":["string","null"]},"product_name":{"type":["string","null"]},"variant_name":{"type":["string","null"]},"brand":{"type":["string","null"]},"product_type":{"type":["string","null"]},"sku":{"type":["string","null"]},"barcode":{"type":["string","null"]},"price":{"type":["number","null"],"description":"Selling price."},"cost":{"type":["number","null"],"description":"Unit cost. Only for people allowed to see financials."},"reorder_point":{"type":["number","null"]},"reorder_target":{"type":["number","null"]},"units_per_case":{"type":["number","null"]},"active":{"type":"boolean","description":"False when the item or its product is switched off."},"age_restricted":{"type":"boolean","description":"For information only."},"minimum_age":{"type":["number","null"]},"age_restriction_label":{"type":["string","null"]}}}},"note":{"type":"string"}},"required":["match","count","items"]},"list_low_stock_alerts_input":{"type":"object","properties":{"type":{"type":"string","enum":["low_stock","out_of_stock"],"description":"Only \"low_stock\" or only \"out_of_stock\". Leave out for both."},"location_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Only this store location. Leave out for every location."},"include_acknowledged":{"type":"boolean","description":"Also include alerts someone has already marked as seen. Default false (open alerts only)."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many alerts to return, 1 to 50. Default 20."}},"additionalProperties":false},"list_low_stock_alerts_output":{"type":"object","properties":{"count":{"type":"integer"},"alerts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["low_stock","out_of_stock"]},"severity":{"type":"string"},"status":{"type":"string","enum":["open","acknowledged"]},"title":{"type":["string","null"]},"message":{"type":["string","null"]},"product_name":{"type":["string","null"]},"variant_name":{"type":["string","null"]},"sku":{"type":["string","null"]},"barcode":{"type":["string","null"]},"location_id":{"type":["string","null"]},"location_name":{"type":["string","null"]},"qty_available":{"type":["number","null"],"description":"Units on hand when the alert was raised or last updated."},"reorder_point":{"type":["number","null"],"description":"The level that triggered the alert."},"raised_at":{"type":["string","null"]},"updated_at":{"type":["string","null"]}}}},"note":{"type":"string"}},"required":["count","alerts"]},"list_purchase_orders_input":{"type":"object","properties":{"status":{"type":"string","enum":["open","draft","pending_approval","sent","partially_received","received","cancelled","closed"],"description":"\"open\" = ordered and still waiting for some or all of the delivery. Or one exact status. Leave out for every status."},"vendor":{"type":"string","maxLength":120,"description":"Part of the supplier name."},"location_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Only orders shipping to this store location."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many orders to return, 1 to 50. Default 20."}},"additionalProperties":false},"list_purchase_orders_output":{"type":"object","properties":{"count":{"type":"integer"},"purchase_orders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"po_number":{"type":["string","null"]},"status":{"type":"string","description":"One of: draft, pending_approval, sent, partially_received, received, cancelled, closed."},"vendor_name":{"type":["string","null"]},"location_id":{"type":["string","null"]},"location_name":{"type":["string","null"]},"ordered_at":{"type":["string","null"]},"expected_at":{"type":["string","null"]},"created_at":{"type":["string","null"]},"line_count":{"type":"integer"},"units_ordered":{"type":"number"},"units_received":{"type":"number"},"units_outstanding":{"type":"number"},"currency":{"type":["string","null"]},"subtotal":{"type":["number","null"],"description":"Only for people allowed to see financials."},"total":{"type":["number","null"],"description":"Only for people allowed to see financials."}}}},"note":{"type":"string"}},"required":["count","purchase_orders"]},"get_purchase_order_input":{"type":"object","properties":{"purchase_order_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The purchase order id (from list_purchase_orders)."},"po_number":{"type":"string","maxLength":40,"description":"The PO number as printed, for example \"PO-00001234\". Used when no id is given."},"line_limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many lines to return, 1 to 50. Default 50."},"line_offset":{"type":"integer","minimum":0,"description":"Skip this many lines first, to page through a long order. Default 0."}},"additionalProperties":false},"get_purchase_order_output":{"type":"object","properties":{"purchase_order":{"type":"object","properties":{"id":{"type":"string"},"po_number":{"type":["string","null"]},"status":{"type":"string","description":"One of: draft, pending_approval, sent, partially_received, received, cancelled, closed."},"vendor_name":{"type":["string","null"]},"location_id":{"type":["string","null"]},"location_name":{"type":["string","null"]},"ordered_at":{"type":["string","null"]},"expected_at":{"type":["string","null"]},"sent_at":{"type":["string","null"]},"closed_at":{"type":["string","null"]},"cancelled_at":{"type":["string","null"]},"created_at":{"type":["string","null"]},"can_receive":{"type":"boolean","description":"False for cancelled or closed orders."},"line_count":{"type":"integer"},"units_ordered":{"type":"number"},"units_received":{"type":"number"},"units_outstanding":{"type":"number"},"currency":{"type":["string","null"]},"subtotal":{"type":["number","null"]},"tax_total":{"type":["number","null"]},"shipping_total":{"type":["number","null"]},"discount_total":{"type":["number","null"]},"total":{"type":["number","null"]}}},"lines":{"type":"array","items":{"type":"object","properties":{"line_id":{"type":"string"},"line_number":{"type":["number","null"]},"description":{"type":["string","null"]},"variant_id":{"type":["string","null"]},"product_name":{"type":["string","null"]},"variant_name":{"type":["string","null"]},"sku":{"type":["string","null"]},"barcode":{"type":["string","null"]},"vendor_sku":{"type":["string","null"]},"quantity_ordered":{"type":["number","null"]},"units_per_case":{"type":["number","null"]},"units_ordered":{"type":"number"},"units_received":{"type":"number"},"units_outstanding":{"type":"number"},"receivable":{"type":"boolean","description":"False when the line is not matched to a catalog item yet."},"unit_cost":{"type":["number","null"]},"line_total":{"type":["number","null"]}}}},"lines_returned":{"type":"integer"},"line_offset":{"type":"integer"},"more_lines":{"type":"boolean","description":"True when there are more lines after this page."}},"required":["purchase_order","lines"]},"last_stock_count_input":{"type":"object","properties":{"location_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Only this store location. Leave out for the latest count at each location."},"include_in_progress":{"type":"boolean","description":"Also consider counts that are not finished yet. Default false (finished counts only)."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many locations to return, 1 to 50. Default 5."}},"additionalProperties":false},"last_stock_count_output":{"type":"object","properties":{"count":{"type":"integer"},"stock_counts":{"type":"array","items":{"type":"object","properties":{"stock_count_id":{"type":"string"},"name":{"type":["string","null"]},"status":{"type":"string","description":"complete, or (when asked for) draft, awaiting_approval or modifications_needed."},"location_id":{"type":["string","null"]},"location_name":{"type":["string","null"]},"started_at":{"type":["string","null"]},"submitted_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"items_on_count":{"type":"integer","description":"Items listed on the count."},"items_counted":{"type":"integer","description":"Items that were actually counted."},"items_with_difference":{"type":"integer","description":"Counted items whose count differed from what Backbone expected."},"units_short":{"type":"number","description":"Total units found MISSING (counted below expected)."},"units_over":{"type":"number","description":"Total units found EXTRA (counted above expected)."},"net_difference":{"type":"number","description":"units_over minus units_short."},"differences_complete":{"type":"boolean","description":"False if the count was too large to add up every difference."},"biggest_differences":{"type":"array","items":{"type":"object","properties":{"product_name":{"type":["string","null"]},"variant_name":{"type":["string","null"]},"sku":{"type":["string","null"]},"expected_qty":{"type":["number","null"]},"counted_qty":{"type":["number","null"]},"difference":{"type":["number","null"]}}}}}}},"note":{"type":"string"}},"required":["count","stock_counts"]},"run_report_input":{"type":"object","properties":{"report":{"type":"string","enum":["reorder","dead_stock","velocity"],"description":"\"reorder\" = what is at or below its reorder point and needs ordering; \"dead_stock\" = what has stock but has not sold in 90 days or more; \"velocity\" = the best sellers, by units sold per day."},"location_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Only this store location. Leave out for every location."},"days":{"type":"integer","minimum":90,"description":"dead_stock only: at least this many days without a sale (90 or more)."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many rows to return, 1 to 50. Default 20."}},"required":["report"],"additionalProperties":false},"run_report_output":{"type":"object","properties":{"report":{"type":"string","enum":["reorder","dead_stock","velocity"]},"count":{"type":"integer"},"items":{"type":"array","description":"One row per item and location. Quantities and dates for everyone; cost and value figures only for people allowed to see financials.","items":{"type":"object"}},"min_days_without_sale":{"type":"integer"},"note":{"type":"string"},"note_financials":{"type":"string"}},"required":["report","count","items"]},"list_recent_changes_input":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":50,"description":"How many changes to return, 1 to 50. Default 20."}},"additionalProperties":false},"list_recent_changes_output":{"type":"object","properties":{"count":{"type":"integer"},"changes":{"type":"array","items":{"type":"object","properties":{"action_id":{"type":"string","description":"Pass this to undo_change to undo a stock count change."},"action":{"type":"string","enum":["adjust_inventory_count","receive_purchase_order","reverse_inventory_adjustment"]},"status":{"type":"string","enum":["applied","reversed"],"description":"\"reversed\" means it was undone."},"summary":{"type":["string","null"]},"made_by_you":{"type":"boolean"},"user_id":{"type":["string","null"]},"created_at":{"type":["string","null"]},"applied_at":{"type":["string","null"]},"undo_of":{"type":["string","null"],"description":"For an undo: the change it undid."},"undone_by":{"type":["string","null"],"description":"For an undone change: the undo that reversed it."},"can_undo":{"type":"boolean","description":"True for an applied stock count change that has not been undone."}}}}},"required":["count","changes"]},"adjust_inventory_count_input":{"type":"object","properties":{"variant_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The item to adjust. Or give its sku or barcode instead."},"sku":{"type":"string","maxLength":120,"description":"The exact SKU of the item to adjust."},"barcode":{"type":"string","maxLength":120,"description":"The exact barcode of the item to adjust."},"location_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The store location whose count changes."},"counted_qty":{"type":"integer","minimum":0,"maximum":1000000,"description":"The new count, as counted on the shelf. Give this OR qty_delta."},"qty_delta":{"type":"integer","minimum":-1000000,"maximum":1000000,"description":"Units to add (positive) or remove (negative), never 0. Give this OR counted_qty."},"reason":{"type":"string","minLength":1,"maxLength":500,"description":"Why the count is changing, for example \"damaged\" or \"recount\"."}},"required":["location_id","reason"],"additionalProperties":false},"adjust_inventory_count_output":{"type":"object","properties":{"preview_token":{"type":"string","description":"Pass this to confirm_change once the person says yes."},"action_id":{"type":"string"},"summary":{"type":"string","description":"One plain sentence describing the change. Show it to the person before confirming."},"before":{"type":"object"},"after":{"type":"object"},"expires_at":{"type":"string","description":"The preview stops working after this time (10 minutes)."}},"required":["preview_token","action_id","summary","expires_at"]},"receive_purchase_order_input":{"type":"object","properties":{"purchase_order_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The purchase order the delivery is for. Or give po_number."},"po_number":{"type":"string","maxLength":40,"description":"The PO number as printed, for example \"PO-00001234\"."},"receive_all":{"type":"boolean","description":"Receive everything still outstanding on the order."},"receipts":{"type":"array","maxItems":200,"description":"What arrived, line by line. Leave out when receive_all is true.","items":{"type":"object","properties":{"line_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The PO line (from get_purchase_order). Or give sku."},"sku":{"type":"string","maxLength":120},"quantity":{"type":"integer","minimum":1,"maximum":1000000,"description":"Single units that arrived."},"notes":{"type":"string","maxLength":500}},"required":["quantity"],"additionalProperties":false}}},"additionalProperties":false},"receive_purchase_order_output":{"type":"object","properties":{"preview_token":{"type":"string","description":"Pass this to confirm_change once the person says yes."},"action_id":{"type":"string"},"summary":{"type":"string","description":"One plain sentence describing the change. Show it to the person before confirming."},"before":{"type":"object"},"after":{"type":"object"},"expires_at":{"type":"string","description":"The preview stops working after this time (10 minutes)."}},"required":["preview_token","action_id","summary","expires_at"]},"confirm_change_input":{"type":"object","properties":{"preview_token":{"type":"string","minLength":1,"maxLength":4096,"description":"The preview_token from the preview the person agreed to."},"idempotency_key":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x20-\\x7E]+$","description":"Any retry key of your choice. Sending the same key again returns the first result and never applies the change twice."}},"required":["preview_token"],"additionalProperties":false},"confirm_change_output":{"type":"object","properties":{"action_id":{"type":"string"},"action":{"type":"string","enum":["adjust_inventory_count","receive_purchase_order","reverse_inventory_adjustment"]},"status":{"type":"string","enum":["applied"]},"summary":{"type":"string"},"before":{"type":"object"},"after":{"type":"object"},"applied_at":{"type":"string"},"result":{"type":"object","description":"What was written: inventory_event_ids, or receipt_ids and po_status_after."},"reversible":{"type":"boolean","description":"True when undo_change can undo this change."},"request_id":{"type":["string","null"],"description":"Backbone's reference for the confirmation that applied it."}},"required":["action_id","action","status","summary"]},"undo_change_input":{"type":"object","properties":{"action_id":{"type":"string","format":"uuid","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"The applied stock adjustment to undo (from confirm_change or list_recent_changes)."}},"required":["action_id"],"additionalProperties":false},"undo_change_output":{"type":"object","properties":{"preview_token":{"type":"string","description":"Pass this to confirm_change once the person says yes."},"action_id":{"type":"string"},"summary":{"type":"string","description":"One plain sentence describing the change. Show it to the person before confirming."},"before":{"type":"object"},"after":{"type":"object"},"expires_at":{"type":"string","description":"The preview stops working after this time (10 minutes)."}},"required":["preview_token","action_id","summary","expires_at"]}},"responses":{"Error400":{"description":"The request or its details were not valid. error is one of: invalid_input, invalid_preview.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"invalid_input","message":"Some of the details in this request are not valid.","what_to_do":"Check the details and try again.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":false}}}},"Error401":{"description":"The connection is missing, expired, or turned off. error is one of: invalid_token, token_expired, link_revoked.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"WWW-Authenticate":{"$ref":"#/components/headers/WWW-Authenticate"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"invalid_token","message":"Backbone did not recognise this connection.","what_to_do":"Reconnect Backbone in Muse.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":false}}}},"Error403":{"description":"The connection, the person's Backbone role, the business's settings or its plan do not allow this. error is one of: insufficient_scope, forbidden_capability, writes_disabled_for_business, feature_not_available.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"WWW-Authenticate":{"$ref":"#/components/headers/WWW-Authenticate"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"insufficient_scope","message":"This connection was not given permission to do that.","what_to_do":"Reconnect Backbone in Muse and allow this kind of access when Backbone asks.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":false}}}},"Error404":{"description":"Backbone could not find that. error is one of: not_found.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"not_found","message":"Backbone could not find that.","what_to_do":"Check the name, SKU, barcode or number and try again.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":false}}}},"Error409":{"description":"The change could not be applied as prepared. error is one of: stale_preview, already_applied, not_reversible, idempotency_conflict.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"stale_preview","message":"The numbers changed after this change was prepared, so Backbone did not apply it.","what_to_do":"Ask Muse to prepare the change again with the latest numbers.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":false}}}},"Error410":{"description":"The prepared change expired before it was confirmed. error is one of: preview_expired.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"preview_expired","message":"That prepared change expired before it was confirmed, so nothing was changed.","what_to_do":"Ask Muse to prepare the change again, then confirm it.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":false}}}},"Error429":{"description":"Too many requests in a short time. error is one of: rate_limited.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"rate_limited","message":"Too many requests reached Backbone in a short time.","what_to_do":"Wait a moment, then try again.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":true,"retry_after":30}}}},"Error500":{"description":"Something went wrong on Backbone's side. error is one of: internal_error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"internal_error","message":"Something went wrong on Backbone's side.","what_to_do":"Try again later. If it keeps happening, contact Backbone support.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":false}}}},"Error503":{"description":"Backbone is having trouble right now. Nothing was changed. error is one of: upstream_unavailable.","headers":{"X-Request-Id":{"$ref":"#/components/headers/X-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"error":"upstream_unavailable","message":"Backbone is having trouble right now. Nothing was changed.","what_to_do":"Wait a minute, then try again.","request_id":"7f3c2a9e-1b4d-4c55-9e61-0a8b2d3c4e5f","retryable":true}}}}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Any retry key of your choice, 1 to 255 printable ASCII characters. The same key with the same preview returns the first result, byte for byte, and never applies the change twice; the same key with a different preview answers 409 idempotency_conflict. Keys are per connection and kept at least 24 hours. You may send it as idempotency_key in the body instead; if both are sent they must match.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x20-\\x7E]+$"}}},"headers":{"X-Request-Id":{"description":"Backbone's reference for this request.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0}},"WWW-Authenticate":{"description":"Bearer challenge (RFC 6750). resource_metadata points to https://app.backbonesolutions.ai/.well-known/oauth-protected-resource (RFC 9728), where an MCP client starts OAuth.","schema":{"type":"string"}}},"securitySchemes":{"oauth2":{"type":"oauth2","description":"OAuth 2.0 authorization code grant with PKCE. PKCE with S256 is required for every client; clients are public (no client secret). Register with Dynamic Client Registration (RFC 7591) at https://app.backbonesolutions.ai/api/connector/oauth/register. Server metadata: https://app.backbonesolutions.ai/.well-known/oauth-authorization-server (RFC 8414). The person signs in to Backbone, picks exactly ONE business and approves the scopes. Every call then runs as that person, with their Backbone role and permissions: a scope limits what the connection may do and never widens what the person may do. Access tokens last one hour by default; refresh tokens rotate on every use and last 30 days by default. After a refresh the earlier access tokens stop working 60 seconds later, so switch to the new one. Revoke a token at https://app.backbonesolutions.ai/api/connector/oauth/revoke (RFC 7009).","flows":{"authorizationCode":{"authorizationUrl":"https://app.backbonesolutions.ai/api/connector/oauth/authorize","tokenUrl":"https://app.backbonesolutions.ai/api/connector/oauth/token","refreshUrl":"https://app.backbonesolutions.ai/api/connector/oauth/token","scopes":{"inventory:read":"See your products, stock levels, stock counts and low-stock alerts","purchasing:read":"See your purchase orders and what has been received","reports:read":"Run your stock reports, such as what to reorder and what is not selling","activity:read":"See the stock changes made through Muse, and whether any were undone","inventory:write":"Change stock counts, but only after you confirm each change","purchasing:write":"Receive deliveries against your purchase orders, but only after you confirm each one"}}}}}},"x-mcp":{"endpoint":"https://app.backbonesolutions.ai/api/connector/mcp","transport":"streamable-http","stateless":true,"protocol_version":"2025-06-18","protected_resource_metadata":"https://app.backbonesolutions.ai/.well-known/oauth-protected-resource/api/connector/mcp"},"x-rate-limits":{"reads_per_minute_per_connection":120,"changes_per_minute_per_connection":20,"oauth_authorize_requests_per_15_minutes_per_ip":60,"oauth_registrations_per_15_minutes_per_ip":300,"oauth_token_requests_per_15_minutes_per_ip":600,"oauth_token_requests_per_15_minutes_per_credential":10}}