Skip to main content
Glama

Repeat-buyer cohort analysis

exim__shipments__buyer-recurrence
Read-onlyIdempotent

Returns repeat buyers, retention and shipment scale for an HS code, market or named buyer. Use it to judge how sticky buyers are in a market.

Input Schema

NameRequiredDescriptionDefault
toNoLatest month, YYYY-MM.
fromNoEarliest month, YYYY-MM.
buyerNobuyer company name filter
hsCodeNoHS code at 2, 4 or 6 digits; shorter codes match the whole family (0901 = all coffee). Do not pad with zeros (090100 matches nothing).
sourceNodataset source filter
originCountryNoOrigin (exporting) country, ISO2 code (e.g. VN).
destinationCountryNoDestination (importing) country, ISO2 code (e.g. US, DE).

Output Schema

NameRequiredDescriptionDefault
dataYes
statsNo
_debugNo
summaryYes
warningsNo
nextActionsYes
correlationIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • changedInput schema / not / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "anyOf": [
      -        {
      -          "properties": {
      -            "hs6": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "hs6"
      -          ]
      -        },
      -        {
      -          "properties": {
      -            "dest": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "dest"
      -          ]
      -        }
      -      ]
      -    }
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "anyOf": [
      +        {
      +          "properties": {
      +            "hsCode": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hsCode"
      +          ]
      +        },
      +        {
      +          "properties": {
      +            "destinationCountry": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "destinationCountry"
      +          ]
      +        }
      +      ]
      +    }
      +  }
      +]
    • removedInput schema / properties / dest
      Removed value: -{
      -  "description": "destination country (ISO 2) filter",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • addedInput schema / properties / destinationCountry
      Added value: +{
      +  "description": "Destination (importing) country, ISO2 code (e.g. US, DE).",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • changedInput schema / properties / from / description
      Previous value: -"earliest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)"New value: +"Earliest month, YYYY-MM."
    • removedInput schema / properties / hs6
      Removed value: -{
      -  "description": "HS code at ANY granularity — 2/4/6-digit; a shorter code is a broader family (e.g. 0901 = all coffee). Do NOT pad to 6 digits: 090100 matches nothing.",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • addedInput schema / properties / hsCode
      Added value: +{
      +  "description": "HS code at 2, 4 or 6 digits; shorter codes match the whole family (0901 = all coffee). Do not pad with zeros (090100 matches nothing).",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • removedInput schema / properties / origin
      Removed value: -{
      -  "description": "origin country (ISO 2) filter",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • addedInput schema / properties / originCountry
      Added value: +{
      +  "description": "Origin (exporting) country, ISO2 code (e.g. VN).",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • changedInput schema / properties / to / description
      Previous value: -"latest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)"New value: +"Latest month, YYYY-MM."
  2. Changed9 schema fields changed
    • changedInput schema / not / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "anyOf": [
      -        {
      -          "properties": {
      -            "hsCode": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "hsCode"
      -          ]
      -        },
      -        {
      -          "properties": {
      -            "destinationCountry": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "destinationCountry"
      -          ]
      -        }
      -      ]
      -    }
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "anyOf": [
      +        {
      +          "properties": {
      +            "hs6": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hs6"
      +          ]
      +        },
      +        {
      +          "properties": {
      +            "dest": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "dest"
      +          ]
      +        }
      +      ]
      +    }
      +  }
      +]
    • addedInput schema / properties / dest
      Added value: +{
      +  "description": "destination country (ISO 2) filter",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • removedInput schema / properties / destinationCountry
      Removed value: -{
      -  "description": "Destination (importing) country, ISO2 code (e.g. US, DE).",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • changedInput schema / properties / from / description
      Previous value: -"Earliest month, YYYY-MM."New value: +"earliest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)"
    • addedInput schema / properties / hs6
      Added value: +{
      +  "description": "HS code at ANY granularity — 2/4/6-digit; a shorter code is a broader family (e.g. 0901 = all coffee). Do NOT pad to 6 digits: 090100 matches nothing.",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • removedInput schema / properties / hsCode
      Removed value: -{
      -  "description": "HS code at 2, 4 or 6 digits; shorter codes match the whole family (0901 = all coffee). Do not pad with zeros (090100 matches nothing).",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • addedInput schema / properties / origin
      Added value: +{
      +  "description": "origin country (ISO 2) filter",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • removedInput schema / properties / originCountry
      Removed value: -{
      -  "description": "Origin (exporting) country, ISO2 code (e.g. VN).",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • changedInput schema / properties / to / description
      Previous value: -"Latest month, YYYY-MM."New value: +"latest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)"
  3. Changed9 schema fields changed
    • changedInput schema / not / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "anyOf": [
      -        {
      -          "properties": {
      -            "hs6": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "hs6"
      -          ]
      -        },
      -        {
      -          "properties": {
      -            "dest": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "dest"
      -          ]
      -        }
      -      ]
      -    }
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "anyOf": [
      +        {
      +          "properties": {
      +            "hsCode": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hsCode"
      +          ]
      +        },
      +        {
      +          "properties": {
      +            "destinationCountry": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "destinationCountry"
      +          ]
      +        }
      +      ]
      +    }
      +  }
      +]
    • removedInput schema / properties / dest
      Removed value: -{
      -  "description": "destination country (ISO 2) filter",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • addedInput schema / properties / destinationCountry
      Added value: +{
      +  "description": "Destination (importing) country, ISO2 code (e.g. US, DE).",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • changedInput schema / properties / from / description
      Previous value: -"earliest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)"New value: +"Earliest month, YYYY-MM."
    • removedInput schema / properties / hs6
      Removed value: -{
      -  "description": "HS code at ANY granularity — 2/4/6-digit; a shorter code is a broader family (e.g. 0901 = all coffee). Do NOT pad to 6 digits: 090100 matches nothing.",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • addedInput schema / properties / hsCode
      Added value: +{
      +  "description": "HS code at 2, 4 or 6 digits; shorter codes match the whole family (0901 = all coffee). Do not pad with zeros (090100 matches nothing).",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • removedInput schema / properties / origin
      Removed value: -{
      -  "description": "origin country (ISO 2) filter",
      -  "maxLength": 8000,
      -  "type": "string"
      -}
    • addedInput schema / properties / originCountry
      Added value: +{
      +  "description": "Origin (exporting) country, ISO2 code (e.g. VN).",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • changedInput schema / properties / to / description
      Previous value: -"latest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)"New value: +"Latest month, YYYY-MM."
  4. Changed16 schema fields changed
    • addedInput schema / not
      Added value: +{
      +  "anyOf": [
      +    {
      +      "not": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "hs6": {
      +                "minLength": 1,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "hs6"
      +            ]
      +          },
      +          {
      +            "properties": {
      +              "dest": {
      +                "minLength": 1,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "dest"
      +            ]
      +          }
      +        ]
      +      }
      +    }
      +  ]
      +}
    • removedInput schema / properties / --buyer
      Removed value: -{
      -  "description": "buyer company name filter",
      -  "type": "string"
      -}
    • removedInput schema / properties / --dest
      Removed value: -{
      -  "description": "destination country (ISO 2) filter",
      -  "type": "string"
      -}
    • removedInput schema / properties / --from
      Removed value: -{
      -  "description": "earliest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)",
      -  "pattern": "^[0-9]{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12][0-9]|3[01]))?)?$",
      -  "type": "string"
      -}
    • removedInput schema / properties / --hs6
      Removed value: -{
      -  "description": "HS code at ANY granularity — 2/4/6-digit; a shorter code is a broader family (e.g. 0901 = all coffee). Do NOT pad to 6 digits: 090100 matches nothing.",
      -  "type": "string"
      -}
    • removedInput schema / properties / --origin
      Removed value: -{
      -  "description": "origin country (ISO 2) filter",
      -  "type": "string"
      -}
    • removedInput schema / properties / --source
      Removed value: -{
      -  "description": "dataset source filter",
      -  "type": "string"
      -}
    • removedInput schema / properties / --to
      Removed value: -{
      -  "description": "latest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)",
      -  "pattern": "^[0-9]{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12][0-9]|3[01]))?)?$",
      -  "type": "string"
      -}
    • addedInput schema / properties / buyer
      Added value: +{
      +  "description": "buyer company name filter",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / dest
      Added value: +{
      +  "description": "destination country (ISO 2) filter",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / from
      Added value: +{
      +  "description": "earliest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)",
      +  "maxLength": 8000,
      +  "pattern": "^[0-9]{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12][0-9]|3[01]))?)?$",
      +  "type": "string"
      +}
    • addedInput schema / properties / hs6
      Added value: +{
      +  "description": "HS code at ANY granularity — 2/4/6-digit; a shorter code is a broader family (e.g. 0901 = all coffee). Do NOT pad to 6 digits: 090100 matches nothing.",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / origin
      Added value: +{
      +  "description": "origin country (ISO 2) filter",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / source
      Added value: +{
      +  "description": "dataset source filter",
      +  "maxLength": 8000,
      +  "type": "string"
      +}
    • addedInput schema / properties / to
      Added value: +{
      +  "description": "latest month (YYYY-MM; YYYY or YYYY-MM-DD also accepted)",
      +  "maxLength": 8000,
      +  "pattern": "^[0-9]{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12][0-9]|3[01]))?)?$",
      +  "type": "string"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$defs": {
      +    "value0": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "buyerRetentionRate": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "buyers": {
      +          "$ref": "#/$defs/value1"
      +        },
      +        "newBuyerCount": {
      +          "type": "integer"
      +        },
      +        "recurringBuyerRatio": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "repeatShipmentRatio": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "returningBuyerCount": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "buyerRetentionRate",
      +        "buyers",
      +        "newBuyerCount",
      +        "recurringBuyerRatio",
      +        "repeatShipmentRatio",
      +        "returningBuyerCount"
      +      ],
      +      "type": "object"
      +    },
      +    "value1": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "$ref": "#/$defs/value2"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value2": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "activeMonths": {
      +          "type": "integer"
      +        },
      +        "buyer": {
      +          "type": "string"
      +        },
      +        "firstSeen": {
      +          "type": "string"
      +        },
      +        "lastSeen": {
      +          "type": "string"
      +        },
      +        "repeatShipmentRatio": {
      +          "type": "number"
      +        },
      +        "shipmentCount": {
      +          "type": "integer"
      +        },
      +        "totalValueUsd": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "totalWeightKg": {
      +          "type": "number"
      +        },
      +        "uniqueSellers": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "activeMonths",
      +        "buyer",
      +        "firstSeen",
      +        "lastSeen",
      +        "repeatShipmentRatio",
      +        "shipmentCount",
      +        "totalValueUsd",
      +        "totalWeightKg",
      +        "uniqueSellers"
      +      ],
      +      "type": "object"
      +    },
      +    "value3": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "type": [
      +              "null",
      +              "boolean",
      +              "number",
      +              "string",
      +              "array",
      +              "object"
      +            ]
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value4": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "$ref": "#/$defs/value5"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value5": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "command": {
      +          "type": "string"
      +        },
      +        "cost": {
      +          "type": "string"
      +        },
      +        "label": {
      +          "type": "string"
      +        },
      +        "rationale": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "command",
      +        "cost",
      +        "label",
      +        "rationale"
      +      ],
      +      "type": "object"
      +    },
      +    "value6": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {
      +            "type": "number"
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value7": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "$ref": "#/$defs/value8"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "value8": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "code": {
      +          "type": "string"
      +        },
      +        "message": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "message"
      +      ],
      +      "type": "object"
      +    },
      +    "value9": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {
      +            "type": [
      +              "null",
      +              "boolean",
      +              "number",
      +              "string",
      +              "array",
      +              "object"
      +            ]
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "additionalProperties": false,
      +  "properties": {
      +    "_debug": {
      +      "$ref": "#/$defs/value9"
      +    },
      +    "correlationId": {
      +      "type": "string"
      +    },
      +    "data": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "context": {
      +          "type": [
      +            "null",
      +            "boolean",
      +            "number",
      +            "string",
      +            "array",
      +            "object"
      +          ]
      +        },
      +        "cursor": {
      +          "type": "string"
      +        },
      +        "has_more": {
      +          "type": "boolean"
      +        },
      +        "items": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "$ref": "#/$defs/value0"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "context",
      +        "has_more",
      +        "items"
      +      ],
      +      "type": "object"
      +    },
      +    "nextActions": {
      +      "$ref": "#/$defs/value4"
      +    },
      +    "stats": {
      +      "$ref": "#/$defs/value6"
      +    },
      +    "summary": {
      +      "type": "string"
      +    },
      +    "warnings": {
      +      "$ref": "#/$defs/value7"
      +    }
      +  },
      +  "required": [
      +    "data",
      +    "nextActions",
      +    "summary"
      +  ],
      +  "type": "object"
      +}
  5. First observed

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds the output concept (repeat buyers, retention, scale) but omits the meaningful hidden constraint — that at least one of hsCode or destinationCountry must be supplied — which the agent only discovers by decoding the schema's nested not/anyOf.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the return-value summary front-loaded and the use case trailing. Nothing is repeated from the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering safety, the description does not need to explain return values, and the schema covers all seven parameters. The only real omission is the effective requirement that hsCode or destinationCountry be present, which is encoded opaquely in the schema rather than surfaced in prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented, including the valuable hsCode guidance about 2/4/6-digit matching and not padding with zeros. The description's mention of "HS code, market or named buyer" loosely maps to hsCode/destinationCountry/buyer but adds no syntax or semantics beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (returns) and resource set (repeat buyers, retention, shipment scale) scoped to an HS code, market or named buyer, so an agent can tell it produces cohort stickiness metrics rather than raw shipments. It does not, however, differentiate itself from adjacent siblings like exim__market__churned or exim__companies__customers, which callers might reasonably confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use it to judge how sticky buyers are in a market" gives an explicit intended-use case, which is more than nothing. But there is no guidance on when NOT to use it and no named alternative for related questions (churn, new entrants, competitor customers), so routing between this and siblings is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.