Order from local Danish shops: products, pickup times, card payment and AltID age verification.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Available pickup or delivery times for a shop on a date (default: the first date with times), the next dates with times, preparation time and upcoming closed days.
pickup or delivery
YYYY-MM-DD
The "shop" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp)
Available pickup or delivery times for a shop on a date (default: the first date with times), the next dates with times, preparation time and upcoming closed days.
| Argument | Type | Description |
|---|---|---|
| date | string | YYYY-MM-DD |
| shop | string | The "shop" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp) |
| fulfillment* | string | pickup or delivery |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"fulfillment"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD"
},
"shop": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The \"shop\" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp)"
},
"fulfillment": {
"enum": [
"pickup",
"delivery"
],
"type": "string",
"description": "pickup or delivery"
}
}
}Find Lenius takeaway restaurants and shops in a Danish city or postal code. Optional: what the customer wants (query, e.g. "pizza"), pickup or delivery, and a date/time to check availability (returns the nearest available times).
| Argument | Type | Description |
|---|---|---|
| city | string | City, e.g. "Frederikshavn" |
| date | string | YYYY-MM-DD, default today (Danish time) |
| time | string | HH:MM, e.g. "19:00" |
| query | string | What to eat or buy, e.g. "pizza" or "sushi", or the shop's name |
| fulfillment | string | pickup or delivery |
| postal_code | string | Danish postal code, e.g. "9900" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"city": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "City, e.g. \"Frederikshavn\""
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD, default today (Danish time)"
},
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "HH:MM, e.g. \"19:00\""
},
"query": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "What to eat or buy, e.g. \"pizza\" or \"sushi\", or the shop's name"
},
"fulfillment": {
"enum": [
"pickup",
"delivery"
],
"type": "string",
"description": "pickup or delivery"
},
"postal_code": {
"type": "string",
"maxLength": 10,
"minLength": 3,
"description": "Danish postal code, e.g. \"9900\""
}
}
}Status of an age check: pending, approved (pass age_check_id to place_order), failed, expired or revoked. wait_seconds (max 25) waits while pending. While pending, the card shows the AltID QR code again.
| Argument | Type | Description |
|---|---|---|
| age_check_id* | string | |
| wait_seconds | integer | Wait up to this many seconds while pending |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"age_check_id"
],
"properties": {
"age_check_id": {
"type": "string",
"maxLength": 64,
"minLength": 1
},
"wait_seconds": {
"type": "integer",
"maximum": 25,
"minimum": 0,
"description": "Wait up to this many seconds while pending"
}
}
}The menu of a shop from find_shops: categories and products with prices in DKK (incl. VAT) and whether they are available. A product with a unit is priced per unit (pcs, portion, pack, kg, g, l, cl, ml, m = metre). Also weight in grams, preparation time in minutes (orders for it need at least that much notice) and the main image when set. Optional query to only get matching products.
| Argument | Type | Description |
|---|---|---|
| shop | string | The "shop" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp) |
| query | string | Only products matching this, e.g. "pizza" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"shop": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The \"shop\" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp)"
},
"query": {
"type": "string",
"maxLength": 80,
"minLength": 2,
"description": "Only products matching this, e.g. \"pizza\""
}
}
}Status of an order from place_order: awaiting_payment, awaiting_shop_approval, approved, in_kitchen, ready, out_for_delivery, completed, cancelled or rejected (and any delay).
| Argument | Type | Description |
|---|---|---|
| shop | string | The "shop" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp) |
| order_id* | string | order_id from place_order |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"order_id"
],
"properties": {
"shop": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The \"shop\" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp)"
},
"order_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "order_id from place_order"
}
}
}Place the order with the shop (like the checkout). Only after the customer confirmed the quoted order and accepted the terms (terms_url). Paid by card in advance on the shop's order page: returns the order number and order_url (with "Betal nu"; the shop gets the order when paid). The customer gets a confirmation e-mail when paid. With products with an age limit and no approved age_check_id, nothing is ordered: returns status age_check_required with the AltID card; call again with age_check_id when the age is confirmed.
| Argument | Type | Description |
|---|---|---|
| date* | string | YYYY-MM-DD (from available_times) |
| shop | string | The "shop" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp) |
| time* | string | HH:MM (from available_times) |
| items* | array | |
| address | object | Required for delivery |
| comment | string | A note for the shop, e.g. "no onions" |
| customer* | object | |
| fulfillment* | string |
Price an order exactly like the shop checkout (lines, fees, discounts, total in DKK incl. VAT), check that the time, products, minimum order and delivery address are OK, and tell how it is paid. Nothing is saved. Shows a card with the products (with their images), fees and total so the customer can see what they are ordering; show the result to the customer before place_order.
| Argument | Type | Description |
|---|---|---|
| date* | string | YYYY-MM-DD (from available_times) |
| shop | string | The "shop" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp) |
| time* | string | HH:MM (from available_times) |
| items* | array | |
| address | object | Required for delivery |
| fulfillment* | string | |
| other_stops | array | The other orders you are placing for the customer in this conversation (other shops, same day): used only to warn when they are too far apart in time (trip_warnings). Nothing is looked up about the customer. |
Only when the customer orders products with an age limit from several shops: start one age check with AltID with the highest age limit across all the orders (min_age from get_menu/quote_order) and reuse the age_check_id in every place_order (valid 30 minutes after approval, at any shop). With an order from one shop, call place_order instead: it shows the AltID card itself. Shows the AltID card (QR code / "Åbn AltID app") that updates by itself. Never make your own QR code.
| Argument | Type | Description |
|---|---|---|
| min_age* | integer | The age to confirm, e.g. 18 |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"min_age"
],
"properties": {
"min_age": {
"type": "integer",
"maximum": 120,
"minimum": 1,
"description": "The age to confirm, e.g. 18"
}
}
}| other_stops | array | The other orders you are placing for the customer in this conversation (other shops, same day): used only to warn when they are too far apart in time (trip_warnings). Nothing is looked up about the customer. |
| age_check_id | string | Products with an age limit: the approved age check (from start_age_check or the age_check_required card); one age check can be reused for 30 minutes across shops |
| accepted_terms* | boolean | true when the customer has accepted the shop's terms (terms_url) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"fulfillment",
"date",
"time",
"items",
"customer",
"accepted_terms"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD (from available_times)"
},
"shop": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The \"shop\" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp)"
},
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "HH:MM (from available_times)"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"product_id",
"quantity"
],
"properties": {
"options": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"option_id",
"choice_id"
],
"properties": {
"choice_id": {
"type": "string",
"maxLength": 32,
"minLength": 1,
"description": "choice_id from get_menu"
},
"option_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"option_id",
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 500,
"description": "The customer's own words, e.g. \"uden løg\""
},
"option_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"option_id",
"choices"
],
"properties": {
"choices": {
"type": "array",
"items": {
"type": "object",
"required": [
"choice_id",
"quantity"
],
"properties": {
"quantity": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "1 unless the option has quantities"
},
"choice_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
},
"maxItems": 100,
"description": "choose_many: the chosen choices; the total must be between min_total and max_total"
},
"option_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
}
]
},
"maxItems": 20,
"description": "Answers to the product's options from get_menu (option_id + choice_id, option_id + text, or option_id + choices for choose_many). Required options must be answered; ask the customer, never pick for them."
},
"quantity": {
"type": "integer",
"maximum": 99,
"minimum": 1
},
"product_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Product id from get_menu"
}
}
},
"maxItems": 50,
"minItems": 1
},
"address": {
"type": "object",
"required": [
"street",
"postal_code",
"city"
],
"properties": {
"city": {
"type": "string",
"maxLength": 60,
"minLength": 2
},
"street": {
"type": "string",
"maxLength": 120,
"minLength": 2,
"description": "Street and number"
},
"postal_code": {
"type": "string",
"maxLength": 10,
"minLength": 3
}
},
"description": "Required for delivery"
},
"comment": {
"type": "string",
"maxLength": 500,
"description": "A note for the shop, e.g. \"no onions\""
},
"customer": {
"type": "object",
"required": [
"name",
"email",
"phone"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"minLength": 2
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 200
},
"phone": {
"type": "string",
"maxLength": 20,
"minLength": 8,
"description": "Danish phone number, e.g. \"12 34 56 78\""
}
}
},
"fulfillment": {
"enum": [
"pickup",
"delivery"
],
"type": "string"
},
"other_stops": {
"type": "array",
"items": {
"type": "object",
"required": [
"shop",
"fulfillment",
"date",
"time"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"shop": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The \"shop\" value from find_shops"
},
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"address": {
"type": "object",
"required": [
"street",
"postal_code",
"city"
],
"properties": {
"city": {
"type": "string",
"maxLength": 60,
"minLength": 2
},
"street": {
"type": "string",
"maxLength": 120,
"minLength": 2,
"description": "Street and number"
},
"postal_code": {
"type": "string",
"maxLength": 10,
"minLength": 3
}
},
"description": "Required for delivery"
},
"fulfillment": {
"enum": [
"pickup",
"delivery"
],
"type": "string"
}
}
},
"maxItems": 10,
"description": "The other orders you are placing for the customer in this conversation (other shops, same day): used only to warn when they are too far apart in time (trip_warnings). Nothing is looked up about the customer."
},
"age_check_id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Products with an age limit: the approved age check (from start_age_check or the age_check_required card); one age check can be reused for 30 minutes across shops"
},
"accepted_terms": {
"type": "boolean",
"description": "true when the customer has accepted the shop's terms (terms_url)"
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"fulfillment",
"date",
"time",
"items"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "YYYY-MM-DD (from available_times)"
},
"shop": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The \"shop\" value from find_shops (not needed on a shop's own address <shop>.lenius.app/mcp)"
},
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
"description": "HH:MM (from available_times)"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"product_id",
"quantity"
],
"properties": {
"options": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"option_id",
"choice_id"
],
"properties": {
"choice_id": {
"type": "string",
"maxLength": 32,
"minLength": 1,
"description": "choice_id from get_menu"
},
"option_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"option_id",
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 500,
"description": "The customer's own words, e.g. \"uden løg\""
},
"option_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"option_id",
"choices"
],
"properties": {
"choices": {
"type": "array",
"items": {
"type": "object",
"required": [
"choice_id",
"quantity"
],
"properties": {
"quantity": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "1 unless the option has quantities"
},
"choice_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
},
"maxItems": 100,
"description": "choose_many: the chosen choices; the total must be between min_total and max_total"
},
"option_id": {
"type": "string",
"maxLength": 32,
"minLength": 1
}
},
"additionalProperties": false
}
]
},
"maxItems": 20,
"description": "Answers to the product's options from get_menu (option_id + choice_id, option_id + text, or option_id + choices for choose_many). Required options must be answered; ask the customer, never pick for them."
},
"quantity": {
"type": "integer",
"maximum": 99,
"minimum": 1
},
"product_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Product id from get_menu"
}
}
},
"maxItems": 50,
"minItems": 1
},
"address": {
"type": "object",
"required": [
"street",
"postal_code",
"city"
],
"properties": {
"city": {
"type": "string",
"maxLength": 60,
"minLength": 2
},
"street": {
"type": "string",
"maxLength": 120,
"minLength": 2,
"description": "Street and number"
},
"postal_code": {
"type": "string",
"maxLength": 10,
"minLength": 3
}
},
"description": "Required for delivery"
},
"fulfillment": {
"enum": [
"pickup",
"delivery"
],
"type": "string"
},
"other_stops": {
"type": "array",
"items": {
"type": "object",
"required": [
"shop",
"fulfillment",
"date",
"time"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"shop": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The \"shop\" value from find_shops"
},
"time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"address": {
"type": "object",
"required": [
"street",
"postal_code",
"city"
],
"properties": {
"city": {
"type": "string",
"maxLength": 60,
"minLength": 2
},
"street": {
"type": "string",
"maxLength": 120,
"minLength": 2,
"description": "Street and number"
},
"postal_code": {
"type": "string",
"maxLength": 10,
"minLength": 3
}
},
"description": "Required for delivery"
},
"fulfillment": {
"enum": [
"pickup",
"delivery"
],
"type": "string"
}
}
},
"maxItems": 10,
"description": "The other orders you are placing for the customer in this conversation (other shops, same day): used only to warn when they are too far apart in time (trip_warnings). Nothing is looked up about the customer."
}
}
}