cheesestore
v2.0.0The 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.
Add to your MCP client configuration:
Tools
search_cheese
read-onlyidempotentSearch the cheese catalog by name, origin, milk type, or texture. Returns matching cheeses sorted by relevance.
Parameters
querystringrequiredargumentFree-text search (e.g., "nutty alpine cheese")
milk_typestringcowgoatsheepbuffalomixedargumentFilter by milk type
texturestringsoftsemi-softsemi-hardhardbluefreshargumentFilter by texture category
originstringargumentCountry or region of origin (e.g., "France", "Swiss Alps")
min_age_monthsintegerargumentMinimum aging period in months
max_pricenumberargumentMaximum price per kg in USD
limitinteger[1, 50]10argumentResults per page
Returns
cheesesArray<object>totalinteger{
"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
}){
"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-onlyidempotentGet full details for a specific cheese by ID. Includes tasting notes, pairings, nutritional info, and current stock levels.
Parameters
cheese_idstringrequiredargumentCheese ID
Returns
idstringnamestringoriginstringregionstringmilk_typestringtexturestringage_monthsintegerprice_per_kgnumberdescriptionstringtasting_notesstringpairingsobjectnutrition_per_100gobjectin_stockbooleanstock_quantity_kgnumber{
"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"
}){
"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-onlyGet personalized cheese recommendations based on preferences, occasion, or pairing needs.
Parameters
occasionstringargumentWhat's the cheese for? (e.g., "dinner party", "sandwich", "existential comfort")
preferencesstringargumentTaste preferences (e.g., "strong and funky", "mild and creamy")
pair_withstringargumentWine or food to pair with (e.g., "Pinot Noir", "sourdough")
budget_per_kgnumberargumentBudget in USD per kg
countinteger[1, 10]3argumentNumber of recommendations
Returns
recommendationsArray<object>{
"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
}){
"recommendations": [
{
"cheese_id": "string",
"name": "string",
"reason": "string",
"confidence": 0
}
]
}create_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
itemsArray<object>requiredCheeses to order
shipping_addressobjectrequiredDelivery address
gift_messagestringOptional gift note (max 200 chars)
expeditedbooleanfalseExpedited cold-chain shipping (recommended for soft cheeses in summer)
dry_runbooleanfalsePreview order totals without placing it
Parameters
itemsArray<object>requiredargumentCheeses to order
shipping_addressobjectrequiredargumentDelivery address
gift_messagestringargumentOptional gift note (max 200 chars)
expeditedbooleanfalseargumentExpedited cold-chain shipping (recommended for soft cheeses in summer)
dry_runbooleanfalseargumentPreview order totals without placing it
Returns
order_idstringstatusstringconfirmedpreviewitemsArray<object>shipping_costnumbertotalnumberestimated_deliverystring<date>{
"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
}){
"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
}{
"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-onlyidempotentCheck the status of an existing order. Includes tracking info if shipped.
Parameters
order_idstringrequiredargumentOrder ID
Returns
order_idstringstatusstringconfirmedprocessingshippeddeliveredcancelledtracking_numberstringtracking_urlstringestimated_deliverystring<date>itemsArray<object>totalnumber{
"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"
}){
"order_id": "string",
"status": "confirmed",
"tracking_number": "string",
"tracking_url": "string",
"estimated_delivery": "2024-01-15",
"items": [
{}
],
"total": 0
}cancel_order
destructiveCancel an order that hasn't shipped yet. Once the cheese is in the van, there's no going back.
Parameters
order_idstringrequiredargumentOrder ID to cancel
reasonstringargumentCancellation reason (optional)
Returns
Returns MCP content array (text, image, or embedded resource).
{
"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"
}){
"content": [
{
"type": "text",
"text": "..."
}
]
}subscribe_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
planstringexplorerconnoisseurfromagerrequiredSubscription tier: explorer (3 cheeses), connoisseur (5 cheeses), fromager (7 cheeses + wine pairing)
shipping_addressobjectrequiredpreferencesobjectOptional preference hints for curation
Parameters
planstringexplorerconnoisseurfromagerrequiredargumentSubscription tier: explorer (3 cheeses), connoisseur (5 cheeses), fromager (7 cheeses + wine pairing)
shipping_addressobjectrequiredargumentpreferencesobjectargumentOptional preference hints for curation
Returns
Returns MCP content array (text, image, or embedded resource).
{
"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"
}
}){
"plan": "explorer",
"shipping_address": {
"name": "string",
"street": "string",
"city": "string",
"state": "string",
"postal_code": "string",
"country": "string"
},
"preferences": {
"avoid_milk_types": [
"string"
],
"intensity": "mild"
}
}{
"content": [
{
"type": "text",
"text": "..."
}
]
}Resources
Full Catalog
Complete cheese catalog with current prices and stock levels
Returns
Returns MCP content array (text, image, or embedded resource).
{
"jsonrpc": "2.0",
"method": "resources/read",
"params": {
"uri": "cheese://catalog"
}
}const result = await client.readResource("cheese://catalog");result = await session.read_resource("cheese://catalog"){
"content": [
{
"type": "text",
"text": "..."
}
]
}Featured Cheeses
This week's featured selections, hand-picked by our cheesemonger
Returns
Returns MCP content array (text, image, or embedded resource).
{
"jsonrpc": "2.0",
"method": "resources/read",
"params": {
"uri": "cheese://featured"
}
}const result = await client.readResource("cheese://featured");result = await session.read_resource("cheese://featured"){
"content": [
{
"type": "text",
"text": "..."
}
]
}Cheese Regions
Cheese-producing regions with descriptions and specialties
Returns
Returns MCP content array (text, image, or embedded resource).
{
"jsonrpc": "2.0",
"method": "resources/read",
"params": {
"uri": "cheese://regions"
}
}const result = await client.readResource("cheese://regions");result = await session.read_resource("cheese://regions"){
"content": [
{
"type": "text",
"text": "..."
}
]
}Cheese Detail
Full details for a single cheese by ID
Parameters
cheese_idstringrequiredpathReturns
Returns MCP content array (text, image, or embedded resource).
{
"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}"){
"content": [
{
"type": "text",
"text": "..."
}
]
}Region Detail
Cheeses and producers from a specific region
Parameters
regionstringrequiredpathReturns
Returns MCP content array (text, image, or embedded resource).
{
"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}"){
"content": [
{
"type": "text",
"text": "..."
}
]
}Prompts
cheese_board
Design a cheese board for a specific occasion, guest count, and budget. Returns a curated selection with serving notes and wine pairings.
Parameters
occasionstringrequiredargumentWhat's the event? (e.g., dinner party, picnic, Tuesday)
guestsstringrequiredargumentNumber of guests
budgetstringargumentTotal budget in USD
Returns
Returns MCP content array (text, image, or embedded resource).
{
"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>",
}){
"content": [
{
"type": "text",
"text": "..."
}
]
}pairing_guide
Get a wine and food pairing guide for a specific cheese or cheese style.
Parameters
cheesestringrequiredargumentCheese name or style (e.g., "aged cheddar", "soft-ripened")
Returns
Returns MCP content array (text, image, or embedded resource).
{
"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>",
}){
"content": [
{
"type": "text",
"text": "..."
}
]
}