From henry
Shop with Henry: searches real products across merchants, builds a cart, and returns a hosted checkout link. Use when the user explicitly wants to buy or shop for something. In Claude Code, run as /henry:shop <what you want to buy>.
How this skill is triggered — by the user, by Claude, or both
Slash command
/henry:shopThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The user's shopping request: $ARGUMENTS
The user's shopping request: $ARGUMENTS
If the request above is empty (or the $ARGUMENTS placeholder was not
interpolated by this client), use the user's last message as the request. If
there is still no concrete request, ask what they want to buy and stop.
Extract from the request:
Henry's MCP server exposes one of two tool surfaces depending on version.
Match tool names by suffix (clients prefix MCP tool names differently —
never hardcode a mcp__...__ prefix):
search_products,
retrieve_product_details, add_cart_items, list_cart_items,
remove_cart_items, create_cart_checkout, retrieve_status_orders.execute (runs TypeScript against
@henrylabs/sdk in a sandbox) and search_docs (searches the SDK docs).If neither surface is present, the Henry MCP server is not configured. Walk the user through setup, then stop and ask them to re-run this skill:
claude mcp add henry -e HENRY_SDK_API_KEY=<key> -- npx -y @henrylabs/mcp@latestcommand: "npx", args: ["-y", "@henrylabs/mcp@latest"],
env: { "HENRY_SDK_API_KEY": "<key>" }If tools exist but calls fail with a connection error or 401 / authentication error, the API key is missing or invalid:
export HENRY_SDK_API_KEY="<key>" in the terminal that launches this
client (add to the shell profile to persist)./mcp and reconnect the henry server; in other
clients, restart the MCP server or the client (env vars are read at server
launch).Never ask the user to paste their API key into the chat, and never fabricate results while tools are unavailable.
search_products with the query and any parsed
filters (merchant, min/max price, ~10 results). If the response is an async
job (refId with status: pending|processing) rather than a product list,
poll its status tool every ~2s for up to ~60s until complete or failed.henry.products.search(...), polls henry.products.pollSearch(refId) in a
loop (~2s interval, ~60s cap), and returns the products array.Show a compact markdown table, max 8 rows:
| # | Product | Price | Merchant | In stock |
|---|
Format price from the product's price.value and price.currency; stock from
availability. Keep each product's link — it is the cart item identifier.
Ask which item(s) to add, unless the request already pins one unambiguous
product and quantity — then proceed.
If the chosen product needs a size/color the user didn't specify, fetch
product details for its link (also an async job — poll the same way), list
the available variants briefly, and ask. Skip details otherwise — search
results are enough to buy.
add_cart_items with
{ link, quantity, variant? }. Reuse the returned cartId for further adds
in this session.henry.cart.create({ items: [...] }) or
henry.cart.item.add(...) for an existing cart.Get the hosted checkout URL (create_cart_checkout, or the checkoutUrl
already returned by henry.cart.create). This skill is hosted-checkout
only: never attempt a headless purchase, and never collect addresses or
card details in chat — Henry's hosted checkout page handles that.
Short summary table of cart contents with line prices, then the checkout URL prominently on its own line:
Checkout here:
On a sandbox key, note this is a test checkout and no real charge occurs.
After the user completes checkout, offer to check status (orders tools or
henry.orders.list({ cartId })). Report the order status progression
(pending → processing → complete/cancelled) and the final costs on
completion.
| Symptom | Action |
|---|---|
| Henry tools absent | Run the Step 1 server setup, then stop |
| 401 / authentication error | Run the Step 1 key onboarding, then stop |
Job status: "failed" | Surface the job's error, retry once, then suggest rephrasing |
| Poll exceeds ~60s | Say it's still processing; offer to keep waiting |
| Empty results | Suggest broadening the query or dropping filters |
| Anything else | Never fabricate products, prices, or checkout URLs — only show what the API returned |
npx claudepluginhub henry-social/skills --plugin henryCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.