Stovefront
Find US home kitchens on Stovefront, read their menus and pickup times, and build order links.
使うべきか
品質と安全性
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"stovefront": {
"url": "https://app.stovefront.com/mcp"
}
}
}リモートエンドポイント
https://app.stovefront.com/mcpstreamable-httpできること
ツール一覧
ツール(4)
🟢search_kitchens(query, dietary, pickup_date, pickup_from, pickup_to, ...)
Finds published Stovefront kitchens and the dishes they have open for ordering. Matches words against kitchen names, dish names and categories, and can filter by dietary tags, pickup date and the area a kitchen serves. Returns each kitchen's name, storefront link, short description, service area and up to 8 matching dishes with price, dietary tags, stock and next pickup. Sample storefronts and kitchens hidden from search are not included.
入力スキーマ
{
"type": "object",
"properties": {
"query": {
"description": "Words to match in kitchen names, dish names and categories, e.g. \"tamales\"",
"type": "string",
"maxLength": 200
},
"dietary": {
"description": "Every dish returned has all of these tags",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"enum": [
"vegan",
"vegetarian",
"glutenFree",
"dairyFree",
"eggFree",
"nutFree",
"soyFree",
"paleo",
"spicy",
"containsNuts"
]
}
},
"pickup_date": {
"description": "Only dishes that can be picked up or delivered on this kitchen-local date",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"pickup_from": {
"description": "Start of a date range (use with pickup_to, at most 31 days)",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"pickup_to": {
"description": "End of a date range, inclusive",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"area": {
"description": "City or neighborhood, matched against the area each kitchen says it serves",
"type": "string",
"maxLength": 100
},
"limit": {
"description": "Kitchens per page, default 10",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"cursor": {
"description": "nextCursor from the previous page",
"type": "string",
"maxLength": 12
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kitchen": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Pass as `kitchen` to the other tools"
},
"name": {
"type": "string"
},
"url": {
"type": "string",
"description": "The kitchen's own storefront"
},
"description": {
"type": [
"string",
"null"
]
},
"area": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"serviceArea": {
"description": "Neighborhoods or towns the kitchen serves, as the cook wrote it",
"type": [
"string",
"null"
]
}
},
"required": [
"city",
"region",
"serviceArea"
],
"additionalProperties": false
},
"timezone": {
"type": "string"
}
},
"required": [
"slug",
"name",
"url",
"description",
"area",
"timezone"
],
"additionalProperties": false
},
"orderableNow": {
"type": "boolean"
},
"orderableDishCount": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"matchingDishCount": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"matchingDishes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Pass as dish_id to build_order_link"
},
"kind": {
"type": "string",
"enum": [
"dish",
"package"
]
},
"name": {
"type": "string"
},
"category": {
"type": [
"string",
"null"
]
},
"price": {
"description": "US dollars",
"type": [
"number",
"null"
]
},
"priceCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"currency": {
"type": "string",
"const": "USD"
},
"dietary": {
"type": "array",
"items": {
"type": "string",
"enum": [
"vegan",
"vegetarian",
"glutenFree",
"dairyFree",
"eggFree",
"nutFree",
"soyFree",
"paleo",
"spicy",
"containsNuts"
]
}
},
"stock": {
"type": "object",
"properties": {
"left": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Units left; null when the cook does not show a count or sells without a limit"
},
"low": {
"type": "boolean",
"description": "True when 10 or fewer are left"
}
},
"required": [
"left",
"low"
],
"additionalProperties": false
},
"orderCutoffAt": {
"type": [
"string",
"null"
]
},
"nextPickup": {
"anyOf": [
{
"type": "object",
"properties": {
"slotId": {
"description": "Scheduled time id (scheduled-slot kitchens); null for fixed weekly pickup",
"type": [
"string",
"null"
]
},
"method": {
"type": "string",
"enum": [
"pickup",
"delivery"
]
},
"date": {
"description": "Kitchen-local date, YYYY-MM-DD",
"type": [
"string",
"null"
]
},
"startAt": {
"description": "RFC 3339 with the kitchen's UTC offset",
"type": [
"string",
"null"
]
},
"endAt": {
"type": [
"string",
"null"
]
},
"orderCutoffAt": {
"description": "Last moment to order for this time",
"type": [
"string",
"null"
]
},
"place": {
"description": "Pickup place name; never a street address",
"type": [
"string",
"null"
]
},
"deliveryFeeCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"minimumOrderCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"slotId",
"method",
"date",
"startAt",
"endAt",
"orderCutoffAt",
"place",
"deliveryFeeCents",
"minimumOrderCents"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"url": {
"description": "Link to this dish on the kitchen's storefront",
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"kind",
"name",
"category",
"price",
"priceCents",
"currency",
"dietary",
"stock",
"orderCutoffAt",
"nextPickup",
"url"
],
"additionalProperties": false
}
}
},
"required": [
"kitchen",
"orderableNow",
"orderableDishCount",
"matchingDishCount",
"matchingDishes"
],
"additionalProperties": false
}
},
"nextCursor": {
"description": "Pass as cursor for the next page; null when there are no more",
"type": [
"string",
"null"
]
},
"currency": {
"type": "string",
"const": "USD"
},
"orderModel": {
"type": "string",
"const": "request_then_confirm"
},
"orderModelNote": {
"type": "string"
}
},
"required": [
"results",
"nextCursor",
"currency",
"orderModel",
"orderModelNote"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_menu(kitchen, week, include_unavailable)
Returns one kitchen's menu: the dishes and meal packages that can be ordered now, with price, dietary tags, allergen notes, stock, order cutoff, next pickup or delivery time, quantity rules and any required options. Also returns the payment methods the kitchen accepts and its order model (orders are requests the cook confirms).
入力スキーマ
{
"type": "object",
"properties": {
"kitchen": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Kitchen slug or storefront link, e.g. \"stephanie-s-bite-of-heaven\" or \"https://app.stovefront.com/<slug>\""
},
"week": {
"description": "Only this menu week (its Monday, YYYY-MM-DD, as listed in weeks)",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"include_unavailable": {
"description": "Also list sold-out and closed offers, with the reason. Default false",
"type": "boolean"
}
},
"required": [
"kitchen"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"kitchen": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Pass as `kitchen` to the other tools"
},
"name": {
"type": "string"
},
"url": {
"type": "string",
"description": "The kitchen's own storefront"
},
"description": {
"type": [
"string",
"null"
]
},
"area": {
"type": "object",
"properties": {
"city": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"serviceArea": {
"description": "Neighborhoods or towns the kitchen serves, as the cook wrote it",
"type": [
"string",
"null"
]
}
},
"required": [
"city",
"region",
"serviceArea"
],
"additionalProperties": false
},
"timezone": {
"type": "string"
},
"sample": {
"type": "boolean",
"description": "True for a sample storefront that takes no orders"
}
},
"required": [
"slug",
"name",
"url",
"description",
"area",
"timezone",
"sample"
],
"additionalProperties": false
},
"orderModel": {
"type": "string",
"const": "request_then_confirm"
},
"orderModelNote": {
"type": "string"
},
"currency": {
"type": "string",
"const": "USD"
},
"fulfillmentModel": {
"type": "string",
"enum": [
"scheduled_slots",
"weekly_pickup"
]
},
"paymentMethods": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"id",
"label"
],
"additionalProperties": false
}
},
"weeks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weekId": {
"type": "string"
},
"label": {
"type": [
"string",
"null"
]
},
"orderableOfferCount": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"weekId",
"label",
"orderableOfferCount"
],
"additionalProperties": false
},
"description": "Menu weeks with something open for ordering; pass one as week to narrow the list"
},
"offerCount": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Offers matching the request; offers may list fewer"
},
"offers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Pass as dish_id to build_order_link"
},
"kind": {
"type": "string",
"enum": [
"dish",
"package"
]
},
"name": {
"type": "string"
},
"category": {
"type": [
"string",
"null"
]
},
"price": {
"description": "US dollars",
"type": [
"number",
"null"
]
},
"priceCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"currency": {
"type": "string",
"const": "USD"
},
"dietary": {
"type": "array",
"items": {
"type": "string",
"enum": [
"vegan",
"vegetarian",
"glutenFree",
"dairyFree",
"eggFree",
"nutFree",
"soyFree",
"paleo",
"spicy",
"containsNuts"
]
}
},
"stock": {
"type": "object",
"properties": {
"left": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Units left; null when the cook does not show a count or sells without a limit"
},
"low": {
"type": "boolean",
"description": "True when 10 or fewer are left"
}
},
"required": [
"left",
"low"
],
"additionalProperties": false
},
"orderCutoffAt": {
"type": [
"string",
"null"
]
},
"nextPickup": {
"anyOf": [
{
"type": "object",
"properties": {
"slotId": {
"description": "Scheduled time id (scheduled-slot kitchens); null for fixed weekly pickup",
"type": [
"string",
"null"
]
},
"method": {
"type": "string",
"enum": [
"pickup",
"delivery"
]
},
"date": {
"description": "Kitchen-local date, YYYY-MM-DD",
"type": [
"string",
"null"
]
},
"startAt": {
"description": "RFC 3339 with the kitchen's UTC offset",
"type": [
"string",
"null"
]
},
"endAt": {
"type": [
"string",
"null"
]
},
"orderCutoffAt": {
"description": "Last moment to order for this time",
"type": [
"string",
"null"
]
},
"place": {
"description": "Pickup place name; never a street address",
"type": [
"string",
"null"
]
},
"deliveryFeeCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"minimumOrderCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"slotId",
"method",
"date",
"startAt",
"endAt",
"orderCutoffAt",
"place",
"deliveryFeeCents",
"minimumOrderCents"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"url": {
"description": "Link to this dish on the kitchen's storefront",
"type": [
"string",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"weekId": {
"type": [
"string",
"null"
]
},
"allergens": {
"type": "object",
"properties": {
"contains": {
"type": [
"string",
"null"
]
},
"mayContain": {
"type": [
"string",
"null"
]
}
},
"required": [
"contains",
"mayContain"
],
"additionalProperties": false
},
"servings": {
"type": [
"string",
"null"
]
},
"orderable": {
"type": "boolean"
},
"unavailableReason": {
"anyOf": [
{
"type": "string",
"enum": [
"menu_closed",
"not_offered",
"sold_out",
"past_cutoff",
"no_pickup_time"
]
},
{
"type": "null"
}
]
},
"quantity": {
"type": "object",
"properties": {
"minimum": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"increment": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"maximumPerCustomer": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"minimum",
"increment",
"maximumPerCustomer"
],
"additionalProperties": false
},
"requiredChoices": {
"type": "array",
"items": {
"type": "string"
},
"description": "Option groups the customer must choose on the storefront"
},
"includes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"quantity": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"name",
"quantity"
],
"additionalProperties": false
},
"description": "Dishes in a meal package"
}
},
"required": [
"id",
"kind",
"name",
"category",
"price",
"priceCents",
"currency",
"dietary",
"stock",
"orderCutoffAt",
"nextPickup",
"url",
"description",
"weekId",
"allergens",
"servings",
"orderable",
"unavailableReason",
"quantity",
"requiredChoices",
"includes"
],
"additionalProperties": false
}
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"kitchen",
"orderModel",
"orderModelNote",
"currency",
"fulfillmentModel",
"paymentMethods",
"weeks",
"offerCount",
"offers",
"notes"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_pickup_windows(kitchen)
Returns a kitchen's upcoming pickup and delivery times that are open for ordering, each with its order cutoff and the pickup place name. Kitchens with scheduled times list each slot; kitchens with weekly pickup list each pickup time and the dishes it serves. Street addresses are never included.
入力スキーマ
{
"type": "object",
"properties": {
"kitchen": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Kitchen slug or storefront link, e.g. \"stephanie-s-bite-of-heaven\" or \"https://app.stovefront.com/<slug>\""
}
},
"required": [
"kitchen"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"kitchen": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": "string"
},
"url": {
"type": "string"
},
"timezone": {
"type": "string"
},
"sample": {
"type": "boolean"
}
},
"required": [
"slug",
"name",
"url",
"timezone",
"sample"
],
"additionalProperties": false
},
"model": {
"type": "string",
"enum": [
"scheduled_slots",
"weekly_pickup"
]
},
"windows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slotId": {
"description": "Scheduled time id (scheduled-slot kitchens); null for fixed weekly pickup",
"type": [
"string",
"null"
]
},
"method": {
"type": "string",
"enum": [
"pickup",
"delivery"
]
},
"date": {
"description": "Kitchen-local date, YYYY-MM-DD",
"type": [
"string",
"null"
]
},
"startAt": {
"description": "RFC 3339 with the kitchen's UTC offset",
"type": [
"string",
"null"
]
},
"endAt": {
"type": [
"string",
"null"
]
},
"orderCutoffAt": {
"description": "Last moment to order for this time",
"type": [
"string",
"null"
]
},
"place": {
"description": "Pickup place name; never a street address",
"type": [
"string",
"null"
]
},
"deliveryFeeCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"minimumOrderCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"dishIds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
]
}
},
"required": [
"slotId",
"method",
"date",
"startAt",
"endAt",
"orderCutoffAt",
"place",
"deliveryFeeCents",
"minimumOrderCents",
"dishIds"
],
"additionalProperties": false
}
},
"delivery": {
"anyOf": [
{
"type": "object",
"properties": {
"offered": {
"type": "boolean"
},
"feeCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"dates": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"offered",
"feeCents",
"dates"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Weekly-pickup kitchens: whether the cook delivers. Scheduled-slot kitchens list delivery times in windows."
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"kitchen",
"model",
"windows",
"delivery",
"notes"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢build_order_link(kitchen, items)
Checks that the given dishes can be ordered now in those quantities (stock, cutoff, quantity rules, one shared pickup time) and returns a link to the kitchen's own storefront with them already in the cart. It does not place an order or take payment: the customer reviews and submits the order request on the storefront, and the cook confirms it.
入力スキーマ
{
"type": "object",
"properties": {
"kitchen": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Kitchen slug or storefront link, e.g. \"stephanie-s-bite-of-heaven\" or \"https://app.stovefront.com/<slug>\""
},
"items": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"dish_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "An offer id from get_menu or search_kitchens"
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 99
}
},
"required": [
"dish_id",
"quantity"
],
"additionalProperties": false
}
}
},
"required": [
"kitchen",
"items"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The kitchen's storefront with these items in the cart"
},
"kitchen": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"name": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"name",
"url"
],
"additionalProperties": false
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"dish_id": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"dish",
"package"
]
},
"name": {
"type": "string"
},
"quantity": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"unitPriceCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"lineTotalCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"dish_id",
"kind",
"name",
"quantity",
"unitPriceCents",
"lineTotalCents"
],
"additionalProperties": false
}
},
"estimatedSubtotalCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Before any delivery fee"
},
"currency": {
"type": "string",
"const": "USD"
},
"pickup": {
"anyOf": [
{
"type": "object",
"properties": {
"slotId": {
"description": "Scheduled time id (scheduled-slot kitchens); null for fixed weekly pickup",
"type": [
"string",
"null"
]
},
"method": {
"type": "string",
"enum": [
"pickup",
"delivery"
]
},
"date": {
"description": "Kitchen-local date, YYYY-MM-DD",
"type": [
"string",
"null"
]
},
"startAt": {
"description": "RFC 3339 with the kitchen's UTC offset",
"type": [
"string",
"null"
]
},
"endAt": {
"type": [
"string",
"null"
]
},
"orderCutoffAt": {
"description": "Last moment to order for this time",
"type": [
"string",
"null"
]
},
"place": {
"description": "Pickup place name; never a street address",
"type": [
"string",
"null"
]
},
"deliveryFeeCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"minimumOrderCents": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
}
},
"required": [
"slotId",
"method",
"date",
"startAt",
"endAt",
"orderCutoffAt",
"place",
"deliveryFeeCents",
"minimumOrderCents"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"orderModel": {
"type": "string",
"const": "request_then_confirm"
},
"instruction": {
"type": "string"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"url",
"kitchen",
"items",
"estimatedSubtotalCents",
"currency",
"pickup",
"orderModel",
"instruction",
"notes"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}コミュニティ
エビデンス