Skip to main content
Glama
slavins-co

CellarTracker MCP

by slavins-co

CellarTracker MCP

Disclaimer: This is a community-maintained project with no affiliation to, or endorsement by, CellarTracker! LLC. It uses CellarTracker's self-serve data export on your own account's behalf.

Connect Claude to your CellarTracker wine cellar. Query your inventory, get drinking recommendations, and analyze purchases and drinking history, all through natural conversation. No need to refresh your inventory, or share your tasting notes. Claude pulls them directly from your CellarTracker account.

Install

Two install methods for different Claude interfaces. You may need one or both:

Desktop Extension (.mcpb)

Claude Code Plugin

Works in

Chat (Desktop), Cowork

Cowork, Code

Tools

11 cellar tools

All 13 tools (includes setup-credentials and clear-user-data)

Skills

No

Yes

Setup

One-click download

Marketplace or CLI

Credentials

Prompted on install, stored in OS keychain

Run setup-credentials after install

Which do I need?

  • Chat (Desktop) only → Desktop Extension

  • Code only → Claude Code Plugin

  • Cowork only → Either works (plugin adds skills)

  • Full coverage → Install both

Installing both is safe. The extension covers Chat (Desktop); the plugin covers Cowork and Code. In Cowork, both are accessible without conflict. Note, there is no coverage for claude.ai web chat sessions.

Desktop Extension (Chat & Cowork)

One-click install. No terminal needed.

  1. Download cellartracker-mcp.mcpb from the latest release

  2. Double-click the file to install in Claude Desktop

  3. Enter your CellarTracker username and password when prompted

  4. Start chatting (e.g. "What wines should I open this month?")

Credentials are stored in your OS keychain (macOS Keychain / Windows Credential Manager). To update them later, go to Customize > Connectors > CellarTracker.

Claude Code Plugin (Cowork & Code)

Full experience with tools and skills.

Via Desktop app

  1. Open the Code tab > Customize > Browse plugins > Personal > + > Add marketplace from GitHub > enter slavins-co/cellartracker-mcp

  2. Find "CellarTracker MCP" in the plugin browser and click Install

  3. Set up credentials immediately: In a new Code or Cowork session, say "Set up my CellarTracker credentials"

Via terminal

Step 1: Add the marketplace

/plugin marketplace add slavins-co/cellartracker-mcp

Step 2: Install the plugin

/plugin install cellartracker-mcp@cellartracker-mcp

Step 3: Set up credentials immediately — say:

"Set up my CellarTracker credentials"

Claude will verify and save them. No restart needed. Without credentials, tools will return errors and skills won't have data to work with.

Alternative: Set CT_USERNAME and CT_PASSWORD as environment variables in your shell profile.

Credentials are stored only on your machine. When using the setup tool, they pass through Anthropic's servers as part of the conversation. They are sent to CellarTracker's servers for authentication.

Related MCP server: Strava MCP Server

What you can do

Tool

What it does

setup-credentials

Connect your CellarTracker account (Claude Code plugin only — Desktop Extension handles credentials during install)

search-cellar

Find wines by name, color, region, varietal, location, or vintage

drinking-recommendations

Wines to open now, sorted by drinking window urgency

cellar-stats

Collection overview — totals and breakdowns by any dimension

purchase-history

Spending analysis by store, date range, or wine

recent-deliveries

Wines actually received in a date range, by delivery date (not order date)

incoming-orders

Wines ordered but not yet received — what's on the way

get-wishlist

Your wishlist with notes on why each wine was added and a max price

consumption-history

Wines you've opened — by name, color, or date range

tasting-notes

Your tasting notes and reviews with ratings and scores

bottle-details

Find individual bottles by name, location, bin, size, or barcode — cellar and consumed

refresh-data

Force a fresh pull (auto-refreshes every 24 hours)

clear-user-data

Remove stored credentials and cached data from this machine (Claude Code plugin only)

Every tool returns structured JSON alongside its readable text, so clients can compute over results directly. List tools support offset pagination past the 25-per-page cap.

Resources

