Loyal Spark

Base MCP (39 tools) on Base: programs, mint, rewards. lsk_ key; plan limits enforced. /for-agents

사용해야 할까요

품질 및 안전성

A
설명 품질
96%
스키마 완전성
89%
이름 품질
94%
오염 위험
80%
권한 일치
100%
프로토콜 준수
100%

발견 사항 (3)

  • HIGHTool poisoning patterns detected
  • LOWTool 'use_voucher' description lacks action verbuse_voucher에서
  • INFOTool description contains placeholder or incomplete textcreate_gift_certificate에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~4,524토큰 (도구 정의)
~928 B일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 3.53%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`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"
  ]
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 39개
검증됨버전이 기록되지 않음도구 39개
검증됨버전이 기록되지 않음도구 39개