Home

cheesestore

v2.0.0

The Cheese Store MCP server lets AI agents browse, search, and order artisanal cheeses on behalf of discerning humans who have better things to do than scroll through a catalog.

Pairs well with a glass of wine and a patient language model.

Connect

Add to your MCP client configuration:

{ "mcpServers": { "cheesestore": { "command": "npx", "args": [ "@cheesestore/mcp-server" ] } } }
Protocol MCP 2025-11-25Transport stdioCapabilities tools, resources, prompts

Tools

search_cheese

read-onlyidempotent
TOOLsearch_cheese

Search the cheese catalog by name, origin, milk type, or texture. Returns matching cheeses sorted by relevance.

Parameters

querystringrequiredargument

Free-text search (e.g., "nutty alpine cheese")

milk_typestringcowgoatsheepbuffalomixedargument

Filter by milk type

texturestringsoftsemi-softsemi-hardhardbluefreshargument

Filter by texture category

originstringargument

Country or region of origin (e.g., "France", "Swiss Alps")

min_age_monthsintegerargument

Minimum aging period in months

max_pricenumberargument

Maximum price per kg in USD

limitinteger[1, 50]10argument

Results per page

Returns

cheesesArray<object>
Show child attributes
idstring
namestring
originstring
milk_typestring
texturestring
age_monthsinteger
price_per_kgnumber
descriptionstring
in_stockboolean
totalinteger
search_cheese
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "search_cheese",
    "arguments": {
        "query": "string",
        "milk_type": "cow",
        "texture": "soft",
        "origin": "string",
        "min_age_months": 0,
        "max_price": 0,
        "limit": 10
      }
  }
}
const result = await client.callTool("search_cheese", {
  "query": "string",
  "milk_type": "cow",
  "texture": "soft",
  "origin": "string",
  "min_age_months": 0,
  "max_price": 0,
  "limit": 10
});
result = await session.call_tool("search_cheese", arguments={
  "query": "string",
  "milk_type": "cow",
  "texture": "soft",
  "origin": "string",
  "min_age_months": 0,
  "max_price": 0,
  "limit": 10
})
Response
{
  "cheeses": [
    {
      "id": "string",
      "name": "string",
      "origin": "string",
      "milk_type": "string",
      "texture": "string",
      "age_months": 0,
      "price_per_kg": 0,
      "description": "string",
      "in_stock": true
    }
  ],
  "total": 0
}

get_cheese

read-onlyidempotent
TOOLget_cheese

Get full details for a specific cheese by ID. Includes tasting notes, pairings, nutritional info, and current stock levels.

Parameters

cheese_idstringrequiredargument

Cheese ID

Returns

idstring
namestring
originstring
regionstring
milk_typestring
texturestring
age_monthsinteger
price_per_kgnumber
descriptionstring
tasting_notesstring
pairingsobject
Show child attributes
winesArray<string>
foodsArray<string>
nutrition_per_100gobject
Show child attributes
caloriesinteger
fat_gnumber
protein_gnumber
calcium_mginteger
in_stockboolean
stock_quantity_kgnumber
get_cheese
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "get_cheese",
    "arguments": {
        "cheese_id": "string"
      }
  }
}
const result = await client.callTool("get_cheese", {
  "cheese_id": "string"
});
result = await session.call_tool("get_cheese", arguments={
  "cheese_id": "string"
})
Response
{
  "id": "string",
  "name": "string",
  "origin": "string",
  "region": "string",
  "milk_type": "string",
  "texture": "string",
  "age_months": 0,
  "price_per_kg": 0,
  "description": "string",
  "tasting_notes": "string",
  "pairings": {
    "wines": [
      "string"
    ],
    "foods": [
      "string"
    ]
  },
  "nutrition_per_100g": {
    "calories": 0,
    "fat_g": 0,
    "protein_g": 0,
    "calcium_mg": 0
  },
  "in_stock": true,
  "stock_quantity_kg": 0
}

recommend_cheese

read-only
TOOLrecommend_cheese

