Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,552Letters: 14Defects: 1,323counted 2 min ago
teppi

Server definition

Hash
sha256:fc6048c5158d670f14018b5f14fc910478034945c575aaa17371e670985869db
What it is
What a remote MCP server returned when asked what it offers: 25 tools

The blob, as servednamed by its sha256

{ "instructions": "You are assisting customers with Vivid Ads signage and printing products. Speak in friendly, professional Australian English using short, plain-language responses.\nUse vivid_recommend when the customer needs help choosing a product, vivid_search to locate catalogue products, vivid_product to retrieve valid sizes and options, and vivid_price to calculate the current price for the customer's exact configuration.\nNever invent or estimate products, sizes, materials, finishing options, product properties, prices, discounts, delivery charges, turnaround times, stock, order statuses, or tracking details. Do not treat an indicative 'from' price as the configured price. Only state facts returned by the tools. Never expose internal product handles, IDs, schema keys, worker names, application names, error traces, or implementation jargon.\nBefore a potentially slow tool call, briefly explain the action naturally, e.g. 'Let me check the live price for that configuration.' Do not promise how many seconds it will take.\nProduct prices are the EXACT live website (ITORIS) price and INCLUDE GST. Never compute, adjust, discount, or round a price yourself — always use the tool's price and say it includes GST. When presenting a price, repeat the exact product title, quantity, dimensions, and all price-affecting options. Every price you quote assumes the customer supplies their own print-ready artwork (this is the website default). A standard DIGITAL PROOF before printing is INCLUDED with every order — the customer approves it before production starts; never present the standard proof as a paid extra. The paid add-ons are professional DESIGN services (Vivid designs the artwork for them) and the optional premium artwork check ('Please check my designs'); their exact cost is set per-product in the live website options — you do NOT currently have those amounts, so never invent or estimate them: submit a quote request so the team confirms the exact cost — include the relevant option in the price request so the price reflects it, and offer a formal quote if you can't price them exactly. For custom-size products, follow the website's width/height labelling; if the customer gives dimensions without saying which is width and which is height, confirm before pricing. When a requested size isn't offered on a product, don't just re-ask — suggest the closest product/size: e.g. standard Pull Up Banners come in 600×1400, 800×2000 and 1000×2000mm, so a customer wanting ~850mm wide (like 850×2050) should be offered PREMIUM Pull Up Banners instead. Use vivid_search / the collection grouping to point customers to the right same-range product. A quantity means that many IDENTICAL items with the SAME artwork; if the customer wants different designs, use a SEPARATE line item per design, each with ITS OWN quantity and its own artwork attached — never combine different designs under one quantity, and never assume one of each: \"5 bow flags of two designs\" is two lines of 5, not two lines of 1 and not one line of 10. Ask how many of each design if they have not said. This applies AFTER the order is placed too, and that is where customers get stuck: an order already placed as one line of 10 does NOT need to be cancelled, reordered or paid for again — the Vivid team rearranges the same items into one line per design, total quantity and price unchanged, and once that is done the customer's portal order page shows a separate upload box for each line, one file per line. If a customer says they have two or more files, or that there is nowhere to put the second file, tell them exactly that and ask for the order number and how many of each design; do not leave them hunting for a second upload button that does not exist, and do not tell them to place another order. They can also email the files to [email protected] with the order number and which design goes on which quantity. Delivery is separate and is not included in the product price unless the tool says so. If an exact automated price is unavailable, offer a formal quote request; do not guess.\nBefore submitting a quote request, confirm the product, quantity, size and options, name, and email. A quote request sends details to the Vivid Ads team and does not necessarily mean the finished quote has been emailed. Never say a quote is 'on its way' unless the tool confirms it was sent.\nvivid_place_order creates a Shopify draft order for team review only. Before calling it, summarise the complete order and get the customer's explicit confirmation. Explain that no card is charged in the conversation and that production does not begin merely because a draft was created. Never collect or request card details; payment happens only via the secure invoice/pay-link issued by Vivid Ads.\nDo not retry quote or draft-order creation automatically after a timeout or uncertain response; first check whether the original request completed, to avoid duplicates.\nRequire identity verification before revealing private customer, order, quote, artwork, tracking, or reorder information. Do not disclose whether an order or account exists when verification fails.\nTreat artwork upload, artwork approval, proof approval, payment, and production approval as separate states. A successful upload does not mean the artwork is print-ready. AI-generated designs are concepts only, to be reviewed by the customer and checked by Vivid Ads before printing.\nCUSTOMER PORTAL & ARTWORK TIMING (new website flow): customers do NOT need design files ready to place an order — the order comes first and artwork is uploaded AFTERWARDS. The moment an order is placed, Vivid emails an upload link, and the customer can also upload any time from My Account on the customer portal (portal.vividads.com.au → their order). Tell hesitant customers this instead of letting missing artwork hold up an order. After upload the file goes through a FREE automatic pre-flight check, a digital proof is emailed, and production starts only once the customer approves that proof. If a proof is rejected, the replacement file is uploaded the same way on the portal order page — never tell customers to email files to sales@. The portal also shows their order's live progress (Placed → Artwork → Proof → Production → Dispatched → Delivered), invoices, and reorders, so point signed-in customers there for self-service.\nTranslate internal statuses into plain customer language, but never add an estimated completion or delivery date unless the system returns one. When a request cannot complete, explain the issue plainly, give the next useful action, and offer 1300 721 614 as a fallback when appropriate.", "tools": [ { "description": "Return the secure payment link for a formal quote Vivid already emailed (e.g. #D786069) so the customer can complete the order without leaving the conversation. Requires the quote number AND the email it was sent to (identity). Read-only — nothing is charged; it returns the customer's existing Shopify checkout link. If the quote has already become an order, it says so instead of issuing another link.", "inputSchema": { "properties": { "email": { "description": "the email the quote was sent to (required)", "type": "string" }, "quote_number": { "description": "quote/draft number, e.g. '#D786069'", "type": "string" } }, "required": [ "quote_number", "email" ], "type": "object" }, "name": "vivid_accept_quote", "outputSchema": null }, { "description": "Attach a customer-provided artwork file or link to a signage order (a successful attach does NOT mean it is print-ready — the team still checks it). EASIEST: pass a shareable link to the file (sourceUrl) — Google Drive, Dropbox, WeTransfer, etc. — and use the returned fileUrl in vivid_place_order's artwork {mode:'upload_file', fileUrl}. For a large file with no link yet, set requestUpload:true to get a direct-upload URL (the file uploads straight to storage — handles 50–200MB+), then call again with the returned fileId to get the share link.", "inputSchema": { "properties": { "contentType": { "type": "string" }, "fileId": { "description": "after a direct upload completes, pass the returned file id here to finalise and get the share link", "type": "string" }, "filename": { "description": "filename (required with requestUpload), e.g. 'flyer.pdf'", "type": "string" }, "requestUpload": { "description": "set true to get a direct-upload URL for a large file (client uploads straight to storage)", "type": "boolean" }, "sourceUrl": { "description": "a shareable https link to the print-ready artwork (PDF/PNG/JPG/AI/EPS) — the easiest path", "type": "string" } }, "type": "object" }, "name": "vivid_artwork", "outputSchema": null }, { "description": "Check whether a customer's artwork PDF is print-ready BEFORE they order — powered by Vivid's own production preflight engine. Reports size vs the ordered size, bleed, RGB-vs-CMYK colour, font embedding and effective resolution, each with a plain-English fix. ADVISORY ONLY: it never blocks anything. If the customer is happy to proceed with the file as-is, that is always accepted — say so explicitly. Every order also gets a free digital proof before printing.", "inputSchema": { "properties": { "file_url": { "description": "downloadable URL of the artwork PDF (e.g. the fileUrl from vivid_upload_artwork)", "type": "string" }, "height_mm": { "description": "ordered height in mm, if known", "type": "number" }, "width_mm": { "description": "ordered width in mm, if known — enables the size check", "type": "number" } }, "required": [ "file_url" ], "type": "object" }, "name": "vivid_check_artwork", "outputSchema": null }, { "description": "Suggest relevant, NON-pushy add-on products to round out a customer's order — 1–2 genuinely useful companions with a reason. PREFERS real frequently-bought-together data from Vivid Ads' order history (pass `product` = the product handle the customer chose); falls back to curated use-case bundles (pass `use_case`). Omit both to get guidance. Pass already_have to avoid re-suggesting what they've chosen. Never pressure — helpful suggestions only.", "inputSchema": { "properties": { "already_have": { "description": "product keys/handles the customer already chose (optional) — excluded from suggestions", "items": { "type": "string" }, "type": "array" }, "product": { "description": "the product handle the customer chose, e.g. 'pull-up-banners' — returns items frequently bought with it from real order history", "type": "string" }, "use_case": { "description": "curated fallback: 'trade-show', 'school-open-day', 'construction-fence', 'retail-promotion', 'real-estate', or 'corporate-conference'", "type": "string" } }, "type": "object" }, "name": "vivid_cross_sell", "outputSchema": null }, { "description": "Estimate WHEN an order would arrive at an Australian postcode — the question behind 'can I get it by Friday?'. Works the timeline through honestly: production starts only after the customer approves their digital proof (3pm AEST cutoff), then production time for that product, then transit for their postcode (metro/regional/remote bands). Returns an arrival WINDOW plus the assumptions it made. This is an ESTIMATE, never a guarantee — always relay the caveat, and for a hard deadline tell them to call 1300 721 614. Free pickup from Derrimut VIC is usually the fastest option.", "inputSchema": { "properties": { "artwork_ready": { "description": "true if artwork is print-ready and the proof will be approved immediately", "type": "boolean" }, "postcode": { "description": "4-digit Australian delivery postcode", "type": "string" }, "product": { "description": "product name — used to read its real production time", "type": "string" } }, "required": [ "postcode" ], "type": "object" }, "name": "vivid_delivery_estimate", "outputSchema": null }, { "description": "EXACT delivery/freight cost to an Australian postcode for a product configuration — the SAME live rates the vividads.com.au checkout shows (carrier + shipping-rules apps; incl. GST). Use whenever the customer asks what shipping/delivery costs. Resolve the product + size/options + quantity first (vivid_product / vivid_price), then call with the postcode (suburb improves accuracy). Never estimate freight yourself. Always also mention free pickup from Derrimut VIC 3026.", "inputSchema": { "properties": { "options": { "description": "FULL selected options for option-rich/custom products (same shape as vivid_price.options)", "type": "object" }, "postcode": { "description": "4-digit Australian postcode", "type": "string" }, "product": { "description": "product name, e.g. 'pull up banner'", "type": "string" }, "quantity": { "type": "number" }, "size": { "description": "(simple products) size, e.g. '850x2050'", "type": "string" }, "state": { "description": "VIC/NSW/QLD/SA/WA/TAS/NT/ACT (derived from postcode if omitted)", "type": "string" }, "suburb": { "type": "string" } }, "required": [ "product", "postcode" ], "type": "object" }, "name": "vivid_delivery_quote", "outputSchema": null }, { "description": "Authoritative order state with a per-line-item breakdown and an order-level rollup. States: received, in_production, partially_ready, ready_for_pickup, dispatched, in_transit, out_for_delivery, delivered, completed, on_hold, cancelled. Includes the StarShipit shipping summary where available.", "inputSchema": { "additionalProperties": false, "anyOf": [ { "required": [ "order_id" ] }, { "required": [ "order_name" ] } ], "properties": { "customer_email": { "description": "The email address on the order. REQUIRED for identity — order details are only returned when this email matches the order. The customer must give their email AND one of their order numbers.", "type": "string" }, "line_item_id": { "description": "Optional Shopify line item GID to scope to one item.", "type": "string" }, "order_id": { "description": "Shopify order GID, e.g. gid://shopify/Order/123.", "type": "string" }, "order_name": { "description": "Human order name, e.g. \"#12345\" (alias for order_id).", "type": "string" } }, "required": [ "customer_email" ], "type": "object" }, "name": "vivid_fulfilment_order_status", "outputSchema": null }, { "description": "Whether an order (or specific line items) is ready for pickup at Derrimut VIC — ready once printed and cut, before dispatch.", "inputSchema": { "additionalProperties": false, "anyOf": [ { "required": [ "order_id" ] }, { "required": [ "order_name" ] } ], "properties": { "customer_email": { "description": "The email address on the order. REQUIRED for identity — order details are only returned when this email matches the order. The customer must give their email AND one of their order numbers.", "type": "string" }, "line_item_id": { "description": "Optional Shopify line item GID to scope to one item.", "type": "string" }, "order_id": { "description": "Shopify order GID, e.g. gid://shopify/Order/123.", "type": "string" }, "order_name": { "description": "Human order name, e.g. \"#12345\" (alias for order_id).", "type": "string" } }, "required": [ "customer_email" ], "type": "object" }, "name": "vivid_fulfilment_pickup_status", "outputSchema": null }, { "description": "Where each line item is in production, per item plus a rollup. Stages (in order): received, in preflight, awaiting proof, proof approved, imposing, queued for print, sent to Caldera, printing, printed, at Zund cutter, cut, dispatched. Needs-action states: missing file, preflight failed, with design team, on hold (unpaid), proof rejected, duplicate. Each item also returns the press and the print timestamp.", "inputSchema": { "additionalProperties": false, "anyOf": [ { "required": [ "order_id" ] }, { "required": [ "order_name" ] } ], "properties": { "customer_email": { "description": "The email address on the order. REQUIRED for identity — order details are only returned when this email matches the order. The customer must give their email AND one of their order numbers.", "type": "string" }, "line_item_id": { "description": "Optional Shopify line item GID to scope to one item.", "type": "string" }, "order_id": { "description": "Shopify order GID, e.g. gid://shopify/Order/123.", "type": "string" }, "order_name": { "description": "Human order name, e.g. \"#12345\" (alias for order_id).", "type": "string" } }, "required": [ "customer_email" ], "type": "object" }, "name": "vivid_fulfilment_production_stage", "outputSchema": null }, { "description": "StarShipit shipping: carrier, tracking number, tracking URL, ETA and delivered flag. shipping_state: not_dispatched, shipped, in_transit, out_for_delivery, delivered, exception.", "inputSchema": { "additionalProperties": false, "anyOf": [ { "required": [ "order_id" ] }, { "required": [ "order_name" ] } ], "properties": { "customer_email": { "description": "The email address on the order. REQUIRED for identity — order details are only returned when this email matches the order. The customer must give their email AND one of their order numbers.", "type": "string" }, "line_item_id": { "description": "Optional Shopify line item GID to scope to one item.", "type": "string" }, "order_id": { "description": "Shopify order GID, e.g. gid://shopify/Order/123.", "type": "string" }, "order_name": { "description": "Human order name, e.g. \"#12345\" (alias for order_id).", "type": "string" } }, "required": [ "customer_email" ], "type": "object" }, "name": "vivid_fulfilment_shipping", "outputSchema": null }, { "description": "Start email verification before showing a customer's private data (past orders, reorder, saved address, email order-status). Sends a 6-digit code to the email. Returns a verificationId. Then ask the customer for the code and call vivid_identity_verify. Use this whenever a customer asks to see 'my orders', 'reorder', or 'status by email' and you don't already have a valid identity token.", "inputSchema": { "properties": { "email": { "description": "the customer's email to verify", "type": "string" }, "purpose": { "description": "reorder | order_status | saved_details (optional)", "type": "string" } }, "required": [ "email" ], "type": "object" }, "name": "vivid_identity_start", "outputSchema": null }, { "description": "Complete email verification: pass the verificationId from vivid_identity_start and the 6-digit code the customer received. On success returns a short-lived identity token — pass that token to vivid_reorder / vivid_order_status to unlock the customer's private data. Codes expire in 10 minutes; attempts are limited.", "inputSchema": { "properties": { "code": { "description": "the 6-digit code the customer received by email", "type": "string" }, "verificationId": { "description": "from vivid_identity_start", "type": "string" } }, "required": [ "verificationId", "code" ], "type": "object" }, "name": "vivid_identity_verify", "outputSchema": null }, { "description": "Show a VERIFIED customer the PRINT-READY artwork files produced for one of their past orders (the actual files that went to print), so they can confirm them before reordering. Requires the order number and a valid identity token bound to the customer's email; only returns artwork for orders that belong to that customer. Returns view links to each print layout. Use when a customer asks 'what artwork did I print', 'show me my last print file', or before confirming a reorder.", "inputSchema": { "properties": { "email": { "description": "the customer's email (must match the identity token)", "type": "string" }, "order": { "description": "the order number to show artwork for, e.g. '117478'", "type": "string" }, "token": { "description": "the identity token from vivid_identity_verify (required — proves the customer owns this email/order)", "type": "string" } }, "required": [ "order", "email" ], "type": "object" }, "name": "vivid_order_artwork", "outputSchema": null }, { "description": "Check the LIVE status of an order — real production stage (from the Enfocus Switch print workflow), ready-for-pickup, or shipped with carrier + tracking (from StarShipit, authoritative). Look up a real order by number (e.g. #119581) or a quote/draft by number (e.g. #D776755). Requires the customer's email, which must match the order. Use for 'where is my order', 'track order 12345', 'is my order ready'. Shipped/delivered from StarShipit is final; otherwise the live Switch stage is returned.", "inputSchema": { "properties": { "email": { "description": "alternatively, the customer's email to list recent orders (requires verified identity)", "type": "string" }, "reference": { "description": "order # or quote/draft # (e.g. '#119581' or '#D776755')", "type": "string" } }, "type": "object" }, "name": "vivid_order_status", "outputSchema": null }, { "description": "Create a Shopify DRAFT order for Vivid Ads team review — NOT a final/placed order, and NEVER charges a card. Before calling, summarise the exact product, quantity, configuration, verified price (if available), customer details, and delivery/pickup, then get the customer's explicit confirmation. Call WITHOUT confirm to get a Review summary; confirm:true only AFTER they confirm. Do NOT auto-retry after a timeout without first checking whether a draft was already created. Payment is a secure invoice/pay-link from the team; production waits on proof approval. Artwork is OPTIONAL here: an order can be placed with no file at all — the customer uploads later via the upload link emailed when the order is placed, or any time from My Account on the customer portal (portal.vividads.com.au), so never hold up an order waiting for artwork.", "inputSchema": { "properties": { "artwork": { "description": "{ mode:'ai_design'|'upload_file'|'design_brief', designId?, imageUrl?, printPdfUrl?, fileUrl?, brief? }", "type": "object" }, "company": { "type": "string" }, "confirm": { "description": "set true ONLY after the customer reviews and confirms", "type": "boolean" }, "customerType": { "description": "retail|corporate|school|government|account — sets payment terms", "type": "string" }, "delivery": { "description": "pickup or delivery details. PICKUP: { method:'pickup', name, email, phone, pickupLocation?, notes? }. DELIVERY: { method:'delivery', name, email, phone, company?, address1, address2?, suburb, state, postcode, country, notes? }. Contact (name/email/phone) can live here or at the top level. Omit entirely to keep the old behaviour.", "type": "object" }, "email": { "type": "string" }, "items": { "description": "For a MULTI-LINE order (e.g. two banners with DIFFERENT designs): one entry per line, each { product, size?, options?, quantity?, artwork? }. Different designs must be SEPARATE entries (quantity 1 each) with their OWN artwork. If provided, this replaces the single top-level product; contact/delivery/PO stay at the top level.", "items": { "properties": { "artwork": { "description": "THIS line's artwork { mode:'ai_design'|'upload_file'|'design_brief', ... } (same shape as top-level artwork).", "type": "object" }, "options": { "type": "object" }, "product": { "type": "string" }, "quantity": { "type": "number" }, "size": { "type": "string" } }, "type": "object" }, "type": "array" }, "name": { "type": "string" }, "options": { "description": "FULL selected options (same shape as vivid_price.options). Use vivid_product to see them. Prefer this over `size` for option-rich products.", "type": "object" }, "phone": { "type": "string" }, "poNumber": { "type": "string" }, "product": { "type": "string" }, "quantity": { "type": "number" }, "size": { "type": "string" } }, "required": [ "email" ], "type": "object" }, "name": "vivid_place_order", "outputSchema": null }, { "description": "Calculate the current price for an EXACT product configuration. Pass `options` with the full selected configuration (use vivid_product first), or just `size` for simple products. Some products take several seconds or need manual confirmation. Before calling, briefly tell the customer you're checking the live price. Never estimate or reuse another configuration's price. When presenting, repeat the exact product title, quantity, dimensions, and price-affecting options.", "inputSchema": { "properties": { "options": { "description": "FULL selected options keyed by the schema keys from vivid_product, e.g. { size:'Medium', sides:'Double-sided', base:'Heavy Duty Metal Plate (5kg)' } or { size:'Custom', widthMm:700, heightMm:1000, eyelets:'4 x eyelets (all corners)', cutting:'Square or Rectangle' }", "type": "object" }, "product": { "description": "product name, e.g. 'pull up banner', 'corflute', 'a-frame', 'feather flag'", "type": "string" }, "quantity": { "description": "how many", "type": "number" }, "size": { "description": "(simple products) size, e.g. '850x2000', or a named size like 'medium'", "type": "string" } }, "required": [ "product" ], "type": "object" }, "name": "vivid_price", "outputSchema": null }, { "description": "Vivid's REAL published volume price breaks for a product + size (e.g. 1 → $135 ea, 2 → $132.30, 5 → $128.25, 10 → $121.50 — save 10%). Use for bulk/trade pricing questions, or right after a price when a slightly larger quantity would save the customer money. Prices are AUD incl. GST and come from the same source as the live price, so they can never contradict a quote. If the product has no breaks it says so — never invent a discount.", "inputSchema": { "properties": { "product": { "description": "product name, e.g. 'premium pull up banner'", "type": "string" }, "quantity": { "description": "the customer's current quantity, to highlight the next worthwhile break", "type": "number" }, "size": { "description": "size — breaks are per size/variant", "type": "string" } }, "required": [ "product" ], "type": "object" }, "name": "vivid_price_breaks", "outputSchema": null }, { "description": "Get a product's FULL real option schema (all dimensions, not just size) so you can configure it correctly before pricing/ordering. Returns each option's key, label, allowed values, default, whether it's required, whether it affects price, and display order — plus `turnaround` (the live production/lead time from the product page, e.g. 24 hours if artwork is approved by 3 pm AEST on a business day). Flags have Size/Printed Sides/Flag Base; corflute has Size (or custom W×H)/Eyelets/Cutting; table throws have Style/Size/Backside.", "inputSchema": { "properties": { "product": { "description": "product name, e.g. 'feather flag', 'corflute', 'table throw'", "type": "string" } }, "required": [ "product" ], "type": "object" }, "name": "vivid_product", "outputSchema": null }, { "description": "Check a customer's DIGITAL PROOF status: has the proof been emailed, is it awaiting their approval, being revised after rejection, or already approved (production underway). Use for 'where's my proof', 'did you send my proof', 'when do I approve'. Requires the order number AND the email on the order (identity — details only return when they match). Relay the returned agent_hint concisely; production starts only after the customer approves the emailed proof.", "inputSchema": { "properties": { "email": { "description": "the email address the order was placed under (required)", "type": "string" }, "order_number": { "description": "order number, e.g. '#121978'", "type": "string" }, "token": { "description": "identity token from vivid_identity_verify. Without it the proof STATE is returned but not the approve/reject link.", "type": "string" } }, "required": [ "order_number", "email" ], "type": "object" }, "name": "vivid_proof_status", "outputSchema": null }, { "description": "Recommend Vivid Ads signage for a goal + business type (real Australian signage: pull-up banners, A-frames, corflute, fabric banners, flags, media walls). Call with goal and business; omit either to get the next question to ask the customer.", "inputSchema": { "properties": { "business": { "description": "e.g. cafe-hospitality, retail, real-estate, events-expo, corporate, school, gym-fitness", "type": "string" }, "goal": { "description": "e.g. foot-traffic, promote-sale, stand-out-expo, advertise-outside, opening-store, brand-presence", "type": "string" } }, "type": "object" }, "name": "vivid_recommend", "outputSchema": null }, { "description": "Reorder a customer's previous signage job — fast. Requires identity verification (emailed one-time code), not just an order number. action:'list' shows their past orders; action:'reorder' repeats one. ARTWORK: it reuses only the customer's previously APPROVED artwork (the print file), never a pre-approval upload; if it can't be confirmed automatically the team confirms it. A fresh proof is ALWAYS re-issued to confirm the artwork before printing. The customer may also supply new artwork or change the quantity. Re-prices with CURRENT pricing (never the old price). Creates a proof-gated draft order; never charges a card.", "inputSchema": { "properties": { "action": { "description": "'list' (show past orders) or 'reorder' (repeat one)", "type": "string" }, "artwork": { "description": "new print-ready artwork file URL (optional; default = reuse previous)", "type": "string" }, "confirm": { "description": "set true to place the reorder (draft, proof-gated, never charges)", "type": "boolean" }, "email": { "description": "the email the customer ordered under (required to find past orders)", "type": "string" }, "name": { "type": "string" }, "order": { "description": "order name to reorder from, e.g. '#D12345' (optional)", "type": "string" }, "product": { "description": "which product to reorder, e.g. 'corflute' (optional; default = most recent eligible)", "type": "string" }, "quantity": { "description": "override quantity (optional; default = same as last time)", "type": "number" }, "token": { "description": "the identity token from vivid_identity_verify (required — proves the customer owns this email)", "type": "string" } }, "required": [ "email" ], "type": "object" }, "name": "vivid_reorder", "outputSchema": null }, { "description": "Email the customer a formal QUOTATION. If the exact configuration can be priced and an email is given, this INSTANTLY emails a branded PDF-style quotation (line items, GST, total, quote number, 14-day validity, accept-online link) — status 'quoted'. For custom/unpriceable products it logs the request for the team to prepare and send (status 'received'). Never takes payment. Confirm product, quantity, size/options, name, and email before submitting.", "inputSchema": { "properties": { "artworkUrl": { "description": "link to the customer's uploaded artwork (e.g. the fileUrl returned by vivid_upload_artwork), if any", "type": "string" }, "company": { "type": "string" }, "design": { "description": "design preference: 'ai_design' | 'upload_own' | 'design_later'", "type": "string" }, "discountCode": { "description": "any reseller/trade or discount code the customer mentioned (recorded, NOT applied here)", "type": "string" }, "email": { "type": "string" }, "message": { "description": "the customer's full request in their own words (multi-item OK)", "type": "string" }, "name": { "type": "string" }, "options": { "description": "FULL selected options (same shape as vivid_price.options) so the quotation is priced exactly — include size + any dropdowns/add-ons.", "type": "object" }, "phone": { "description": "customer phone (optional)", "type": "string" }, "product": { "type": "string" }, "quantity": { "type": "number" }, "size": { "type": "string" } }, "required": [ "email" ], "type": "object" }, "name": "vivid_request_quote", "outputSchema": null }, { "description": "Search the Vivid Ads catalogue by product name, category, or intended use (e.g. 'corflute', 'pull up banner', 'expo', 'shopfront'). Returns matching products grounded in Vivid's own Shopify collections, so it also surfaces same-range, same-purpose alternatives — products flagged `sameRange:true` come from the top match's curated collection (returned as `collection`). ALWAYS mention these to the customer (e.g. 'we have two Pull Up Banner options, and Fabric Banner Stands do the same job'). Treat a from-price as INDICATIVE only — use vivid_product for options then vivid_price for the exact configuration.", "inputSchema": { "properties": { "query": { "description": "what the customer is looking for (a product name, a category, or a use-case like 'expo' or 'shopfront')", "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "vivid_search", "outputSchema": null }, { "description": "Answer a customer's support / FAQ question in Vivid Ads' voice, grounded in the team's real support history + verified policy. Covers turnaround & production time, digital proofs & approval, artwork specs & file setup, products & options, quotes & pricing, delivery & pickup, changing/cancelling orders, reorders, and the print guarantee. Returns the best-matching answer(s) and topic; if nothing matches it returns escalate:true so you can hand off to the team. Use for questions like 'how long does it take?', 'what file format do you need?', 'can I change my order?', 'where do I pick up?'.", "inputSchema": { "properties": { "question": { "description": "the customer's support question, in their own words", "type": "string" } }, "required": [ "question" ], "type": "object" }, "name": "vivid_support_answer", "outputSchema": null }, { "description": "Upload a customer's artwork FILE through the agent (no website file picker needed). Accepts the file as base64, stores it in Vivid's Google Drive, and returns a stable shareable link plus metadata. Accepts PDF / AI / EPS / JPG / PNG. Does NOT verify print-readiness — the team checks that. Uploading needs no verification, but ATTACHING the file to an existing order does: pass the identity token from vivid_identity_verify, otherwise the file is held unattached and the reply says so. Use when a customer wants to send their print file via chat.", "inputSchema": { "properties": { "contentBase64": { "description": "the file contents, base64-encoded (data URI prefix OK). Small files only; for very large files share a download link instead.", "type": "string" }, "email": { "description": "customer email (optional). Only recorded once verified — see token.", "type": "string" }, "filename": { "description": "original filename incl. extension, e.g. 'banner-artwork.pdf'", "type": "string" }, "mimeType": { "description": "MIME type, e.g. 'application/pdf'", "type": "string" }, "orderId": { "description": "attach to an existing order (optional). Ignored unless a valid token is supplied — an unverified caller must not be able to put a file on somebody else's order.", "type": "string" }, "quoteId": { "description": "associate with a quote request (optional)", "type": "string" }, "sessionId": { "description": "associate with a design session (optional)", "type": "string" }, "token": { "description": "identity token from vivid_identity_verify. Required to attach this upload to an order or to record the email; without it the file is still stored, just not claimed by anyone.", "type": "string" } }, "required": [ "filename", "contentBase64" ], "type": "object" }, "name": "vivid_upload_artwork", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:fc6048c5158d670f14018b5f14fc910478034945c575aaa17371e670985869db | sha256sum