Kapruka MCP
Server Details
Free public MCP server for Kapruka.com — Sri Lanka's largest e-commerce platform.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- kapruka/mcp
- GitHub Stars
- 21
- Server Listing
- Kapruka MCP Server
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.7/5 across 8 of 8 tools scored.
Each tool targets a clearly distinct operation: delivery checking vs city listing, product search vs product fetch, order creation vs tracking, plus an auxiliary card renderer. Even the two delivery-related tools have non-overlapping purposes, and descriptions reinforce the boundary.
All tools follow a consistent `kapruka_<verb>_<noun>` snake_case pattern (e.g., check_delivery, create_order, search_products). The verb-noun structure is uniform, making it easy to predict tool names.
8 tools is well-scoped for an e-commerce MCP server, covering catalog browsing, delivery feasibility, order placement, and order tracking without unnecessary bloat. Each tool serves a distinct step in the shopping workflow.
The tool surface covers the full agent-visible lifecycle: discover products (search/get/categories), check delivery, create a guest order, and track post-payment status. There are no obvious dead ends for common shopping scenarios.
Available Tools
8 toolskapruka_check_deliveryARead-onlyInspect
Check whether Kapruka can deliver to a given city on a given date, and at what rate.
Returns the flat delivery rate (LKR), whether the requested date is available,
and — if not — the next available date plus reason. Kapruka delivers as a
single shipment per order at one flat rate regardless of item count.
If a `product_id` is supplied and the code matches a perishable family
(CAKE*, FLOWER*, COMBO*), an extra warning is added when the chosen
delivery date is more than 1 day out.
Args:
params (CheckDeliveryInput):
- city (str): Canonical city name (e.g. 'Colombo 03', 'Galle')
- delivery_date (Optional[str]): YYYY-MM-DD; defaults to today (LK time)
- product_id (Optional[str]): Optional, enables perishable warning
- response_format (str): 'markdown' (default) or 'json'
Returns:
str: Delivery feasibility + rate in the requested format.
JSON schema:
{
"city": str,
"now": str, # ISO timestamp, Sri Lanka time
"checked_date": str, # YYYY-MM-DD
"available": bool,
"rate": number, # flat LKR rate per order
"currency": "LKR",
"reason": str | null, # populated when available=false
"next_available_date": str|null, # populated when available=false
"perishable_warning": str | null # populated when product_id is perishable
}
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations (readOnlyHint=true, destructiveHint=false). It discloses the flat-rate-per-order behavior ('single shipment per order at one flat rate regardless of item count'), the perishable warning logic, and the default date behavior ('defaults to today (LK time)'). It also details the exact JSON response schema, including null fields and conditions. With annotations already establishing safety, this extra context is valuable and non-redundant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear 'Args' and 'Returns' sections, and the core purpose is front-loaded. It is slightly longer than necessary but every sentence adds useful detail—no filler. The JSON schema example is appropriately compact and aids comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete given the tool's complexity. The output schema is fully explained, return fields are enumerated with conditions, perishable warning behavior is described, and defaults are specified. There is no ambiguity about the response format or edge cases. Sibling tools exist but do not create a need for more context here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description's Args section explicitly lists and explains each parameter in plain language, complementing the schema which also has descriptions. It adds meaning beyond the schema by explaining the effect of product_id ('enables perishable warning') and the default behavior of delivery_date. The flat-rate note and perishable logic give real semantic depth beyond field names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: 'Check whether Kapruka can deliver to a given city on a given date, and at what rate.' It clearly differentiates from sibling tools like kapruka_list_delivery_cities (which lists cities) and kapruka_create_order (which places orders). The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (checking delivery feasibility and rate) and includes conditional usage guidance: 'If a product_id is supplied and the code matches a perishable family... the chosen delivery date is more than 1 day out.' It does not explicitly mention alternatives or exclusions, but the context is sufficient. A minor gap is not referencing sibling tools like kapruka_list_delivery_cities for city discovery, though the schema covers that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kapruka_create_orderAIdempotentInspect
Create a guest-checkout order on Kapruka and return a click-to-pay link.
Builds a Kapruka order from the supplied cart + recipient + delivery + sender,
then returns a checkout URL the customer opens in a browser to complete payment.
No Kapruka account is required. Prices are locked for the lifetime of the link
(60 minutes) — the customer pays exactly the quoted grand total even if the
catalog price changes meanwhile.
Free public tier limits: 30 orders per hour per client IP. Cart up to 30 items,
quantity up to 99 per item. A fresh idempotency key is generated per call so
retries on transient errors return the same checkout URL rather than duplicates.
Args:
params (CreateOrderInput):
- cart (list[CartItem]): 1–30 items. Each: product_id, quantity (default 1), optional icing_text (cakes only).
- recipient (Recipient): name + phone (E.164 +9477… or local 077…)
- delivery (Delivery): address, city (must be Kapruka-deliverable — use kapruka_list_delivery_cities), location_type (house/apartment/office/other, default house), date (YYYY-MM-DD, today-or-future Asia/Colombo), optional instructions
- sender (Sender): name + anonymous flag
- gift_message (Optional[str]): Up to 300 chars
- currency (str): LKR (default), USD, GBP, AUD, CAD, EUR
- response_format (str): 'markdown' (default) or 'json'
Returns:
str: Order confirmation with checkout URL.
JSON schema:
{
"checkout_url": str, # Open in browser to pay (no login required)
"order_ref": str, # e.g. "ORD-20260520-7823"
"summary": {
"items_total": number,
"delivery_fee": number,
"addons_total": number,
"grand_total": number, # items_total + delivery_fee + addons_total
"currency": str
},
"expires_at": str # ISO 8601 — link stops working after this
}
Error: "Error (<code>): <message>" on failure. Common codes:
empty_cart, missing_field, past_delivery_date, product_not_found,
product_out_of_stock, city_not_deliverable, date_not_deliverable.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true), the description reveals vital behaviors: prices locked for 60 minutes, free tier limits (30 orders/hour/IP), cart and quantity limits, idempotency key generation for retries, and guest checkout without an account. It also documents error message format and common error codes. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized into sections (summary, limits, args, returns, errors). Every sentence provides actionable information, with the core purpose front-loaded and supporting details logically grouped. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with nested parameters and multiple constraints, yet the description covers all essential aspects: input structure, validation rules, error handling, return JSON schema, and behavioral semantics like pricing and idempotency. It is fully self-contained and leaves no critical gaps for an AI agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The Args section paraphrases and enriches each schema field with practical meaning, such as phone format (E.164 +9477… or local 077…), icing_text only for cakes, and city must be Kapruka-deliverable. It also clarifies the response_format options and supported currencies, going well beyond the raw schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a guest-checkout order on Kapruka and return a click-to-pay link,' clearly stating the verb, resource, and outcome. It distinguishes itself from sibling tools by focusing on order creation rather than listing, searching, or tracking, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use the tool and how to prepare inputs, including a cross-reference to kapruka_list_delivery_cities for valid city names. It also states constraints like 'No Kapruka account is required' and delivery date must be today or future, providing clear context for correct usage. While it doesn't list exclusions for sibling tools, its role is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kapruka_get_productARead-onlyIdempotentInspect
Fetch full details for a single Kapruka product by its product ID.
Returns name, description, price (with optional currency conversion), stock status,
images, variants, shipping info, and a direct product URL.
Note: Some IDs starting with 'CATSYM' are category landing pages, not purchasable
products — this tool will flag those clearly.
Args:
params (GetProductInput):
- product_id (str): Kapruka product ID (e.g. 'cakeXX000000')
- currency (str): Price currency — LKR (default), USD, GBP, AUD, CAD, EUR
- type (Optional[str]): Optional type hint (e.g. 'specialgifts')
- response_format (str): 'markdown' (default) or 'json'
Returns:
str: Product details in the requested format.
JSON schema:
{
"id": str,
"name": str,
"description": str,
"summary": str,
"price": {"amount": float, "currency": str},
"compare_at_price": {"amount": float, "currency": str} | null,
"in_stock": bool,
"stock_level": str, # "low" | "medium" | "high"
"category": {"id": str, "name": str, "slug": str, "path": str},
"variants": [{"id": str, "name": str, "sku": str, "price": {...},
"in_stock": bool, "stock_level": str, "attributes": {...}}],
"images": [str], # list of full-resolution image URLs
"attributes": {"type": str, "subtype": str, "weight": str, "vendor": str},
"shipping": {"ships_from": str, "ships_internationally": bool, "restricted_countries": [str]},
"rating": null,
"url": str
}
Error: "Error: <message>" on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context: the CATSYM category landing page edge case, optional currency conversion, response format selection, error string format, and a complete JSON schema of the returned data. This goes well beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose, a note, an Args section, and a Returns section with the full JSON schema. Every part adds necessary detail, and the information is front-loaded with the main purpose in the first sentence. No filler or repetition exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully self-contained for a complex tool: it covers all four parameters, provides a complete output schema, explains error handling, and notes the CATSYM edge case. Combined with the annotations, the agent has everything needed to select and invoke the tool correctly without external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already thoroughly describes each parameter (product_id format, currency options, type hint, response_format meaning). The description's Args section largely repeats this information without adding significant new semantics, though it does present the nesting under 'params' clearly. Given high schema coverage, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Fetch full details for a single Kapruka product by its product ID', using a specific verb and resource with clear scope. It distinguishes from siblings like search_products and list_categories by focusing on a single product via ID, and lists the exact data fields returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this is for retrieving a specific product when you already have its ID, and the note about CATSYM IDs warns against using it for category landing pages. However, it does not explicitly name alternative tools like kapruka_search_products for discovery, so it lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kapruka_list_categoriesARead-onlyIdempotentInspect
List top-level Kapruka product categories by name with browse URLs.
Returns category names (usable as the `category` filter on kapruka_search_products)
plus the public Kapruka.com URL for each category landing page — useful for shopping
agents that want to send users directly to a category to browse. Internal IDs and
product counts are not exposed. Results are cached for 30 minutes server-side.
Args:
params (ListCategoriesInput):
- depth (int): Sub-category levels to include, 1 or 2 (default 1)
- response_format (str): 'markdown' (default) or 'json'
Returns:
str: Category tree in the requested format.
JSON schema:
{
"categories": [
{
"name": str,
"url": str, # kapruka.com category landing page
"children": [{"name": str, "url": str, "children": [...]}]
}
]
}
Error: "Error: <message>" on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, etc.), the description discloses that 'Internal IDs and product counts are not exposed' and 'Results are cached for 30 minutes server-side.' It also details the error format, adding valuable behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear summary, Args, Returns, and error format. It is slightly long due to the embedded JSON schema, but each section contributes to usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All relevant aspects are covered: purpose, parameter semantics, output schema, limitations, caching, and error handling. The cross-reference to kapruka_search_products aids contextual understanding within the sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description's Args section restates the schema's parameter descriptions without adding new meaning. The schema already fully documents depth and response_format, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List top-level Kapruka product categories by name with browse URLs.' It also distinguishes itself from siblings by noting the returned names are usable as a filter on kapruka_search_products, making its purpose specific and non-overlapping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Guidance is provided: 'useful for shopping agents that want to send users directly to a category to browse' and relationships to kapruka_search_products are mentioned. While it doesn't explicitly state when not to use it, the context strongly implies its role versus searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kapruka_list_delivery_citiesARead-onlyIdempotentInspect
List or search Sri Lankan cities Kapruka delivers to.
Use the `query` param to filter (e.g. "colombo" → all Colombo zones,
"anur" → Anuradhapura). Without a query you get the first 25 cities
alphabetically, which is rarely what an agent needs — pass a query.
Returns canonical city names (use these as the `city` argument to
kapruka_check_delivery) plus any common aliases / vernacular spellings.
Args:
params (ListDeliveryCitiesInput):
- query (Optional[str]): Partial match filter
- limit (int): Max results, 1–50 (default 25)
- response_format (str): 'markdown' (default) or 'json'
Returns:
str: Cities list in the requested format.
JSON schema:
{
"cities": [{"name": str, "aliases": [str]}],
"total_matched": int,
"showing": int
}
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral detail beyond annotations: default shows first 25 cities alphabetically, query enables partial case-insensitive match, response_format can be markdown or json, and returns canonical names plus aliases. The caveat about the default being rarely needed is honest and useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and front-loaded: opening purpose, usage guidance, Args section, and Returns with JSON schema. Each sentence contributes relevant information without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's list/search functionality and available output schema, the description covers default behavior, filtering, response formats, and return structure. It even includes a JSON schema excerpt, making it complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description restates parameter names and types, but also adds illustrative examples and meaning beyond the schema. It explains the query behavior with concrete examples and clarifies that returned names should be used as the `city` argument, enriching parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists or searches Sri Lankan cities Kapruka delivers to, with a specific verb (list/search) and resource (cities). It distinguishes from sibling kapruka_check_delivery by noting it returns canonical city names to use as the `city` argument for that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: warns that without a query the default alphabetical limit is rarely what an agent needs, and gives example filters ('colombo' → Colombo zones, 'anur' → Anuradhapura). It implies the relationship to kapruka_check_delivery but does not state when to avoid using this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kapruka_render_options_cardARead-onlyIdempotentInspect
Render 1-4 products as ONE shareable JPEG "menu" card and return its URL.
The card shows each product's photo with a big numbered badge (the ref you
assign), and its name + price printed under the photo. Built for chat
commerce (WhatsApp): send the image, tell the customer "reply 1, 2 or 3",
and they pick without opening links. No AI is involved — the image is
server-composited from the live catalog data, so prices match what the
product tools return.
Ref numbering contract: refs are yours to assign — use sequential numbers
per conversation and NEVER reuse one (if the first card was 1-3, the next
card starts at 4). A number must keep meaning the same product for the whole
conversation.
Args:
params (RenderOptionsCardInput):
- items (list[CardProduct]): 1-4 of {product_id, ref}
- currency (str): LKR (default), USD, GBP, AUD, CAD, EUR
Returns:
str: JSON:
{
"card_url": str, # public JPEG URL — send this as the image
"items": [{"ref": int, "product_id": str, "name": str,
"price": {"amount": float, "currency": str}, "url": str}],
"unavailable": [str] # product_ids that failed to load (omitted from card)
}
Error: "Error: <message>" when no product could be loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint), the description reveals that the image is server-composited from live catalog data (so prices match product tools), explains the ref-assignment contract (sequential, never reused, stable meaning per conversation), and details the exact JSON return shape and error behavior. These are operational traits the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every part is warranted: it front-loads the purpose, then explains the chat use case, the critical ref contract, and ends with organized Args/Returns sections. It is structured and free of fluff—no sentence is redundant with the annotations or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool's behavior is complex enough that this detail is needed: it specifies the output URL, the item list with product names, prices, and URLs, the absence of unavailable products, and the fallback error string. Together with the WhatsApp scenario and the ref contract, the description provides complete context for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema_description_coverage at 0% for the top-level 'params' parameter, the description's Args section compensates fully: it lists 'items' (1-4 of {product_id, ref}) and 'currency' with defaults, clarifies the ref numbering rule, and gives an example of use. This adds practical meaning well beyond the bare schema structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise action and outcome: 'Render 1-4 products as ONE shareable JPEG "menu" card and return its URL.' This clearly differentiates the tool from siblings (search, create_order, delivery) by its output format (a composited image card) and its chat-commerce purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly targets a WhatsApp chat-commerce use case: 'send the image, tell the customer "reply 1, 2 or 3" and they pick without opening links.' This provides clear when-to-use context, but it does not name alternative tools or state exclusions, so it misses the top score by one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kapruka_search_productsARead-onlyIdempotentInspect
Search for products on Kapruka.com by keyword, with optional category filter and pagination.
Returns a ranked list of matching products with prices, stock status, images, and URLs.
Supports cursor-based pagination — pass next_cursor from one response into the next call.
Pagination is capped at 3 pages per query to discourage catalog enumeration; for broader
discovery, refine the query or filter by category instead.
Queries must be at least 3 characters and contain specific terms — pure stopword queries
(e.g. "the", "a an") are rejected.
By default, category landing pages (CATSYM entries with price=0) are filtered out so results
contain only purchasable products. Set include_stubs=true to include them.
Args:
params (SearchProductsInput):
- q (str): Search query (e.g. 'birthday cake', 'roses', 'tea gift'). Min 3 chars.
- category (Optional[str]): Category filter (e.g. 'Birthday', 'Flowers')
- limit (int): Results per page, 1–50 (default 10)
- cursor (Optional[str]): Pagination cursor from previous response
- currency (str): LKR (default), USD, GBP, AUD, CAD, EUR
- min_price (Optional[float]): Min price (inclusive) in the requested currency
- max_price (Optional[float]): Max price (inclusive) in the requested currency
- in_stock_only (bool): Restrict to in-stock items (default false)
- sort (str): 'relevance' | 'price_asc' | 'price_desc' | 'newest' | 'bestseller'
- include_stubs (bool): Include category landing pages (default false)
- response_format (str): 'markdown' (default) or 'json'
Returns:
str: Search results in the requested format.
JSON schema:
{
"results": [
{
"id": str,
"name": str,
"summary": str,
"price": {"amount": float | null, "currency": str},
"compare_at_price": {"amount": float, "currency": str} | null,
"in_stock": bool,
"stock_level": str,
"image_url": str | null,
"category": {"id": str, "name": str, "slug": str},
"rating": null,
"ships_internationally": bool,
"url": str
}
],
"next_cursor": str | null, # null after page 3 even if upstream has more
"applied_filters": {"q": str, "limit": int, "in_stock_only": bool}
}
Error: "Error: <message>" or "No products found for '<query>'" on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds substantial behavioral context: pagination is capped at 3 pages, queries must be ≥3 chars and reject stopwords, category landing pages (price=0) are filtered by default, and error formats are specified. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: purpose first, then pagination and query rules, then a structured Args list, then the return JSON schema and error messages. It is front-loaded with the most important info and contains no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers the complexity of this search tool: pagination behavior and cap, query constraints, stub filtering, parameter meanings, and the complete output schema. It also documents error strings and the special meaning of next_cursor. Nothing important is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage at the top level is 0% (the 'params' property has no description), so the description must compensate. It does so thoroughly: the Args section lists all 11 parameters with types, defaults, allowed values, and examples (e.g., sort options, currency list, min price). This adds critical meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search for products on Kapruka.com by keyword, with optional category filter and pagination,' using a specific verb+resource+scope. This clearly distinguishes it from sibling tools like kapruka_get_product (single product) and kapruka_list_categories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for usage: keyword search, cursor-based pagination, pagination cap of 3 pages, and advice to 'refine the query or filter by category instead' for broader discovery. However, it does not explicitly name alternative tools or state when not to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kapruka_track_orderARead-onlyInspect
Look up status and delivery progress for a Kapruka order by order number.
Returns current status (received / confirmed / out-for-delivery / delivered /
cancelled), the recipient and delivery details on file, a timestamped progress
timeline, the cart contents, and flags for whether a delivery photo or video is
available. Use this after a customer has placed and paid for an order and reads
back the order number from their confirmation email or the order complete page.
The order number is NOT the `order_ref` returned by kapruka_create_order
(which is the pre-payment checkout reference). Once the customer completes
payment in the browser, Kapruka emails them a separate order number — that
is what this tool expects.
Args:
params (TrackOrderInput):
- order_number (str): Kapruka order number (e.g. 'VIMP34456CB2')
- response_format (str): 'markdown' (default) or 'json'
Returns:
str: Order tracking details in the requested format.
JSON schema:
{
"order_number": str,
"pnref": str, # internal payment reference (numeric; not the same as order_number)
"status": str, # received | confirmed | shipped | delivered | cancelled | ...
"status_display": str, # human label
"order_date": str, # human-formatted, Asia/Colombo
"delivery_date": str, # human-formatted
"shipped_date": str | null,
"amount": str, # LKR string (e.g. "15500.00")
"payment_method": str,
"comments": str | null,
"recipient": {"name": str, "phone": str, "address": str, "city": str},
"greeting_message": str | null,
"special_instructions": str | null,
"progress": [{"step": str, "timestamp": str}],
"live_tracking_available": bool,
"has_delivery_video": bool,
"has_delivery_photo": bool,
"items": [{"product_id": str, "name": str, "quantity": int, "selling_price": float}]
}
Error: "Error: <message>" on failure (e.g. order not found).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by detailing the exact statuses returned, the contents of the progress timeline, availability of delivery photo/video flags, and the error message format. Even though readOnlyHint and destructiveHint are already provided, the description adds meaningful behavioral context (e.g., live_tracking_available boolean, payment reference field) that helps an agent anticipate results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: it starts with the core purpose, provides usage context, lists parameters, and includes a return schema. Every sentence contributes value, and the structure makes it easy to scan. The embedded JSON schema is verbose but justified given the complex return payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple statuses, nested recipient/items objects, error handling), the description is comprehensive. It explains when to use it, what input to provide, what output to expect, and includes the caveat about order_ref. The annotations and detailed schema round out the context, making the tool fully actionable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description's Args section essentially mirrors the input schema, which already contains detailed descriptions for both parameters, including the crucial order_ref distinction. Thus, the description adds little new semantic meaning beyond what the schema provides. The example format ('VIMP34456CB2') is helpful but not a significant increment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Look up') and resource ('status and delivery progress for a Kapruka order by order number'), clearly distinguishing it from sibling tools like kapruka_create_order. It also outlines the exact output, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('after a customer has placed and paid for an order and reads back the order number from their confirmation email or the order complete page') and warns against using the order_ref from kapruka_create_order. This provides clear when-to-use and when-not-to-use guidance, effectively differentiating it from related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Servers
- Alicense-qualityAmaintenanceOpen source MCP server for open project aimed at community edition usersLast updated1MIT
- Alicense-qualityBmaintenancePublic MCP server for integrating Cuprice pricing widgets from AI tools like Cursor, Claude Desktop, and Claude Code.Last updated1MIT
- AlicenseBqualityDmaintenanceAn MCP server that provides comprehensive financial insights and analysis by leveraging real-time market data, news, and advanced analytics for stocks, options, financial statements, and economic indicators.Last updated1750PythonMIT
- AlicenseAqualityBmaintenanceMCP server that exposes 25 tools for the Kwork freelance marketplace — browse projects, submit offers, manage orders, send messages, and more.Last updated283MIT
Your Connectors
Sign in to create a connector for this server.