Loyal Spark
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Base MCP (39 tools) on Base: programs, mint, rewards. lsk_ key; plan limits enforced. /for-agents
| Author | io.github.aspekt19 |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 920 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Loyal Spark": {
"url": "https://api.loyalspark.online/loyalty-mcp",
"transport": "streamable-http"
}
}
}
Measured tools (42)
get_platform_inforead-onlyGet info about Loyal Spark protocol on Base L2
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
get_my_profileread-onlyGet authenticated agent's profile
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
generate_program_defaultsread-onlyWorkflow planner: field catalog, required parameters, next_actions, and non-binding examples. External agents must choose their own name, symbol, and economics.
Parameters:
locale— stringcategory— stringdescription— stringbusiness_name— stringpreferred_style— stringtarget_audience— string
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
get_program_workflow_statusread-onlyExplain the next merchant action: current_step, required fields, and ordered next_actions (you provide all parameter values)
Parameters:
token_address— string — Optional token to inspect
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
list_loyalty_programsread-onlyList loyalty programs owned by the agent's merchant
Parameters:
include_expired— boolean — Include expired programs
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
create_loyalty_programGet 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.
Parameters:
name(required) — string — Program name (required for external agents)symbol(required) — string — Token symbol, 2-5 chars (required for external agents)locale— stringauto_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— stringtarget_audience— stringbusiness_context— object — Optional context for examples onlyagent_wallet_address— string — (B20 only) Additional wallet to grant MINT_ROLE atomically. Defaults to the agent's active CDP MPC wallet if not provided.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
register_loyalty_programRegister a deployed token as a loyalty program in the database. B20 tokens are registered as active; legacy ERC-20 as inactive (activate next).
Parameters:
name(required) — string — Program namesymbol(required) — string — Token symboltoken_address(required) — string — Deployed token contract address (0x...)cashback_rate— number — Default cashback percent for earn (1–100). Omit for DB default (5).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).
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
activate_loyalty_programFor legacy ERC-20 programs: returns unpauseUtility + enableMinting calldata. For B20 programs: no-op (already active).
Parameters:
token_address(required) — string — Token contract address (0x...)
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
update_program_statusUpdate program status in database after onchain activation/pause
Parameters:
token_address(required) — string — Token contract addressstatus(required) — string — New status: active, paused, or inactive
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
update_program_configUpdate default cashback_rate and/or points_per_dollar for a program (same as merchant dashboard sliders)
Parameters:
token_address(required) — string — Token contract address (0x...)cashback_rate— number — New default cashback % for earn (1–100). Omit to leave unchanged.points_per_dollar— number — New points per $1 (0–1000, exclusive 0). Omit to leave unchanged.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
list_rewardsread-onlyList rewards for a loyalty program by token_address. Includes redemption metrics (total vouchers issued, redeemed, and last-30-day counts) for each reward.
Parameters:
token_address(required) — string — Token contract address (0x...)
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
create_rewardCreate a new reward redeemable with loyalty tokens
Parameters:
token_address(required) — string — Token contract addressname(required) — string — Reward namecost(required) — number — Token cost to redeemdescription— string — Reward description
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
mint_loyalty_tokensRecord 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.
Parameters:
token_address(required) — string — Token contract addressamount(required) — number — Tokens to mintrecipient— string — Legacy alias for recipient_addressrecipient_address— string — Customer wallet receiving minted tokens (0x...). Preferred — matches REST.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
transfer_loyalty_tokensGet calldata to transfer loyalty tokens between wallets
Parameters:
token_address(required) — string — Token contract address (0x...)to(required) — string — Recipient wallet (0x...)amount(required) — number — Tokens to transfer
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
earn_pointsCalculate 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.
Parameters:
token_address(required) — string — Token contract address (0x...)customer_address(required) — string — Customer wallet (0x...)purchase_amount(required) — number — Purchase amount in currency units (e.g. dollars)cashback_rate— number — Override cashback rate (%). If omitted, uses the program's default rate.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
confirm_mint_feeConfirm 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.
Parameters:
obligation_id(required) — string — fee_obligation_id returned by mint_loyalty_tokens or earn_pointsfee_tx_hash(required) — string — Transaction hash of the protocol fee mintrecipient_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.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
list_mintsread-onlyList 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.
Parameters:
status— string — pending or completedtoken_address— string — Optional loyalty token
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
list_fee_obligationsread-onlyList protocol-fee obligations for this API key. status=unpaid is an alias for pending. Each unpaid row includes next_action describing POST /mint/confirm.
Parameters:
status— string — unpaid, pending, settled, or failed
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
get_token_balanceread-onlyGet loyalty token balance and tier info for a customer
Parameters:
token_address(required) — string — Token contract addresscustomer_address(required) — string — Customer wallet
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
get_program_analyticsread-onlyGet analytics for one of your loyalty programs
Parameters:
token_address(required) — string — Token contract address (0x...)
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
list_marketplace_offersread-onlyList active token trading offers on the marketplace
Parameters:
limit— number — Max results (1-100)status— string — Filter: active/completed/cancelledtoken_address— string — Optional. When set, only offers that give or ask for this token.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
redeem_rewardRedeem a reward by providing a verified token transfer transaction hash. Creates a voucher for the customer.
Parameters:
reward_id(required) — string — UUID of the reward to redeemcustomer_address(required) — string — Wallet address of the customer who transferred tokenstransaction_hash(required) — string — Onchain tx hash of the token transfer from customer to merchant
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
use_voucherdestructiveMark 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.
Parameters:
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.
Hints: read-only no · destructive yes · idempotent not declared · open-world not declared
check_voucher_statusread-onlyCheck 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.
Parameters:
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.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
create_personalized_offerCreate a personalized offer for a specific customer. Use when analytics reveal engagement patterns (e.g., inactive customers, high-value segments).
Parameters:
token_address(required) — string — Token contract addresscustomer_address(required) — string — Customer wallet addresstitle(required) — 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 descriptionbonus_tokens— number — Bonus tokens to awarddiscount_percentage— number — Discount percentage (0-100)
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
update_reward_statusActivate or deactivate a reward in the catalog. Use to manage reward availability based on analytics.
Parameters:
reward_id(required) — string — UUID of the rewardis_active(required) — boolean — true to activate, false to deactivate
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
send_reportInternal. Send a report to the merchant's Agent Reports dashboard (SEO audits, growth ideas, anomalies, weekly summaries). Not a loyalty action.
Parameters:
agent_role(required) — string — Your role: ceo, seo, growth, or analystreport_type(required) — string — Type: seo_audit, growth_idea, data_report, anomaly, task, recommendation, or weekly_reporttitle(required) — string — Report title (max 500 chars)content(required) — string — Report body text (max 10000 chars)priority— string — Priority: low, medium, high, or criticalaction_items— array — List of suggested action items
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
list_my_reportsread-onlyInternal. List reports this agent submitted (status new, reviewed, or done).
Parameters:
limit— number — Max results 1-50 (default: 20)status— string — Filter by status: new, reviewed, done (optional)
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
update_report_statusInternal. Set a report you submitted to reviewed or done.
Parameters:
report_id(required) — string — UUID of the reportstatus(required) — string — New status: reviewed or done
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
delete_reportdestructiveInternal. Delete a report you submitted.
Parameters:
report_id(required) — string — UUID of the report to delete
Hints: read-only no · destructive yes · idempotent not declared · open-world not declared
export_customersread-onlyExport customer data for a specific loyalty program. Returns wallet addresses, voucher stats, balances, and tier info. Use for analytics, segmentation, and personalized offers.
Parameters:
token_address(required) — string — Token address of the loyalty program
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
list_store_discount_codesread-onlyList discount codes for this merchant's Shopify store, plus how customers spend points (online code, register voucher, or both).
Parameters:
token_address— string — Program address. Omit to list every linked store.
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
update_store_discount_codedestructiveMark a Shopify discount code used, or cancel it and return the loyalty points. Same actions as the merchant discount-code journal.
Parameters:
redemption_id(required) — string — Id from list_store_discount_codes.action(required) — string — use or cancel
Hints: read-only no · destructive yes · idempotent not declared · open-world not declared
set_store_sales_channelSet how this store's customers spend loyalty points: online (checkout code), offline (voucher at the register), or both (the shopper chooses).
Parameters:
channel(required) — string — online, offline, or both
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
create_gift_certificateCreate 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.
Parameters:
token_address(required) — string — ERC-20 loyalty token address (must belong to the agent's merchant)usd_amount(required) — number — Certificate face value in USD (positive)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 designdescription— string — Optional descriptive text shown to the customerexpires_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.max_redemption_percent— number — Max % of any future purchase the customer can pay with these tokens (5–100). Default 50.
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
list_gift_certificatesread-onlyList gift certificates issued by the agent's merchant (with status and redemption info).
Parameters:
limit— number — Max rows (default 50, max 200)status— string — Filter by status: active, pending_mint, redeemed, expired, revokedtoken_address— string — Filter by program token address (optional)
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
revoke_gift_certificatedestructiveRevoke an active gift certificate (status active -> revoked). Only the issuing merchant can revoke. Already-redeemed/minted certificates cannot be revoked.
Parameters:
certificate_id(required) — string — UUID of the certificate from create_gift_certificate / list_gift_certificates
Hints: read-only no · destructive yes · idempotent not declared · open-world not declared
mark_gift_certificate_mintedAfter 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.
Parameters:
certificate_id(required) — string — UUID of the certificatetransaction_hash(required) — string — Base L2 mint transaction hash (0x...)
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
bazaar_discover_resourcesread-onlyDiscover 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').
Parameters:
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 callnetwork— string — Filter by network, e.g. 'base' or 'base-sepolia'
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
bazaar_discover_mcp_serversread-onlyDiscover third-party MCP servers published in Coinbase CDP's Bazaar. Read-only. Filter by free-text q and/or network.
Parameters:
q— string — Free-text filter matched against the server JSONlimit— number — Max rows (default 25, max 100)cursor— string — Pagination cursornetwork— string — Filter by network, e.g. 'base'
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
bazaar_probe_x402read-onlyGET 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.
Parameters:
url(required) — string — Full https:// URL of the x402-paid endpoint
Hints: read-only yes · destructive no · idempotent not declared · open-world not declared
bazaar_pay_and_callPay 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.
Parameters:
url(required) — string — Full https:// URL of the x402 resourcebody— Optional JSON request body for non-GET methodsmethod— 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'])
Hints: read-only no · destructive no · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.