Loyal Spark
Base MCP (39 tools) on Base: programs, mint, rewards. lsk_ key; plan limits enforced. /for-agents
사용해야 할까요
품질 및 안전성
발견 사항 (3)
- HIGH
- LOWuse_voucher에서
- INFOcreate_gift_certificate에서
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"loyal-spark": {
"url": "https://api.loyalspark.online/loyalty-mcp"
}
}
}원격 엔드포인트
https://api.loyalspark.online/loyalty-mcpstreamable-http할 수 있는 일
도구 목록
도구 (39)
🟢get_platform_info
Get info about Loyal Spark protocol on Base L2
입력 스키마
{
"type": "object",
"properties": {}
}🟢get_my_profile
Get authenticated agent's profile
입력 스키마
{
"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.
입력 스키마
{
"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)
입력 스키마
{
"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
입력 스키마
{
"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.
입력 스키마
{
"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).
입력 스키마
{
"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).
입력 스키마
{
"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
입력 스키마
{
"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)
입력 스키마
{
"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.
입력 스키마
{
"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
입력 스키마
{
"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.
입력 스키마
{
"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
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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
입력 스키마
{
"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
입력 스키마
{
"type": "object",
"properties": {}
}🟢list_marketplace_offers(status, limit)
List active token trading offers on the marketplace
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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).
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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).
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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').
입력 스키마
{
"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.
입력 스키마
{
"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.
입력 스키마
{
"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).
입력 스키마
{
"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"
]
}커뮤니티
증거