# Loyal Spark (remote · api.loyalspark.online)

Onchain loyalty MCP on Base: programs, mint, rewards, vouchers for AI agents.

- Trust score: 56/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-09

## Components

- remote · `api.loyalspark.online`: 56/100 (this document), [markdown](https://verifymcp.io/servers/aspekt19-loyal-spark/loyalty-mcp.md), [page](https://verifymcp.io/servers/aspekt19-loyal-spark/loyalty-mcp)

## Channel facts

- Endpoint: `https://api.loyalspark.online/loyalty-mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-09.

- **Endpoint Security**: 51/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 39 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS not yet verified: we couldn't determine whether a plaintext access path exists.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 3429 tokens (~87/item across 39 items; 39 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 10/100
  - Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 97/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 92% of tool parameters carry a description.
- **Capabilities**: 40/100
  - Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http aspekt19-loyal-spark https://api.loyalspark.online/loyalty-mcp
```

### Codex

```toml
[mcp_servers.aspekt19-loyal-spark]
url = "https://api.loyalspark.online/loyalty-mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "aspekt19-loyal-spark": {
      "type": "remote",
      "url": "https://api.loyalspark.online/loyalty-mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add aspekt19-loyal-spark --url https://api.loyalspark.online/loyalty-mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  aspekt19-loyal-spark:
    url: "https://api.loyalspark.online/loyalty-mcp"
```

### Other

```json
{
  "mcpServers": {
    "aspekt19-loyal-spark": {
      "type": "http",
      "url": "https://api.loyalspark.online/loyalty-mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-08 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-07 (score 55, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-08-06 (score 55)

First indexed and scored.

## MCP tools (39)

### `get_platform_info` (~20 tokens)

Get info about Loyal Spark protocol on Base L2

### `get_my_profile` (~15 tokens)

Get authenticated agent's profile

### `generate_program_defaults` (~85 tokens)

Workflow planner: field catalog, required parameters, next_actions, and non-binding examples. External agents must choose their own name, symbol, and economics.

Input parameters:

- `business_name` (string)
- `category` (string)
- `description` (string)
- `locale` (string)
- `preferred_style` (string)
- `target_audience` (string)

### `get_program_workflow_status` (~46 tokens)

Explain the next merchant action: current_step, required fields, and ordered next_actions (you provide all parameter values)

Input parameters:

- `token_address` (string): Optional token to inspect

### `list_loyalty_programs` (~34 tokens)

List loyalty programs owned by the agent's merchant

Input parameters:

- `include_expired` (boolean): Include expired programs

### `create_loyalty_program` (~318 tokens)

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.

Input parameters:

- `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.
- `auto_generate` (boolean): Internal automation only — fills missing name/symbol from examples. External agents should pass explicit name and symbol.
- `business_context` (object): Optional context for examples only
- `expiration_days` (number): Program duration in days (default: 365)
- `extra_minters` (array): (B20 only) Extra addresses to grant MINT_ROLE atomically in the same deploy tx.
- `locale` (string)
- `name` (string): Program name (required for external agents)
- `preferred_style` (string)
- `symbol` (string): Token symbol, 2-5 chars (required for external agents)
- `target_audience` (string)
- `token_standard` (string): 'b20' (default, single-tx deploy on Base precompile factory) or 'erc20' (legacy factory, requires activate_loyalty_program follow-up)

### `register_loyalty_program` (~167 tokens)

Register a deployed token as a loyalty program in the database. B20 tokens are registered as active; legacy ERC-20 as inactive (activate next).

Input parameters:

- `cashback_rate` (number): Default cashback percent for earn (1–100). Omit for DB default (5).
- `expiration_days` (number): Duration in days (default: 365)
- `name` (string, required): Program name
- `points_per_dollar` (number): Loyalty points per $1 spent (1–1000). Omit for DB default (1).
- `symbol` (string, required): Token symbol
- `token_address` (string, required): Deployed token contract address (0x...)
- `token_standard` (string): 'b20' (default) or 'erc20' (legacy)

### `activate_loyalty_program` (~53 tokens)

For legacy ERC-20 programs: returns unpauseUtility + enableMinting calldata. For B20 programs: no-op (already active).

Input parameters:

- `token_address` (string, required): Token contract address (0x...)

### `update_program_status` (~48 tokens)

Update program status in database after onchain activation/pause

Input parameters:

- `status` (string, required): New status: active, paused, or inactive
- `token_address` (string, required): Token contract address

### `update_program_config` (~97 tokens)

Update default cashback_rate and/or points_per_dollar for a program (same as merchant dashboard sliders)

Input parameters:

- `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.
- `token_address` (string, required): Token contract address (0x...)

### `list_rewards` (~53 tokens)

List rewards for a loyalty program by token_address. Includes redemption metrics (total vouchers issued, redeemed, and last-30-day counts) for each reward.

Input parameters:

- `token_address` (string, required): Token contract address (0x...)

### `create_reward` (~58 tokens)

Create a new reward redeemable with loyalty tokens

Input parameters:

- `cost` (number, required): Token cost to redeem
- `description` (string): Reward description
- `name` (string, required): Reward name
- `token_address` (string, required): Token contract address

### `mint_loyalty_tokens` (~139 tokens)

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.

Input parameters:

- `amount` (number, required): Tokens to mint
- `recipient` (string, required): Recipient wallet (0x...)
- `token_address` (string, required): Token contract address

### `transfer_loyalty_tokens` (~56 tokens)

Get calldata to transfer loyalty tokens between wallets

Input parameters:

- `amount` (number, required): Tokens to transfer
- `to` (string, required): Recipient wallet (0x...)
- `token_address` (string, required): Token contract address (0x...)

### `earn_points` (~152 tokens)

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.

Input parameters:

- `cashback_rate` (number): Override cashback rate (%). If omitted, uses the program's default rate.
- `customer_address` (string, required): Customer wallet (0x...)
- `purchase_amount` (number, required): Purchase amount in currency units (e.g. dollars)
- `token_address` (string, required): Token contract address (0x...)

### `confirm_mint_fee` (~102 tokens)

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.

Input parameters:

- `fee_tx_hash` (string, required): Transaction hash of the protocol fee mint
- `obligation_id` (string, required): fee_obligation_id returned by mint_loyalty_tokens or earn_points
- `recipient_tx_hash` (string): Optional transaction hash of the recipient mint

### `get_token_balance` (~41 tokens)

Get loyalty token balance and tier info for a customer

Input parameters:

- `customer_address` (string, required): Customer wallet
- `token_address` (string, required): Token contract address

### `get_program_analytics` (~17 tokens)

Get analytics for your loyalty programs

### `list_marketplace_offers` (~48 tokens)

List active token trading offers on the marketplace

Input parameters:

- `limit` (number): Max results (1-100)
- `status` (string): Filter: active/completed/cancelled

### `redeem_reward` (~78 tokens)

Redeem a reward by providing a verified token transfer transaction hash. Creates a voucher for the customer.

Input parameters:

- `customer_address` (string, required): Wallet address of the customer who transferred tokens
- `reward_id` (string, required): UUID of the reward to redeem
- `transaction_hash` (string, required): Onchain tx hash of the token transfer from customer to merchant

### `use_voucher` (~65 tokens)

Mark a voucher as used (redeemed by customer at merchant). Merchant-only operation.

Input parameters:

- `voucher_code` (string): Voucher code (e.g. LOYAL-XXXX-XXXX-XXXX-XXXX)
- `voucher_id` (string): Voucher UUID (alternative to code)

### `check_voucher_status` (~66 tokens)

Check voucher status by code or ID. Public endpoint — no API key or authentication required.

Input parameters:

- `code` (string): Voucher code (e.g. LOYAL-XXXX-XXXX-XXXX-XXXX)
- `voucher_id` (string): Voucher UUID (alternative to code)

### `get_platform_stats` (~28 tokens)

Get global platform statistics across all merchants. Admin-only: requires agent owned by an admin wallet.

### `cancel_stale_offers` (~54 tokens)

Cancel marketplace offers that have been active for more than N days with no completions. Admin-only action tool.

Input parameters:

- `max_age_days` (number): Cancel offers older than this many days (default: 14)

### `create_personalized_offer` (~136 tokens)

Create a personalized offer for a specific customer. Use when analytics reveal engagement patterns (e.g., inactive customers, high-value segments).

Input parameters:

- `bonus_tokens` (number): Bonus tokens to award
- `customer_address` (string, required): Customer wallet address
- `description` (string): Offer description
- `discount_percentage` (number): Discount percentage (0-100)
- `title` (string, required): Offer title (e.g., 'Welcome back! 20% bonus tokens')
- `token_address` (string, required): Token contract address
- `valid_days` (number): How many days the offer is valid (default: 7)

### `update_reward_status` (~54 tokens)

Activate or deactivate a reward in the catalog. Use to manage reward availability based on analytics.

Input parameters:

- `is_active` (boolean, required): true to activate, false to deactivate
- `reward_id` (string, required): UUID of the reward

### `send_report` (~160 tokens)

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.

Input parameters:

- `action_items` (array): List of suggested action items
- `agent_role` (string, required): Your role: ceo, seo, growth, or analyst
- `content` (string, required): Report body text (max 10000 chars)
- `priority` (string): Priority: low, medium, high, or critical
- `report_type` (string, required): Type: seo_audit, growth_idea, data_report, anomaly, task, recommendation, or weekly_report
- `title` (string, required): Report title (max 500 chars)

### `list_my_reports` (~73 tokens)

List your previously submitted reports. Allows reviewing past reports, checking status (new/reviewed/done), and identifying what still needs attention.

Input parameters:

- `limit` (number): Max results 1-50 (default: 20)
- `status` (string): Filter by status: new, reviewed, done (optional)

### `update_report_status` (~68 tokens)

Update report status to 'reviewed' or 'done'. Use 'done' when the action items have been completed. Use 'reviewed' to acknowledge a report.

Input parameters:

- `report_id` (string, required): UUID of the report
- `status` (string, required): New status: reviewed or done

### `delete_report` (~40 tokens)

Delete a report that is no longer relevant. Use to clean up outdated or irrelevant reports.

Input parameters:

- `report_id` (string, required): UUID of the report to delete

### `export_customers` (~55 tokens)

Export customer data for a specific loyalty program. Returns wallet addresses, voucher stats, balances, and tier info. Use for analytics, segmentation, and personalized offers.

Input parameters:

- `token_address` (string, required): Token address of the loyalty program

### `create_gift_certificate` (~258 tokens)

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.

Input parameters:

- `description` (string): Optional descriptive text shown to the customer
- `expires_in_days` (number): Validity period in days (omit for no expiry)
- `image_url` (string): Optional public image URL for the cert design
- `max_redemption_percent` (number): Max % of any future purchase the customer can pay with these tokens (5–100). Default 50.
- `points_per_dollar` (number): Optional override of program rate (e.g. 10 = 10 tokens per $1). Defaults to program's points_per_dollar.
- `quantity` (number): Number of certificates to create as a batch (1–100, default 1)
- `title` (string): Display title (default: 'Gift Certificate')
- `token_address` (string, required): ERC-20 loyalty token address (must belong to the agent's merchant)
- `usd_amount` (number, required): Certificate face value in USD (positive)

### `list_gift_certificates` (~81 tokens)

List gift certificates issued by the agent's merchant (with status and redemption info).

Input parameters:

- `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)

