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 (full catalog, via Vivino's Algolia index — finds wines with no marketplace listing too). |
search_by_filters(wine_type, country, min_rating, price_min, price_max, limit) |
Discover/recommend wines by filters, with marketplace prices (via explore). |
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).
search_wine / search_by_filters return {total_matched, returned, note, results}. total_matched is how many wines Vivino reports for the query;
results is a ranked, paginated list capped at limit (not the full catalog).
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.
Metadata
Release files for vivino-mcp 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| vivino_mcp-0.1.6.tar.gz | 11.6 kB | Without provenance | Details for vivino_mcp-0.1.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| vivino_mcp-0.1.6-py3-none-any.whl | Python 3 | none | any | Details for vivino_mcp-0.1.6-py3-none-any.whl |
Total release size: 26.1 kB
Release files / vivino_mcp-0.1.6.tar.gz
| Download URL | vivino_mcp-0.1.6.tar.gz |
|---|---|
| Size | 11.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8fdf04279da2feb23b4cc56c64e97ab8360171d6109843b9dc35c95cc6cf6eab
|
|
BLAKE2b-256 checksum How to use checksums |
6f3402b14e8c08ce554be868e2fc88e6944f38e21e41345a30fa17fe76beb0b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / vivino_mcp-0.1.6-py3-none-any.whl
| Download URL | vivino_mcp-0.1.6-py3-none-any.whl |
|---|---|
| Size | 14.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e634256cdc02fccf43571e31cfe2bcd54b9abf1a6032d5035d8a4a5fd5c90a27
|
|
BLAKE2b-256 checksum How to use checksums |
604e752df3d4866fe3b1273aa5754f23a33a75013488ab5138c6abc7ac96186d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Security for vivino-mcp 0.1.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.