Look up loyalty customers, points history, rewards and VIP tiers, and add points or activities.
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.
WRITE: record that a customer performed an action (identified by an activity type token configured in Smile Admin, e.g. a custom 'newsletter signup' activity). Smile then asynchronously applies the store's earning rules and may issue points or rewards. Identify the customer by customer_id OR customer_email (exactly one). Pass distinct_id (e.g. an order number) to make it idempotent — a second activity with the same token + distinct_id is rejected. Custom activity types need Smile's Plus/Enterprise plan. Requires the activity:write scope. Smile: POST /activities.
Activity type token, e.g. activity_f57a9b5a8d0ac5.
Smile customer ID (or give customer_email).
Unique id for this activity in your system; prevents duplicates for the same token.
Customer email (or give customer_id).
ISO 8601 date-time the action actually happened, if earlier than now.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
WRITE: record that a customer performed an action (identified by an activity type token configured in Smile Admin, e.g. a custom 'newsletter signup' activity). Smile then asynchronously applies the store's earning rules and may issue points or rewards. Identify the customer by customer_id OR customer_email (exactly one). Pass distinct_id (e.g. an order number) to make it idempotent — a second activity with the same token + distinct_id is rejected. Custom activity types need Smile's Plus/Enterprise plan. Requires the activity:write scope. Smile: POST /activities.
| Argument | Type | Description |
|---|---|---|
| token* | string | Activity type token, e.g. activity_f57a9b5a8d0ac5. |
| customer_id | integer | Smile customer ID (or give customer_email). |
| distinct_id | string | Unique id for this activity in your system; prevents duplicates for the same token. |
| customer_email | string | Customer email (or give customer_id). |
| created_on_origin_at | string | ISO 8601 date-time the action actually happened, if earlier than now. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"token"
],
"properties": {
"token": {
"type": "string",
"minLength": 1,
"description": "Activity type token, e.g. activity_f57a9b5a8d0ac5."
},
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smile customer ID (or give customer_email).",
"exclusiveMinimum": 0
},
"distinct_id": {
"type": "string",
"description": "Unique id for this activity in your system; prevents duplicates for the same token."
},
"customer_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,}$",
"description": "Customer email (or give customer_id)."
},
"created_on_origin_at": {
"type": "string",
"description": "ISO 8601 date-time the action actually happened, if earlier than now."
}
}
}WRITE: add or deduct points from a customer's balance (a manual adjustment, e.g. a goodwill credit or a correction). points_change > 0 adds, < 0 deducts; Smile rejects a deduction that would make the balance negative. Undo by creating an opposite adjustment. `description` is shown to the customer; `internal_note` is merchant-only. To reward a customer for completing an action, prefer smile_create_activity. Requires the points_transaction:write scope. Smile: POST /points_transactions.
| Argument | Type | Description |
|---|---|---|
| customer_id* | integer | Smile customer ID. |
| description | string | Customer-visible reason, e.g. "Points correction". |
| internal_note | string | Merchant-only note, never shown to the customer. |
| points_change* | integer | Points to add (positive) or deduct (negative). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id",
"points_change"
],
"properties": {
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smile customer ID.",
"exclusiveMinimum": 0
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Customer-visible reason, e.g. \"Points correction\"."
},
"internal_note": {
"type": "string",
"maxLength": 1000,
"description": "Merchant-only note, never shown to the customer."
},
"points_change": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Points to add (positive) or deduct (negative)."
}
}
}Fetch one customer by Smile customer ID: name, email, state, points_balance, referral_url, vip_tier_id, and optionally their VIP status with current and next tier. Smile: GET /customers/{id}.
| Argument | Type | Description |
|---|---|---|
| include | array | Related objects to include, e.g. ["vip_status.vip_tier", "vip_status.next_vip_tier"]. |
| customer_id* | integer | Smile customer ID. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id"
],
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"vip_status",
"vip_status.vip_tier",
"vip_status.next_vip_tier"
],
"type": "string"
},
"description": "Related objects to include, e.g. [\"vip_status.vip_tier\", \"vip_status.next_vip_tier\"]."
},
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smile customer ID.",
"exclusiveMinimum": 0
}
}
}Fetch one points product (a way to redeem points) by ID, including its reward. Smile: GET /points_products/{id}.
| Argument | Type | Description |
|---|---|---|
| points_product_id* | integer | Smile points product ID. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"points_product_id"
],
"properties": {
"points_product_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smile points product ID.",
"exclusiveMinimum": 0
}
}
}Fetch the points program's configuration, e.g. the points currency label ("Points", "Stars"). Smile: GET /points_settings.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Fetch one points transaction by ID. Smile: GET /points_transactions/{id}.
| Argument | Type | Description |
|---|---|---|
| points_transaction_id* | integer | Smile points transaction ID. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"points_transaction_id"
],
"properties": {
"points_transaction_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smile points transaction ID.",
"exclusiveMinimum": 0
}
}
}Fetch the referral program's configuration: whether it is active, and the sender (advocate) and receiver (friend) rewards. Smile: GET /referral_settings.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}List loyalty-program customers, newest first, with their points balance, state and VIP tier id. Look a customer up by exact email, or filter by state or last-updated time. Cursor-paginated (metadata.next_cursor). Smile: GET /customers.
| Argument | Type | Description |
|---|---|---|
| string | Exact email address to look up. | |
| limit | integer | Maximum number of results, 1-250 (Smile default 50). |
| state | string | candidate = not yet joined, member = in the program, disabled = excluded. |
| cursor | string | Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page. |
| updated_at_min | string | Only records updated at/after this ISO 8601 date-time, e.g. 2026-01-01T00:00:00Z. |
| include_vip_status | boolean | Include each customer's vip_status object (include=vip_status). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"email": {
"type": "string",
"description": "Exact email address to look up."
},
"limit": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "Maximum number of results, 1-250 (Smile default 50)."
},
"state": {
"enum": [
"candidate",
"member",
"disabled"
],
"type": "string",
"description": "candidate = not yet joined, member = in the program, disabled = excluded."
},
"cursor": {
"type": "string",
"description": "Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page."
},
"updated_at_min": {
"type": "string",
"description": "Only records updated at/after this ISO 8601 date-time, e.g. 2026-01-01T00:00:00Z."
},
"include_vip_status": {
"type": "boolean",
"description": "Include each customer's vip_status object (include=vip_status)."
}
}
}List the enabled earning rules — the ways customers earn points or rewards (placing an order, signing up, birthdays, custom activities), with reward, reward_value, earning_limit and any VIP-tier restriction. Cursor-paginated. Smile: GET /earning_rules.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results, 1-250 (Smile default 50). |
| cursor | string | Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "Maximum number of results, 1-250 (Smile default 50)."
},
"cursor": {
"type": "string",
"description": "Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page."
}
}
}List points products — the rewards customers can buy with points. 'fixed' products cost points_price; 'variable' products trade variable_points_step points for variable_points_step_reward_value, between variable_points_min and variable_points_max. Each embeds its reward. Page-numbered (page, page_size); a page shorter than page_size is the last. Smile: GET /points_products.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| page_size | integer | Results per page, 1-250 (default 50). |
| exchange_type | string | Only fixed- or variable-price products. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number, starting at 1."
},
"page_size": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "Results per page, 1-250 (default 50)."
},
"exchange_type": {
"enum": [
"fixed",
"variable"
],
"type": "string",
"description": "Only fixed- or variable-price products."
}
}
}List points transactions (every earn, spend and manual adjustment), newest first — e.g. a customer's full points history. Each has points_change (+/-), a customer-visible description and a merchant internal_note. Cursor-paginated. Smile: GET /points_transactions.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results, 1-250 (Smile default 50). |
| cursor | string | Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page. |
| customer_id | integer | Only this customer's transactions. |
| updated_at_min | string | Only records updated at/after this ISO 8601 date-time, e.g. 2026-01-01T00:00:00Z. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "Maximum number of results, 1-250 (Smile default 50)."
},
"cursor": {
"type": "string",
"description": "Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page."
},
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only this customer's transactions.",
"exclusiveMinimum": 0
},
"updated_at_min": {
"type": "string",
"description": "Only records updated at/after this ISO 8601 date-time, e.g. 2026-01-01T00:00:00Z."
}
}
}List rewards that have been issued to customers — usually discount codes — with code, fulfillment_status (pending/issued/cancelled/failed), usage_status (used/unused/untracked), used_at and expires_at. Use customer_id to answer 'what codes does this customer have?'. Cursor-paginated. Smile: GET /reward_fulfillments.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results, 1-250 (Smile default 50). |
| cursor | string | Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page. |
| customer_id | integer | Only this customer's rewards. |
| usage_status | string | |
| updated_at_min | string | Only records updated at/after this ISO 8601 date-time, e.g. 2026-01-01T00:00:00Z. |
| fulfillment_status | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 250,
"minimum": 1,
"description": "Maximum number of results, 1-250 (Smile default 50)."
},
"cursor": {
"type": "string",
"description": "Cursor from the previous response's metadata.next_cursor (or previous_cursor). Omit for the first page."
},
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only this customer's rewards.",
"exclusiveMinimum": 0
},
"usage_status": {
"enum": [
"used",
"unused",
"untracked"
],
"type": "string"
},
"updated_at_min": {
"type": "string",
"description": "Only records updated at/after this ISO 8601 date-time, e.g. 2026-01-01T00:00:00Z."
},
"fulfillment_status": {
"enum": [
"pending",
"issued",
"cancelled",
"failed"
],
"type": "string"
}
}
}List the VIP program's tiers, sorted by milestone (the threshold to reach each tier), optionally with each tier's perks and entry rewards. Smile: GET /vip_tiers.
| Argument | Type | Description |
|---|---|---|
| include | array | Nested objects to include, e.g. ["perks", "entry_rewards"]. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"perks",
"entry_rewards"
],
"type": "string"
},
"description": "Nested objects to include, e.g. [\"perks\", \"entry_rewards\"]."
}
}
}WRITE — SPENDS THE CUSTOMER'S POINTS: redeem points on the customer's behalf by purchasing a points product; Smile deducts the points and issues the reward (the response's points_purchase.reward_fulfillment usually holds a discount code). Only do this when the customer asked for it. For a 'variable' product pass points_to_spend; leave it out for 'fixed' products. There is no API to cancel a redemption — a mistaken one can only be compensated with smile_create_points_transaction. Requires the points_purchase:write scope. Smile: POST /points_products/{id}/purchase.
| Argument | Type | Description |
|---|---|---|
| customer_id* | integer | Smile customer ID. |
| points_to_spend | integer | Points to spend — variable-price products only. |
| points_product_id* | integer | Smile points product ID. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"points_product_id",
"customer_id"
],
"properties": {
"customer_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smile customer ID.",
"exclusiveMinimum": 0
},
"points_to_spend": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Points to spend — variable-price products only.",
"exclusiveMinimum": 0
},
"points_product_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Smile points product ID.",
"exclusiveMinimum": 0
}
}
}