Whisky Hunter MCP Server
This endpoint implements the Model Context Protocol (MCP)
over Streamable HTTP, giving AI assistants read-only access to Whisky Hunter database.
Responses include only data available to the authenticated request.
Fair play
These tools are for working with the data — looking things up, comparing releases, analysing a
market — not for extracting it. A question about a bottle, a distillery, or a price trend is the
normal case; a client that walks the whole database page by page is not.
- Ask narrow questions. Query the bottles and distilleries you actually care
about. Paging through everything “just in case” is what makes the limits tighter for
everybody.
- Do not ask twice. Reuse what a tool already returned within a session instead
of repeating the same call.
- No mirroring or resale. Bulk export, rebuilding the dataset elsewhere,
re-publishing the results, or feeding them into another product is outside what these endpoints
are offered for.
- The limits are real. What is counted is how much data leaves, not how often
you ask: a budget of units over a rolling 30-day window, a daily ceiling within it, a
per-search page allowance, and rate limits — all per account and per plan. A row of
results costs more or less depending on how expensive that data is, and failed calls cost
nothing. Every answer reports what is left, so a client can pace itself. A refusal is an
answer — retrying straight through one temporarily parks the account, suspending its
MCP access briefly.
- One token, one account. Do not share it or wire it into a public service.
Full rules: Terms & Conditions.
Data notes
- Monetary auction and distillery statistics are in GBP unless a tool explicitly states otherwise.
- Auction fee fields
buyers_fee, sellers_fee, and vat_fee
are percentage values; reserve_fee and listing_fee are fixed amounts
in the auction house's base_currency.
- Lot count fields count auction lots.
- Monthly statistics are grouped by calendar month.
Search syntax
There are five scope-specific search tools that share the same syntax:
search_past_auction_lots, search_live_auction_lots,
search_retail_listings, search_casks, and
search_bottles. search_casks is the one tool whose
search terms are optional — call it with no arguments to page through the whole
cask list.
Whisky search is full-text matching against lot, listing, or bottle titles, not a natural-language
prompt. Auction houses often describe the same bottle with different spelling, punctuation, age wording,
batch padding, or volume notation. Build compact queries from the tokens that identify the bottle,
inspect the noise, then tighten with exclusions or one more high-confidence variant.
search_include is the positive query. Separate real title variants with
| , for example macallan 18 | macallan eighteen. Within one variant,
every word must match.
search_exclude removes known false positives. Separate exclusions with
& , for example mini & miniature & 5cl.
- Use spaces around operators:
mini & miniature is correct;
mini&miniature is not.
- Prefer meaningful bare tokens:
18 instead of 18 years old,
43 instead of 43%, 700 instead of 700 ml.
Keep distinctive vintage, age, ABV, cask, batch, chapter, or edition details when they separate
otherwise similar bottles.
- Use
cursor with the returned nextCursor to continue paginated results.
A cursor is only valid for the same tool and search terms that produced it.
Practical search examples
- Same bottle, different age wording
search_include: macallan 18 | macallan eighteen
- Same batch, different spelling and zero padding
search_include: aberlour a'bunadh 7 | aberlour abunadh 7 | aberlour a'bunadh 07 | aberlour abunadh 07
- Start broad, then exclude visible noise
search_include: scapa 16
search_exclude: 6 & 2 & 2002 & Jutland & Signatory & Douglas & Cask & Macleod
- Full-size bottle, not miniatures or samples
search_exclude: mini & miniature & 5cl & 50ml & sample
For the same search habits in the website UI, see
Dive into the search functionality of the Whisky Hunter database.
Endpoint
https://whiskyhunter.net/mcp/
All requests must be POST with Content-Type: application/json and a valid
Bearer credential in the Authorization header: your MCP API token, or the
access token an assistant receives when you connect it by signing in.
Connect by signing in (Claude, ChatGPT)
No token to copy. In the assistant's connector settings, add a custom connector with this address:
https://whiskyhunter.net/mcp
The assistant sends you to Whisky Hunter to log in and approve the connection, then works under your
account and your plan's data allowance. You need a Whisky Hunter account first.
Connect with a token (Claude Desktop / Claude Code and other clients)
Add the following to your claude_desktop_config.json (or .claude/settings.json):
{
"mcpServers": {
"whiskyhunter": {
"type": "http",
"url": "https://whiskyhunter.net/mcp/",
"headers": {
"Authorization": "Bearer <YOUR_MCP_API_TOKEN>"
}
}
}
}
Available Tools
All tools are read-only. Shared units, date granularity, authentication, pagination, and search syntax
are documented once above; each tool below lists only its own accepted arguments and response shape.
list_distilleries
Return distillery names, slugs, and countries that can be used with distillery tools.
Arguments
No arguments.
Returns
Public distillery metadata visible to the authenticated request.
| Field |
Type |
Description |
distilleries |
array of objects |
Distilleries that can be used with distillery MCP tools. |
list_auction_schedule
Return live and upcoming auction events for active auction houses, including start date, end date, and seller deadline.
Arguments
No arguments.
Returns
Live and upcoming auction events for active auction houses.
| Field |
Type |
Description |
live |
array of objects |
Auction events currently live. |
upcoming |
array of objects |
Auction events scheduled after today. |
list_active_auctions
Return active auction house metadata, including website, buyers_fee, sellers_fee, and vat_fee percentage fields plus fixed reserve and listing fees.
Arguments
No arguments.
Returns
Public metadata for active auction houses.
| Field |
Type |
Description |
auctions |
array of objects |
Active auction houses visible to the authenticated request. |
get_monthly_distillery_stats
Return month-by-month secondary-market price, trading volume, and auction lots statistics for one distillery. Monetary values are in GBP and rows are grouped by calendar month.
Arguments
| Name |
Type |
Required |
Description |
distillery_slug |
string |
yes |
Distillery slug from list_distilleries. |
Returns
Month-by-month secondary-market distillery statistics. Monetary values are in GBP.
| Field |
Type |
Description |
monthly_stats |
array of objects |
Monthly statistics grouped by calendar month. |
get_distillery_summary
Return distillery metadata and aggregate secondary-market statistics calculated from visible monthly data grouped by calendar month. Monetary values are GBP and lot count fields count auction lots.
Arguments
| Name |
Type |
Required |
Description |
distillery_slug |
string |
yes |
Distillery slug from list_distilleries. |
Returns
Distillery metadata and aggregate secondary-market statistics calculated from visible monthly data. Monetary values are GBP by default unless explicitly stated otherwise.
| Field |
Type |
Description |
distillery |
object |
Public distillery metadata. |
stats |
object |
Aggregate statistics over visible monthly distillery data. |
search_past_auction_lots
Start here for sale prices and market overviews: search closed auction lots, including unsold lots. The first page also reports live and retail match counts and up to five catalogue candidates with slugs for get_bottle_data; a separate catalogue search is usually unnecessary. Related matches use the search text, not this search's date, price, region or auction filters. For an overview, summarise the first page; use a cursor only when the user explicitly requests additional results.
Arguments
| Name |
Type |
Required |
Description |
search_include |
string |
yes |
Required full-text query. Separate OR title variants with ' | '; words inside each variant are ANDed. Use compact identifiers such as brand, vintage, age, ABV, cask, batch, or edition. Prefer bare numbers: 18 instead of '18 years old', 43 instead of '43%', and 700 instead of '700 ml'. |
search_exclude |
string |
no |
Optional terms that must not appear, joined with ' & '. Only narrows search_include; for example 'mini & miniature & 5cl'. |
cursor |
string or null |
no |
Opaque cursor returned by the previous page. |
price_min |
integer or null |
no |
Lowest price in GBP, inclusive. Requires the advanced search subscription on whiskyhunter.net. |
price_max |
integer or null |
no |
Highest price in GBP, inclusive. Requires the advanced search subscription on whiskyhunter.net. |
auction_slug |
string or null |
no |
Only lots from this auction house; slug from list_active_auctions. |
geo |
string or null |
no |
Only lots located in this region, for example 'UK' or 'EU'. Requires the advanced search subscription on whiskyhunter.net. |
date_from |
date string or null |
no |
Earliest sale date, inclusive, ISO format YYYY-MM-DD. Requires the advanced search subscription on whiskyhunter.net. |
date_to |
date string or null |
no |
Latest sale date, inclusive, ISO format YYYY-MM-DD. Requires the advanced search subscription on whiskyhunter.net. |
hide_nmr |
boolean or null |
no |
Exclude lots that did not meet their reserve (unsold). Available to any account. |
Returns
A market page with compact cross-market hints on its first page.
| Field |
Type |
Description |
results |
array of objects |
Matching results for the current page. |
nextCursor |
string or null |
Opaque cursor for the next page when more results exist. |
search_syntax |
string |
How to use include and exclude search operators. |
related_matches |
object or null |
Matches for the same include/exclude text in the other markets and bottle catalogue. Present only on the first page; market-specific filters from this search are not applied to these hints. |
search_live_auction_lots
Start here for open bids: search live auction lots. The first page also reports past and retail match counts and up to five catalogue candidates with slugs for get_bottle_data. Related matches use the search text, not this search's price, region or auction filters.
Arguments
| Name |
Type |
Required |
Description |
search_include |
string |
yes |
Required full-text query. Separate OR title variants with ' | '; words inside each variant are ANDed. Use compact identifiers such as brand, vintage, age, ABV, cask, batch, or edition. Prefer bare numbers: 18 instead of '18 years old', 43 instead of '43%', and 700 instead of '700 ml'. |
search_exclude |
string |
no |
Optional terms that must not appear, joined with ' & '. Only narrows search_include; for example 'mini & miniature & 5cl'. |
cursor |
string or null |
no |
Opaque cursor returned by the previous page. |
price_min |
integer or null |
no |
Lowest price in GBP, inclusive. Requires the advanced search subscription on whiskyhunter.net. |
price_max |
integer or null |
no |
Highest price in GBP, inclusive. Requires the advanced search subscription on whiskyhunter.net. |
auction_slug |
string or null |
no |
Only lots from this auction house; slug from list_active_auctions. |
geo |
string or null |
no |
Only lots located in this region, for example 'UK' or 'EU'. Requires the advanced search subscription on whiskyhunter.net. |
Returns
A market page with compact cross-market hints on its first page.
| Field |
Type |
Description |
results |
array of objects |
Matching results for the current page. |
nextCursor |
string or null |
Opaque cursor for the next page when more results exist. |
search_syntax |
string |
How to use include and exclude search operators. |
related_matches |
object or null |
Matches for the same include/exclude text in the other markets and bottle catalogue. Present only on the first page; market-specific filters from this search are not applied to these hints. |
search_retail_listings
Start here to buy now: search in-stock retail listings. The first page also reports past and live match counts and up to five catalogue candidates with slugs for get_bottle_data.
Arguments
| Name |
Type |
Required |
Description |
search_include |
string |
yes |
Required full-text query. Separate OR title variants with ' | '; words inside each variant are ANDed. Use compact identifiers such as brand, vintage, age, ABV, cask, batch, or edition. Prefer bare numbers: 18 instead of '18 years old', 43 instead of '43%', and 700 instead of '700 ml'. |
search_exclude |
string |
no |
Optional terms that must not appear, joined with ' & '. Only narrows search_include; for example 'mini & miniature & 5cl'. |
cursor |
string or null |
no |
Opaque cursor returned by the previous page. |
Returns
A market page with compact cross-market hints on its first page.
| Field |
Type |
Description |
results |
array of objects |
Matching results for the current page. |
nextCursor |
string or null |
Opaque cursor for the next page when more results exist. |
search_syntax |
string |
How to use include and exclude search operators. |
related_matches |
object or null |
Matches for the same include/exclude text in the other markets and bottle catalogue. Present only on the first page; market-specific filters from this search are not applied to these hints. |
search_casks
Search or browse whole casks held in bond in the past or live market. Search terms are optional. Needs a Hogshead subscription on whiskyhunter.net.
Arguments
| Name |
Type |
Required |
Description |
search_include |
string |
no |
Optional full-text query; omit it to browse casks. Separate OR title variants with ' | '; words inside a variant are ANDed. |
search_exclude |
string |
no |
Optional terms that must not appear, joined with ' & '. Only narrows search_include; for example 'mini & miniature & 5cl'. |
cursor |
string or null |
no |
Opaque cursor returned by the previous page. |
price_min |
integer or null |
no |
Lowest price in GBP, inclusive. Requires the advanced search subscription on whiskyhunter.net. |
price_max |
integer or null |
no |
Highest price in GBP, inclusive. Requires the advanced search subscription on whiskyhunter.net. |
auction_slug |
string or null |
no |
Only lots from this auction house; slug from list_active_auctions. |
geo |
string or null |
no |
Only lots located in this region, for example 'UK' or 'EU'. Requires the advanced search subscription on whiskyhunter.net. |
date_from |
date string or null |
no |
Earliest sale date, inclusive, ISO format YYYY-MM-DD. Requires the advanced search subscription on whiskyhunter.net. |
date_to |
date string or null |
no |
Latest sale date, inclusive, ISO format YYYY-MM-DD. Requires the advanced search subscription on whiskyhunter.net. |
hide_nmr |
boolean or null |
no |
Exclude lots that did not meet their reserve (unsold). Available to any account. |
market |
string |
no |
Which market to read: 'past' for casks already sold at auction (price history), 'live' for casks currently open for bidding. date_from, date_to, and hide_nmr apply to 'past' only. |
Returns
One page of search results.
| Field |
Type |
Description |
results |
array of objects |
Matching results for the current page. |
nextCursor |
string or null |
Opaque cursor for the next page when more results exist. |
search_syntax |
string |
How to use include and exclude search operators. |
search_bottles
Search bottle releases in Whisky Hunter and return slugs for get_bottle_data.
Arguments
| Name |
Type |
Required |
Description |
search_include |
string |
yes |
Required full-text query. Separate OR title variants with ' | '; words inside each variant are ANDed. Use compact identifiers such as brand, vintage, age, ABV, cask, batch, or edition. Prefer bare numbers: 18 instead of '18 years old', 43 instead of '43%', and 700 instead of '700 ml'. |
search_exclude |
string |
no |
Optional terms that must not appear, joined with ' & '. Only narrows search_include; for example 'mini & miniature & 5cl'. |
cursor |
string or null |
no |
Opaque cursor returned by the previous page. |
Returns
One page of search results.
| Field |
Type |
Description |
results |
array of objects |
Matching results for the current page. |
nextCursor |
string or null |
Opaque cursor for the next page when more results exist. |
search_syntax |
string |
How to use include and exclude search operators. |
identify_bottle
Find Whisky Hunter bottles that look like the bottle in a photograph, ranked closest first, with slugs to pass to get_bottle_data. Submit the actual photo bytes as base64 in image_base64; a host with access to attachment bytes may populate the argument directly. If it cannot, read the label and use search_bottles instead. A visual candidate is not a confirmed release: compare its ABV, years, age and volume with the label before using its market data. Needs a paid subscription on whiskyhunter.net.
Arguments
| Name |
Type |
Required |
Description |
image_base64 |
string |
yes |
The actual photo bytes, base64-encoded (JPEG, PNG or WebP; a data: URL prefix is accepted). Do not replace the photo with a textual description. A host with access to attachment bytes may populate this argument directly; otherwise read the label and use search_bottles. Downscale before sending — the detector resizes anyway, and an oversized body is refused. |
Returns
Catalogue bottles that look like the one in the submitted photo.
| Field |
Type |
Description |
status |
string |
Recognition outcome: candidates when visual matches are returned; no_catalog_match when the bottle was processed but no catalogue entry passed the match threshold; no_embedding when a bottle was detected but no usable visual embedding was produced; no_bottle when no bottle was detected in the photo. |
candidates |
array of objects |
Bottles from the Whisky Hunter database ranked by visual similarity, closest first. Pass a slug to get_bottle_data for prices and history. Empty when nothing in the catalogue looks close enough to be worth showing. |
bottles_on_photo |
integer |
How many bottles were detected in the photo. Zero means no bottle was visible at all — ask for a clearer picture with the front label showing, rather than treating it as an empty catalogue. Only the most confident bottle is matched, so a value above one means the rest of the picture was ignored: ask for a photo of a single bottle. |
guidance |
string |
How to use these candidates safely; repeat its caution to the user rather than presenting a candidate as identified. |
get_bottle_data
Return one bottle's metadata, secondary-market auction price history, year-over-year analytics, recent past auction lots, live auction offers, and in-stock retail offers. Monetary values are GBP.
Arguments
| Name |
Type |
Required |
Description |
bottle_slug |
string |
yes |
Bottle slug from search_bottles. |
Returns
Details for one Whisky Hunter bottle. Monetary values are GBP. Sections may be replaced by a locked marker when the caller's subscription plan is not high enough. Sections follow the order of the bottle page on whiskyhunter.net — price history, year by year, retail, live, past — so present them in that order.
| Field |
Type |
Description |
bottle |
object |
Public bottle metadata. |
currency |
string |
Currency for all monetary values in this payload. |
price_history |
object |
Secondary-market auction price statistics per period, or a locked marker. |
by_years |
object |
Year-over-year auction sales analytics, or a locked marker. |
retail_offers |
object |
In-stock retail listings for this bottle. |
live_offers |
object |
Currently open auction lots for this bottle. |
past_lots |
object |
Most recent visible past auction lots for this bottle. |
Quick start - raw JSON-RPC
# 1. Initialize
curl -s -X POST https://whiskyhunter.net/mcp/ \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer <wh_mcp_token>" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","clientInfo":{"name":"curl","version":"0"}}}'
# 2. Confirm initialization (server replies 202, no body)
curl -s -X POST https://whiskyhunter.net/mcp/ \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer <wh_mcp_token>" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","method":"notifications/initialized"}'
# 3. List tools
curl -s -X POST https://whiskyhunter.net/mcp/ \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer <wh_mcp_token>" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
# 4. Call a tool
curl -s -X POST https://whiskyhunter.net/mcp/ \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer <wh_mcp_token>" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_monthly_distillery_stats","arguments":{"distillery_slug":"ardbeg"}}}'
Search example
curl -s -X POST https://whiskyhunter.net/mcp/ \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer <wh_mcp_token>" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"search_past_auction_lots","arguments":{"search_include":"macallan 18 | macallan eighteen","search_exclude":"mini & miniature & 5cl"}}}'
Authentication
Create or rotate your MCP API token on the Whisky Hunter profile page.
Assistants that connect by signing in use OAuth 2.1 (authorization code with PKCE) and need no token from you.
Unauthenticated requests will receive a 401 Unauthorized JSON-RPC error.