Get personalized cheese recommendations based on preferences, occasion, or pairing needs.

Parameters

occasionstringargument

What's the cheese for? (e.g., "dinner party", "sandwich", "existential comfort")

preferencesstringargument

Taste preferences (e.g., "strong and funky", "mild and creamy")

pair_withstringargument

Wine or food to pair with (e.g., "Pinot Noir", "sourdough")

budget_per_kgnumberargument

Budget in USD per kg

countinteger[1, 10]3argument

Number of recommendations

Returns

recommendationsArray<object>
Show child attributes
cheese_idstring
namestring
reasonstring
confidencenumber[0, 1]
recommend_cheese
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "recommend_cheese",
    "arguments": {
        "occasion": "string",
        "preferences": "string",
        "pair_with": "string",
        "budget_per_kg": 0,
        "count": 3
      }
  }
}
const result = await client.callTool("recommend_cheese", {
  "occasion": "string",
  "preferences": "string",
  "pair_with": "string",
  "budget_per_kg": 0,
  "count": 3
});
result = await session.call_tool("recommend_cheese", arguments={
  "occasion": "string",
  "preferences": "string",
  "pair_with": "string",
  "budget_per_kg": 0,
  "count": 3
})
Response
{
  "recommendations": [
    {
      "cheese_id": "string",
      "name": "string",
      "reason": "string",
      "confidence": 0
    }
  ]
}

create_order

TOOLcreate_order

Place an order for one or more cheeses. Requires a shipping address. International shipping available but customs may have questions about that Époisses.

Body

application/json
itemsArray<object>required

Cheeses to order

Show child attributes
cheese_idstringrequired

Cheese ID

quantity_kgnumberrequired

Weight in kg (minimum 100g)

shipping_addressobjectrequired

Delivery address

Show child attributes

Delivery address

namestringrequired
streetstringrequired
citystringrequired
statestring
postal_codestringrequired
countrystringrequired
gift_messagestring

Optional gift note (max 200 chars)

expeditedbooleanfalse

Expedited cold-chain shipping (recommended for soft cheeses in summer)

dry_runbooleanfalse

Preview order totals without placing it

Parameters

itemsArray<object>requiredargument

Cheeses to order

shipping_addressobjectrequiredargument

Delivery address

gift_messagestringargument

Optional gift note (max 200 chars)

expeditedbooleanfalseargument

Expedited cold-chain shipping (recommended for soft cheeses in summer)

dry_runbooleanfalseargument

Preview order totals without placing it

Returns

order_idstring
statusstringconfirmedpreview
itemsArray<object>
Show child attributes
cheese_idstring
namestring
quantity_kgnumber
unit_pricenumber
subtotalnumber
shipping_costnumber
totalnumber
estimated_deliverystring<date>
create_order
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "create_order",
    "arguments": {
        "items": [
          {
            "cheese_id": "string",
            "quantity_kg": 0.1
          }
        ],
        "shipping_address": {
          "name": "string",
          "street": "string",
          "city": "string",
          "state": "string",
          "postal_code": "string",
          "country": "string"
        },
        "gift_message": "string",
        "expedited": false,
        "dry_run": false
      }
  }
}
const result = await client.callTool("create_order", {
  "items": [
    {
      "cheese_id": "string",
      "quantity_kg": 0.1
    }
  ],
  "shipping_address": {
    "name": "string",
    "street": "string",
    "city": "string",
    "state": "string",
    "postal_code": "string",
    "country": "string"
  },
  "gift_message": "string",
  "expedited": false,
  "dry_run": false
});
result = await session.call_tool("create_order", arguments={
  "items": [
    {
      "cheese_id": "string",
      "quantity_kg": 0.1
    }
  ],
  "shipping_address": {
    "name": "string",
    "street": "string",
    "city": "string",
    "state": "string",
    "postal_code": "string",
    "country": "string"
  },
  "gift_message": "string",
  "expedited": false,
  "dry_run": false
})
Request Body
{
  "items": [
    {
      "cheese_id": "string",
      "quantity_kg": 0.1
    }
  ],
  "shipping_address": {
    "name": "string",
    "street": "string",
    "city": "string",
    "state": "string",
    "postal_code": "string",
    "country": "string"
  },
  "gift_message": "string",
  "expedited": false,
  "dry_run": false
}
Response
{
  "order_id": "string",
  "status": "confirmed",
  "items": [
    {
      "cheese_id": "string",
      "name": "string",
      "quantity_kg": 0,
      "unit_price": 0,
      "subtotal": 0
    }
  ],
  "shipping_cost": 0,
  "total": 0,
  "estimated_delivery": "2024-01-15"
}