For bulk analysis without per-tool result caps, the server also exposes the cached table exports as MCP resources: cellartracker://tables/<Table> (raw CSV, one per table — List, Notes, Purchase, Consumed, Availability, Tag, Bottles, Pending) and cellartracker://meta/cache (JSON freshness timestamps per table plus the server version, readable without credentials).

Included skills

Note: Skills are available in Cowork and Code modes via the Claude Code plugin. Chat mode (Desktop Extension) provides tools only.

cellartracker-data — Teaches Claude to interpret CellarTracker data: table relationships, score abbreviations, drinking windows, and query routing.

wine-purchase-evaluator — Framework for evaluating wine purchases. Two-score system (Quality + Personal Fit) with BUY/CONSIDER/PASS verdicts. Checks your cellar for redundancy, verifies pricing, and applies drinking window discipline.

To customize the evaluator for your preferences, copy skills/wine-purchase-evaluator/references/preferences-example.md to preferences.md in the same directory and edit it.

How it works

CellarTracker has no official API. This server uses their CSV export endpoint, which authenticates with your username and password over HTTPS. Data is cached locally and auto-refreshes every 24 hours.

The server can only access your data — inventory, purchases, notes, and wishlist. It cannot search CellarTracker's full wine database.

Security & credentials

CellarTracker API limitations

CellarTracker has no OAuth, API keys, or scoped tokens. Authentication requires your actual account username and password, sent as URL query parameters over HTTPS. While encrypted on the wire, query parameters are routinely logged in server-side access logs on CellarTracker's infrastructure. There is no way to create read-only or limited-access credentials, therefore, this MCP only performs read operations, but it authenticates with your full account.

How this server protects your credentials

Protection

Details

File permissions

Config directory 0700, .env file 0600 — only your OS user can read

Error stripping

Network errors are caught and re-thrown without the URL, which contains credentials

No logging

Credentials never appear in stdout, stderr, or error messages

OS keychain

Desktop Extension (.mcpb) stores credentials in macOS Keychain / Windows Credential Manager

Env var support

Set CT_USERNAME / CT_PASSWORD environment variables to avoid storing credentials on disk

