{"name":"io.github.aspekt19/loyal-spark","slug":"aspekt19-loyal-spark","title":"Loyal Spark","description":"Base MCP (39 tools) on Base: programs, mint, rewards. lsk_ key; plan limits enforced. /for-agents","url":"https://mcp.market/server/aspekt19-loyal-spark","rating":null,"grade":"C","score":64,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":29,"stars":13,"forks":5,"downloads_week":null,"last_push_at":"2026-09-20T03:58:28.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-05T17:20:40.131Z","last_ok_at":"2026-11-05T17:20:40.131Z","latency_ms":777},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://loyalspark.online/for-agents","version":"1.0.4","remotes":[{"type":"streamable-http","url":"https://api.loyalspark.online/loyalty-mcp","headers":[{"description":"Merchant agent API key (lsk_...). Get at loyalspark.online/for-agents or SIWE.","isRequired":true,"isSecret":true,"name":"x-api-key"},{"description":"Alternative auth: Bearer lsk_... (same key as x-api-key).","isSecret":true,"placeholder":"Bearer lsk_...","name":"Authorization"}]}],"packages":[],"tools":[{"name":"activate_loyalty_program","description":"For legacy ERC-20 programs: returns unpauseUtility + enableMinting calldata. For B20 programs: no-op (already active).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address (0x...)"}},"required":["token_address"]}},{"name":"bazaar_discover_mcp_servers","description":"Discover third-party MCP servers published in Coinbase CDP's Bazaar. Read-only. Filter by free-text q and/or network.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Free-text filter matched against the server JSON"},"network":{"type":"string","description":"Filter by network, e.g. 'base'"},"limit":{"type":"number","description":"Max rows (default 25, max 100)"},"cursor":{"type":"string","description":"Pagination cursor"}}}},{"name":"bazaar_discover_resources","description":"Discover third-party x402-paid resources published in Coinbase CDP's Bazaar (docs, data feeds, AI inference, etc). Read-only. Filter by free-text q and/or network (e.g. 'base').","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Free-text filter matched against the resource JSON (name/description/url)"},"network":{"type":"string","description":"Filter by network, e.g. 'base' or 'base-sepolia'"},"limit":{"type":"number","description":"Max rows returned (default 25, max 100)"},"cursor":{"type":"string","description":"Pagination cursor from a previous call"}}}},{"name":"bazaar_pay_and_call","description":"Pay a Loyal Spark x402 URL on api.loyalspark.online with the merchant agent's CDP MPC wallet (EIP-3009 exact scheme, Base USDC). Other hosts are refused before any signature. Requires scope 'mint' and an active CDP wallet. max_usdc default 0.25, hard limit 10.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"Full https:// URL of the x402 resource"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"],"description":"HTTP method (default GET)"},"body":{"description":"Optional JSON request body for non-GET methods"},"headers":{"type":"object","description":"Extra request headers (Accept/Content-Type auto-set)"},"max_usdc":{"type":"number","description":"Spend cap for THIS call in USDC (default 0.25, must be ≤ 10)"},"allowed_networks":{"type":"array","items":{"type":"string"},"description":"Networks to accept (default ['base', 'eip155:8453'])"},"allowed_schemes":{"type":"array","items":{"type":"string"},"description":"x402 schemes to accept (default ['exact'])"}},"required":["url"]}},{"name":"bazaar_probe_x402","description":"GET a candidate x402 URL and, if it responds HTTP 402, return the parsed payment requirements (accepts[]) so the caller can decide whether to pay. HTTPS only. No signing performed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"Full https:// URL of the x402-paid endpoint"}},"required":["url"]}},{"name":"check_voucher_status","description":"Check voucher status for this merchant. Send one of code, voucher_code, or voucher_id (anyOf). If none is sent the tool returns error_code missing_identifier, an example, and next_action. Anonymous public lookup is GET /agent-api/vouchers/status.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"code":{"type":"string","description":"Voucher code (LOYAL-XXXX-XXXX-XXXX-XXXX). One of code, voucher_code, or voucher_id is required."},"voucher_id":{"type":"string","description":"Voucher UUID. One of code, voucher_code, or voucher_id is required."},"voucher_code":{"type":"string","description":"Alias of code. One of code, voucher_code, or voucher_id is required."}},"anyOf":[{"required":["code"]},{"required":["voucher_id"]},{"required":["voucher_code"]}]}},{"name":"confirm_mint_fee","description":"Confirm a prepared mint on Base. Verifies the protocol-fee mint and, when recipient_tx_hash is set (or the fee receipt already contains the recipient mint), writes customer_tier_status so get_token_balance leaves 0. Same hash for both fields when EIP-5792 batched the calls. A second call with recipient_tx_hash still credits the customer after the fee is already settled.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"obligation_id":{"type":"string","description":"fee_obligation_id returned by mint_loyalty_tokens or earn_points"},"fee_tx_hash":{"type":"string","description":"Transaction hash of the protocol fee mint"},"recipient_tx_hash":{"type":"string","description":"Transaction hash of the mint to the recipient. Same as fee_tx_hash when both mints are in one transaction. Required to update GET /balance."}},"required":["obligation_id","fee_tx_hash"]}},{"name":"create_gift_certificate","description":"Create a gift / welcome certificate (UDS-style) with a unique random redemption code (LOYAL-XXXX-XXXX-XXXX). Customer redeems via QR or by entering the code; merchant then mints tokens on-chain. Use for welcome bonuses, promo campaigns, partnership gifts.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"ERC-20 loyalty token address (must belong to the agent's merchant)"},"usd_amount":{"type":"number","description":"Certificate face value in USD (positive)"},"points_per_dollar":{"type":"number","description":"Optional override of program rate (e.g. 10 = 10 tokens per $1). Defaults to program's points_per_dollar."},"max_redemption_percent":{"type":"number","description":"Max % of any future purchase the customer can pay with these tokens (5–100). Default 50."},"title":{"type":"string","description":"Display title (default: 'Gift Certificate')"},"description":{"type":"string","description":"Optional descriptive text shown to the customer"},"expires_in_days":{"type":"number","description":"Validity period in days (omit for no expiry)"},"image_url":{"type":"string","description":"Optional public image URL for the cert design"},"quantity":{"type":"number","description":"Number of certificates to create as a batch (1–100, default 1)"}},"required":["token_address","usd_amount"]}},{"name":"create_loyalty_program","description":"Get factory calldata to deploy a new loyalty token on Base. Defaults to B20 (Base-native B20 asset standard, ERC-20 compatible, single tx, active immediately). Pass token_standard='erc20' for the legacy factory. For B20, MINT_ROLE is granted atomically to the merchant admin AND to the agent's CDP wallet (or explicit extra_minters) so autonomous agents can mint with no follow-up transaction.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Program name (required for external agents)"},"symbol":{"type":"string","description":"Token symbol, 2-5 chars (required for external agents)"},"expiration_days":{"type":"number","description":"Program duration in days (default: 365)"},"token_standard":{"type":"string","description":"'b20' (default, single-tx deploy on Base precompile factory) or 'erc20' (legacy factory, requires activate_loyalty_program follow-up)"},"agent_wallet_address":{"type":"string","description":"(B20 only) Additional wallet to grant MINT_ROLE atomically. Defaults to the agent's active CDP MPC wallet if not provided."},"extra_minters":{"type":"array","items":{"type":"string"},"description":"(B20 only) Extra addresses to grant MINT_ROLE atomically in the same deploy tx."},"auto_generate":{"type":"boolean","description":"Internal automation only — fills missing name/symbol from examples. External agents should pass explicit name and symbol."},"business_context":{"type":"object","description":"Optional context for examples only"},"preferred_style":{"type":"string"},"locale":{"type":"string"},"target_audience":{"type":"string"}},"required":["name","symbol"]}},{"name":"create_personalized_offer","description":"Create a personalized offer for a specific customer. Use when analytics reveal engagement patterns (e.g., inactive customers, high-value segments).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"customer_address":{"type":"string","description":"Customer wallet address"},"title":{"type":"string","description":"Offer title (e.g., 'Welcome back! 20% bonus tokens')"},"description":{"type":"string","description":"Offer description"},"bonus_tokens":{"type":"number","description":"Bonus tokens to award"},"discount_percentage":{"type":"number","description":"Discount percentage (0-100)"},"valid_days":{"type":"number","description":"How many days the offer is valid (default: 7)"}},"required":["token_address","customer_address","title"]}},{"name":"create_reward","description":"Create a new reward redeemable with loyalty tokens","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"name":{"type":"string","description":"Reward name"},"description":{"type":"string","description":"Reward description"},"cost":{"type":"number","description":"Token cost to redeem"}},"required":["token_address","name","cost"]}},{"name":"delete_report","description":"Internal. Delete a report you submitted.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"report_id":{"type":"string","description":"UUID of the report to delete"}},"required":["report_id"]}},{"name":"earn_points","description":"Calculate and mint loyalty tokens based on purchase amount and program's cashback rate, optionally redeeming existing points at checkout (points_to_redeem or redeem_all) to reduce the payable receipt amount before calculating new cashback. Returns a fee-first `calls[]` bundle (protocol fee mint first, then the customer mint) — submit in order, atomically via EIP-5792 if supported, then call confirm_mint_fee (or POST /agent-api/mint/confirm) with obligation_id, fee_tx_hash, and recipient_tx_hash. Unconfirmed fee obligations block future mints.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address (0x...)"},"customer_address":{"type":"string","description":"Customer wallet (0x...) or email address"},"customer_email":{"type":"string","description":"Customer email address"},"purchase_amount":{"type":"number","description":"Purchase amount in currency units (e.g. dollars)"},"cashback_rate":{"type":"number","description":"Override cashback rate (%). If omitted, uses the program's default rate."},"points_to_redeem":{"type":"number","description":"Optional integer loyalty points to redeem at the counter to reduce purchase_amount."},"redeem_all":{"type":"boolean","description":"If true, redeems all available customer loyalty points (up to purchase_amount when positive)."}},"required":["token_address","customer_address","purchase_amount"]}},{"name":"export_customers","description":"Export customer data for a specific loyalty program. Returns wallet addresses, voucher stats, balances, and tier info. Use for analytics, segmentation, and personalized offers.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token address of the loyalty program"}},"required":["token_address"]}},{"name":"generate_program_defaults","description":"Workflow planner: field catalog, required parameters, next_actions, and non-binding examples. External agents must choose their own name, symbol, and economics.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"business_name":{"type":"string"},"category":{"type":"string"},"description":{"type":"string"},"locale":{"type":"string"},"preferred_style":{"type":"string"},"target_audience":{"type":"string"}}}},{"name":"get_my_profile","description":"Get authenticated agent's profile","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"get_platform_info","description":"Get info about Loyal Spark protocol on Base L2","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"get_program_analytics","description":"Get analytics for one of your loyalty programs","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address (0x...)"}},"required":["token_address"]}},{"name":"get_program_workflow_status","description":"Explain the next merchant action: current_step, required fields, and ordered next_actions (you provide all parameter values)","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Optional token to inspect"}}}},{"name":"get_token_balance","description":"Get loyalty token balance and tier info for a customer (accepts 0x Base wallet address or customer email in customer_address / customer_email)","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"customer_address":{"type":"string","description":"Customer 0x Base wallet address or customer email"}},"required":["token_address","customer_address"]}},{"name":"list_fee_obligations","description":"List protocol-fee obligations for this API key. status=unpaid is an alias for pending. Each unpaid row includes next_action describing POST /mint/confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"type":"string","description":"unpaid, pending, settled, or failed"}}}},{"name":"list_gift_certificates","description":"List gift certificates issued by the agent's merchant (with status and redemption info).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Filter by program token address (optional)"},"status":{"type":"string","description":"Filter by status: active, pending_mint, redeemed, expired, revoked"},"limit":{"type":"number","description":"Max rows (default 50, max 200)"}}}},{"name":"list_loyalty_programs","description":"List loyalty programs owned by the agent's merchant","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"include_expired":{"type":"boolean","description":"Include expired programs"}}}},{"name":"list_marketplace_offers","description":"List active token trading offers on the marketplace","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"type":"string","description":"Filter: active/completed/cancelled"},"limit":{"type":"number","description":"Max results (1-100)"},"token_address":{"type":"string","description":"Optional. When set, only offers that give or ask for this token."}}}},{"name":"list_mints","description":"List mint intents for this merchant. status=pending means transaction_hash is still null (confirm has not credited the recipient). status=completed means the recipient mint was recorded. GET /balance stays 0 until confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Optional loyalty token"},"status":{"type":"string","description":"pending or completed"}}}},{"name":"list_my_reports","description":"Internal. List reports this agent submitted (status new, reviewed, or done).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"type":"string","description":"Filter by status: new, reviewed, done (optional)"},"limit":{"type":"number","description":"Max results 1-50 (default: 20)"}}}},{"name":"list_rewards","description":"List rewards for a loyalty program by token_address. Includes redemption metrics (total vouchers issued, redeemed, and last-30-day counts) for each reward.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address (0x...)"}},"required":["token_address"]}},{"name":"list_store_discount_codes","description":"List discount codes for this merchant's Shopify store, plus how customers spend points (online code, register voucher, or both).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Program address. Omit to list every linked store."}}}},{"name":"mark_gift_certificate_minted","description":"After the merchant submits the on-chain mint transaction for a claimed gift certificate, call this to mark it as minted (status pending_mint -> redeemed) and store the mint tx hash.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"certificate_id":{"type":"string","description":"UUID of the certificate"},"transaction_hash":{"type":"string","description":"Base L2 mint transaction hash (0x...)"}},"required":["certificate_id","transaction_hash"]}},{"name":"mint_loyalty_tokens","description":"Record mint intent and get a fee-first `calls[]` bundle: protocol fee mint FIRST, then the recipient mint. The protocol fee is charged in the merchant's own loyalty tokens (not USDC). Submit both calls in order (atomically via EIP-5792 send_calls if your wallet supports it), then call confirm_mint_fee (or POST /agent-api/mint/confirm) with obligation_id, fee_tx_hash, and recipient_tx_hash. Unconfirmed fee obligations block future mints. Accepts a 0x Base wallet address or customer email in recipient_address (or recipient_email), automatically resolving the customer's wallet.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"recipient_address":{"type":"string","description":"Customer 0x Base wallet address or customer email receiving minted tokens. Preferred — matches REST."},"recipient":{"type":"string","description":"Legacy alias for recipient_address (0x address or email)"},"recipient_email":{"type":"string","description":"Customer email address to resolve to their Base wallet"},"amount":{"type":"number","description":"Tokens to mint"}},"required":["token_address","amount"],"anyOf":[{"required":["recipient_address"]},{"required":["recipient"]},{"required":["recipient_email"]}]}},{"name":"redeem_reward","description":"Redeem a reward by providing a verified token transfer transaction hash. Creates a voucher for the customer.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"reward_id":{"type":"string","description":"UUID of the reward to redeem"},"customer_address":{"type":"string","description":"Wallet address of the customer who transferred tokens"},"transaction_hash":{"type":"string","description":"Onchain tx hash of the token transfer from customer to merchant"}},"required":["reward_id","customer_address","transaction_hash"]}},{"name":"register_loyalty_program","description":"Register a deployed token as a loyalty program in the database. B20 tokens are registered as active; legacy ERC-20 as inactive (activate next).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Program name"},"symbol":{"type":"string","description":"Token symbol"},"token_address":{"type":"string","description":"Deployed token contract address (0x...)"},"expiration_days":{"type":"number","description":"Duration in days (default: 365)"},"cashback_rate":{"type":"number","description":"Default cashback percent for earn (1–100). Omit for DB default (5)."},"points_per_dollar":{"type":"number","description":"Loyalty points per $1 spent (1–1000). Omit for DB default (1)."},"token_standard":{"type":"string","description":"'b20' (default) or 'erc20' (legacy)"}},"required":["name","symbol","token_address"]}},{"name":"revoke_gift_certificate","description":"Revoke an active gift certificate (status active -> revoked). Only the issuing merchant can revoke. Already-redeemed/minted certificates cannot be revoked.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"certificate_id":{"type":"string","description":"UUID of the certificate from create_gift_certificate / list_gift_certificates"}},"required":["certificate_id"]}},{"name":"send_report","description":"Internal. Send a report to the merchant's Agent Reports dashboard (SEO audits, growth ideas, anomalies, weekly summaries). Not a loyalty action.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_role":{"type":"string","description":"Your role: ceo, seo, growth, or analyst"},"report_type":{"type":"string","description":"Type: seo_audit, growth_idea, data_report, anomaly, task, recommendation, or weekly_report"},"title":{"type":"string","description":"Report title (max 500 chars)"},"content":{"type":"string","description":"Report body text (max 10000 chars)"},"priority":{"type":"string","description":"Priority: low, medium, high, or critical"},"action_items":{"type":"array","items":{"type":"string"},"description":"List of suggested action items"}},"required":["agent_role","report_type","title","content"]}},{"name":"set_store_sales_channel","description":"Set how this store's customers spend loyalty points: online (checkout code), offline (voucher at the register), or both (the shopper chooses).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"channel":{"type":"string","description":"online, offline, or both"}},"required":["channel"]}},{"name":"transfer_loyalty_tokens","description":"Get calldata to transfer loyalty tokens between wallets","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address (0x...)"},"to":{"type":"string","description":"Recipient wallet (0x...)"},"amount":{"type":"number","description":"Tokens to transfer"}},"required":["token_address","to","amount"]}},{"name":"update_program_config","description":"Update default cashback_rate and/or points_per_dollar for a program (same as merchant dashboard sliders)","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address (0x...)"},"cashback_rate":{"type":"number","description":"New default cashback % for earn (1–100). Omit to leave unchanged."},"points_per_dollar":{"type":"number","description":"New points per $1 (0–1000, exclusive 0). Omit to leave unchanged."}},"required":["token_address"],"anyOf":[{"required":["cashback_rate"]},{"required":["points_per_dollar"]}]}},{"name":"update_program_status","description":"Update program status in database after onchain activation/pause","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"token_address":{"type":"string","description":"Token contract address"},"status":{"type":"string","description":"New status: active, paused, or inactive"}},"required":["token_address","status"]}},{"name":"update_report_status","description":"Internal. Set a report you submitted to reviewed or done.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"report_id":{"type":"string","description":"UUID of the report"},"status":{"type":"string","description":"New status: reviewed or done"}},"required":["report_id","status"]}},{"name":"update_reward_status","description":"Activate or deactivate a reward in the catalog. Use to manage reward availability based on analytics.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"reward_id":{"type":"string","description":"UUID of the reward"},"is_active":{"type":"boolean","description":"true to activate, false to deactivate"}},"required":["reward_id","is_active"]}},{"name":"update_store_discount_code","description":"Mark a Shopify discount code used, or cancel it and return the loyalty points. Same actions as the merchant discount-code journal.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"redemption_id":{"type":"string","description":"Id from list_store_discount_codes."},"action":{"type":"string","description":"use or cancel"}},"required":["redemption_id","action"]}},{"name":"use_voucher","description":"Mark a voucher as used at the merchant. Send one of voucher_code or voucher_id (anyOf). If neither is sent the tool returns error_code missing_identifier and an example.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"voucher_code":{"type":"string","description":"Voucher code (LOYAL-XXXX-XXXX-XXXX-XXXX). Use this OR voucher_id."},"voucher_id":{"type":"string","description":"Voucher UUID. Use this OR voucher_code."}},"anyOf":[{"required":["voucher_code"]},{"required":["voucher_id"]}]}}],"scan":{"score":64,"grade":"C","scanned_at":"2026-10-29T18:47:08.308Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-29T18:47:08.189Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1537ms"]},"poisoning":{"score":15,"max":15,"notes":["42 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://api.loyalspark.online/loyalty-mcp","reachable":true,"authRequired":false,"latencyMs":1537,"serverInfo":{"name":"loyal-spark-mcp","version":"1.0.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://loyalspark.online/media-kit/app-icon-1024.png","source":"registry","width":1024,"height":1024},"presence":{"stars":13,"forks":5,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-20T03:58:28.000Z","score":29}}}},"grade_history":[{"kind":"downgrade","fromGrade":"B","toGrade":"C","reason":"score 64: No source repository listed","createdAt":"2026-10-29T18:47:17.336Z"}],"reviews":[]}