get_order

read-onlyidempotent
TOOLget_order

Check the status of an existing order. Includes tracking info if shipped.

Parameters

order_idstringrequiredargument

Order ID

Returns

order_idstring
statusstringconfirmedprocessingshippeddeliveredcancelled
tracking_numberstring
tracking_urlstring
estimated_deliverystring<date>
itemsArray<object>
totalnumber
get_order
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "get_order",
    "arguments": {
        "order_id": "string"
      }
  }
}
const result = await client.callTool("get_order", {
  "order_id": "string"
});
result = await session.call_tool("get_order", arguments={
  "order_id": "string"
})
Response
{
  "order_id": "string",
  "status": "confirmed",
  "tracking_number": "string",
  "tracking_url": "string",
  "estimated_delivery": "2024-01-15",
  "items": [
    {}
  ],
  "total": 0
}

cancel_order

destructive
TOOLcancel_order

Cancel an order that hasn't shipped yet. Once the cheese is in the van, there's no going back.

Parameters

order_idstringrequiredargument

Order ID to cancel

reasonstringargument

Cancellation reason (optional)

Returns

Returns MCP content array (text, image, or embedded resource).

cancel_order
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "cancel_order",
    "arguments": {
        "order_id": "string",
        "reason": "string"
      }
  }
}
const result = await client.callTool("cancel_order", {
  "order_id": "string",
  "reason": "string"
});
result = await session.call_tool("cancel_order", arguments={
  "order_id": "string",
  "reason": "string"
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

subscribe_cheese_box

TOOLsubscribe_cheese_box

Subscribe to a monthly curated cheese box. Each month our cheesemongers select a themed collection. Past themes include "Alpine Adventure", "Stinky but Distinguished", and "Goat to Be Kidding Me".

Body

application/json
planstringexplorerconnoisseurfromagerrequired

Subscription tier: explorer (3 cheeses), connoisseur (5 cheeses), fromager (7 cheeses + wine pairing)

shipping_addressobjectrequired
Show child attributes
namestringrequired
streetstringrequired
citystringrequired
statestring
postal_codestringrequired
countrystringrequired
preferencesobject

Optional preference hints for curation

Show child attributes

Optional preference hints for curation

avoid_milk_typesArray<string>

Milk types to exclude (allergies, etc.)

intensitystringmildmediumstrongsurprise_me

Preferred flavour intensity

Parameters

planstringexplorerconnoisseurfromagerrequiredargument

Subscription tier: explorer (3 cheeses), connoisseur (5 cheeses), fromager (7 cheeses + wine pairing)

shipping_addressobjectrequiredargument
preferencesobjectargument

Optional preference hints for curation

Returns

Returns MCP content array (text, image, or embedded resource).

subscribe_cheese_box
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "subscribe_cheese_box",
    "arguments": {
        "plan": "explorer",
        "shipping_address": {
          "name": "string",
          "street": "string",
          "city": "string",
          "state": "string",
          "postal_code": "string",
          "country": "string"
        },
        "preferences": {
          "avoid_milk_types": [
            "string"
          ],
          "intensity": "mild"
        }
      }
  }
}
const result = await client.callTool("subscribe_cheese_box", {
  "plan": "explorer",
  "shipping_address": {
    "name": "string",
    "street": "string",
    "city": "string",
    "state": "string",
    "postal_code": "string",
    "country": "string"
  },
  "preferences": {
    "avoid_milk_types": [
      "string"
    ],
    "intensity": "mild"
  }
});
result = await session.call_tool("subscribe_cheese_box", arguments={
  "plan": "explorer",
  "shipping_address": {
    "name": "string",
    "street": "string",
    "city": "string",
    "state": "string",
    "postal_code": "string",
    "country": "string"
  },
  "preferences": {
    "avoid_milk_types": [
      "string"
    ],
    "intensity": "mild"
  }
})
Request Body
{
  "plan": "explorer",
  "shipping_address": {
    "name": "string",
    "street": "string",
    "city": "string",
    "state": "string",
    "postal_code": "string",
    "country": "string"
  },
  "preferences": {
    "avoid_milk_types": [
      "string"
    ],
    "intensity": "mild"
  }
}
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