The Claude Code plugin stores credentials as plaintext in ~/.config/cellartracker-mcp/.env. We evaluated OS keychain integration (#22) and decided against it. The native dependency cost (node-gyp / keytar) outweighs the security benefit for wine cellar data, and the Desktop Extension path already uses the OS keychain.

Recommendations

  • Use a unique password for CellarTracker. Do not reuse a password from other services.

  • Prefer environment variables over the setup-credentials tool if you want to avoid persisting credentials to disk.

  • Pin to a specific version in your MCP config (e.g., cellartracker-mcp@0.5.2) rather than relying on @latest.

Development

For contributors or anyone who wants to run from source:

git clone https://github.com/slavins-co/cellartracker-mcp.git
cd cellartracker-mcp
npm install
npm run build

# Set credentials
cp .env.example .env
# Edit .env with your CT login

# Test as Claude Code plugin
claude --plugin-dir .

npx local-resolution footgun

If you run npx -y cellartracker-mcp (e.g. via an MCP client config) with your working directory inside a local checkout of this repo, npm can resolve the bare package name to that local folder instead of downloading it from the registry — so whatever is on disk in dist/ gets served, not the published version. npm install/npm ci now runs a prepare script that rebuilds dist/ automatically, so a fresh clone is always current. But if you edit src/ directly and don't run npm install or npm run build again, dist/ will silently go stale — the server keeps running the old compiled code with no error. If output looks wrong while developing, rebuild (npm run build) before assuming the bug is in src/.

AI Disclosure

This project was developed with AI assistance.

Trademark Disclosure

This project is in no way affiliated or connected to CellarTracker! LLC. "CellarTracker" is a trademark of CellarTracker! LLC.

License

MIT

Available Tools

11 tools
bottle-detailsA
Read-only

Look up individual bottles from the Bottles table — the per-bottle view spanning both in-cellar and consumed bottles, with barcode, exact location/bin, and size. Filter by wine name, location, bin, size, or barcode; set state to 'cellar' (default 'all' includes consumed). If the user attaches a photo of a bottle or its barcode, read the barcode digits from the image and pass them as the barcode filter. Location and Bin are account-specific labels, not physical descriptions — if a location/bin filter finds nothing, use cellar-stats with group_by=location or group_by=bin to see the actual values in use. Returns up to max_results per page (default 25) — pass offset to page through more.

ParametersJSON Schema
NameRequiredDescriptionDefault
binNoSpecific bin/position (e.g. 'Drawer 2', '1-3')
sizeNoBottle format (e.g. '750ml', '1500ml')
queryNoWine name search term
stateNoWhich bottles: 'cellar', 'consumed', or 'all' (default)
offsetNoResult offset for pagination (default 0)
barcodeNoBottle barcode — e.g. read from a photo
locationNoStorage location (e.g. 'Wine Fridge')
max_resultsNoMaximum results (default 25)

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
totalYes
offsetYes
bottlesYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real behavioral context beyond that: Location/Bin are account-specific labels rather than physical descriptions, the default state='all' silently includes consumed bottles, and results are paged. It does not cover error/auth behavior, but the added context is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the identity of the resource, then filters, then the photo workflow, then the fallback, then pagination — a logical order. It is dense and long, but nearly every clause carries non-obvious information; only the enumeration of filter fields overlaps the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't describe return values, and it doesn't. For an 8-parameter read tool it covers defaults, pagination, the photo/barcode path, and the account-specific-label edge case, leaving nothing an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: state='all' is the default and includes consumed bottles, max_results defaults to 25 per page, offset pages through results, and barcode can be sourced from a photo. These are operational semantics, not restatements.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('look up') and resource ('individual bottles from the Bottles table') and explicitly scopes it as the per-bottle view, distinguishing it from the aggregate siblings search-cellar and cellar-stats. An agent can tell what it returns (barcode, location/bin, size) without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use conditions (filter by name/location/bin/size/barcode; state='cellar' vs 'all'), a concrete workflow for photo attachments (read barcode digits from image), and a named fallback ('use cellar-stats with group_by=location or group_by=bin') when a label filter returns nothing. Alternatives and exclusions are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cellar-statsA
Read-only

Get cellar statistics: total bottles, value, unique wines, and optional breakdowns. Valid group_by options: color, country, region, varietal, location, bin, category.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_byNoBreakdown dimension

Output Schema

ParametersJSON Schema
NameRequiredDescription
breakdownNo
avgPerWineYes
totalValueYes
uniqueWinesYes
totalBottlesYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by naming the computed metrics and the dimensions a breakdown can take, but says nothing about cost, caching, or whether breakdowns change the return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler: the metric list comes first, the enumerated valid values second. Every clause carries information the caller needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the single optional parameter is fully documented. Complete for a one-parameter aggregation tool; only omission is any hint about how breakdowns affect output or performance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but the schema only says 'Breakdown dimension' and declares zero enums; the description supplies the actual valid values (color, country, region, varietal, location, bin, category), which is real information the schema lacks. This meaningfully exceeds the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('cellar statistics') and enumerates the metrics returned (total bottles, value, unique wines, breakdowns). An agent can distinguish this from siblings like search-cellar or bottle-details, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'optional breakdowns' implies when to supply group_by versus omitting it, which is implicit usage guidance, but there is no explicit statement of when to prefer this tool over siblings such as search-cellar for aggregate-style questions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

consumption-historyA
Read-only

Search your consumption history — wines you've opened and drunk. Filter by wine name, color, or date range. Returns most recent consumptions first with tasting context, up to max_results per page (default 25) — pass offset to page through more.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNoFilter by color (Red, White, Rosé)
queryNoWine name search term
offsetNoResult offset for pagination (default 0)
date_toNoEnd date (YYYY-MM-DD)
date_fromNoStart date (YYYY-MM-DD)
max_resultsNoMaximum results (default 25)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
totalYes
offsetYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior: results are ordered most-recent-first, include tasting context, and page via max_results/offset. It does not discuss result caps or authentication, but the added context is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence set: purpose first, filterable fields second, pagination and ordering last. No filler and nothing redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, filtered list tool with an output schema, the description covers the essentials: what it searches, how to filter, ordering, and pagination. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond it by explaining pagination mechanics — max_results per page with a default of 25 and offset for paging — which links two parameters semantically in a way the schema entries do not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (consumption history of wines opened/drunk), which cleanly separates it from siblings like purchase-history and search-cellar. An agent can identify the tool's domain without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context — filter by wine name, color, or date range — so the agent knows which dimensions it can slice by. It does not name an alternative tool or describe when *not* to use it, so it falls short of full explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

drinking-recommendationsA
Read-only

Get wine drinking recommendations sorted by urgency. Prioritizes wines that are past peak, then those with closing windows, then wines currently in their drinking window. Optionally filter by color.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNoFilter by color
occasionNoOccasion description
max_resultsNoMaximum results (default 10)

Output Schema

ParametersJSON Schema
NameRequiredDescription
recommendationsYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real behavioral context beyond that: the three-tier urgency ranking (past peak, closing windows, in window) tells the agent how results are ordered. It does not cover pagination or result shape, but an output schema exists for that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with zero waste, front-loading the purpose before the ranking detail and the optional filter. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the safety profile, the description supplies the purpose, the ranking semantics, and a filter hint. The only minor gap is that the occasion and max_results parameters go unmentioned, but the schema covers them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are documented in the schema. The description only echoes the color filter and omits occasion and max_results entirely, adding minimal meaning beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get wine drinking recommendations') and even the ordering logic used to rank them. It is clearly distinguishable from lookup siblings like search-cellar or bottle-details, though it never names an alternative directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when this tool is useful (finding wines to drink now, ranked by urgency) and notes an optional color filter, but it gives no explicit when-to-use-vs-alternatives guidance or prerequisites. Usage must be inferred from the intent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-wishlistA
Read-only

View your CellarTracker wishlist wines. Optionally search by wine name, region, or varietal.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch term

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
winesYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe/read-only nature is covered structurally. The description adds no behavioral detail beyond that – no mention of pagination, auth requirements, result limits, or what the wishlist view returns. It essentially restates the read operation the annotations already imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the primary action front-loaded and the optional modifier second. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and with only one optional parameter the description is close to sufficient. A brief note on scope (e.g., whether it returns all wishlist items by default) would close the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description enriches the bare 'Search term' parameter by specifying it matches wine name, region, or varietal. That adds real semantic meaning about what the query actually filters on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('View') and resource ('CellarTracker wishlist wines'), which clearly separates it from siblings like search-cellar or cellar-stats. It lacks any explicit naming of an alternative tool, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Optionally search by wine name, region, or varietal' implies the two usage modes (list all vs. filtered search), which is useful context. However, there is no guidance on when to prefer this over search-cellar, and no prerequisites or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

incoming-ordersA
Read-only

List wines ordered but not yet received, from the Pending table. Sorted oldest order first. Use this for 'what's on the way', unlike recent-deliveries which shows what has already arrived.

ParametersJSON Schema
NameRequiredDescriptionDefault
storeNoStore name filter

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
totalYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavior beyond that: the underlying Pending table and the oldest-first sort order. It doesn't discuss pagination, but an output schema exists so return shape is handled elsewhere.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both front-loaded with the scoping constraint first and the alternative-routing second. No redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, single-filter list tool with an output schema and clear annotations, the description supplies everything needed: purpose, data source, ordering, and sibling differentiation. Nothing required to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'store' filter is documented in the schema itself. The description adds no syntax or filtering detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List), resource (wines ordered but not yet received), source (Pending table), and ordering (oldest first). It explicitly differentiates itself from the sibling recent-deliveries, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit use case ('what's on the way') and names the alternative tool (recent-deliveries) with the condition that selects it (already arrived). When-to-use and when-not-to-use are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

