Skip to main content
Glama

Loyal Spark — Onchain Loyalty Protocol

A Web3-powered loyalty platform built on Base Mainnet: merchants and AI agents create onchain loyalty programs (B20 by default), mint points, manage rewards/vouchers, and automate the loop via REST, MCP, and pay-per-call gateways (x402 / MPP).

Overview

Loyal Spark revolutionizes traditional loyalty programs by bringing them onchain. It operates as a dual-mode platform: humans interact via the web UI with flexible authentication (email, phone, social login, or wallet), while AI agents interact via REST API or MCP Server — sharing the same database, smart contracts, and tokens.

Wallet Abstraction: Users and merchants sign in via Privy — email, phone/SMS, Google, or external wallets (MetaMask, WalletConnect, Coinbase Wallet). Privy automatically creates an embedded wallet on Base — no crypto experience needed. Farcaster miniapp and SIWE for crypto-native users are also fully supported. Merchants can send tokens to customers by email or phone number (resolved to wallet address automatically).

┌─────────────────────────────────────────────────┐
│              Loyal Spark Platform                │
│                                                  │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐   │
│  │  Web UI   │    │ REST API │    │MCP Server│   │
│  │ (humans)  │    │ (agents) │    │ (agents) │   │
│  └─────┬─────┘    └─────┬────┘    └─────┬────┘   │
│        │                │               │        │
│        ▼                ▼               ▼        │
│  ┌──────────────────────────────────────────┐    │
│  │        Backend (Edge Functions)           │    │
│  │    Auth · RLS · DB · Realtime             │    │
│  └─────────────────┬────────────────────────┘    │
│                    │                             │
│        ┌───────────┴───────────┐                 │
│        ▼                       ▼                 │
│  ┌──────────┐          ┌──────────────┐          │
│  │ Base L2  │          │ CDP Server   │          │
│  │ Contracts│          │ Wallet (MPC) │          │
│  └──────────┘          └──────────────┘          │
└─────────────────────────────────────────────────┘

Related MCP server: Free USDC Transfer MCP Server

Features

For Merchants (Web UI)

  • Deploy Loyalty Tokens: Create custom loyalty tokens on Base (B20 default; legacy ERC-20 via API)

  • Mint Tokens: Issue loyalty points to customers via wallet addresses or QR scan

  • Create Rewards: Design voucher rewards with token costs

  • CRM & Analytics: Customer profiles, RFM segmentation, tier management

  • Marketing Automation: Automated campaigns, personalized offers

  • Referral Programs: Generate referral codes with bonuses

  • Voucher Management: Track redemptions with QR code verification

  • AI Agent Management: Register agents, manage API keys, monitor activity

  • Team & branches: Invite cashiers/managers by wallet or one-time invite code (redeem on Merchant → Team); requires Postgres RPC accept_merchant_invite — see docs/development/PORTALS_AND_TEAM.md

For Customers (Web UI)

  • Multi-Token Dashboard: View all loyalty tokens from different merchants

  • Browse Rewards: Explore available vouchers across all programs

  • Redeem Vouchers: Burn tokens to claim exclusive rewards with QR codes

  • Tier System: Bronze → Silver → Gold → Platinum with increasing perks

  • Frozen modules (not product promises): marketplace/ (DEX) and roundup/ (DeFi) remain in the tree but are explicitly frozen — no active development

For AI Agents (REST API + MCP)

  • Full CRUD via API: Create programs, mint tokens, manage rewards, view analytics

  • MCP Server: Connect Claude, GPT, Cursor, or any MCP-compatible LLM directly

  • Server Wallets: Coinbase CDP MPC wallets for autonomous onchain operations

  • Scoped Permissions: Granular access control (read, mint, manage_rewards, trade)

  • Activity Logging: Full audit trail of all agent operations

  • Tiered Pricing (agents): Free (200 calls/mo, 1 agent, 1,000 tokens minted/mo, 1.25% mint fee) → Pro ($49/mo, 0.5%) → Enterprise ($129/mo, 0.25%) — subscriptions in USDC, mint fee in loyalty tokens; see docs/business/MONETIZATION_AND_PRICING.md

  • Skills Documentation: 16 structured step-by-step guides (0015 under /.well-known/skills/) for agent onboarding, B20 semantics, and payment rails

Technology Stack

Layer

Technology

Frontend

React 18, TypeScript, Vite, Tailwind CSS, shadcn/ui (Radix)

Animations

Framer Motion

Blockchain

Wagmi v2, Viem, RainbowKit, Privy (@privy-io/react-auth + @privy-io/wagmi)

Network

Base Mainnet (Chain ID: 8453)

Smart Contracts

Base-native B20 Asset precompile + legacy ERC-20 factory

Backend

Supabase (PostgreSQL, RLS, Deno Edge Functions, Realtime)

Native apps

Capacitor 8 (iOS / Android) — see docs/development/NATIVE_BUILD_GUIDE.md

Agent Wallets

Coinbase CDP MPC (Server Wallets)

State

TanStack Query v5

Routing

React Router DOM v6

Forms

React Hook Form + Zod validation

Builder Attribution

Base Builder Code (ERC-8021)

Smart Contract Architecture

New loyalty programs (default) deploy via Base’s native B20 factory precompile — one transaction, active immediately after register-program. Legacy programs use the Loyal Spark ERC-20 factory below (token_standard: "erc20" in API only). Full flows: docs/development/LOYALTY_PROGRAM_CONTRACTS.md.

Role

Address

When

B20 Factory (Base precompile)

0xB20f000000000000000000000000000000000000

DefaultcreateB20 → token 0xB200…

LoyaltyTokenFactory (legacy)

0x5F3DdBa12580CFdc6016258774cCc19C4250dA80

Opt-in erc20createLoyaltyToken + activation

LoyalSparkERC20 (implementation)

0xe6BA426C9c51281B929a17444De02c65815E27C3

Logic for legacy proxy tokens

LoyaltyTokenEscrow (P2P)

0xA569C95AfC1BCF381c48BcF336ED9D2c014bcdDF

Marketplace swaps

Network: Base Mainnet (Chain ID: 8453)

Program creation (summary)

Path

Deploy

Activate

Portal

B20 (default)

createB20 on 0xB20f…

Not required

Yes

Legacy ERC-20

createLoyaltyToken on 0x5F3DdB…

unpauseUtility + enableMinting

API only

Token operations (both standards)

B20 tokens are ERC-20–compatible for balances, transfers, mint, and escrow:

  • mint(address to, uint256 amount) — issue points (role-gated)

  • transfer / transferFrom — move tokens between wallets

  • balanceOf(address) — query balance