### `revoke_gift_certificate` (~63 tokens)

Revoke an active gift certificate (status active → revoked). Only the issuing merchant can revoke. Already-redeemed/minted certificates cannot be revoked.

Input parameters:

- `certificate_id` (string, required): UUID of the certificate from create_gift_certificate / list_gift_certificates

### `mark_gift_certificate_minted` (~78 tokens)

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.

Input parameters:

- `certificate_id` (string, required): UUID of the certificate
- `transaction_hash` (string, required): Base L2 mint transaction hash (0x...)

### `bazaar_discover_resources` (~128 tokens)

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').

Input parameters:

- `cursor` (string): Pagination cursor from a previous call
- `limit` (number): Max rows returned (default 25, max 100)
- `network` (string): Filter by network, e.g. 'base' or 'base-sepolia'
- `q` (string): Free-text filter matched against the resource JSON (name/description/url)

### `bazaar_discover_mcp_servers` (~95 tokens)

Discover third-party MCP servers published in Coinbase CDP's Bazaar. Read-only. Filter by free-text q and/or network.

Input parameters:

- `cursor` (string): Pagination cursor
- `limit` (number): Max rows (default 25, max 100)
- `network` (string): Filter by network, e.g. 'base'
- `q` (string): Free-text filter matched against the server JSON

