Skip to main content

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).

Setup

uv sync
uv run python smoke_test.py   # optional: live end-to-end check

Run

uv run vivino-mcp

Register with an MCP client (e.g. Claude Desktop)

{
  "mcpServers": {
    "vivino": {
      "command": "uv",
      "args": ["--directory", "/Users/dmkim/Projects/vivino-mcp", "run", "vivino-mcp"]
    }
  }
}

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.

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 at explore_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_wine ranks explore results client-side by name match (the explore path has no free-text q param). 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

vivino_mcp-0.1.0.tar.gz (8.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vivino_mcp-0.1.0-py3-none-any.whl (10.8 kB view details)

Uploaded Python 3

File details

Details for the file vivino_mcp-0.1.0.tar.gz.

File metadata

  • Download URL: vivino_mcp-0.1.0.tar.gz
  • Upload date:
  • Size: 8.2 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

Hashes for vivino_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 add97a29dabab0ff9d70940e7194881ea1d26e102e3b4894ae7f601f83fdff5f
MD5 20e7bd8277d51f4502fa3b51b030b8e6
BLAKE2b-256 e2faea71de42bd904b86dd6b1d40ab6657a7dcbc29cb352be4d91f70acff2181

See more details on using hashes here.

File details

Details for the file vivino_mcp-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: vivino_mcp-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 10.8 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

Hashes for vivino_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 797e2787e9949ac1df5c7a30f90022f69241ba7e2dfa6ce49e62cb7eb5efee05
MD5 0ae66dadfe9892c926933113de074c84
BLAKE2b-256 4ca0c790d52143c6bb44a830efc80c79ba37dc452d6ca096df6154cfa352bc32

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page