AI Agent Integration

Quick Start

Merchant dashboard:

  1. Go to loyalspark.online/merchant and sign in (email, phone, Google, or wallet via Privy)

  2. Open AI Agents tab → Register an agent → Copy your API key (lsk_...)

  3. Use the key in x-api-key header for REST or MCP calls

Without the web app (autonomous agents): free lsk_ via wallet signature — Edge Function agent-register-siwe + nonce from siwe-nonce. See docs/agents/AUTONOMOUS_AGENT_REGISTRATION.md and docs/agents/QUICKSTART.md.

Optional repo scripts (development / agent onboarding)

These directories are not imported by the web app; they are optional helpers for developers and agents reproducing flows locally. Secrets stay in environment variables only.

Folder

Purpose

scripts/x402-paid-mcp-test/

Smoke test: paid MCP via x402 (USDC on Base, @x402/fetch).

scripts/x402-paid-agent-api/

Same stack, paid agent-api routes (GET/POST to x402-gateway/<resource>).

scripts/traffic-bot-x402-bridge.py

Example Python → Node subprocess hook for bots that already send loyalty txs on Base.

scripts/agent-register-siwe/

Helper: build SIWE message + sign + call agent-register-siwe (same as production).

Schemas for paid MCP: merchant mcp-tools/<name>mcp-bazaar-tools.ts; recipient recipient-mcp-tools/<name>recipient-mcp-bazaar-tools.ts. HTTP 402 accepts + Coinbase x402 Bazaar discovery metadata for all paid routes are built in x402-bazaar-accept.ts. These scripts are not linked from the marketing homepage; primary onboarding remains /for-agents and the merchant portal.

REST API

# List loyalty programs
curl -H "x-api-key: lsk_YOUR_KEY" \
  https://api.loyalspark.online/agent-api/programs

# Mint tokens — returns a fee-first calls[] bundle (1.25% fee on Free plan,
# minted in your own loyalty tokens); settle it via POST /agent-api/mint/confirm
curl -X POST \
  -H "x-api-key: lsk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"token_address":"0x...","recipient_address":"0x...","amount":100}' \
  https://api.loyalspark.online/agent-api/mint

API Endpoints (28 authenticated + 1 public)

All routes below require x-api-key: lsk_... except GET /vouchers/status (public). Canonical catalogue: public/.well-known/agent.json (must match supabase/functions/agent-api/index.ts).

Method

Path

Scope

Description

GET

/me

authenticated

Agent profile & permissions

GET

/workflow/program-status

read

Autonomous planner: lifecycle step + next_actions[]

GET

/programs

read

List loyalty programs

POST

/workflow/generate-program-defaults

read, mint, or create_program

Propose program name, symbol, economics, and starter rewards from business context

POST

/programs

mint or create_program

Calldata to deploy loyalty token (B20 default, or legacy ERC-20 with token_standard: "erc20")

POST

/register-program

mint or create_program

Register deployed token (optional cashback_rate, points_per_dollar)

POST

/update-program-config

mint or create_program

Update cashback_rate / points_per_dollar for a program

POST

/activate-program

mint or create_program

Legacy ERC-20 activation only (no-op for B20)

POST

/program-status

mint or create_program

Update program status

GET

/rewards

read

List rewards

POST

/rewards

manage_rewards

Create reward

POST

/mint

mint

Fee-first mint calls[] + fee_obligation_id

POST

/mint/confirm

mint

Settle protocol fee after mint/earn (obligation_id + fee_tx_hash)

POST

/earn

mint

Cashback: mint from purchase amount × rate (same fee-first + confirm)

POST

/transfer

mint

Transfer tokens

GET

/balance

read

Token balance & tier

GET

/customers

read

Customer list

GET

/vouchers

read

List vouchers

GET

/vouchers/status

public

Check voucher status (no API key)

POST

/redeem-reward

read

Redeem reward → create voucher

POST

/vouchers/use

manage_rewards

Mark voucher as used

GET

/analytics

read

Program analytics

GET

/offers

read

Marketplace offers

POST

/offers

trade

Create P2P offer

POST

/accept-offer

trade

Accept P2P offer

POST

/cancel-offer

trade

Cancel P2P offer

GET

/tx-receipt

authenticated

Extract token_address from deploy tx

GET

/merchant-profile

read

Read merchant profile

POST

/merchant-profile

manage_rewards

Create or update merchant profile (PUT also accepted)

MCP Server (for LLMs)

Connect Claude, GPT, or any MCP-compatible agent:

{
  "mcpServers": {
    "loyal-spark": {
      "url": "https://api.loyalspark.online/loyalty-mcp",
      "headers": {
        "x-api-key": "lsk_YOUR_KEY"
      }
    }
  }
}

MCP tools (39) — defined in supabase/functions/loyalty-mcp/index.ts:
get_platform_info, get_my_profile, generate_program_defaults, get_program_workflow_status, list_loyalty_programs, create_loyalty_program, register_loyalty_program, activate_loyalty_program, update_program_status, update_program_config, list_rewards, create_reward, mint_loyalty_tokens, transfer_loyalty_tokens, earn_points, confirm_mint_fee, get_token_balance, get_program_analytics, list_marketplace_offers, redeem_reward, use_voucher, check_voucher_status, get_platform_stats, cancel_stale_offers, create_personalized_offer, update_reward_status, export_customers, send_report, list_my_reports, update_report_status, delete_report, create_gift_certificate, list_gift_certificates, revoke_gift_certificate, mark_gift_certificate_minted, bazaar_discover_resources, bazaar_discover_mcp_servers, bazaar_probe_x402, bazaar_pay_and_call (confirm_mint_fee = lsk_-only fee settlement, not x402-priced; last four = Bazaar side-car).

Base MCP custom plugin (send_calls-ready calldata)

For AI users already connected to Base MCP (mcp.base.org), Loyal Spark ships GET-friendly calldata endpoints at https://api.loyalspark.online/agent-prepare/*. Each response returns a send_calls-compatible transaction batch with Builder Code bc_wdmnog7m already appended (ERC-8021). Base Account signs and broadcasts.

Actions: create-program, activate-program, mint, transfer (merchant, lsk_) · recipient-transfer, recipient-approve (holder, rwk_).

# Prepare a mint (returns { transactions: [{to,data,value}], … } for send_calls)
curl -H "x-api-key: lsk_YOUR_KEY" \
  "https://api.loyalspark.online/agent-prepare/mint?token=0xTOKEN&to=0xCUSTOMER&amount=100"

Plugin spec: skills/loyal-spark/plugins/loyal-spark.md.

Recipient agents (wallet holders, rwk_)