### `bazaar_probe_x402` (~68 tokens)

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.

Input parameters:

- `url` (string, required): Full https:// URL of the x402-paid endpoint

### `bazaar_pay_and_call` (~232 tokens)

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).

Input parameters:

- `allowed_networks` (array): Networks to accept (default ['base'])
- `allowed_schemes` (array): x402 schemes to accept (default ['exact'])
- `body`: Optional JSON request body for non-GET methods
- `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)
- `method` (string): HTTP method (default GET)
- `url` (string, required): Full https:// URL of the x402 resource

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/aspekt19-loyal-spark/loyalty-mcp#diagnostics

## Score history

- 2026-08-09: 56
- 2026-08-08: 56
- 2026-08-07: 55
- 2026-08-06: 55

## Links

- Remote endpoint: https://api.loyalspark.online/loyalty-mcp
- Authorisation metadata: https://api.loyalspark.online/.well-known/oauth-protected-resource/loyalty-mcp
- Repository: https://github.com/aspekt19/unboxed-loyalty-spark
- Website: https://loyalspark.online/
- Changelog RSS feed: https://verifymcp.io/servers/aspekt19-loyal-spark/loyalty-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/aspekt19-loyal-spark/loyalty-mcp.json
- HTML version of this page: https://verifymcp.io/servers/aspekt19-loyal-spark/loyalty-mcp