purchase-historyB
Read-only

Search purchase history with spending summary. Filter by wine name, store, or date range (YYYY-MM-DD format). Shows total spent, average price, per-store breakdown, and recent purchases.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoWine name search
storeNoStore name filter
date_toNoEnd date (YYYY-MM-DD)
date_fromNoStart date (YYYY-MM-DD)

Output Schema

ParametersJSON Schema
NameRequiredDescription
recentYes
byStoreYes
avgPriceYes
totalSpentYes
bottleCountYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully discloses the output shape (total spent, average price, per-store breakdown, recent purchases), which goes beyond the annotations, but since an output schema exists this is partially redundant and no other behavioral traits (pagination, empty-result behavior) are added.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler, and the purpose is front-loaded before the filter list and return summary. Slightly over-specifies outputs that the output schema already carries.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, four-optional-parameter search tool with a full output schema, the description covers purpose, filters, and result contents adequately. The only gap is absence of any cross-tool routing guidance, which a multi-sibling environment would benefit from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in the schema, including the YYYY-MM-DD date format. The description notes the date format again but adds no syntax beyond what the schema provides, establishing the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (purchase history) plus the added value (spending summary), so an agent knows exactly what the tool returns. It does not, however, differentiate itself from plausible siblings like consumption-history or cellar-stats, leaving the selection boundary implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description enumerates the available filters but never says when to use this tool versus consumption-history, cellar-stats, or recent-deliveries. No prerequisites, no exclusions, no routing guidance — the agent must infer applicability from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recent-deliveriesA
Read-only