For AI agents that only hold a wallet which receives loyalty tokens (not merchant operators). Humans are unchanged; this is an optional machine path.

Piece

URL / path

REST

https://api.loyalspark.online/recipient-api

MCP

https://api.loyalspark.online/recipient-loyalty-mcp

Register key

POST …/recipient-api/register with SIWE { message, signature } (nonce from siwe-nonce) — returns rwk_… once. Pass Supabase apikey (anon/publishable) header like other public functions.

REST (14 routes; all require x-api-key: rwk_… except register): GET /me, GET /balances, GET /balance?token_address=, GET /rewards?token_address=, GET /vouchers, GET /workflow/reward-status, POST /register (SIWE), POST /redeem-reward with { reward_id, transaction_hash } (customer is always the bound wallet), POST /prepare-transfer with { token_address, to, amount }, POST /workflow/prepare-reward-redemption. P2P: GET /offers?token_address=, POST /offers, POST /accept-offer, POST /cancel-offer (same bodies as merchant agent-api marketplace; creator_address is the bound wallet).

MCP tools (20)supabase/functions/recipient-loyalty-mcp/index.ts: get_recipient_profile, list_my_loyalty_balances, get_my_loyalty_balance, get_reward_workflow_status, prepare_reward_redemption, prepare_loyalty_token_transfer, list_rewards_for_program, list_my_vouchers, redeem_my_reward, list_p2p_offers, create_p2p_offer, accept_p2p_offer, cancel_p2p_offer, lookup_gift_certificate, claim_gift_certificate, list_my_gift_certificates, bazaar_discover_resources, bazaar_discover_mcp_servers, bazaar_probe_x402, bazaar_pay_and_call (last four = Bazaar side-car; bazaar_pay_and_call requires opt-in delegated CDP wallet).

Pay-per-call (recipient, MPP / x402): Autonomous agents that should pay USDC per request use the same gateways as merchants: mpp-gateway/recipient-api/… (Tempo MPP) or x402-gateway/recipient-api/… and x402-gateway/recipient-mcp-tools/<tool> (x402). USD prices match the merchant corridor (reads ~$0.001, writes ~$0.005–0.01; prepare-transfer / prepare_loyalty_token_transfer $0.005). Canonical tables: docs/business/MONETIZATION_AND_PRICING.md §4.1 · source constants: supabase/functions/_shared/recipient-paid-routes.ts, recipient-mcp-bazaar-tools.ts. Direct functions/v1/recipient-api / recipient-loyalty-mcp calls use rwk_ + rate limits only (no per-request USDC in the gateway layer).

Example MCP fragment: examples/recipient-agent-mcp/cursor-mcp.json.

Agent Discovery

AI agents can discover the protocol automatically via:

  • /.well-known/agent.json — Full protocol specification, capabilities, pricing

  • /.well-known/skills/ — 16 structured Skills (0015, step-by-step guides)

  • /api-docs — Interactive API documentation

Skills for AI Agents

Structured Markdown guides that teach agents how to use the protocol:

#

Skill

Description

00

Getting Started

Register agent (merchant UI or SIWE), get lsk_, first request

01

Create Loyalty Program

Deploy B20 loyalty token on Base (legacy ERC-20 optional)

02

Mint Tokens

Mint tokens to customer wallets

03

Transfer Tokens

Transfer tokens between wallets

04

Manage Rewards

Create redeemable rewards catalog

05

Balance & Tiers

Check balances and tier status

06

Marketplace Trading

P2P token trading with atomic escrow

07

Analytics & CRM

Program analytics and CRM data

08

Referrals

Referral programs for organic growth

09

Vouchers

Voucher lifecycle management

10

Server Wallets

CDP MPC wallets for autonomous transactions

11

Earn Points (Cashback)

Mint from purchase amount × cashback rate

12

Gift Certificates

Issue, claim, and mint LOYAL-XXXXXX certificates

13

Endpoint Workflows

Multi-step REST/MCP flows and prerequisites

14

B20 Native Spec

Base Beryl B20 Asset semantics for loyalty tokens

15

Payment Scenarios

x402 exact, MPP, subscriptions, spend policies

Installable skill bundle (CLI): npx skills add aspekt19/unboxed-loyalty-spark --skill loyal-spark — source in skills/loyal-spark/.

Skills index: https://loyalspark.online/.well-known/skills/index.md

Server Wallets (CDP MPC)

Agents can create their own Coinbase MPC wallets on Base for autonomous transactions:

curl -X POST \
  -H "x-api-key: lsk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"create_wallet"}' \
  https://api.loyalspark.online/agent-wallet

Benefits:

  • No private key management — keys are in Coinbase's secure enclave

  • Server-side transaction signing

  • Automatic Builder Code attribution (ERC-8021)

Pricing

Plan

Monthly

API Calls

Agents

Mint fee

Mint cap

Free

$0

200

1

1.25%

1,000 tokens/mo

Pro

$49 USDC

10,000

5

0.5%

Unlimited

Enterprise

$129 USDC

Unlimited

Unlimited

0.25%

Unlimited

Merchant SaaS (portal): Starter $39 / Growth $79 / Scale $149 per month (annual discount 15–20% optional) — details in docs/business/MONETIZATION_AND_PRICING.md.

Payments for agent plans on-chain in USDC on Base ($1 = 1 USDC). Plan limits (API calls, agent seats, Free-tier mint cap) are enforced server-side in Edge Functions — see MONETIZATION_AND_PRICING.md.

Mint fee is not USDC. It is charged in the merchant's own loyalty tokens — a second mint(address,uint256) to the platform fee wallet on the same token contract, returned first in the calls[] bundle. The token contract has no mintWithFee, so settlement is tracked off-chain: each prepared mint creates a fee obligation, and 5+ obligations unpaid for over 60 minutes block further mints with HTTP 402. Confirm with POST /agent-api/mint/confirm.

Getting Started

Prerequisites

  • Node.js 18+ or Bun

  • An email, phone number, Google account, or Web3 wallet (MetaMask, Coinbase Wallet, WalletConnect)

  • Some ETH on Base for gas fees (merchants only)

Installation

git clone https://github.com/aspekt19/unboxed-loyalty-spark.git
cd unboxed-loyalty-spark
npm install
npm run dev

Sign In Options

  • Email / Phone / Google (recommended): Click "Sign In" via Privy — an embedded wallet is created automatically, no crypto knowledge needed

  • MetaMask / Coinbase Wallet / WalletConnect: Traditional Web3 wallet connection

  • Farcaster: Auto-connects inside Warpcast miniapp

