Loyal Spark
Base MCP (39 tools) on Base: programs, mint, rewards. lsk_ key; plan limits enforced. /for-agents
Sollte ich dies verwenden
Qualität und Sicherheit
Befunde (3)
- HIGH
- LOWin use_voucher
- INFOin create_gift_certificate
Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.
Kontextkosten
Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.
Installieren
Installation mit einem Klick
Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:
{
"mcpServers": {
"loyal-spark": {
"url": "https://api.loyalspark.online/loyalty-mcp"
}
}
}Remote-Endpunkte
https://api.loyalspark.online/loyalty-mcpstreamable-httpWas es kann
Tool-Inventar
Tools (39)
🟢get_platform_info
Get info about Loyal Spark protocol on Base L2
Eingabe-Schema
{
"type": "object",
"properties": {}
}🟢get_my_profile
Get authenticated agent's profile
Eingabe-Schema
{
"type": "object",
"properties": {}
}⚪generate_program_defaults(business_name, category, description, locale, preferred_style, ...)
Workflow planner: field catalog, required parameters, next_actions, and non-binding examples. External agents must choose their own name, symbol, and economics.
Eingabe-Schema
{
"type": "object",
"properties": {
"business_name": {
"type": "string"
},
"category": {
"type": "string"
},
"description": {
"type": "string"
},
"locale": {
"type": "string"
},
"preferred_style": {
"type": "string"
},
"target_audience": {
"type": "string"
}
}
}🟢get_program_workflow_status(token_address)
Explain the next merchant action: current_step, required fields, and ordered next_actions (you provide all parameter values)
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Optional token to inspect"
}
}
}🟢list_loyalty_programs(include_expired)
List loyalty programs owned by the agent's merchant
Eingabe-Schema
{
"type": "object",
"properties": {
"include_expired": {
"type": "boolean",
"description": "Include expired programs"
}
}
}🟡create_loyalty_program(name, symbol, expiration_days, token_standard, agent_wallet_address, ...)
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.
Eingabe-Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Program name (required for external agents)"
},
"symbol": {
"type": "string",
"description": "Token symbol, 2-5 chars (required for external agents)"
},
"expiration_days": {
"type": "number",
"description": "Program duration in days (default: 365)"
},
"token_standard": {
"type": "string",
"description": "'b20' (default, single-tx deploy on Base precompile factory) or 'erc20' (legacy factory, requires activate_loyalty_program follow-up)"
},
"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."
},
"extra_minters": {
"type": "array",
"items": {
"type": "string"
},
"description": "(B20 only) Extra addresses to grant MINT_ROLE atomically in the same deploy tx."
},
"auto_generate": {
"type": "boolean",
"description": "Internal automation only — fills missing name/symbol from examples. External agents should pass explicit name and symbol."
},
"business_context": {
"type": "object",
"description": "Optional context for examples only"
},
"preferred_style": {
"type": "string"
},
"locale": {
"type": "string"
},
"target_audience": {
"type": "string"
}
}
}⚪register_loyalty_program(name, symbol, token_address, expiration_days, cashback_rate, ...)
Register a deployed token as a loyalty program in the database. B20 tokens are registered as active; legacy ERC-20 as inactive (activate next).
Eingabe-Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Program name"
},
"symbol": {
"type": "string",
"description": "Token symbol"
},
"token_address": {
"type": "string",
"description": "Deployed token contract address (0x...)"
},
"expiration_days": {
"type": "number",
"description": "Duration in days (default: 365)"
},
"cashback_rate": {
"type": "number",
"description": "Default cashback percent for earn (1–100). Omit for DB default (5)."
},
"points_per_dollar": {
"type": "number",
"description": "Loyalty points per $1 spent (1–1000). Omit for DB default (1)."
},
"token_standard": {
"type": "string",
"description": "'b20' (default) or 'erc20' (legacy)"
}
},
"required": [
"name",
"symbol",
"token_address"
]
}⚪activate_loyalty_program(token_address)
For legacy ERC-20 programs: returns unpauseUtility + enableMinting calldata. For B20 programs: no-op (already active).
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
}
},
"required": [
"token_address"
]
}🟡update_program_status(token_address, status)
Update program status in database after onchain activation/pause
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address"
},
"status": {
"type": "string",
"description": "New status: active, paused, or inactive"
}
},
"required": [
"token_address",
"status"
]
}🟡update_program_config(token_address, cashback_rate, points_per_dollar)
Update default cashback_rate and/or points_per_dollar for a program (same as merchant dashboard sliders)
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
},
"cashback_rate": {
"type": "number",
"description": "New default cashback % for earn (1–100). Omit to leave unchanged."
},
"points_per_dollar": {
"type": "number",
"description": "New points per $1 (0–1000, exclusive 0). Omit to leave unchanged."
}
},
"required": [
"token_address"
]
}🟢list_rewards(token_address)
List rewards for a loyalty program by token_address. Includes redemption metrics (total vouchers issued, redeemed, and last-30-day counts) for each reward.
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
}
},
"required": [
"token_address"
]
}🟡create_reward(token_address, name, description, cost)
Create a new reward redeemable with loyalty tokens
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address"
},
"name": {
"type": "string",
"description": "Reward name"
},
"description": {
"type": "string",
"description": "Reward description"
},
"cost": {
"type": "number",
"description": "Token cost to redeem"
}
},
"required": [
"token_address",
"name",
"cost"
]
}🟡mint_loyalty_tokens(token_address, recipient, amount)
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 the fee tx hash. Unconfirmed fee obligations block future mints.
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address"
},
"recipient": {
"type": "string",
"description": "Recipient wallet (0x...)"
},
"amount": {
"type": "number",
"description": "Tokens to mint"
}
},
"required": [
"token_address",
"recipient",
"amount"
]
}🟢transfer_loyalty_tokens(token_address, to, amount)
Get calldata to transfer loyalty tokens between wallets
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
},
"to": {
"type": "string",
"description": "Recipient wallet (0x...)"
},
"amount": {
"type": "number",
"description": "Tokens to transfer"
}
},
"required": [
"token_address",
"to",
"amount"
]
}🟡earn_points(token_address, customer_address, purchase_amount, cashback_rate)
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). Unconfirmed fee obligations block future mints.
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address (0x...)"
},
"customer_address": {
"type": "string",
"description": "Customer wallet (0x...)"
},
"purchase_amount": {
"type": "number",
"description": "Purchase amount in currency units (e.g. dollars)"
},
"cashback_rate": {
"type": "number",
"description": "Override cashback rate (%). If omitted, uses the program's default rate."
}
},
"required": [
"token_address",
"customer_address",
"purchase_amount"
]
}⚪confirm_mint_fee(obligation_id, fee_tx_hash, recipient_tx_hash)
Confirm that the protocol fee transaction for a previous mint/earn was broadcast on Base. Verifies the fee mint on-chain and clears the obligation. Unconfirmed fee obligations block future mints.
Eingabe-Schema
{
"type": "object",
"properties": {
"obligation_id": {
"type": "string",
"description": "fee_obligation_id returned by mint_loyalty_tokens or earn_points"
},
"fee_tx_hash": {
"type": "string",
"description": "Transaction hash of the protocol fee mint"
},
"recipient_tx_hash": {
"type": "string",
"description": "Optional transaction hash of the recipient mint"
}
},
"required": [
"obligation_id",
"fee_tx_hash"
]
}🟢get_token_balance(token_address, customer_address)
Get loyalty token balance and tier info for a customer
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address"
},
"customer_address": {
"type": "string",
"description": "Customer wallet"
}
},
"required": [
"token_address",
"customer_address"
]
}🟢get_program_analytics
Get analytics for your loyalty programs
Eingabe-Schema
{
"type": "object",
"properties": {}
}🟢list_marketplace_offers(status, limit)
List active token trading offers on the marketplace
Eingabe-Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Filter: active/completed/cancelled"
},
"limit": {
"type": "number",
"description": "Max results (1-100)"
}
}
}⚪redeem_reward(reward_id, customer_address, transaction_hash)
Redeem a reward by providing a verified token transfer transaction hash. Creates a voucher for the customer.
Eingabe-Schema
{
"type": "object",
"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"
}
},
"required": [
"reward_id",
"customer_address",
"transaction_hash"
]
}⚪use_voucher(voucher_code, voucher_id)
Mark a voucher as used (redeemed by customer at merchant). Merchant-only operation.
Eingabe-Schema
{
"type": "object",
"properties": {
"voucher_code": {
"type": "string",
"description": "Voucher code (e.g. LOYAL-XXXX-XXXX-XXXX-XXXX)"
},
"voucher_id": {
"type": "string",
"description": "Voucher UUID (alternative to code)"
}
}
}🟢check_voucher_status(code, voucher_id)
Check voucher status by code or ID. Public endpoint — no API key or authentication required.
Eingabe-Schema
{
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "Voucher code (e.g. LOYAL-XXXX-XXXX-XXXX-XXXX)"
},
"voucher_id": {
"type": "string",
"description": "Voucher UUID (alternative to code)"
}
}
}🟢get_platform_stats
Get global platform statistics across all merchants. Admin-only: requires agent owned by an admin wallet.
Eingabe-Schema
{
"type": "object",
"properties": {}
}🔴cancel_stale_offers(max_age_days)
Cancel marketplace offers that have been active for more than N days with no completions. Admin-only action tool.
Eingabe-Schema
{
"type": "object",
"properties": {
"max_age_days": {
"type": "number",
"description": "Cancel offers older than this many days (default: 14)"
}
}
}🟡create_personalized_offer(token_address, customer_address, title, description, bonus_tokens, ...)
Create a personalized offer for a specific customer. Use when analytics reveal engagement patterns (e.g., inactive customers, high-value segments).
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token contract address"
},
"customer_address": {
"type": "string",
"description": "Customer wallet address"
},
"title": {
"type": "string",
"description": "Offer title (e.g., 'Welcome back! 20% bonus tokens')"
},
"description": {
"type": "string",
"description": "Offer description"
},
"bonus_tokens": {
"type": "number",
"description": "Bonus tokens to award"
},
"discount_percentage": {
"type": "number",
"description": "Discount percentage (0-100)"
},
"valid_days": {
"type": "number",
"description": "How many days the offer is valid (default: 7)"
}
},
"required": [
"token_address",
"customer_address",
"title"
]
}🟡update_reward_status(reward_id, is_active)
Activate or deactivate a reward in the catalog. Use to manage reward availability based on analytics.
Eingabe-Schema
{
"type": "object",
"properties": {
"reward_id": {
"type": "string",
"description": "UUID of the reward"
},
"is_active": {
"type": "boolean",
"description": "true to activate, false to deactivate"
}
},
"required": [
"reward_id",
"is_active"
]
}🟡send_report(agent_role, report_type, title, content, priority, ...)
Send a report to the developer/owner. Use this to submit SEO audits, growth ideas, data reports, anomalies, recommendations, or weekly summaries. The report will appear in the merchant's Agent Reports dashboard.
Eingabe-Schema
{
"type": "object",
"properties": {
"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"
},
"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"
},
"action_items": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of suggested action items"
}
},
"required": [
"agent_role",
"report_type",
"title",
"content"
]
}🟢list_my_reports(status, limit)
List your previously submitted reports. Allows reviewing past reports, checking status (new/reviewed/done), and identifying what still needs attention.
Eingabe-Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Filter by status: new, reviewed, done (optional)"
},
"limit": {
"type": "number",
"description": "Max results 1-50 (default: 20)"
}
}
}🟡update_report_status(report_id, status)
Update report status to 'reviewed' or 'done'. Use 'done' when the action items have been completed. Use 'reviewed' to acknowledge a report.
Eingabe-Schema
{
"type": "object",
"properties": {
"report_id": {
"type": "string",
"description": "UUID of the report"
},
"status": {
"type": "string",
"description": "New status: reviewed or done"
}
},
"required": [
"report_id",
"status"
]
}🔴delete_report(report_id)
Delete a report that is no longer relevant. Use to clean up outdated or irrelevant reports.
Eingabe-Schema
{
"type": "object",
"properties": {
"report_id": {
"type": "string",
"description": "UUID of the report to delete"
}
},
"required": [
"report_id"
]
}⚪export_customers(token_address)
Export customer data for a specific loyalty program. Returns wallet addresses, voucher stats, balances, and tier info. Use for analytics, segmentation, and personalized offers.
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Token address of the loyalty program"
}
},
"required": [
"token_address"
]
}🟡create_gift_certificate(token_address, usd_amount, points_per_dollar, max_redemption_percent, title, ...)
Create a gift / welcome certificate (UDS-style) with a unique 6-character redemption code (LOYAL-XXXXXX). Customer redeems via QR or by entering the code; merchant then mints tokens on-chain. Use for welcome bonuses, promo campaigns, partnership gifts.
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "ERC-20 loyalty token address (must belong to the agent's merchant)"
},
"usd_amount": {
"type": "number",
"description": "Certificate face value in USD (positive)"
},
"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."
},
"title": {
"type": "string",
"description": "Display title (default: 'Gift Certificate')"
},
"description": {
"type": "string",
"description": "Optional descriptive text shown to the customer"
},
"expires_in_days": {
"type": "number",
"description": "Validity period in days (omit for no expiry)"
},
"image_url": {
"type": "string",
"description": "Optional public image URL for the cert design"
},
"quantity": {
"type": "number",
"description": "Number of certificates to create as a batch (1–100, default 1)"
}
},
"required": [
"token_address",
"usd_amount"
]
}🟢list_gift_certificates(token_address, status, limit)
List gift certificates issued by the agent's merchant (with status and redemption info).
Eingabe-Schema
{
"type": "object",
"properties": {
"token_address": {
"type": "string",
"description": "Filter by program token address (optional)"
},
"status": {
"type": "string",
"description": "Filter by status: active, pending_mint, redeemed, expired, revoked"
},
"limit": {
"type": "number",
"description": "Max rows (default 50, max 200)"
}
}
}⚪revoke_gift_certificate(certificate_id)
Revoke an active gift certificate (status active → revoked). Only the issuing merchant can revoke. Already-redeemed/minted certificates cannot be revoked.
Eingabe-Schema
{
"type": "object",
"properties": {
"certificate_id": {
"type": "string",
"description": "UUID of the certificate from create_gift_certificate / list_gift_certificates"
}
},
"required": [
"certificate_id"
]
}⚪mark_gift_certificate_minted(certificate_id, transaction_hash)
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.
Eingabe-Schema
{
"type": "object",
"properties": {
"certificate_id": {
"type": "string",
"description": "UUID of the certificate"
},
"transaction_hash": {
"type": "string",
"description": "Base L2 mint transaction hash (0x...)"
}
},
"required": [
"certificate_id",
"transaction_hash"
]
}🟢bazaar_discover_resources(q, network, limit, cursor)
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').
Eingabe-Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free-text filter matched against the resource JSON (name/description/url)"
},
"network": {
"type": "string",
"description": "Filter by network, e.g. 'base' or 'base-sepolia'"
},
"limit": {
"type": "number",
"description": "Max rows returned (default 25, max 100)"
},
"cursor": {
"type": "string",
"description": "Pagination cursor from a previous call"
}
}
}🟢bazaar_discover_mcp_servers(q, network, limit, cursor)
Discover third-party MCP servers published in Coinbase CDP's Bazaar. Read-only. Filter by free-text q and/or network.
Eingabe-Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free-text filter matched against the server JSON"
},
"network": {
"type": "string",
"description": "Filter by network, e.g. 'base'"
},
"limit": {
"type": "number",
"description": "Max rows (default 25, max 100)"
},
"cursor": {
"type": "string",
"description": "Pagination cursor"
}
}
}🟢bazaar_probe_x402(url)
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.
Eingabe-Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full https:// URL of the x402-paid endpoint"
}
},
"required": [
"url"
]
}⚪bazaar_pay_and_call(url, method, body, headers, max_usdc, ...)
Pay and call any x402-paid HTTPS endpoint using the merchant agent's CDP MPC wallet (EIP-3009 exact scheme on Base USDC). Probes the URL for HTTP 402, picks a compatible requirement, signs TransferWithAuthorization via CDP, retries with X-PAYMENT header, and returns the paid response. Requires scope 'mint' and a pre-created CDP wallet. Safety cap: max_usdc (default 0.25, hard limit 10).
Eingabe-Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Full https:// URL of the x402 resource"
},
"method": {
"type": "string",
"enum": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"
],
"description": "HTTP method (default GET)"
},
"body": {
"description": "Optional JSON request body for non-GET methods"
},
"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_networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Networks to accept (default ['base'])"
},
"allowed_schemes": {
"type": "array",
"items": {
"type": "string"
},
"description": "x402 schemes to accept (default ['exact'])"
}
},
"required": [
"url"
]
}Community
Nachweis