What this MCP does
Searches Kapruka products, checks delivery, creates guest orders with payment links, and tracks order fulfillment.
Tools
Input schema
{'type': 'object', '$defs': {'CheckDeliveryInput': {'type': 'object', 'title': 'CheckDeliveryInput', 'required': ['city'], 'properties': {'city': {'type': 'string', 'title': 'City', 'maxLength': 100, 'minLength': 2, 'description': "Canonical city name (use kapruka_list_delivery_cities to find one). Examples: 'Colombo 03', 'Anuradhapura', 'Galle'."}, 'product_id': {'anyOf': [{'type': 'string', 'maxLength': 80}, {'type': 'null'}], 'title': 'Product Id', 'default': None, 'description': "Product ID to check the city AGAINST THAT ITEM'S delivery scope. Food, hotel cakes and liquor only reach selected cities â\x80\x94 always pass this when a customer names a product and a city, and only promise delivery if `available` is true. Also adds a freshness warning for perishable codes (cake/flower/combo) when the date is >1 day out."}, 'delivery_date': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Delivery Date', 'default': None, 'description': 'Target delivery date in ISO format (YYYY-MM-DD), Sri Lanka time. Omit to check today.'}, 'response_format': {'type': 'string', 'title': 'Response Format', 'default': 'markdown', 'description': "'markdown' (default) or 'json'"}}, 'additionalProperties': False}}, 'title': 'kapruka_check_deliveryArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/CheckDeliveryInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_check_deliveryOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'Sender': {'type': 'object', 'title': 'Sender', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'Name', 'maxLength': 80, 'minLength': 1, 'description': 'Sender name on the gift card.'}, 'anonymous': {'type': 'boolean', 'title': 'Anonymous', 'default': False, 'description': "If true, gift card shows 'Anonymous' instead of the sender name."}}, 'additionalProperties': False}, 'CartItem': {'type': 'object', 'title': 'CartItem', 'properties': {'phone': {'anyOf': [{'type': 'string', 'maxLength': 30, 'minLength': 7}, {'type': 'null'}], 'title': 'Phone', 'default': None, 'description': 'The customer.phone the custom cake request was made with (custom cake lines only).'}, 'quantity': {'anyOf': [{'type': 'integer', 'maximum': 99, 'minimum': 1}, {'type': 'null'}], 'title': 'Quantity', 'default': None, 'description': 'Quantity (1â\x80\x9399, default 1). Catalogue lines only.'}, 'icing_text': {'anyOf': [{'type': 'string', 'maxLength': 120}, {'type': 'null'}], 'title': 'Icing Text', 'default': None, 'description': 'Cake icing text. Silently ignored for non-cake products. Catalogue lines only.'}, 'product_id': {'anyOf': [{'type': 'string', 'maxLength': 80, 'minLength': 3}, {'type': 'null'}], 'title': 'Product Id', 'default': None, 'description': "Kapruka product ID (e.g. 'cakeXX000000'). Catalogue line."}, 'custom_cake_request_id': {'anyOf': [{'type': 'string', 'maxLength': 80, 'minLength': 6}, {'type': 'null'}], 'title': 'Custom Cake Request Id', 'default': None, 'description': "request_id of a custom cake that kapruka_custom_cake_status reports as 'quoted'. Orders the staff-quoted cake (quantity 1). Requires `phone`."}}, 'description': 'One cart line â\x80\x94 EITHER a catalogue product OR a quoted custom cake.\n\nCatalogue line: {"product_id": "...", "quantity": 1, "icing_text": "..."}\nCustom cake line: {"custom_cake_request_id": "...", "phone": "+9477..."}\nThe custom cake line is turned into the staff-quoted cake server-side\n(name, picture, price); quantity is always 1 and no price is ever sent.', 'additionalProperties': False}, 'Delivery': {'type': 'object', 'title': 'Delivery', 'required': ['address', 'city', 'date'], 'properties': {'city': {'type': 'string', 'title': 'City', 'maxLength': 100, 'minLength': 2, 'description': 'Must be a Kapruka delivery city (canonical name from kapruka_list_delivery_cities) that EVERY cart item can reach. The order ships as one shipment, so food / hotel cake / liquor items restrict the whole cart to their city set â\x80\x94 verify with kapruka_check_delivery(city, product_id) first; otherwise the order is rejected with city_not_deliverable_for_item.'}, 'date': {'type': 'string', 'title': 'Date', 'description': 'Delivery date in YYYY-MM-DD (Asia/Colombo). Must be today or future.'}, 'address': {'type': 'string', 'title': 'Address', 'maxLength': 250, 'minLength': 3, 'description': 'Street address.'}, 'instructions': {'anyOf': [{'type': 'string', 'maxLength': 250}, {'type': 'null'}], 'title': 'Instructions', 'default': None, 'description': 'Free-form delivery instructions.'}, 'location_type': {'type': 'string', 'title': 'Location Type', 'default': 'house', 'description': 'One of: house, apartment, office, other.'}}, 'additionalProperties': False}, 'Recipient': {'type': 'object', 'title': 'Recipient', 'required': ['name', 'phone'], 'properties': {'name': {'type': 'string', 'title': 'Name', 'maxLength': 80, 'minLength': 1, 'description': 'Recipient name shown on the order.'}, 'phone': {'type': 'string', 'title': 'Phone', 'maxLength': 30, 'minLength': 7, 'description': 'Recipient phone â\x80\x94 E.164 (+9477â\x80¦) or local SL (077â\x80¦) format.'}}, 'additionalProperties': False}, 'CreateOrderInput': {'type': 'object', 'title': 'CreateOrderInput', 'required': ['cart', 'recipient', 'delivery', 'sender'], 'properties': {'cart': {'type': 'array', 'items': {'$ref': '#/$defs/CartItem'}, 'title': 'Cart', 'maxItems': 30, 'minItems': 1, 'description': '1â\x80\x9330 items.'}, 'sender': {'$ref': '#/$defs/Sender'}, 'currency': {'type': 'string', 'title': 'Currency', 'default': 'LKR', 'description': 'Pricing currency. Supported: LKR, USD, GBP, AUD, EUR.'}, 'delivery': {'$ref': '#/$defs/Delivery'}, 'recipient': {'$ref': '#/$defs/Recipient'}, 'gift_message': {'anyOf': [{'type': 'string', 'maxLength': 300}, {'type': 'null'}], 'title': 'Gift Message', 'default': None, 'description': 'Optional gift card message.'}, 'response_format': {'type': 'string', 'title': 'Response Format', 'default': 'markdown', 'description': "'markdown' (default) or 'json'."}}, 'additionalProperties': False}}, 'title': 'kapruka_create_orderArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/CreateOrderInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_create_orderOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'GetProductInput': {'type': 'object', 'title': 'GetProductInput', 'required': ['product_id'], 'properties': {'type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Type', 'default': None, 'description': "Optional product type hint passed to the API (e.g. 'specialgifts'). Rarely needed."}, 'currency': {'type': 'string', 'title': 'Currency', 'default': 'LKR', 'description': 'Price currency. Supported: LKR, USD, GBP, AUD, EUR'}, 'product_id': {'type': 'string', 'title': 'Product Id', 'maxLength': 80, 'minLength': 3, 'description': "Kapruka product ID (e.g. 'cakeXX000000', 'EF_PC_CHOC0V2774P00065')"}, 'response_format': {'type': 'string', 'title': 'Response Format', 'default': 'markdown', 'description': "'markdown' for human-readable output, 'json' for raw structured data."}}, 'additionalProperties': False}}, 'title': 'kapruka_get_productArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/GetProductInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_get_productOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'ListCategoriesInput': {'type': 'object', 'title': 'ListCategoriesInput', 'properties': {'depth': {'type': 'integer', 'title': 'Depth', 'default': 1, 'maximum': 2, 'minimum': 1, 'description': 'How many levels of sub-categories to include (1 or 2). Default 1.'}, 'response_format': {'type': 'string', 'title': 'Response Format', 'default': 'markdown', 'description': "'markdown' for human-readable output, 'json' for raw structured data."}}, 'additionalProperties': False}}, 'title': 'kapruka_list_categoriesArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/ListCategoriesInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_list_categoriesOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'ListDeliveryCitiesInput': {'type': 'object', 'title': 'ListDeliveryCitiesInput', 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 25, 'maximum': 50, 'minimum': 1, 'description': 'Max cities to return (1â\x80\x9350).'}, 'query': {'anyOf': [{'type': 'string', 'maxLength': 50}, {'type': 'null'}], 'title': 'Query', 'default': None, 'description': 'Filter cities by partial match against name or aliases (case-insensitive). Omit to see the first `limit` cities alphabetically.'}, 'response_format': {'type': 'string', 'title': 'Response Format', 'default': 'markdown', 'description': "'markdown' (default) or 'json'"}}, 'additionalProperties': False}}, 'title': 'kapruka_list_delivery_citiesArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/ListDeliveryCitiesInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_list_delivery_citiesOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'Courtesy': {'type': 'object', 'title': 'Courtesy', 'required': ['currency', 'per_usd'], 'properties': {'per_usd': {'type': 'number', 'title': 'Per Usd', 'description': 'Units of that currency per 1 USD, as used for the chat text.', 'exclusiveMaximum': 1000000, 'exclusiveMinimum': 0}, 'currency': {'type': 'string', 'title': 'Currency', 'pattern': '^[A-Za-z]{3}$', 'maxLength': 3, 'minLength': 3, 'description': "ISO-4217 code of the customer's home currency, e.g. JPY."}}, 'description': "A home-currency approximation to print under each USD price.\n\nThe CALLER supplies the rate it used for its own chat text, so the card and\nthe text agree to the unit; the card never converts on its own. Only\napplied when the card is priced in USD â\x80\x94 the courtesy figure describes\nwhat a USD charge will look like on the customer's statement.", 'additionalProperties': False}, 'CardProduct': {'type': 'object', 'title': 'CardProduct', 'required': ['product_id', 'ref'], 'properties': {'ref': {'type': 'integer', 'title': 'Ref', 'maximum': 99, 'minimum': 1, 'description': "The reference number to print on this product's badge (customer replies with it). Assign sequentially per conversation and NEVER reuse a number."}, 'product_id': {'type': 'string', 'title': 'Product Id', 'maxLength': 80, 'minLength': 3, 'description': 'Kapruka product ID (from a search result).'}}, 'additionalProperties': False}, 'RenderOptionsCardInput': {'type': 'object', 'title': 'RenderOptionsCardInput', 'required': ['items'], 'properties': {'items': {'type': 'array', 'items': {'$ref': '#/$defs/CardProduct'}, 'title': 'Items', 'maxItems': 4, 'minItems': 1, 'description': '1-4 products to show side by side.'}, 'courtesy': {'anyOf': [{'$ref': '#/$defs/Courtesy'}, {'type': 'null'}], 'default': None, 'description': "Optional: print 'â\x89\x88 <home currency>' under each USD price (see Courtesy). Ignored unless currency is USD."}, 'currency': {'type': 'string', 'title': 'Currency', 'default': 'LKR', 'description': 'Price currency: LKR, USD, GBP, AUD, EUR.'}, 'footer_note': {'anyOf': [{'type': 'string', 'maxLength': 60}, {'type': 'null'}], 'title': 'Footer Note', 'default': None, 'description': "Optional short note appended to the footer's reply hint, e.g. 'Checkout charges USD'."}}, 'additionalProperties': False}}, 'title': 'kapruka_render_options_cardArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/RenderOptionsCardInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_render_options_cardOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'SearchProductsInput': {'type': 'object', 'title': 'SearchProductsInput', 'required': ['q'], 'properties': {'q': {'type': 'string', 'title': 'Q', 'maxLength': 200, 'minLength': 3, 'description': "Search query (e.g. 'birthday cake', 'roses', 'chocolates for mom'). Min 3 characters, must contain specific terms (not stopwords only)."}, 'sort': {'type': 'string', 'title': 'Sort', 'default': 'relevance', 'description': "Sort order: 'relevance' (default), 'price_asc', 'price_desc', 'newest', 'bestseller'."}, 'limit': {'type': 'integer', 'title': 'Limit', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': 'Number of results to return (1â\x80\x9350).'}, 'cursor': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Cursor', 'default': None, 'description': "Pagination cursor from a previous search response's 'next_cursor' field."}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Category', 'default': None, 'description': "Filter by a SEARCH FACET name. Every search response lists the valid ones for its words under facets.categories (e.g. 'Kapruka Cakes', 'Fresh Flowers', 'Electronics', 'Mobile Phones', 'Greeting Cards') â\x80\x94 search once without a category, then narrow with one of those names. Department words ('Cakes', 'Flowers') and names from kapruka_list_categories (the site's navigation, a different vocabulary) are NOT facet names. Case and spacing don't matter. A name that isn't a facet for this query is dropped: you get results without it plus the list of valid names."}, 'currency': {'type': 'string', 'title': 'Currency', 'default': 'LKR', 'description': 'Price currency. Supported: LKR, USD, GBP, AUD, EUR'}, 'max_price': {'anyOf': [{'type': 'number', 'minimum': 0}, {'type': 'null'}], 'title': 'Max Price', 'default': None, 'description': 'Maximum price (inclusive), in the requested currency.'}, 'min_price': {'anyOf': [{'type': 'number', 'minimum': 0}, {'type': 'null'}], 'title': 'Min Price', 'default': None, 'description': 'Minimum price (inclusive), in the requested currency.'}, 'in_stock_only': {'type': 'boolean', 'title': 'In Stock Only', 'default': False, 'description': 'If true, only return products currently in stock.'}, 'include_stubs': {'type': 'boolean', 'title': 'Include Stubs', 'default': False, 'description': "Deprecated, has no effect. Kept so existing callers don't break: since 2026-09-26 the API never returns category landing pages from a search."}, 'response_format': {'type': 'string', 'title': 'Response Format', 'default': 'markdown', 'description': "'markdown' for human-readable output, 'json' for raw structured data."}}, 'additionalProperties': False}}, 'title': 'kapruka_search_productsArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/SearchProductsInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_search_productsOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Input schema
{'type': 'object', '$defs': {'TrackOrderInput': {'type': 'object', 'title': 'TrackOrderInput', 'required': ['order_number'], 'properties': {'order_number': {'type': 'string', 'title': 'Order Number', 'maxLength': 40, 'minLength': 4, 'description': "Order number from the customer's Kapruka order confirmation email or the order complete page on kapruka.com (e.g. 'VIMP34456CB2'). This is NOT the same as the order_ref returned by kapruka_create_order â\x80\x94 the customer must complete payment first; the Kapruka order number is then emailed to them."}, 'response_format': {'type': 'string', 'title': 'Response Format', 'default': 'markdown', 'description': "'markdown' (default) or 'json'."}}, 'additionalProperties': False}}, 'title': 'kapruka_track_orderArguments', 'required': ['params'], 'properties': {'params': {'$ref': '#/$defs/TrackOrderInput'}}}
Output schema
{'type': 'object', 'title': 'kapruka_track_orderOutput', 'required': ['result'], 'properties': {'result': {'type': 'string', 'title': 'Result'}}}
Recent tool changes
Similar MCP servers
AgentLot Marketplace
Enables agents and users to discover, bid on, purchase, deliver, and settle paid digital services and compute work.
apex-x1
Provides X1 and Arc token screening, liquidity and exit-risk checks, wallet and bridge data, non-custodial token operations, comm…
SpellBook Finance
Provides Magic: The Gathering and other trading-card market prices, buylist offers, arbitrage analysis, sealed-product EV, seller…
API Direct
Searches and retrieves data from social networks, news and Google services, while also providing Amazon product, seller, ranking,…
Digital Manager Guru
Provides Digital Manager Guru checkout, customer, transaction, subscription, affiliate, coupon, blocklist, and digital-product sa…
Pagar.me
Connects to Pagar.me to manage customers, cards, orders, charges, invoices, payment captures, confirmations, retries, refunds, an…
amazon-product-research-mcp
Researches Amazon products, brands, sellers, buy-box activity, sourcing profitability, category competition, and supplier opportu…
AgentLux
Operates an agent avatar marketplace with item generation, purchases, creator earnings, public profiles, social activity, and ERC…