On Merchant and Customer portals, use the header Sign In / wallet control until a session exists; the Profile control appears only after you are signed in. See docs/development/PORTALS_AND_TEAM.md.

Network: Base Mainnet (Chain ID: 8453) | RPC: https://mainnet.base.org | Explorer: https://basescan.org

Project Structure

unboxed-loyalty-spark/
├── AGENTS.md                      # Entry map for AI / coding agents
├── docs/                          # Human docs (guides, integrations, pitch notes)
│   ├── development/               # Build & deploy
│   ├── integrations/              # Farcaster, OpenServ, A2A, prompts
│   ├── pitch-deck/                # Investor deck (Markdown sources)
│   └── supabase/                  # DB/edge runbooks
├── src/
│   ├── components/
│   │   ├── ui/                    # shadcn/ui library
│   │   ├── agents/                # AI agent management
│   │   ├── rewards/               # Rewards & vouchers
│   │   ├── crm/                   # CRM & analytics
│   │   ├── marketing/             # Campaigns
│   │   ├── automation/            # Marketing automation
│   │   ├── tiers/                 # Customer tiers
│   │   ├── referral/              # Referral programs
│   │   ├── roundup/               # DeFi investment (frozen)
│   │   ├── marketplace/           # Token trading (frozen)
│   │   ├── reviews/               # Customer reviews
│   │   ├── onboarding/            # Welcome flows & tours
│   │   ├── merchant/              # Merchant shell & tabs (Team, Programs, …)
│   │   ├── team/                  # Branches, employees, invite redemption
│   │   └── admin/                 # Platform administration
│   ├── hooks/                     # Data fetching (TanStack Query + Supabase) — keep queries here
│   ├── config/                    # Contract addresses & ABIs
│   ├── contexts/                  # Auth context
│   ├── integrations/supabase/     # Database client & types
│   ├── pages/                     # Routes (e.g. ForAgentsPage → /for-agents, ApiDocsPage → /api-docs)
│   └── lib/                       # Utilities
├── examples/agent-mcp/            # Copy-paste MCP + curl for agents
├── scripts/                       # Optional dev helpers (x402 MCP smoke test, SIWE lsk_ helper) — not bundled in the web app
├── public/
│   ├── .well-known/
│   │   ├── agent.json             # AI agent discovery
│   │   ├── skills/                # Markdown skills for agents (00–12)
│   │   └── farcaster.json         # Farcaster manifest
│   ├── openapi.json               # OpenAPI 3.1 (API + x402 hints)
│   ├── llms.txt / llms-full.txt   # Short / long summaries for LLM crawlers
│   └── media-kit/                 # Brand & press assets
├── capacitor.config.ts            # Native app IDs (see docs/development/)
├── contracts/                     # Solidity contracts
├── supabase/
│   ├── functions/                 # Edge Functions — see supabase/functions/README.md
│   └── migrations/                # Database migrations
└── README.md

Indexes: AGENTS.md (AI agents) · docs/README.md (human guides) · docs/development/PORTALS_AND_TEAM.md (portal UI & team invites) · supabase/functions/README.md (Edge Functions).

Edge Functions

See the supabase/functions/README.md catalogue (grouped by role: API, MCP, auth, payments, jobs). The root README table is intentionally shortened here to avoid duplication.

Security

  • Flexible Authentication: Email/phone/Google via Privy (with embedded wallets), or SIWE for Farcaster and crypto-native users

  • API Key Auth: SHA-256 hashed keys with lsk_ prefix for agents

  • Row Level Security: All database tables protected with RLS policies

  • Scoped Permissions: Agents operate within granted scopes only

  • MPC Wallets: Private keys never leave Coinbase's secure enclave

  • Rate Limiting: Per-agent rate limits prevent abuse

  • Builder Code Attribution: All transactions tagged with ERC-8021 builder code

Builder Code

All on-chain transactions are tagged with Base Builder Code bc_wdmnog7m (ERC-8021 format) for analytics visibility in base.dev.

For AI Agents

Loyal Spark is a machine-payment-native API. AI agents can discover, authenticate, and pay for API calls without human intervention.

Discovery Endpoints

Resource

URL

Purpose

Agent onboarding (web)

/for-agents

Keys, REST, MCP, gateways, discovery — one page for builders

Agent Manifest

/.well-known/agent.json

Full protocol spec, capabilities, pricing

MPP Manifest

/.well-known/mpp.json

Machine Payment Protocol manifest

OpenAPI Spec

/openapi.json

OpenAPI 3.1.0 with x-payment-info

Skills Library

/.well-known/skills/

16 step-by-step guides for agents (0015)

LLMs.txt

/llms.txt

Protocol summary for LLM crawlers

Prompt Guide

PROMPT_GUIDE.md

Ready-to-use system prompts

Copy-paste MCP / curl

examples/agent-mcp/

Starter configs in the repo

Repo quickstart (keys, SIWE, x402)

docs/agents/QUICKSTART.md

Short paths for coding agents

Payment Gateways (pay per call — no subscription)

Agents can pay per request with onchain micropayments instead of a monthly plan. Write actions still need a free lsk_ or rwk_ key for identity and scopes; x402/MPP cover the per-call USDC/pathUSD fee only.

Protocol

Network

Asset

Gateway

x402 exact

Base

USDC

https://api.loyalspark.online/x402-gateway

MPP

Tempo

pathUSD / USDC

https://api.loyalspark.online/mpp-gateway

Pricing: $0.001–$0.005 per read · $0.005–$0.05 per write · HTTP 402 challenge/response flow.

Paid MCP (merchant): POST …/x402-gateway/mcp-tools/<tool_name> (JSON-RPC tools/call); after settlement, pass x-api-key: lsk_… like direct MCP. Recipient / holder MCP: POST …/x402-gateway/recipient-mcp-tools/<tool_name> with x-api-key: rwk_…. Tool lists + JSON Schemas: mcp-bazaar-tools.ts · recipient-mcp-bazaar-tools.ts. 402 + Bazaar (discovery) metadata for both families: x402-bazaar-accept.ts (extensions.bazaar, outputSchema.input.type: "mcp"). After successful settle, the CDP facilitator may return EXTENSION-RESPONSES (bazaar.status: success | processing | rejected).

Catalogues & Registries

  • Official MCP Registryio.github.aspekt19/loyal-spark (remote Streamable HTTP → api.loyalspark.online/loyalty-mcp; see root server.json)

  • mppscan.com — MPP service scanner (indexed via OpenAPI)

  • glama.ai — MCP server directory

  • mcp.so — MCP server registry

  • smithery.ai — MCP marketplace (loyalspark/loyalty-protocol)

