MCP server that fetches wine information from Vivino
Project description
vivino-mcp
An MCP server that fetches wine information from Vivino via its unofficial JSON API.
⚠️ Vivino has no official public API. This server calls internal endpoints the website uses. It is intended for personal / educational use. Respect Vivino's Terms of Service and keep request volume low (the server caches and throttles by default). Endpoints may change without notice.
Tools
| Tool | Description |
|---|---|
search_wine(query, limit) |
Search wines by name; returns summary cards. |
search_by_filters(wine_type, country, min_rating, price_min, price_max, limit) |
Discover wines by structured filters. |
get_wine_details(vintage_id) |
Full details for a vintage incl. taste structure (tannin/acidity/sweetness/intensity) and flavor profile. |
get_wine_reviews(wine_id, year, limit) |
User reviews for a wine. |
list_wine_types() |
Supported wine types and their Vivino ids. |
IDs flow naturally: a search result gives you vintage_id (for details) and
wine_id (for reviews).
Install (for users)
Claude Desktop — one-click
Download vivino-mcp.mcpb from the
latest release and
double-click it (or Settings → Extensions → Install from file).
Requires uv on your machine.
Any MCP client — via uvx
No clone needed; uvx fetches the package from PyPI automatically:
{
"mcpServers": {
"vivino": {
"command": "uvx",
"args": ["vivino-mcp"]
}
}
}
Optional env: VIVINO_CURRENCY (default USD), VIVINO_COUNTRY (default us).
Develop (from source)
uv sync
uv run python smoke_test.py # optional: live end-to-end check
uv run vivino-mcp # run the server (stdio)
Configuration (env vars)
| Var | Default | Purpose |
|---|---|---|
VIVINO_CURRENCY |
USD |
Currency for prices/explore. |
VIVINO_COUNTRY |
us |
Default country code. |
VIVINO_USER_AGENT |
Firefox UA | Override the browser UA sent to Vivino. |
VIVINO_CA_BUNDLE |
— | Path to a CA bundle (PEM) to verify TLS against. |
VIVINO_INSECURE |
— | Set to 1 to disable TLS verification (last resort). |
TLS behind a corporate proxy
By default the server verifies TLS against your OS trust store (via
truststore), so it works behind corporate TLS-interception proxies whose
private root CA is in the system keychain. If you still hit
CERTIFICATE_VERIFY_FAILED, point VIVINO_CA_BUNDLE at your company's root CA
PEM, or set VIVINO_INSECURE=1 as a last resort.
Architecture
server.py MCP tool layer (FastMCP) — schemas + error wrapping
│
client.py VivinoClient — throttle, retry/backoff, TTL cache
│
models.py Pydantic models — flatten Vivino's nested JSON
config.py UA, currency, timeouts, cache TTLs, wine-type map
Verified Vivino endpoints
GET /api/explore/explore— search/discovery. Params:country_codes[],wine_type_ids[],grape_ids[],region_ids[],min_rating,price_range_min/max,currency_code,order_by,order,page. Results atexplore_vintage.matches[].GET /api/vintages/{vintage_id}— vintage detail (no taste data).GET /api/wines/{wine_id}/tastes— taste structure + flavor profile.GET /api/wines/{wine_id}/reviews?per_page=&page=&year=— user reviews.
A browser User-Agent header is required — Vivino blocks requests without one.
Notes / limitations
search_wineranks explore results client-side by name match (the explore path has no free-textqparam). For exact-name lookups this is approximate; extend with the site search host if you need stricter matching.- No tests beyond
smoke_test.py(which hits the live API). Add HTML/JSON fixtures for offline unit tests before relying on this in CI.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vivino_mcp-0.1.2.tar.gz.
File metadata
- Download URL: vivino_mcp-0.1.2.tar.gz
- Upload date:
- Size: 9.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28181c9aa19b98b4341003a78353551b2b379995313dfbd842e41c728c66fc85
|
|
| MD5 |
4db55015b664a96a9e26756269d0131f
|
|
| BLAKE2b-256 |
64ff617f0fa63a5745e922480becaa8249407910c925ec0791450491903cde91
|
File details
Details for the file vivino_mcp-0.1.2-py3-none-any.whl.
File metadata
- Download URL: vivino_mcp-0.1.2-py3-none-any.whl
- Upload date:
- Size: 12.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6721ad8d35d320c7acd123f9f4ff1ce3831786ba2c880f2bb3d99514f9efa29
|
|
| MD5 |
0b6a10c1ffa6ea3c282c701eb59adac7
|
|
| BLAKE2b-256 |
e5fea5d786c706e4c14592e4733703d160c886f0423bd269ef8a950ba6e8088e
|