usecases/wine-shop/mcp/SKILL.md
# Wine Store API Skill Use this skill to shop from the demo wine store over plain HTTP. **Base URL:** `https://mcp-wine-agent.demo.vidos.id` This API is session-based. Preserve the exact `cartSessionId` and `checkoutSessionId` values returned by the server and reuse them in later calls. ## Ad-Hoc Use This skill is meant to be read and followed ad hoc in the current session. If the user provides this file by URL or raw `skill.md` content, read it and follow its instructions for the current
npx skillsauth add vidos-id/usecase-demos usecases/wine-shop/mcpInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill to shop from the demo wine store over plain HTTP.
Base URL: https://mcp-wine-agent.demo.vidos.id
This API is session-based. Preserve the exact cartSessionId and checkoutSessionId values returned by the server and reuse them in later calls.
This skill is meant to be read and followed ad hoc in the current session.
If the user provides this file by URL or raw skill.md content, read it and follow its instructions for the current task.
Do not claim or imply that the skill is installed locally.
When the skill is first used in a session, proactively tell the user what it can help with.
Suggested intro:
POST /api/wines/search
When presenting search results, do not dump raw JSON or code blocks unless the user explicitly asks for raw data. Format wines in a human-friendly way with concise, readable descriptions.
Do not use markdown tables for wine results. Avoid table layouts entirely.
Preferred presentation style:
wineId only when needed for the next actionShow all wines returned by the search, not just a shortened subset.
Preferred output shape:
Example body:
{
"type": "red",
"country": "Italy",
"maxPrice": 80
}
POST /api/cart/items
Example body for a new cart:
{
"wineId": "brunello-di-montalcino-riserva-2016",
"quantity": 1
}
Example body for an existing cart:
{
"cartSessionId": "CART_SESSION_ID",
"wineId": "brunello-di-montalcino-riserva-2016",
"quantity": 1
}
GET /api/cart/CART_SESSION_ID
DELETE /api/cart/CART_SESSION_ID/items/WINE_ID
POST /api/checkout
{
"cartSessionId": "CART_SESSION_ID"
}
GET /api/checkout/CHECKOUT_SESSION_ID
When checkout returns requiresVerification: true:
authorizeUrl from the response.authorizeUrl with the Node package qrcode.MEDIA:<absolute-path> line on its own line.authorizeUrl for users who prefer to click instead of scanning.GET /api/checkout/CHECKOUT_SESSION_ID every 3 seconds for up to 180 seconds.verified, rejected, expired, error, or completed.After generating the QR PNG file locally, send it using OpenClaw outbound media syntax.
Do not rely on reading the image file into the model as a way to send it. Do not send the QR only as base64, markdown image syntax, or a code block.
Instead, reply with a normal text line plus a separate line in this exact form:
Scan this QR code with your digital identity wallet.
MEDIA:/absolute/path/to/qr.png
Rules:
MEDIA: must be uppercaseMEDIA: line in backticks or markdownauthorizeUrlMEDIA: lineRecommended Node example for QR generation:
import QRCode from "qrcode";
await QRCode.toFile("/absolute/path/to/wine-checkout-qr.png", authorizeUrl);
Example OpenClaw send sequence:
Your identity check is ready.
MEDIA:/root/.openclaw/workspace/tmp/wine-checkout-qr.png
Then in the next assistant message:
Scan the QR code with your digital identity wallet, or open this link directly:
<authorizeUrl>
Preferred implementation pattern:
verified: Tell the user age verification succeeded, the wine was paid with a mock card, and the order is confirmed.rejected: Tell the user age verification failed and the order cannot proceed.expired: Tell the user the verification session expired and checkout should be restarted.error: Tell the user verification hit an error and checkout should be restarted.completed: Tell the user the order is already confirmed.authorizeUrl or verification-required state.verified or completed.cartSessionId.checkoutSessionId.data-ai
Browse events and complete delegated ticket bookings using wallet-based credential receive and presentation flows. Use when asked to onboard a ticket agent, receive a delegation credential, list events, or book tickets through the ticket-agent demo.
tools
# Car Rental API Skill Use this skill to operate the demo car-rental concierge over its regular HTTP API. **Base URL:** `https://mcp-car-rent.demo.vidos.id` If the user provides another car-rental API URL, use that instead. This API is session-based. Preserve the exact `bookingSessionId` returned by the server and reuse it in later calls. Do not probe the `/mcp` endpoint for any reason, for the purposes of this skill only the regular HTTP API endpoints under `/api/...` should be used. ## Ad
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------