Built With

  • Base — Ethereum L2 by Coinbase

  • Privy — Wallet Abstraction & Authentication

  • Coinbase CDP — MPC Server Wallets (for AI agents)

  • Wagmi — React Hooks for Ethereum

  • shadcn/ui — UI Components

  • Lovable — Full-Stack Development Platform

  • Viem — TypeScript Interface for Ethereum

License

MIT License — see LICENSE file for details.

Available Tools

17 tools
activate_loyalty_programAInspect

Get activation calldata (unpauseUtility + enableMinting) for an inactive program

ParametersJSON Schema
NameRequiredDescriptionDefault
token_addressYesToken contract address (0x...)

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the burden of explaining behavior. It successfully clarifies that this returns calldata (transaction data) rather than executing the activation itself, and discloses the specific operations involved. However, it omits safety considerations, error conditions (e.g., already active programs), or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, efficient sentence with high information density. The parenthetical technical details (unpauseUtility + enableMinting) are precisely placed to clarify the calldata content without verbosity. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given low complexity (1 param, no nesting) and no output schema, the description adequately explains the return value (calldata) and the target state. It meets the minimum requirements for this tool's complexity level, though annotations or error conditions would improve it further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3. The description adds implicit context that token_address refers to an inactive program's contract, but does not elaborate on parameter format beyond the schema's '0x...' notation or provide examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'Gets activation calldata' using specific technical terms (unpauseUtility + enableMinting) and specifies the target resource (inactive program). However, it does not explicitly differentiate from the sibling tool update_program_status, which could create selection ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies preconditions by specifying 'for an inactive program,' but provides no explicit guidance on when to use this versus update_program_status or other sibling tools, and does not state what happens if the program is already active.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_voucher_statusAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoVoucher code (e.g. LOYAL-XXXX-XXXX-XXXX-XXXX)
voucher_idNoVoucher UUID (alternative to code)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the burden. It discloses that the endpoint is public and requires no authentication, which is valuable. However, it does not explicitly state that it is read-only, nor does it mention error handling, rate limits, or response format. The 'check' wording implies safety but doesn't confirm it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the core purpose. The second sentence adds a useful fact (public endpoint) without fluff. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only tool with no output schema, the description covers the essential aspects: what it does, how to invoke it, and authentication requirements. It lacks details on output format, but this is likely acceptable for a status check tool. The absence of explicit read-only disclosure is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear descriptions for both 'code' and 'voucher_id'. The description's mention of 'by code or ID' aligns with the schema but adds no new semantic depth. Baseline of 3 is appropriate for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Check voucher status by code or ID.' It uses a specific verb ('check') and resource ('voucher status'), and the two lookup methods distinguish it from sibling tools like use_voucher or create_gift_certificate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for read-only status checks but does not explicitly compare with alternatives or state when not to use it. The public endpoint note provides context but no exclusionary guidance. Usage is inferred from the clear purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_loyalty_programAInspect

Get factory calldata to deploy a new ERC-20 loyalty token on Base

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProgram name
symbolYesToken symbol, 2-5 chars
expiration_daysNoProgram duration in days (default: 365)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the mechanism (factory calldata) and platform (Base), but lacks details on side effects, authentication requirements, rate limits, or what the tool actually returns (the calldata itself vs a transaction hash).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, dense sentence with zero waste. Front-loaded with action ('Get factory calldata'), specifies the domain ('ERC-20 loyalty token'), and platform ('Base'). Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a blockchain deployment tool with 100% schema coverage, the description adequately covers the primary purpose. However, lacking an output schema and given the complexity of factory deployment patterns, it should ideally clarify what the caller receives (calldata vs deployed address) and next steps. Sufficient but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear descriptions for all 3 parameters (name, symbol, expiration_days). The description provides context that these params are for an ERC-20 loyalty token, but does not add specific syntax or format details beyond what the schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Get factory calldata' combined with clear resource 'ERC-20 loyalty token' and platform 'Base'. Distinguishes from sibling tools like register_loyalty_program or activate_loyalty_program through the specific deployment mechanism.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this versus siblings like register_loyalty_program or activate_loyalty_program. While 'deploy' implies initial contract creation, the workflow relationship between deploying, registering, and activating is not explained.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_rewardBInspect

Create a new reward redeemable with loyalty tokens

ParametersJSON Schema
NameRequiredDescriptionDefault
token_addressYesToken contract address
nameYesReward name
descriptionNoReward description
costYesToken cost to redeem

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states that the tool creates a reward but does not mention any side effects, prerequisites (e.g., an existing loyalty program), permission requirements, or whether the operation is reversible. This is a significant gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear, front-loaded sentence with no redundant information. It earns its place by stating the core function in an efficient manner.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description should explain return behavior, prerequisites, and relation to other loyalty program entities. It only states the basic action, leaving out important context such as whether a loyalty program must already exist or what the response contains. The tool has 4 parameters and sits in a complex set of sibling tools, so this brevity is insufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter already documented (e.g., cost is 'Token cost to redeem'). The description adds no extra meaning beyond the schema; it merely restates the token-based redemption concept. Baseline 3 is appropriate since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Create' with a clear resource ('reward') and a qualifying phrase ('redeemable with loyalty tokens') that distinguishes it from sibling tools like create_gift_certificate and create_personalized_offer. It precisely states the action and object.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates when to use this tool (when creating a reward), but provides no explicit guidance on when not to use it or how it differs from similar creation tools such as create_gift_certificate or create_personalized_offer. The usage context is implied rather than clarified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_my_profileAInspect

Get authenticated agent's profile

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. The verb 'Get' implies a read-only operation and the phrase 'authenticated agent' signals an authentication requirement, but it does not disclose error conditions, side effects, or output behavior. A more explicit read-only/authentication statement would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys all essential information without superfluous words. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, parameterless read-only tool, the description is largely complete. It does not explain the output structure, but no output schema exists, and 'profile' is reasonably self-explanatory given common usage. Minor gaps remain around expected response fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema fully covers the parameter surface. The description adds no parameter-specific meaning, but none is needed; baseline for 0-parameter tools is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' and names the precise resource 'authenticated agent's profile', which distinguishes it from all sibling tools focused on loyalty, marketplace, or reports. Adding 'authenticated' clarifies the otherwise ambiguous 'my' from the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the tool is for retrieving one's own profile, and no sibling tool serves a similar purpose. It does not explicitly state when not to use it, but the context is unambiguous due to the unique scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_platform_infoAInspect

