MCP tools
The 27 tools Cru’s MCP server offers, in the order tools/list returns them. A connection is shown only the tools its permissions allow, and partner keys get the write tools in a version of their own. Each has a page of its own, with its arguments, what it returns, and a console that calls it on your connection and shows what Cru answers.
| TOOL | NEEDS | REST EQUIVALENT |
|---|---|---|
whoamiYour Cru account | meta:read | GET /ping |
search_winesSearch wines | market:read | GET /wines |
get_wineWine details | wines:read | GET /wines/{lwin18} |
list_warehousesCru warehouses | meta:read | GET /warehouses |
list_inbond_warehousesInbond warehouses | meta:read | GET /warehouses/inbond |
list_inbond_addressesInbond addresses | addresses:read | GET /addresses/inbond |
list_bidsBids: what you could sell for | market:read | GET /market/bids |
list_offersOffers: what you could buy at | market:read | GET /market/offers |
list_marketMarket: bids and offers | market:read | GET /market |
get_my_portfolioYour portfolio | portfolio:read | GET /portfolio |
list_my_bidsYour bids | bids:read | GET /bids |
list_my_listingsYour listings | offers:read | GET /offers |
list_my_purchasesYour purchases | trades:read | GET /trades/purchases |
list_my_salesYour sales | trades:read | GET /trades/sales |
place_bidPlace a bid | bids:write | POST /bids |
update_bidChange a bid | bids:write | PATCH /bids/{code} |
cancel_bidCancel a bid | bids:write | DELETE /bids/{code} |
renew_bidRenew a bid | bids:write | POST /bids/{code}/renew |
buy_wineBuy wine now | bids:write + orders:write | POST /market/offers/{code}/buy |
list_for_saleList wine for sale | offers:write | POST /offers |
update_listingChange a listing | offers:write | PATCH /offers/{code} |
remove_offersRemove an offer | offers:write | DELETE /offers/{code} |
sell_to_bidSell into a bid | offers:write + orders:write | POST /market/bids/{code}/sell |
suggest_inbond_warehouseSuggest an inbond warehouse | warehouses:suggest | POST /warehouses/inbond |
add_inbond_addressAdd an inbond address | addresses:write | POST /addresses/inbond |
remove_inbond_addressRemove an inbond address | addresses:write | DELETE /addresses/inbond/{id} |
confirm_instructionConfirm an instruction | bids:write or offers:write or addresses:write | POST /confirmations/{code} |
list_my_trades is gone: list_my_purchases and list_my_sales take its place. get_my_portfolio now returns portfolio lines, as GET /portfolio does, with the same filters, and refuses include_market_price, as every wine now has its market price. list_my_listings takes those filters too, and answers under offers rather than listings, each a wine with its listed lines. list_for_sale and sell_to_bid now require stock_type, and update_listing and remove_offers take a line’s portfolio_id, a listing’s code being optional.
Conventions every tool shares
- Prices are normal amounts in the market’s currency —
12345.5is 12,345.50 — and every result says which currency. Price filters take whole units. - Wines are LWIN18 codes, 18 digits;
search_winesfinds them by name. A list of LWIN18s may be an array or one comma-separated string, up to 20. - Paging is
limitandoffset, withpaginationin the result: 10 a page by default, at most 50, or 25 forsearch_wines. - Unknown arguments are refused with a tool error listing what the tool accepts. Numbers may arrive as strings, and booleans as
"true"or1. - Results come as
structuredContentand as the same object in JSON text. Errors come back as a result withisError: true, worded for the assistant to act on.
Reading
The 14 read tools answer at once and change nothing. All are marked readOnlyHint, so an assistant may run them without asking.
Trading
With a connected app’s token, the 11 trading tools prepare an instruction and change nothing: they are marked read-only for that reason. Each checks the request against live data, refuses with a reason if Cru would not do it, and otherwise returns a summary and a confirmation code.
{ "confirmation_code": "cnf_5DT4rt0U-KyEjnQUzHPTGKw86dNTZ8uZud_zQFdTa-k", "expires_at": "2026-10-19T10:25:55Z", "action": "bid.place", "summary": "Bid GBP 1,650.50 per unit for 1 x Lafite Rothschild 2024 (6x75cl) - GBP 1,650.50 in total, live for 90 days.", "preview": { "summary": "…the same sentence…", "lwin18": "101187220240600750", "quantity": 1, "price": 1650.5, "total": 1650.5, "currency": "GBP", "expires_on": "2027-01-17", "allowance_remaining": 48349.5 }, "next": "Nothing has happened yet. Show the customer the summary and ask them to confirm it. Only if they say yes in this conversation, call confirm_instruction with this confirmation_code. If they decline or want changes, do not confirm it; it expires on its own." }
Confirmation
One tool carries a staged instruction out: confirm_instruction, marked destructiveHint. Every staging result ends with the same instruction to the assistant:
Nothing has happened yet. Show the customer the summary and ask them to confirm it. Only if they say yes in this conversation, call confirm_instruction with this confirmation_code. If they decline or want changes, do not confirm it; it expires on its own.
| Who confirms | The customer, by saying yes in the conversation. There is no email or website step. Cru binds the code to the connection that staged it, so no other app, account or market can use it. |
| When | Within 15 minutes, once. If the customer declines, the code simply expires. |
| What runs | Exactly what was staged. Cru re-checks anything that may have moved — the price, the units, the bid — and refuses rather than doing something the customer did not see. |
| How many | At most 10 waiting per customer at once, across all their apps. |
| Hosts | Assistants that honour destructiveHint may also ask the customer before calling confirm_instruction, as a second check of their own. |
The same instructions can be inspected and confirmed over REST by the same app. Confirmations in full →
With partner keys
Cru builds the tool list for each caller. Called with partner keys — CLIENT-KEY and CLIENT-SECRET — a write over MCP is carried out at once, as it is over REST; only a connected app’s token gets a confirmation step. The pages here describe the token’s version, and a partner key’s differs in these ways:
confirm_instructionis not offered, since nothing waits to be confirmed.- Each write tool’s description opens with what it does, as below, and closes “It is carried out straight away, with no confirmation step; sending the same reference again returns the first result instead of doing it twice.” in place of saying it only prepares.
buy_winealso drops “The preview gives the exact total.”, as there is no preview. - Each takes a required last argument,
reference, up to 50 characters: “Your own unique reference for this instruction.” - Each is marked
idempotentHintand notreadOnlyHint, and those that move money or wine or remove an address — all butadd_inbond_addressandsuggest_inbond_warehouse—destructiveHint. - It returns the action’s result as the REST response’s
datagives it, withreplayed— true when the reference was used before. There is noconfirmation_code,summaryornext.
| TOOL | WITH A TOKEN, OPENS | WITH PARTNER KEYS, OPENS |
|---|---|---|
place_bid | Prepares a bid… | Places a bid… |
update_bid | Prepares a change to the price… | Changes the price… |
cancel_bid | Prepares the cancellation of one of… | Cancels one of… |
renew_bid | Prepares putting… | Puts… |
buy_wine | Prepares buying… | Buys… |
list_for_sale | Prepares a new offer… | Makes a new offer… |
update_listing | Prepares a change to the asking price… | Changes the asking price… |
remove_offers | Prepares taking… | Takes… |
sell_to_bid | Prepares selling… | Sells… |
add_inbond_address | Prepares saving… | Saves… |
remove_inbond_address | Prepares removing… | Removes… |
suggest_inbond_warehouse is offered to partner keys alone: it needs warehouses:suggest, which Cru grants only to a partner credential. Its page shows the version they get.