Resources

Full Catalog

RESOURCEcheese://catalog

Complete cheese catalog with current prices and stock levels

Returns

Returns MCP content array (text, image, or embedded resource).

Full Catalog
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "cheese://catalog"
  }
}
const result = await client.readResource("cheese://catalog");
result = await session.read_resource("cheese://catalog")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

Cheese Regions

RESOURCEcheese://regions

Cheese-producing regions with descriptions and specialties

Returns

Returns MCP content array (text, image, or embedded resource).

Cheese Regions
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "cheese://regions"
  }
}
const result = await client.readResource("cheese://regions");
result = await session.read_resource("cheese://regions")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

Cheese Detail

RESOURCEcheese://catalog/{cheese_id}

Full details for a single cheese by ID

Parameters

cheese_idstringrequiredpath

Returns

Returns MCP content array (text, image, or embedded resource).

Cheese Detail
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "cheese://catalog/{cheese_id}"
  }
}
const result = await client.readResource("cheese://catalog/{cheese_id}");
result = await session.read_resource("cheese://catalog/{cheese_id}")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

Region Detail

RESOURCEcheese://regions/{region}

Cheeses and producers from a specific region

Parameters

regionstringrequiredpath

Returns

Returns MCP content array (text, image, or embedded resource).

Region Detail
{
  "jsonrpc": "2.0",
  "method": "resources/read",
  "params": {
    "uri": "cheese://regions/{region}"
  }
}
const result = await client.readResource("cheese://regions/{region}");
result = await session.read_resource("cheese://regions/{region}")
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

Prompts

cheese_board

PROMPTcheese_board

Design a cheese board for a specific occasion, guest count, and budget. Returns a curated selection with serving notes and wine pairings.

Parameters

occasionstringrequiredargument

What's the event? (e.g., dinner party, picnic, Tuesday)

guestsstringrequiredargument

Number of guests

budgetstringargument

Total budget in USD

Returns

Returns MCP content array (text, image, or embedded resource).

cheese_board
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "cheese_board",
    "arguments": {
        "occasion": "<occasion>",
        "guests": "<guests>",
        "budget": "<budget>"
      }
  }
}
const result = await client.getPrompt("cheese_board", {
  occasion: "<occasion>",
  guests: "<guests>",
  budget: "<budget>",
});
result = await session.get_prompt("cheese_board", arguments={
    "occasion": "<occasion>",
    "guests": "<guests>",
    "budget": "<budget>",
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}

pairing_guide

PROMPTpairing_guide

Get a wine and food pairing guide for a specific cheese or cheese style.

Parameters

cheesestringrequiredargument

Cheese name or style (e.g., "aged cheddar", "soft-ripened")

Returns

Returns MCP content array (text, image, or embedded resource).

pairing_guide
{
  "jsonrpc": "2.0",
  "method": "prompts/get",
  "params": {
    "name": "pairing_guide",
    "arguments": {
        "cheese": "<cheese>"
      }
  }
}
const result = await client.getPrompt("pairing_guide", {
  cheese: "<cheese>",
});
result = await session.get_prompt("pairing_guide", arguments={
    "cheese": "<cheese>",
})
Response
{
  "content": [
    {
      "type": "text",
      "text": "..."
    }
  ]
}