Get info about Loyal Spark protocol on Base L2

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. 'Get info' strongly implies a read-only, non-destructive operation, which is a useful implicit disclosure. However, it does not explicitly state side-effect safety, permission requirements, or return behavior. For a zero-parameter getter, this is minimally transparent but not fully explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, extremely concise and front-loaded. Every word adds value, and there is no redundant or vague filler. It is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (zero parameters, no output schema, no annotations), the description covers the essential invocation context: it tells the agent what the tool does and that it requires no inputs. It lacks details about the return structure or when to use it, but for a basic platform info getter, it is sufficiently complete for selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema covers everything with 100% coverage. The description adds no parameter information, but none is needed. Baseline for zero parameters is 4, and there is no deficiency to penalize.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get info about Loyal Spark protocol on Base L2' uses a specific verb ('Get') and a clear resource ('info about Loyal Spark protocol on Base L2'). It distinguishes from siblings like get_platform_stats and get_my_profile, though 'info' is broader than these more specific sibling names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention any exclusions or preferred contexts, nor does it reference any sibling tools such as get_platform_stats or get_program_analytics. This is a clear gap for a tool with many related siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_program_analyticsBInspect

Get analytics for your loyalty programs

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does not disclose whether the tool is read-only, requires authentication, returns a report, or has any side effects. Minimal behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no redundant filler. It states the action and the resource efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the simple schema, the absence of an output schema and any details about what analytics are returned makes the description inadequate. It would benefit from mentioning typical metrics, time ranges, or the return format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing to explain. The description adds no param semantics, but the baseline for 0-param tools is 4, and the schema already covers this trivially.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a clear verb ('Get') and resource ('analytics for your loyalty programs'), which distinguishes it from siblings like get_platform_stats or get_program_workflow_status. However, it doesn't specify what kind of analytics, so it's not maximally precise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives. The description only states what it does, not when to prefer it over other analytics or program tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_token_balanceBInspect

Get loyalty token balance and tier info for a customer

ParametersJSON Schema
NameRequiredDescriptionDefault
token_addressYesToken contract address
customer_addressYesCustomer wallet

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of disclosing behavioral traits. It only states what the tool returns, but does not explicitly confirm it is read-only, nor does it describe error handling or what happens if the customer or token does not exist. The word 'Get' implies non-mutation, but without annotations this is not sufficiently explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that starts with the verb 'Get' and immediately conveys the purpose. There is no filler or repetition, making it optimally sized and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple tool with two clearly described parameters and no output schema, so the description's claim of returning 'balance and tier info' is minimally adequate. However, it lacks details on the response structure (e.g., what fields constitute 'tier info'), potential errors, and typical use cases, leaving gaps for a complete understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for both parameters (token contract address, customer wallet) with 100% coverage. The tool description adds no additional meaning beyond the schema. Given the baseline of 3 for high schema coverage, this score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get'), the resource ('loyalty token balance and tier info'), and the target ('for a customer'). It distinguishes itself from sibling tools like mint_loyalty_tokens or transfer_loyalty_tokens by being a read-only query, and the explicit mention of 'balance and tier info' makes it specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention that get_my_profile might be used for the caller's own balance, or that this tool is for querying a specific customer's balance given a token address. No prerequisites or exclusions are stated, leaving the agent to infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_loyalty_programsAInspect

List loyalty programs owned by the agent's merchant

ParametersJSON Schema
NameRequiredDescriptionDefault
include_expiredNoInclude expired programs

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It adds the ownership scoping but does not mention whether expired programs are excluded by default, any permission requirements, side effects, or return format. The verb 'list' implies read-only, but this is not explicitly stated, and the description offers little beyond the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loaded, containing only essential information about the action and scope. There is no unnecessary detail or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter) and the schema's clear documentation of the 'include_expired' parameter, the description provides sufficient context for a basic list operation. The ownership scope is stated, and the parameter description implies the default filtering behavior. While an output schema is absent, it is not necessary for a simple list endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage for the single parameter 'include_expired' with a clear description, so the schema fully documents parameter semantics. The tool description does not add further meaning about parameters, but the baseline is 3 when schema coverage is high.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists loyalty programs and specifies the scope 'owned by the agent's merchant', distinguishing it from sibling tools like 'create_loyalty_program' or 'list_gift_certificates'. The verb 'list' and resource are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for viewing the merchant's own loyalty programs, but it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites. It relies on the tool's name and context rather than providing explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_marketplace_offersAInspect

List active token trading offers on the marketplace

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter: active/completed/cancelled
limitNoMax results (1-100)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden for behavioral disclosure. It states that only 'active' offers are listed, adding some context, but does not mention pagination, ordering, or that the status parameter can override the active filter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the action and resource with no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with two optional parameters and no output schema, the description covers the core purpose. However, the absence of usage guidance and behavioral details (like pagination) keeps it from a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — both limit and status have descriptive text. The description adds no additional parameter information, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and identifies the resource ('active token trading offers on the marketplace'), distinguishing it from related sibling tools like cancel_stale_offers or create_personalized_offer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose implies the tool should be used to list active offers, but there is no explicit guidance on when to use it versus alternatives, nor any exclusions or recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_rewardsCInspect

List rewards for a loyalty program by token_address

ParametersJSON Schema
NameRequiredDescriptionDefault
token_addressYesToken contract address (0x...)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure but only implies read-only safety through the verb 'List'. It fails to mention pagination behavior, rate limiting, authentication requirements, or what data structure is returned (rewards as objects, array, etc.).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at 9 words with no filler content. However, given the absence of annotations and output schema, this brevity may be excessive—every sentence earns its place, but there aren't enough sentences to fully document the tool's behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with 100% schema coverage, the description meets minimum viability by identifying the core operation. However, given no output schema and no annotations, it should explain what constitutes a 'reward' or provide return value context to be complete. It stops at the bare minimum.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description acknowledges the 'token_address' parameter but adds no semantic value beyond the schema's description ('Token contract address (0x...)'). It doesn't clarify if this is the program's token or a specific reward token.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (List), resource (rewards), and scope (for a loyalty program), which distinguishes it from sibling tools like 'create_reward' or 'list_loyalty_programs'. However, it doesn't clarify the relationship to 'list_marketplace_offers' or what distinguishes a 'reward' from an 'offer' in this domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions the filter criterion ('by token_address') but provides no explicit guidance on when to use this tool versus alternatives, nor any prerequisites for the token_address value. It lacks 'when-not' guidance or context about program states (e.g., active vs. inactive programs).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mint_loyalty_tokensBInspect

Record mint intent and get smart contract call params

ParametersJSON Schema
NameRequiredDescriptionDefault
token_addressYesToken contract address
recipientYesRecipient wallet (0x...)
amountYesTokens to mint

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden. It crucially clarifies that this tool returns 'smart contract call params' rather than executing the transaction itself—a key behavioral distinction. However, it omits authentication requirements, gas/fee implications, idempotency guarantees, or what the returned parameters contain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at nine words with no filler. It front-loads the core action. However, given the high-stakes blockchain context and zero annotations, it is arguably too terse—lacking safety warnings or output handling guidance that would justify its brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a blockchain operation tool with no output schema and no annotations, the description is insufficient. While it mentions returning 'smart contract call params,' it fails to describe the output structure, error cases, chain/network context, or how to use the returned parameters to actually execute the mint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for all three parameters (token_address, recipient, amount), establishing a baseline score of 3. The description adds no additional semantic context beyond what the schema already provides, such as address format validation or amount precision requirements.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool records minting intent and retrieves smart contract parameters, using specific verbs ('record', 'get') and identifying the blockchain context. However, it does not explicitly differentiate from the sibling 'transfer_loyalty_tokens' tool, which also moves tokens to recipients but from existing supply rather than minting new ones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this versus 'transfer_loyalty_tokens' or other alternatives. There are no prerequisites mentioned (e.g., program ownership requirements) nor warnings about the irreversible nature of minting operations in blockchain contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redeem_rewardAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
reward_idYesUUID of the reward to redeem
customer_addressYesWallet address of the customer who transferred tokens
transaction_hashYesOn-chain tx hash of the token transfer from customer to merchant

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully discloses that the tool 'Creates a voucher' as a side effect and implies validation of the transaction hash. However, it omits critical behavioral details such as error handling for invalid hashes, idempotency guarantees, or whether the voucher creation is synchronous.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two highly efficient sentences with zero redundancy. It front-loads the core action and mechanism in the first sentence and follows with the outcome/side effect, making it immediately scannable and actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of annotations and output schema, the description adequately covers the primary workflow: it explains the redemption mechanism, the required blockchain context, and the voucher creation outcome. It could be improved by describing the return value structure or error conditions, but it provides sufficient context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, establishing a baseline score of 3. The description adds minimal semantic value beyond the schema, though it reinforces the relationship between parameters by specifying that the transaction_hash must represent a 'verified token transfer.' It does not add syntax details, validation rules, or format examples beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Redeem a reward'), the required mechanism ('by providing a verified token transfer transaction hash'), and the outcome ('Creates a voucher'). It effectively distinguishes from siblings like 'create_reward' (which creates the reward definition) and 'use_voucher' (which likely consumes vouchers).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context through the requirement of a 'verified token transfer transaction hash,' suggesting this tool is for post-payment verification scenarios. However, it lacks explicit guidance on when to use this versus 'use_voucher' or what prerequisites must be met before invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

register_loyalty_programCInspect

Register a deployed token as a loyalty program in the database

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProgram name
symbolYesToken symbol
token_addressYesDeployed token contract address (0x...)
expiration_daysNoDuration in days (default: 365)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It mentions persistence ('in the database') but fails to clarify critical behavioral traits: whether this is idempotent, what gets returned (no output schema exists), error conditions (e.g., duplicate registration), or side effects. For a database mutation operation, this is insufficient behavioral coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence is efficient and front-loaded with the core action. However, given the absence of annotations and output schema, the description is arguably too brief—conciseness becomes under-specification when critical behavioral and sibling-differentiation context is missing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero annotations, no output schema, and a confusingly similar sibling tool ('create_loyalty_program'), the description is incomplete. It should explicitly clarify the distinction between creating new programs versus registering existing deployed tokens, and disclose return values or success indicators.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage, establishing a baseline of 3. The description reinforces 'token_address' by mentioning 'deployed token' but adds no additional semantic context (e.g., address format validation, default behavior when expiration_days is omitted) beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Register') and resource ('deployed token' as 'loyalty program'), clarifying this handles existing tokens. However, it lacks explicit differentiation from the sibling 'create_loyalty_program', which could confuse agents about whether to deploy new tokens or register existing ones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus 'create_loyalty_program' or other alternatives. While 'deployed token' implies prior token deployment, there are no 'when-to-use' or 'when-not-to-use' instructions, nor prerequisites stated (e.g., token ownership verification).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transfer_loyalty_tokensAInspect

Get calldata to transfer loyalty tokens between wallets

ParametersJSON Schema
NameRequiredDescriptionDefault
token_addressYesToken contract address (0x...)
toYesRecipient wallet (0x...)
amountYesTokens to transfer

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description bears the full burden of behavioral disclosure. It does disclose the key non-obvious behavior that the tool only returns calldata rather than executing the transfer ('Get calldata to transfer'), which is useful. However, it omits details such as whether the caller must hold tokens, whether approval is needed, or what the calldata format looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that is entirely front-loaded. It states the action and the object without any filler or redundant information, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations, no output schema, and only three straightforward parameters, the description provides the core purpose and the fact that it returns calldata. However, it lacks any context about the return value's structure, potential errors, or how the calldata should be used in an actual transaction, leaving some gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers all three parameters (to, amount, token_address) with descriptions, achieving 100% coverage. The description adds no additional parameter semantics beyond the schema, so it meets the baseline but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Get calldata to transfer loyalty tokens between wallets.' It uses a specific verb ('Get calldata') and identifies the resource (loyalty tokens) and the action (transfer between wallets), distinguishing it from sibling tools like mint_loyalty_tokens and redeem_reward.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention any exclusion criteria, prerequisites, or suggest when to prefer transfer_loyalty_tokens over mint_loyalty_tokens or other token-related tools. The agent is left to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_program_statusAInspect

Update program status in database after on-chain activation/pause

ParametersJSON Schema
NameRequiredDescriptionDefault
token_addressYesToken contract address
statusYesNew status: active, paused, or inactive

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully clarifies that this operates on the database (not the blockchain), which is critical context. However, it omits details about idempotency, error handling if the on-chain state differs, or what the function returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence of nine words with no filler. It front-loads the action ('Update program status') and every word contributes essential information about scope and timing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation tool without output schema or annotations, the description is minimally sufficient. It explains the 'where' (database) and 'when' (after on-chain events), but lacks information about success indicators, failure modes, or state validation requirements that would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, establishing a baseline of 3. The description adds workflow context ('after on-chain activation/pause') that semantically links the 'status' parameter values (active/paused) to their on-chain counterparts, but does not elaborate on token address format or validation rules beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Update), resource (program status in database), and scope limitation (after on-chain activation/pause). It effectively distinguishes this database-sync tool from the sibling 'activate_loyalty_program' by specifying 'database' and 'after on-chain', though it could explicitly name the sibling to be perfect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'after on-chain activation/pause' provides implicit temporal guidance for when to invoke this tool (i.e., following blockchain state changes). However, it lacks explicit contrast with alternatives like 'activate_loyalty_program' or clear statements about when NOT to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

use_voucherAInspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
voucher_codeNoVoucher code (e.g. LOYAL-XXXX-XXXX-XXXX-XXXX)
voucher_idNoVoucher UUID (alternative to code)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral disclosure burden. It does disclose that this is a merchant-only mutation and describes the redemption scenario. However, it does not mention idempotency, behavior if the voucher is already used, reversibility, or error conditions. For a state-changing operation, this is a moderate level of transparency but far from complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and front-loaded: a short main clause followed by a clarifying parenthetical and a restriction. Both sentences earn their place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two params and no output schema, the description covers purpose, usage context, and authorization restriction. It does not mention potential prerequisite checks (e.g., verifying status before marking) or failure semantics, but given the tool's simplicity and the lack of annotations, it is still reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both voucher_id and voucher_code have clear descriptive text including the alternation between them and the format of the code. The description adds no additional parameter meaning, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'Mark a voucher as used' with the context 'redeemed by customer at merchant'. This specific verb+resource distinguishes it from sibling tools like check_voucher_status (read-only status check) and redeem_reward (rewards, not vouchers). The 'Merchant-only operation' qualifier adds further clarity on the intended actor.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when to use the tool (at the point of customer redemption at a merchant) and adds a restriction ('Merchant-only operation'). However, it does not explicitly name alternatives or exclusions, such as using check_voucher_status for querying status before marking as used. The context implies the scenario but lacks explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.1.9
    • Addedcheck_voucher_status
  2. 2 tool updatesv0.1.8
    • Addedredeem_reward
    • Addeduse_voucher
  3. 14 tool updatesv0.1.4
    • Changedactivate_loyalty_program2 fields changed
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Token contract address (0x...)",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "token_address"
        +]
    • Changedcreate_loyalty_program4 fields changed
      • addedInput schema / properties / expiration_days
        Added value: +{
        +  "description": "Program duration in days (default: 365)",
        +  "type": "number"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Program name",
        +  "type": "string"
        +}
      • addedInput schema / properties / symbol
        Added value: +{
        +  "description": "Token symbol, 2-5 chars",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "name",
        +  "symbol"
        +]
    • Changedcreate_reward5 fields changed
      • addedInput schema / properties / cost
        Added value: +{
        +  "description": "Token cost to redeem",
        +  "type": "number"
        +}
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "Reward description",
        +  "type": "string"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Reward name",
        +  "type": "string"
        +}
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Token contract address",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "token_address",
        +  "name",
        +  "cost"
        +]
    • Changedget_my_profile1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_platform_info1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_program_analytics1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_token_balance3 fields changed
      • addedInput schema / properties / customer_address
        Added value: +{
        +  "description": "Customer wallet",
        +  "type": "string"
        +}
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Token contract address",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "token_address",
        +  "customer_address"
        +]
    • Changedlist_loyalty_programs1 field changed
      • addedInput schema / properties / include_expired
        Added value: +{
        +  "description": "Include expired programs",
        +  "type": "boolean"
        +}
    • Changedlist_marketplace_offers2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max results (1-100)",
        +  "type": "number"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "Filter: active/completed/cancelled",
        +  "type": "string"
        +}
    • Changedlist_rewards2 fields changed
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Token contract address (0x...)",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "token_address"
        +]
    • Changedmint_loyalty_tokens4 fields changed
      • addedInput schema / properties / amount
        Added value: +{
        +  "description": "Tokens to mint",
        +  "type": "number"
        +}
      • addedInput schema / properties / recipient
        Added value: +{
        +  "description": "Recipient wallet (0x...)",
        +  "type": "string"
        +}
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Token contract address",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "token_address",
        +  "recipient",
        +  "amount"
        +]
    • Changedregister_loyalty_program5 fields changed
      • addedInput schema / properties / expiration_days
        Added value: +{
        +  "description": "Duration in days (default: 365)",
        +  "type": "number"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Program name",
        +  "type": "string"
        +}
      • addedInput schema / properties / symbol
        Added value: +{
        +  "description": "Token symbol",
        +  "type": "string"
        +}
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Deployed token contract address (0x...)",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "name",
        +  "symbol",
        +  "token_address"
        +]
    • Changedtransfer_loyalty_tokens4 fields changed
      • addedInput schema / properties / amount
        Added value: +{
        +  "description": "Tokens to transfer",
        +  "type": "number"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Recipient wallet (0x...)",
        +  "type": "string"
        +}
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Token contract address (0x...)",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "token_address",
        +  "to",
        +  "amount"
        +]
    • Changedupdate_program_status3 fields changed
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "New status: active, paused, or inactive",
        +  "type": "string"
        +}
      • addedInput schema / properties / token_address
        Added value: +{
        +  "description": "Token contract address",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "token_address",
        +  "status"
        +]
  4. 4 tool updatesv0.1.3
    • Addedactivate_loyalty_program
    • Addedcreate_loyalty_program
    • Addedregister_loyalty_program
    • Addedupdate_program_status
  5. 10 tool updatesv0.1.0
    • First observedcreate_reward
    • First observedget_my_profile
    • First observedget_platform_info
    • First observedget_program_analytics
    • First observedget_token_balance
    • First observedlist_loyalty_programs
    • First observedlist_marketplace_offers
    • First observedlist_rewards
    • First observedmint_loyalty_tokens
    • First observedtransfer_loyalty_tokens

TDQS

A3.5/5.0

Scored across 17 tools

Disambiguation4/5

Tools are mostly distinct, though create_loyalty_program vs register_loyalty_program and activate_loyalty_program vs update_program_status operate on similar resources and could cause brief hesitation. Descriptions clarify the deployment vs. registration and calldata generation vs. database update distinctions sufficiently.

Naming Consistency5/5

Excellent consistency throughout with strict verb_noun snake_case pattern (e.g., create_reward, transfer_loyalty_tokens, check_voucher_status). All 17 tools follow the same convention without deviation.

Tool Count4/5

17 tools is slightly large but justified for the scope, covering full lifecycle: program deployment/registration, token minting/transfers, reward management, voucher handling, marketplace queries, and analytics. Each tool earns its place without redundancy.

Completeness4/5

Strong coverage of loyalty protocol workflows including deployment, activation, token operations, reward redemption, and voucher lifecycle. Minor gaps exist for reward updates/deletion and explicit pause calldata generation, but agents can work around these using existing tools.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers