Packrift Exact-Spec Packaging Procurement
Purpose
Resolve an exact Packrift packaging SKU for a buyer requirement, confirm live price and inventory against Packrift's first-party MCP server at https://mcp.packrift.com/mcp, and return either (a) a measured MCP cart handoff URL when every constraint is matched and the buyer has confirmed, or (b) a measured Packrift bulk-quote handoff URL when no exact match exists. Treats dimensions (L/W/D in inches), material/grade (e.g. ECT-32 kraft corrugated), color, adhesive, printer compatibility, case/bundle count, and SKU as strict exact-match constraints — does not present nearby SKUs as exact matches. Read-only with respect to inventory and pricing; the only mutating side effects are GA4 attribution events that Packrift records when the agent emits a measured URL, and these are explicitly silenced when suppress_analytics: true is set.
When to Use
- A buyer has a packaging spec — exact dimensions plus material/color/adhesive/printer-compatibility/pack-count — and needs the matching Packrift SKU with confirmed live price and inventory before placing or quoting an order.
- A reorder workflow where the buyer already knows the SKU (
1066,LL251WR,MFL1295, …) and needs a one-call live-confirmed cart or reorder URL. - A procurement assistant comparing a competitor-style spec (Uline, etc.) to Packrift's AI-approved catalog without ever fabricating a substitute as "exact".
- Bulk / RFQ paths where no exact SKU exists and the buyer needs a tracked bulk-quote handoff instead of a wrong-fit cart.
Don't use this skill for dimension-only "what box fits this item" discovery — that's the find_packaging_for_item / pack_calculator path, which is a separate flow and is not an exact-spec procurement skill.
Workflow
Packrift exposes a Streamable-HTTP MCP server at https://mcp.packrift.com/mcp with 15 tools covering discovery, live confirmation, and handoff. All SKU-involving tools are AI_APPROVE-gated — only SKUs whose ai_status === "AI_APPROVE" are eligible for cart/reorder handoff. The canonical sequence (printed verbatim in every cart-handoff candidate response) is:
search_products → get_product → get_pricing → check_inventory → create_cart_url
For exact-SKU reorders, prepare_purchase_handoff collapses that whole sequence into a single call and is the preferred shortcut.
1. Connect to the MCP server
Send an initialize JSON-RPC over POST with Accept: application/json, text/event-stream. The server responds with a single JSON envelope (not a streamed SSE response), so no session-id handshake or Mcp-Session-Id header round-trip is required for subsequent tools/call requests — each request is independent.
POST https://mcp.packrift.com/mcp
Content-Type: application/json
Accept: application/json, text/event-stream
{"jsonrpc":"2.0","id":1,"method":"initialize",
"params":{"protocolVersion":"2025-06-18","capabilities":{},
"clientInfo":{"name":"<agent>","version":"x.y"}}}
Server returns serverInfo: { name: "Packrift MCP", version: "0.2.10+" } plus an instructions block that names every tool and gates SKUs behind AI_APPROVE. After that, every tool call is a tools/call request with { name, arguments }.
2. Resolve candidate SKUs (skip if buyer already supplied SKU)
Two retrieval shapes depending on what the buyer gave you:
| Buyer input | Tool | Notes |
|---|---|---|
Exact SKU (1066, LL251WR, …) | skip retrieval — go to step 3 | Trust the SKU; live-confirm in step 3. |
| Free-text category + spec ("weather-resistant polyester laser labels 2 5/8 x 1 3000/case") | search_products(query, limit≤50) | Returns AI_APPROVE-gated hits with match.confidence, evidence.exact_terms_matched, unsafe_substitute_blocked. Inspect evidence.exact_terms_matched to confirm each constraint token actually appears — confidence alone is not sufficient. |
| Item L/W/D + use_case but no specific SKU type | find_packaging_for_item | Returns 5 fit-ranked SKUs. Treat its output as candidates, then exact-match-filter in step 2b. |
| Comparing against competitor spec | compare_alternatives(requested_spec, family) | Returns ranked Packrift candidates plus a plain-language summary — useful for "is there a Packrift equivalent to Uline S-XYZ?" |
2b. Exact-match filter (mandatory before step 3). For every candidate, verify each of the buyer's constraints against the response fields:
- Dimensions: parse from
titleordimensions.{length_in, width_in, depth_in}onget_product. Reject if any axis differs. - Material / grade: parse from
titleanddescription. Look forECT-32 kraft,polyester,polypropylene, etc. - Color: parse from
title/description.kraft≠white≠natural. - Adhesive: only relevant for tape/labels — parse from
description. - Printer compatibility: only relevant for labels —
laservsinkjetvsthermal-transfervsdirect-thermal. - Case / bundle count: parse the trailing
- N Bundle,- N/Case,- N-packintitleand thepack_countline indescription.25 Bundle≠100/Case. - SKU: when the buyer supplied an exact SKU, the response's
approved_skumust match character-for-character.
If any constraint fails, do not emit a cart handoff — jump to step 5 (no-match path).
3. One-call live confirmation (fast path)
For exact-SKU procurement, the single best call is prepare_purchase_handoff:
{
"name": "prepare_purchase_handoff",
"arguments": {
"sku": "1066",
"quantity": 25,
"buyer_confirmed": false,
"source_context": "exact_spec_procurement"
}
}
It internally runs the AI_APPROVE gate, get_product, get_pricing, and check_inventory and returns status: "live_confirmed_awaiting_buyer_confirmation" with the full price/inventory snapshot, the canonical product URL, plus pre-baked product / reorder / quote URLs under live_confirmation.product.conversion_actions. Crucially, it does NOT include a cart URL until you re-call with buyer_confirmed: true. Use the unconfirmed response to present the spec + price + stock back to the buyer for approval.
After buyer approval, re-call with buyer_confirmed: true — the response now has status: "cart_handoff_ready" and a measured cart_url ready to emit. This URL goes to https://mcp.packrift.com/r/cart/{SKU} which Packrift then 302-redirects through to the Shopify cart-permalink URL (https://packrift.com/cart/{variant_id}:{qty}?...) and on to https://packrift.com/checkouts/cn/{token} — i.e., the buyer lands directly on a live Shopify checkout with the item pre-loaded. See gotchas before emitting.
4. Long form (if you can't use prepare_purchase_handoff or need warehouse-level inventory)
get_product(handle) → full product detail, dimensions, all variants, AI_APPROVE gate verdict
get_pricing(variant_ids, qty) → unit_price, currency, available_quantity, line_total, AI_APPROVE gate verdict
check_inventory(variant_ids) → available (int), in_stock (bool), per-variant AI_APPROVE gate verdict
# Optionally:
inventory_status(sku | variant_ids) → Shopify total qty + location-level BOX warehouse split + plain-language summary
get_shipping_estimate(zip, country, items[]) → carrier rate options if buyer wants delivered cost
Then hand off via either:
create_cart_url({ sku, quantity })— shortcut form (resolves variant from SKU)create_cart_url({ items:[{variant_id, qty}] })— full form
The response contains both an mcp_cart_landing_redirect URL (preferred — stamps GA4 attribution) and a final_shopify_cart_url_candidate direct-to-Shopify URL. Emit the MCP landing URL unless you have a reason to bypass attribution.
5. No exact match — explicit quote handoff
If step 2b rejects every candidate, do not call create_cart_url. Instead:
{
"name": "explain_no_exact_match",
"arguments": {
"requested_spec": "9x6x6 white corrugated box 25-pack",
"family": "boxes",
"missing_or_mismatched_fields": ["length_in", "color"],
"reason": "Only 10x6x6 kraft available, not 9x6x6 white."
}
}
Response includes a no_match_policy string, a bulk_quote.quote_url measured handoff URL, a copy_procurement_spec text the agent can paste into a quote form, safe_next_actions: ["request_bulk_quote", "ask_which_attribute_can_vary", "show_family_page_without_calling_it_exact"], and a verbatim unsafe_action_blocked: "Do not call a different dimension, material, color, closure, adhesive, printer type, strength, pack count, or SKU an exact match." — emit that policy line back to the buyer along with the quote URL.
Alternatively, when the buyer wants bulk pricing on a known SKU (rather than a no-match scenario), use get_bulk_quote_link({ requested_spec, sku, family, quantity }) directly.
6. Reorder handoff (alternative to cart)
For repeat-buy workflows where the buyer prefers Packrift's reorder-by-SKU landing over a fresh checkout:
{ "name": "get_reorder_link", "arguments": { "sku": "1066", "source_context": "ai_agent_reorder" } }
Returns reorder_url, product_url, and copy_procurement_spec text. The reorder URL is https://packrift.com/pages/reorder-packaging-by-sku?view=packrift_ai_reorder_live_r05&sku={SKU}&...#sku-{SKU} — anchored to the SKU's row on the reorder page.
Site-Specific Gotchas
- AI_APPROVE gate is mandatory — only AI-approved SKUs return successful cart/reorder handoffs. Every successful response contains
ai_status: "AI_APPROVE"andapproval_gate: "passed". If you encounter a SKU that exists on packrift.com but the MCP server refuses to gate it, useget_bulk_quote_linkinstead of trying to construct a cart URL by hand — manual/cart/{variant_id}:{qty}URLs bypass GA4 attribution and Packrift's safety policy. buyer_confirmed: trueis the cart-URL gate.prepare_purchase_handoffdeliberately returnsstatus: "live_confirmed_awaiting_buyer_confirmation"(no cart URL) on first call. The skill must show the live price + stock to the buyer, get confirmation, and only then re-call withbuyer_confirmed: true. Skipping the confirmation step is an unsafe behavior.- The measured cart URL lands on a live Shopify checkout, not a cart preview. Following
https://mcp.packrift.com/r/cart/{SKU}in a browser ends athttps://packrift.com/checkouts/cn/{token}with the line item pre-loaded and attribution stamped via cart attributes. No card details are pre-filled and there is no auto-submit, but treat this URL as a terminal handoff — emit it to the buyer rather than auto-navigating in a headless context. - Static AI SKU records exist at
https://mcp.packrift.com/ai/sku/{SKU}.md(text/markdown) andhttps://mcp.packrift.com/ai/sku/{SKU}.json. These are cached spec cards — great for confirming dimensions/material/pack-count cheaply — but they do not carry live price or inventory. Always pair withget_pricing+check_inventory(or justprepare_purchase_handoff) before any cart handoff. - Exact-spec means every attribute — the MCP's own no-match policy enumerates the rejection axes verbatim: "dimension, material, color, closure, adhesive, printer type, strength, pack count, or SKU".
10x6x6 kraft 25 Bundleis not a match for9x6x6 kraft 25 Bundle, and25 Bundleis not a match for100/Case. The skill must refuse to call any of these substitutions an exact match — emitexplain_no_exact_matchinstead. - Pack count vs Case count are distinct attributes in titles. Boxes use
- N Bundle, labels/tape often use- N/Case, mailers use- N-packorN/case. Parse them separately and case-sensitively when filtering candidates fromsearch_products. search_productsconfidence is a ranking signal, not a constraint check. A 0.82 confidence hit can still differ from the buyer's spec on material or pack count. Always cross-checkevidence.exact_terms_matchedagainst your constraint list — and prefer the explicit field check fromget_product(dimensions.length_in,dimensions.width_in,dimensions.depth_in,descriptiontext) before calling anything "exact".- MCP server is stateless on Streamable-HTTP —
initializedoes not return anMcp-Session-Idheader in practice (observed null), and subsequenttools/callrequests work without one. Each call is self-contained, including its ownjourney_idif the caller wants to thread attribution across the sequence. get_pricingreturnsline_total = unit_price × quantitywith USD as the only observed currency. Don't infer multi-currency support — if a buyer needs CAD or other, fall back toget_shipping_estimate(country="CA", ...)for ship cost and surface USD pricing as the unit price.get_shipping_estimateonly supportsUSandCAper its JSON-schema enum. For other destinations, hand off viaget_bulk_quote_linkwith areasondescribing the international ship requirement.- Suppress analytics in test runs. Every measured URL emits a GA4 event (
utm_source=chatgpt,utm_medium=mcp,utm_campaign=packrift_ai_commerce) — setsuppress_analytics: trueonprepare_purchase_handoff,create_cart_url,get_reorder_link,get_bulk_quote_link, andexplain_no_exact_matchduring agent eval / synthetic testing to avoid polluting Packrift's AI-commerce attribution. - The MCP
instructionsblock names tools that are NOT intools/list. The initialize response mentionsfind_packaging_for_item,prepare_purchase_handoff,get_cart_handoff_candidatesetc. — most of these are intools/list, but always cross-check with a freshtools/listrather than relying on the instructions prose as a contract. approved_risk_flags: "chatgpt_paid_priority"appears on every AI_APPROVE response — it is a Packrift internal attribution tag, not a flag the agent needs to act on. Pass through unchanged in any agent-side logging.
Expected Output
The skill emits one of four outcome shapes. The exact field set varies slightly with the tool that produced the confirmation, but each shape is built from the JSON fields the MCP server returns.
Shape A — Exact-match cart handoff ready (most common success)
{
"outcome": "cart_handoff_ready",
"match_type": "exact",
"sku": "1066",
"handle": "10x6x6-ect-32-kraft-long-corrugated-boxes-25-bundle",
"variant_id": "53472879935856",
"family": "boxes",
"title": "10x6x6 ECT-32 Kraft Long Corrugated Boxes - 25 Bundle",
"constraints_verified": {
"dimensions": { "length_in": 10, "width_in": 6, "depth_in": 6 },
"material": "ECT-32 kraft corrugated",
"color": "kraft",
"pack_count": 25,
"pack_unit": "bundle"
},
"live_price": { "unit_price": 13.21, "currency": "USD", "quantity": 25, "line_total": 330.25 },
"live_inventory": { "available": 499, "in_stock": true },
"buyer_confirmed": true,
"cart_url": "https://mcp.packrift.com/r/cart/1066?utm_source=chatgpt-mcp&utm_medium=mcp_tool&utm_campaign=create_cart_url&...&ref=mcp&qty=25",
"final_shopify_cart_url": "https://packrift.com/cart/53472879935856:25?ref=mcp&utm_source=chatgpt-mcp&...",
"product_url": "https://packrift.com/products/10x6x6-ect-32-kraft-long-corrugated-boxes-25-bundle?ref=mcp&..."
}
Shape B — Exact match live-confirmed but awaiting buyer approval
{
"outcome": "live_confirmed_awaiting_buyer_confirmation",
"match_type": "exact",
"sku": "LL251WR",
"handle": "2-5-8-x-1-weather-resistant-polyester-laser-labels-3000-case",
"variant_id": "53475925492080",
"family": "labels",
"title": "2 5/8\" x 1\" Weather-Resistant Polyester Laser Labels - 3000/Case",
"constraints_verified": {
"dimensions": { "width_in": 2.625, "height_in": 1 },
"material": "weather-resistant polyester",
"printer_compatibility": "laser",
"pack_count": 3000,
"pack_unit": "case"
},
"live_price": { "unit_price": 88.12, "currency": "USD", "quantity": 1, "line_total": 88.12 },
"live_inventory": { "in_stock": true },
"buyer_confirmed": false,
"cart_url": null,
"next_action": "Present price + stock to buyer; re-call prepare_purchase_handoff with buyer_confirmed=true to receive cart_url."
}
Shape C — Reorder handoff (alternative to cart)
{
"outcome": "reorder_handoff",
"match_type": "exact",
"sku": "1066",
"variant_id": "53472879935856",
"title": "10x6x6 ECT-32 Kraft Long Corrugated Boxes - 25 Bundle",
"live_price": { "unit_price": 13.21, "currency": "USD" },
"live_inventory": { "available": 499, "in_stock": true },
"reorder_url": "https://packrift.com/pages/reorder-packaging-by-sku?view=packrift_ai_reorder_live_r05&sku=1066&...#sku-1066",
"product_url": "https://packrift.com/products/10x6x6-ect-32-kraft-long-corrugated-boxes-25-bundle?...",
"copy_procurement_spec": "Packrift SKU 1066 — 10x6x6 ECT-32 Kraft Long Corrugated Boxes - 25 Bundle"
}
Shape D — No exact match → bulk-quote handoff
{
"outcome": "no_exact_match",
"match_type": "no_exact_match",
"requested_spec": "9x6x6 white corrugated box 25-pack",
"family": "boxes",
"missing_or_mismatched_fields": ["length_in", "color"],
"reason": "Only 10x6x6 kraft available; no 9x6x6 white SKU in AI_APPROVE catalog.",
"no_match_policy": "Exact matches only for purchase handoff. Nearby products must be labeled as alternatives and require buyer confirmation.",
"unsafe_action_blocked": "Do not call a different dimension, material, color, closure, adhesive, printer type, strength, pack count, or SKU an exact match.",
"quote_url": "https://packrift.com/pages/bulk-quote?spec=9x6x6+white+corrugated+box+25-pack&family=boxes&ref=mcp&utm_source=chatgpt&utm_medium=mcp&...",
"copy_procurement_spec": "Requested spec: 9x6x6 white corrugated box 25-pack.",
"safe_next_actions": ["request_bulk_quote", "ask_which_attribute_can_vary", "show_family_page_without_calling_it_exact"]
}