List wines actually delivered (received) in a date range, keyed on DeliveryDate. Defaults to the last 30 days. Use this for 'what just landed', unlike purchase-history which keys on order date.

ParametersJSON Schema
NameRequiredDescriptionDefault
storeNoStore name filter
date_toNoEnd delivery date (YYYY-MM-DD). Defaults to today.
date_fromNoStart delivery date (YYYY-MM-DD). Defaults to 30 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
totalYes
mostRecentDeliveryNo

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds the 30-day default window, but that is also stated in the schema, and it says nothing about result ordering, volume, or pagination behavior for what could be a long list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with zero waste; the date-range scope and default lead, with the sibling distinction following.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. For a simple filtered read-only list, the description plus schema and annotations give an agent everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented with formats and defaults. The description reinforces date-keying semantics but adds no syntax or format detail beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List wines actually delivered') and immediately names the keying field (DeliveryDate), which distinguishes it from siblings like purchase-history at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the when-to-use ('what just landed') and names the alternative tool plus the discriminating condition (order date vs delivery date). No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh-dataA
Read-only

Force refresh all CellarTracker data from the server. Downloads fresh CSV exports for all 8 tables regardless of cache age.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
tablesYes
refreshedAtYes
serverVersionYes

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, but the description says it 'Downloads fresh CSV exports' and 'Force refresh' — a write-like side effect (cache mutation, network I/O). This is not a direct contradiction (the server data isn't modified), but the description does not reconcile the readOnlyHint with the cache-updating behavior. It also doesn't mention network cost, duration, or failure modes for downloading 8 tables.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and scope. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values needn't be explained. However, for a tool that triggers a full server download, the description should address the readOnlyHint vs. cache-write tension and note any cost/latency implications. The core purpose is clear but the behavioral context is thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the baseline is 4. The schema is 100% covered (empty), and the description correctly handles the absence of parameters by describing the fixed scope (all 8 tables, all cache ages).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Force refresh') and resource ('all CellarTracker data from the server'), and clarifies the scope with 'all 8 tables'. An agent can immediately distinguish this from read-only siblings like get-wishlist or cellar-stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'regardless of cache age' implies usage for cache invalidation, but the description never explicitly says when to use this tool versus simply querying the cached data. No alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search-cellarA
Read-only

