Base MCP (39 tools) on Base: programs, mint, rewards. lsk_ key; plan limits enforced. /for-agents
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Merchant agent API key (lsk_...). Get at loyalspark.online/for-agents or SIWE.
Alternative auth: Bearer lsk_... (same key as x-api-key).
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.
For legacy ERC-20 programs: returns unpauseUtility + enableMinting calldata. For B20 programs: no-op (already active).
Token contract address (0x...)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Tool list last changed Oct 25, 2026.
For legacy ERC-20 programs: returns unpauseUtility + enableMinting calldata. For B20 programs: no-op (already active).
| Argument | Type | Description |
|---|---|---|
| token_address* | string | Token contract address (0x...) |
{
"type": "object",
"required": [
"token_address"
],
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
}
}
}Discover third-party MCP servers published in Coinbase CDP's Bazaar. Read-only. Filter by free-text q and/or network.
| Argument | Type | Description |
|---|---|---|
| q | string | Free-text filter matched against the server JSON |
| limit | number | Max rows (default 25, max 100) |
| cursor | string | Pagination cursor |
| network | string | Filter by network, e.g. 'base' |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free-text filter matched against the server JSON"
},
"limit": {
"type": "number",
"description": "Max rows (default 25, max 100)"
},
"cursor": {
"type": "string",
"description": "Pagination cursor"
},
"network": {
"type": "string",
"description": "Filter by network, e.g. 'base'"
}
}
}Discover third-party x402-paid resources published in Coinbase CDP's Bazaar (docs, data feeds, AI inference, etc). Read-only. Filter by free-text q and/or network (e.g. 'base').
| Argument | Type | Description |
|---|---|---|
| q | string | Free-text filter matched against the resource JSON (name/description/url) |
| limit | number | Max rows returned (default 25, max 100) |
| cursor | string | Pagination cursor from a previous call |
| network | string | Filter by network, e.g. 'base' or 'base-sepolia' |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free-text filter matched against the resource JSON (name/description/url)"
},
"limit": {
"type": "number",
"description": "Max rows returned (default 25, max 100)"
},
"cursor": {
"type": "string",
"description": "Pagination cursor from a previous call"
},
"network": {
"type": "string",
"description": "Filter by network, e.g. 'base' or 'base-sepolia'"
}
}
}Pay a Loyal Spark x402 URL on api.loyalspark.online with the merchant agent's CDP MPC wallet (EIP-3009 exact scheme, Base USDC). Other hosts are refused before any signature. Requires scope 'mint' and an active CDP wallet. max_usdc default 0.25, hard limit 10.
| Argument | Type | Description |
|---|---|---|
| url* | string | Full https:// URL of the x402 resource |
| body | any | Optional JSON request body for non-GET methods |
| method | string | HTTP method (default GET) |
| headers | object | Extra request headers (Accept/Content-Type auto-set) |
| max_usdc | number | Spend cap for THIS call in USDC (default 0.25, must be ≤ 10) |
| allowed_schemes | array | x402 schemes to accept (default ['exact']) |
| allowed_networks | array | Networks to accept (default ['base', 'eip155:8453']) |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Full https:// URL of the x402 resource"
},
"body": {
"description": "Optional JSON request body for non-GET methods"
},
"method": {
"enum": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"
],
"type": "string",
"description": "HTTP method (default GET)"
},
"headers": {
"type": "object",
"description": "Extra request headers (Accept/Content-Type auto-set)"
},
"max_usdc": {
"type": "number",
"description": "Spend cap for THIS call in USDC (default 0.25, must be ≤ 10)"
},
"allowed_schemes": {
"type": "array",
"items": {
"type": "string"
},
"description": "x402 schemes to accept (default ['exact'])"
},
"allowed_networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Networks to accept (default ['base', 'eip155:8453'])"
}
}
}GET a candidate x402 URL and, if it responds HTTP 402, return the parsed payment requirements (accepts[]) so the caller can decide whether to pay. HTTPS only. No signing performed.
| Argument | Type | Description |
|---|---|---|
| url* | string | Full https:// URL of the x402-paid endpoint |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Full https:// URL of the x402-paid endpoint"
}
}
}Check voucher status for this merchant. Send one of code, voucher_code, or voucher_id (anyOf). If none is sent the tool returns error_code missing_identifier, an example, and next_action. Anonymous public lookup is GET /agent-api/vouchers/status.
| Argument | Type | Description |
|---|---|---|
| code | string | Voucher code (LOYAL-XXXX-XXXX-XXXX-XXXX). One of code, voucher_code, or voucher_id is required. |
| voucher_id | string | Voucher UUID. One of code, voucher_code, or voucher_id is required. |
| voucher_code | string | Alias of code. One of code, voucher_code, or voucher_id is required. |
{
"type": "object",
"anyOf": [
{
"required": [
"code"
]
},
{
"required": [
"voucher_id"
]
},
{
"required": [
"voucher_code"
]
}
],
"properties": {
"code": {
"type": "string",
"description": "Voucher code (LOYAL-XXXX-XXXX-XXXX-XXXX). One of code, voucher_code, or voucher_id is required."
},
"voucher_id": {
"type": "string",
"description": "Voucher UUID. One of code, voucher_code, or voucher_id is required."
},
"voucher_code": {
"type": "string",
"description": "Alias of code. One of code, voucher_code, or voucher_id is required."
}
}
}Confirm a prepared mint on Base. Verifies the protocol-fee mint and, when recipient_tx_hash is set (or the fee receipt already contains the recipient mint), writes customer_tier_status so get_token_balance leaves 0. Same hash for both fields when EIP-5792 batched the calls. A second call with recipient_tx_hash still credits the customer after the fee is already settled.
| Argument | Type | Description |
|---|---|---|
| fee_tx_hash* | string | Transaction hash of the protocol fee mint |
| obligation_id* | string | fee_obligation_id returned by mint_loyalty_tokens or earn_points |
| recipient_tx_hash | string | Transaction hash of the mint to the recipient. Same as fee_tx_hash when both mints are in one transaction. Required to update GET /balance. |
{
"type": "object",
"required": [
"obligation_id",
"fee_tx_hash"
],
"properties": {
"fee_tx_hash": {
"type": "string",
"description": "Transaction hash of the protocol fee mint"
},
"obligation_id": {
"type": "string",
"description": "fee_obligation_id returned by mint_loyalty_tokens or earn_points"
},
"recipient_tx_hash": {
"type": "string",
"description": "Transaction hash of the mint to the recipient. Same as fee_tx_hash when both mints are in one transaction. Required to update GET /balance."
}
}
}Create a gift / welcome certificate (UDS-style) with a unique random redemption code (LOYAL-XXXX-XXXX-XXXX). Customer redeems via QR or by entering the code; merchant then mints tokens on-chain. Use for welcome bonuses, promo campaigns, partnership gifts.
| Argument | Type | Description |
|---|---|---|
| title | string | Display title (default: 'Gift Certificate') |
| quantity | number | Number of certificates to create as a batch (1–100, default 1) |
| image_url | string | Optional public image URL for the cert design |
| usd_amount* | number | Certificate face value in USD (positive) |
| description | string | Optional descriptive text shown to the customer |
| token_address* | string | ERC-20 loyalty token address (must belong to the agent's merchant) |
| expires_in_days | number | Validity period in days (omit for no expiry) |
| points_per_dollar | number | Optional override of program rate (e.g. 10 = 10 tokens per $1). Defaults to program's points_per_dollar. |
Get factory calldata to deploy a new loyalty token on Base. Defaults to B20 (Base native ERC-20 superset, single tx, active immediately). Pass token_standard='erc20' for the legacy factory. For B20, MINT_ROLE is granted atomically to the merchant admin AND to the agent's CDP wallet (or explicit extra_minters) so autonomous agents can mint with no follow-up transaction.
| Argument | Type | Description |
|---|---|---|
| name* | string | Program name (required for external agents) |
| locale | string | |
| symbol* | string | Token symbol, 2-5 chars (required for external agents) |
| auto_generate | boolean | Internal automation only — fills missing name/symbol from examples. External agents should pass explicit name and symbol. |
| extra_minters | array | (B20 only) Extra addresses to grant MINT_ROLE atomically in the same deploy tx. |
| token_standard | string | 'b20' (default, single-tx deploy on Base precompile factory) or 'erc20' (legacy factory, requires activate_loyalty_program follow-up) |
| expiration_days | number | Program duration in days (default: 365) |
| preferred_style |
Create a personalized offer for a specific customer. Use when analytics reveal engagement patterns (e.g., inactive customers, high-value segments).
| Argument | Type | Description |
|---|---|---|
| title* | string | Offer title (e.g., 'Welcome back! 20% bonus tokens') |
| valid_days | number | How many days the offer is valid (default: 7) |
| description | string | Offer description |
| bonus_tokens | number | Bonus tokens to award |
| token_address* | string | Token contract address |
| customer_address* | string | Customer wallet address |
| discount_percentage | number | Discount percentage (0-100) |
{
"type": "object",
"required": [
"token_address",
"customer_address",
"title"
],
"properties": {
"title": {
"type": "string",
"description": "Offer title (e.g., 'Welcome back! 20% bonus tokens')"
},
"valid_days": {
"type": "number",
"description": "How many days the offer is valid (default: 7)"
},
"description": {
"type": "string",
"description": "Offer description"
},
"bonus_tokens": {
"type": "number",
"description": "Bonus tokens to award"
},
"token_address": {
"type": "string",
"description": "Token contract address"
},
"customer_address": {
"type": "string",
"description": "Customer wallet address"
},
"discount_percentage": {
"type": "number",
"description": "Discount percentage (0-100)"
}
}
}Create a new reward redeemable with loyalty tokens
| Argument | Type | Description |
|---|---|---|
| cost* | number | Token cost to redeem |
| name* | string | Reward name |
| description | string | Reward description |
| token_address* | string | Token contract address |
{
"type": "object",
"required": [
"token_address",
"name",
"cost"
],
"properties": {
"cost": {
"type": "number",
"description": "Token cost to redeem"
},
"name": {
"type": "string",
"description": "Reward name"
},
"description": {
"type": "string",
"description": "Reward description"
},
"token_address": {
"type": "string",
"description": "Token contract address"
}
}
}Internal. Delete a report you submitted.
| Argument | Type | Description |
|---|---|---|
| report_id* | string | UUID of the report to delete |
{
"type": "object",
"required": [
"report_id"
],
"properties": {
"report_id": {
"type": "string",
"description": "UUID of the report to delete"
}
}
}Calculate and mint loyalty tokens based on purchase amount and program's cashback rate. Returns a fee-first `calls[]` bundle (protocol fee mint first, then the customer mint) — submit in order, atomically via EIP-5792 if supported, then call confirm_mint_fee (or POST /agent-api/mint/confirm) with obligation_id, fee_tx_hash, and recipient_tx_hash. Unconfirmed fee obligations block future mints.
| Argument | Type | Description |
|---|---|---|
| cashback_rate | number | Override cashback rate (%). If omitted, uses the program's default rate. |
| token_address* | string | Token contract address (0x...) |
| purchase_amount* | number | Purchase amount in currency units (e.g. dollars) |
| customer_address* | string | Customer wallet (0x...) |
{
"type": "object",
"required": [
"token_address",
"customer_address",
"purchase_amount"
],
"properties": {
"cashback_rate": {
"type": "number",
"description": "Override cashback rate (%). If omitted, uses the program's default rate."
},
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
},
"purchase_amount": {
"type": "number",
"description": "Purchase amount in currency units (e.g. dollars)"
},
"customer_address": {
"type": "string",
"description": "Customer wallet (0x...)"
}
}
}Export customer data for a specific loyalty program. Returns wallet addresses, voucher stats, balances, and tier info. Use for analytics, segmentation, and personalized offers.
| Argument | Type | Description |
|---|---|---|
| token_address* | string | Token address of the loyalty program |
{
"type": "object",
"required": [
"token_address"
],
"properties": {
"token_address": {
"type": "string",
"description": "Token address of the loyalty program"
}
}
}Workflow planner: field catalog, required parameters, next_actions, and non-binding examples. External agents must choose their own name, symbol, and economics.
| Argument | Type | Description |
|---|---|---|
| locale | string | |
| category | string | |
| description | string | |
| business_name | string | |
| preferred_style | string | |
| target_audience | string |
{
"type": "object",
"properties": {
"locale": {
"type": "string"
},
"category": {
"type": "string"
},
"description": {
"type": "string"
},
"business_name": {
"type": "string"
},
"preferred_style": {
"type": "string"
},
"target_audience": {
"type": "string"
}
}
}Get authenticated agent's profile
No arguments.
{
"type": "object",
"properties": {}
}Get info about Loyal Spark protocol on Base L2
No arguments.
{
"type": "object",
"properties": {}
}Get analytics for one of your loyalty programs
| Argument | Type | Description |
|---|---|---|
| token_address* | string | Token contract address (0x...) |
{
"type": "object",
"required": [
"token_address"
],
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
}
}
}Explain the next merchant action: current_step, required fields, and ordered next_actions (you provide all parameter values)
| Argument | Type | Description |
|---|---|---|
| token_address | string | Optional token to inspect |
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Optional token to inspect"
}
}
}Get loyalty token balance and tier info for a customer
| Argument | Type | Description |
|---|---|---|
| token_address* | string | Token contract address |
| customer_address* | string | Customer wallet |
{
"type": "object",
"required": [
"token_address",
"customer_address"
],
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address"
},
"customer_address": {
"type": "string",
"description": "Customer wallet"
}
}
}List protocol-fee obligations for this API key. status=unpaid is an alias for pending. Each unpaid row includes next_action describing POST /mint/confirm.
| Argument | Type | Description |
|---|---|---|
| status | string | unpaid, pending, settled, or failed |
{
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "unpaid, pending, settled, or failed"
}
}
}List gift certificates issued by the agent's merchant (with status and redemption info).
| Argument | Type | Description |
|---|---|---|
| limit | number | Max rows (default 50, max 200) |
| status | string | Filter by status: active, pending_mint, redeemed, expired, revoked |
| token_address | string | Filter by program token address (optional) |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max rows (default 50, max 200)"
},
"status": {
"type": "string",
"description": "Filter by status: active, pending_mint, redeemed, expired, revoked"
},
"token_address": {
"type": "string",
"description": "Filter by program token address (optional)"
}
}
}List loyalty programs owned by the agent's merchant
| Argument | Type | Description |
|---|---|---|
| include_expired | boolean | Include expired programs |
{
"type": "object",
"properties": {
"include_expired": {
"type": "boolean",
"description": "Include expired programs"
}
}
}List active token trading offers on the marketplace
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results (1-100) |
| status | string | Filter: active/completed/cancelled |
| token_address | string | Optional. When set, only offers that give or ask for this token. |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max results (1-100)"
},
"status": {
"type": "string",
"description": "Filter: active/completed/cancelled"
},
"token_address": {
"type": "string",
"description": "Optional. When set, only offers that give or ask for this token."
}
}
}List mint intents for this merchant. status=pending means transaction_hash is still null (confirm has not credited the recipient). status=completed means the recipient mint was recorded. GET /balance stays 0 until confirm.
| Argument | Type | Description |
|---|---|---|
| status | string | pending or completed |
| token_address | string | Optional loyalty token |
{
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "pending or completed"
},
"token_address": {
"type": "string",
"description": "Optional loyalty token"
}
}
}Internal. List reports this agent submitted (status new, reviewed, or done).
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results 1-50 (default: 20) |
| status | string | Filter by status: new, reviewed, done (optional) |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max results 1-50 (default: 20)"
},
"status": {
"type": "string",
"description": "Filter by status: new, reviewed, done (optional)"
}
}
}List rewards for a loyalty program by token_address. Includes redemption metrics (total vouchers issued, redeemed, and last-30-day counts) for each reward.
| Argument | Type | Description |
|---|---|---|
| token_address* | string | Token contract address (0x...) |
{
"type": "object",
"required": [
"token_address"
],
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
}
}
}List discount codes for this merchant's Shopify store, plus how customers spend points (online code, register voucher, or both).
| Argument | Type | Description |
|---|---|---|
| token_address | string | Program address. Omit to list every linked store. |
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Program address. Omit to list every linked store."
}
}
}After the merchant submits the on-chain mint transaction for a claimed gift certificate, call this to mark it as minted (status pending_mint -> redeemed) and store the mint tx hash.
| Argument | Type | Description |
|---|---|---|
| certificate_id* | string | UUID of the certificate |
| transaction_hash* | string | Base L2 mint transaction hash (0x...) |
{
"type": "object",
"required": [
"certificate_id",
"transaction_hash"
],
"properties": {
"certificate_id": {
"type": "string",
"description": "UUID of the certificate"
},
"transaction_hash": {
"type": "string",
"description": "Base L2 mint transaction hash (0x...)"
}
}
}Record mint intent and get a fee-first `calls[]` bundle: protocol fee mint FIRST, then the recipient mint. The protocol fee is charged in the merchant's own loyalty tokens (not USDC). Submit both calls in order (atomically via EIP-5792 send_calls if your wallet supports it), then call confirm_mint_fee (or POST /agent-api/mint/confirm) with obligation_id, fee_tx_hash, and recipient_tx_hash. Unconfirmed fee obligations block future mints. Prefer recipient_address (same as REST POST /agent-api/mint); `recipient` is a legacy alias.
| Argument | Type | Description |
|---|---|---|
| amount* | number | Tokens to mint |
| recipient | string | Legacy alias for recipient_address |
| token_address* | string | Token contract address |
| recipient_address | string | Customer wallet receiving minted tokens (0x...). Preferred — matches REST. |
{
"type": "object",
"anyOf": [
{
"required": [
"recipient_address"
]
},
{
"required": [
"recipient"
]
}
],
"required": [
"token_address",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "Tokens to mint"
},
"recipient": {
"type": "string",
"description": "Legacy alias for recipient_address"
},
"token_address": {
"type": "string",
"description": "Token contract address"
},
"recipient_address": {
"type": "string",
"description": "Customer wallet receiving minted tokens (0x...). Preferred — matches REST."
}
}
}Redeem a reward by providing a verified token transfer transaction hash. Creates a voucher for the customer.
| Argument | Type | Description |
|---|---|---|
| reward_id* | string | UUID of the reward to redeem |
| customer_address* | string | Wallet address of the customer who transferred tokens |
| transaction_hash* | string | Onchain tx hash of the token transfer from customer to merchant |
{
"type": "object",
"required": [
"reward_id",
"customer_address",
"transaction_hash"
],
"properties": {
"reward_id": {
"type": "string",
"description": "UUID of the reward to redeem"
},
"customer_address": {
"type": "string",
"description": "Wallet address of the customer who transferred tokens"
},
"transaction_hash": {
"type": "string",
"description": "Onchain tx hash of the token transfer from customer to merchant"
}
}
}Register a deployed token as a loyalty program in the database. B20 tokens are registered as active; legacy ERC-20 as inactive (activate next).
| Argument | Type | Description |
|---|---|---|
| name* | string | Program name |
| symbol* | string | Token symbol |
| cashback_rate | number | Default cashback percent for earn (1–100). Omit for DB default (5). |
| token_address* | string | Deployed token contract address (0x...) |
| token_standard | string | 'b20' (default) or 'erc20' (legacy) |
| expiration_days | number | Duration in days (default: 365) |
| points_per_dollar | number | Loyalty points per $1 spent (1–1000). Omit for DB default (1). |
{
"type": "object",
"required": [
"name",
"symbol",
"token_address"
],
"properties": {
"name": {
"type": "string",
"description": "Program name"
},
"symbol": {
"type": "string",
"description": "Token symbol"
},
"cashback_rate": {
"type": "number",
"description": "Default cashback percent for earn (1–100). Omit for DB default (5)."
},
"token_address": {
"type": "string",
"description": "Deployed token contract address (0x...)"
},
"token_standard": {
"type": "string",
"description": "'b20' (default) or 'erc20' (legacy)"
},
"expiration_days": {
"type": "number",
"description": "Duration in days (default: 365)"
},
"points_per_dollar": {
"type": "number",
"description": "Loyalty points per $1 spent (1–1000). Omit for DB default (1)."
}
}
}Revoke an active gift certificate (status active -> revoked). Only the issuing merchant can revoke. Already-redeemed/minted certificates cannot be revoked.
| Argument | Type | Description |
|---|---|---|
| certificate_id* | string | UUID of the certificate from create_gift_certificate / list_gift_certificates |
{
"type": "object",
"required": [
"certificate_id"
],
"properties": {
"certificate_id": {
"type": "string",
"description": "UUID of the certificate from create_gift_certificate / list_gift_certificates"
}
}
}Internal. Send a report to the merchant's Agent Reports dashboard (SEO audits, growth ideas, anomalies, weekly summaries). Not a loyalty action.
| Argument | Type | Description |
|---|---|---|
| title* | string | Report title (max 500 chars) |
| content* | string | Report body text (max 10000 chars) |
| priority | string | Priority: low, medium, high, or critical |
| agent_role* | string | Your role: ceo, seo, growth, or analyst |
| report_type* | string | Type: seo_audit, growth_idea, data_report, anomaly, task, recommendation, or weekly_report |
| action_items | array | List of suggested action items |
{
"type": "object",
"required": [
"agent_role",
"report_type",
"title",
"content"
],
"properties": {
"title": {
"type": "string",
"description": "Report title (max 500 chars)"
},
"content": {
"type": "string",
"description": "Report body text (max 10000 chars)"
},
"priority": {
"type": "string",
"description": "Priority: low, medium, high, or critical"
},
"agent_role": {
"type": "string",
"description": "Your role: ceo, seo, growth, or analyst"
},
"report_type": {
"type": "string",
"description": "Type: seo_audit, growth_idea, data_report, anomaly, task, recommendation, or weekly_report"
},
"action_items": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of suggested action items"
}
}
}Set how this store's customers spend loyalty points: online (checkout code), offline (voucher at the register), or both (the shopper chooses).
| Argument | Type | Description |
|---|---|---|
| channel* | string | online, offline, or both |
{
"type": "object",
"required": [
"channel"
],
"properties": {
"channel": {
"type": "string",
"description": "online, offline, or both"
}
}
}Get calldata to transfer loyalty tokens between wallets
| Argument | Type | Description |
|---|---|---|
| to* | string | Recipient wallet (0x...) |
| amount* | number | Tokens to transfer |
| token_address* | string | Token contract address (0x...) |
{
"type": "object",
"required": [
"token_address",
"to",
"amount"
],
"properties": {
"to": {
"type": "string",
"description": "Recipient wallet (0x...)"
},
"amount": {
"type": "number",
"description": "Tokens to transfer"
},
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
}
}
}Update default cashback_rate and/or points_per_dollar for a program (same as merchant dashboard sliders)
| Argument | Type | Description |
|---|---|---|
| cashback_rate | number | New default cashback % for earn (1–100). Omit to leave unchanged. |
| token_address* | string | Token contract address (0x...) |
| points_per_dollar | number | New points per $1 (0–1000, exclusive 0). Omit to leave unchanged. |
{
"type": "object",
"anyOf": [
{
"required": [
"cashback_rate"
]
},
{
"required": [
"points_per_dollar"
]
}
],
"required": [
"token_address"
],
"properties": {
"cashback_rate": {
"type": "number",
"description": "New default cashback % for earn (1–100). Omit to leave unchanged."
},
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
},
"points_per_dollar": {
"type": "number",
"description": "New points per $1 (0–1000, exclusive 0). Omit to leave unchanged."
}
}
}Update program status in database after onchain activation/pause
| Argument | Type | Description |
|---|---|---|
| status* | string | New status: active, paused, or inactive |
| token_address* | string | Token contract address |
{
"type": "object",
"required": [
"token_address",
"status"
],
"properties": {
"status": {
"type": "string",
"description": "New status: active, paused, or inactive"
},
"token_address": {
"type": "string",
"description": "Token contract address"
}
}
}Internal. Set a report you submitted to reviewed or done.
| Argument | Type | Description |
|---|---|---|
| status* | string | New status: reviewed or done |
| report_id* | string | UUID of the report |
{
"type": "object",
"required": [
"report_id",
"status"
],
"properties": {
"status": {
"type": "string",
"description": "New status: reviewed or done"
},
"report_id": {
"type": "string",
"description": "UUID of the report"
}
}
}Activate or deactivate a reward in the catalog. Use to manage reward availability based on analytics.
| Argument | Type | Description |
|---|---|---|
| is_active* | boolean | true to activate, false to deactivate |
| reward_id* | string | UUID of the reward |
{
"type": "object",
"required": [
"reward_id",
"is_active"
],
"properties": {
"is_active": {
"type": "boolean",
"description": "true to activate, false to deactivate"
},
"reward_id": {
"type": "string",
"description": "UUID of the reward"
}
}
}Mark a Shopify discount code used, or cancel it and return the loyalty points. Same actions as the merchant discount-code journal.
| Argument | Type | Description |
|---|---|---|
| action* | string | use or cancel |
| redemption_id* | string | Id from list_store_discount_codes. |
{
"type": "object",
"required": [
"redemption_id",
"action"
],
"properties": {
"action": {
"type": "string",
"description": "use or cancel"
},
"redemption_id": {
"type": "string",
"description": "Id from list_store_discount_codes."
}
}
}Mark a voucher as used at the merchant. Send one of voucher_code or voucher_id (anyOf). If neither is sent the tool returns error_code missing_identifier and an example.
| Argument | Type | Description |
|---|---|---|
| voucher_id | string | Voucher UUID. Use this OR voucher_code. |
| voucher_code | string | Voucher code (LOYAL-XXXX-XXXX-XXXX-XXXX). Use this OR voucher_id. |
{
"type": "object",
"anyOf": [
{
"required": [
"voucher_code"
]
},
{
"required": [
"voucher_id"
]
}
],
"properties": {
"voucher_id": {
"type": "string",
"description": "Voucher UUID. Use this OR voucher_code."
},
"voucher_code": {
"type": "string",
"description": "Voucher code (LOYAL-XXXX-XXXX-XXXX-XXXX). Use this OR voucher_id."
}
}
}| max_redemption_percent |
| number |
| Max % of any future purchase the customer can pay with these tokens (5–100). Default 50. |
{
"type": "object",
"required": [
"token_address",
"usd_amount"
],
"properties": {
"title": {
"type": "string",
"description": "Display title (default: 'Gift Certificate')"
},
"quantity": {
"type": "number",
"description": "Number of certificates to create as a batch (1–100, default 1)"
},
"image_url": {
"type": "string",
"description": "Optional public image URL for the cert design"
},
"usd_amount": {
"type": "number",
"description": "Certificate face value in USD (positive)"
},
"description": {
"type": "string",
"description": "Optional descriptive text shown to the customer"
},
"token_address": {
"type": "string",
"description": "ERC-20 loyalty token address (must belong to the agent's merchant)"
},
"expires_in_days": {
"type": "number",
"description": "Validity period in days (omit for no expiry)"
},
"points_per_dollar": {
"type": "number",
"description": "Optional override of program rate (e.g. 10 = 10 tokens per $1). Defaults to program's points_per_dollar."
},
"max_redemption_percent": {
"type": "number",
"description": "Max % of any future purchase the customer can pay with these tokens (5–100). Default 50."
}
}
}| string |
| target_audience | string |
| business_context | object | Optional context for examples only |
| agent_wallet_address | string | (B20 only) Additional wallet to grant MINT_ROLE atomically. Defaults to the agent's active CDP MPC wallet if not provided. |
{
"type": "object",
"required": [
"name",
"symbol"
],
"properties": {
"name": {
"type": "string",
"description": "Program name (required for external agents)"
},
"locale": {
"type": "string"
},
"symbol": {
"type": "string",
"description": "Token symbol, 2-5 chars (required for external agents)"
},
"auto_generate": {
"type": "boolean",
"description": "Internal automation only — fills missing name/symbol from examples. External agents should pass explicit name and symbol."
},
"extra_minters": {
"type": "array",
"items": {
"type": "string"
},
"description": "(B20 only) Extra addresses to grant MINT_ROLE atomically in the same deploy tx."
},
"token_standard": {
"type": "string",
"description": "'b20' (default, single-tx deploy on Base precompile factory) or 'erc20' (legacy factory, requires activate_loyalty_program follow-up)"
},
"expiration_days": {
"type": "number",
"description": "Program duration in days (default: 365)"
},
"preferred_style": {
"type": "string"
},
"target_audience": {
"type": "string"
},
"business_context": {
"type": "object",
"description": "Optional context for examples only"
},
"agent_wallet_address": {
"type": "string",
"description": "(B20 only) Additional wallet to grant MINT_ROLE atomically. Defaults to the agent's active CDP MPC wallet if not provided."
}
}
}