Search your wine cellar by name, color, region, varietal, location, or vintage range. The region parameter searches across Country, Region, SubRegion, Appellation, and Locale fields. Returns matching wines with details, up to 25 per page — pass offset to page through more.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNoFilter by color (Red, White, Rosé)
queryNoWine name search term
offsetNoResult offset for pagination (default 0)
regionNoRegion, country, or appellation
locationNoStorage location
varietalNoGrape varietal
vintage_maxNoMaximum vintage year
vintage_minNoMinimum vintage year

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
totalYes
winesYes
offsetYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuine behavioral context beyond the annotations: the region parameter fans out across Country, Region, SubRegion, Appellation, and Locale, and results are capped at 25 per page with offset paging. It does not state sort order, which is a minor omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler, front-loaded with the core purpose followed by the non-obvious region semantics and pagination rule. Every sentence carries information an agent would otherwise have to guess.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and it does not over-explain them while still noting the page size. The main gap is the absence of guidance on how results are ordered, which matters for a paginated tool where an agent may page through many results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: it clarifies that region searches across five distinct nested fields, which the terse schema text ('Region, country, or appellation') does not convey. That elevates it above the schema-only baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (Search) and resource (your wine cellar) and enumerates the filterable dimensions (name, color, region, varietal, location, vintage range). It is very clear what the tool does, though it never names an alternative sibling such as bottle-details, so it stops short of explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb and the filter list, and paging via offset is explained, but there is no statement of when to prefer this over bottle-details or cellar-stats, nor any prerequisites or exclusions. A reader infers the context rather than being told it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tasting-notesA
Read-only

Search your tasting notes and reviews. Filter by wine name, color, or minimum rating. Returns notes with ratings, scores, and tasting details, up to max_results per page (default 25) — pass offset to page through more.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNoFilter by color (Red, White, Rosé)
queryNoWine name search term
offsetNoResult offset for pagination (default 0)
min_ratingNoMinimum rating filter
max_resultsNoMaximum results (default 25)

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
countYes
totalYes
offsetYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds pagination behavior (max_results per page, default 25, offset paging), which is useful. It does not describe result ordering or the openWorld implication, so it is modest added value over annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no waste, front-loaded with the action and filters followed by pagination behavior. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and pagination defaults are stated. The only gap is the absence of explicit sibling differentiation for a family of cellar/consumption search tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are documented in the schema. The description reiterates query/color/min_rating filters and pagination defaults, adding no syntax or semantics beyond what the schema provides. Baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (tasting notes and reviews), then names the three filter dimensions. An agent can distinguish this from search_cellar or consumption_history without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The filter dimensions imply when to use this tool, but there is no explicit when-to-use vs. siblings (e.g., search_cellar, consumption-history) and no exclusions. Usage is inferable but not guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.5.1
    • Changedbottle-details2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcellar-stats2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedconsumption-history2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddrinking-recommendations2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-wishlist2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedincoming-orders2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedpurchase-history2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrecent-deliveries2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrefresh-data2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch-cellar2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtasting-notes2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 11 tool updatesv0.5.0
    • First observedbottle-details
    • First observedcellar-stats
    • First observedconsumption-history
    • First observeddrinking-recommendations
    • First observedget-wishlist
    • First observedincoming-orders
    • First observedpurchase-history
    • First observedrecent-deliveries
    • First observedrefresh-data
    • First observedsearch-cellar
    • First observedtasting-notes

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct CellarTracker concept, and descriptions explicitly disambiguate likely overlaps: purchase-history vs recent-deliveries vs incoming-orders, and search-cellar vs bottle-details. Minor overlap between consumption-history and tasting-notes exists, but their purposes remain clear.

Naming Consistency4/5

All names use consistent kebab-case, which is readable and predictable at the casing level. However, the set mixes verb_noun action names (get-wishlist, search-cellar, refresh-data) with noun-phrase resource names (cellar-stats, purchase-history, tasting-notes), so the pattern is not fully uniform.

Tool Count5/5

11 tools fit the CellarTracker read/query domain well, covering the main data views without obvious redundancy. Each tool appears to earn its place.

Completeness4/5

The read-only surface is comprehensive across wishlist, cellar, bottles, purchases, deliveries, pending orders, consumption, tasting notes, stats, and refresh. Gaps exist around write/edit operations (adding bottles, editing notes, managing wishlist), but those may be intentionally out of scope for this MCP.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers