[
  {
    "slug": "time-card",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/time-card/mcp",
    "interface": {
      "displayName": "Handy Time Card Calculator",
      "shortDescription": "Hours, overtime and pay",
      "longDescription": "Turn clock-in and clock-out times into exact hours worked, overtime and gross pay, then download a clean timesheet.\n\nPaste your punches in any format (\"8:45 to 5:15 with a 30 minute lunch\", \"Mon 9-5:30, Tue 8:30-6\"), and the card adds them up to the minute: decimal hours and hours-and-minutes, breaks deducted, overnight shifts handled. Choose the overtime rule (US federal 40 hours a week, California-style daily 8/12 hours, or none), add an hourly rate to see regular, overtime and double-time pay, and round punches to 5, 6 or 15 minutes if your employer does.\n\nDownload the week as an Excel timesheet with live totals or a printable PDF with signature lines. Nothing is stored.",
      "category": "Business & Operations",
      "defaultPrompt": [
        "Calculate my hours this week: Mon 8:45-5:15, Tue 9-6, Wed 8:30-5, Thu 9-5:30, Fri 8-4, 30 min lunch each day",
        "How many hours is 7:50 AM to 4:20 PM with a 45 minute break?",
        "Make a timesheet for Jane: Mon-Fri 9 to 6, $22/hour, California overtime"
      ],
      "capabilities": [
        "Adds up shifts to the minute, in decimal hours and hours:minutes",
        "Deducts unpaid breaks and handles overnight shifts",
        "Weekly 40-hour or California daily overtime and double time",
        "Gross pay at regular, overtime and double-time rates",
        "Punch rounding to 5, 6 or 15 minutes",
        "Excel and printable PDF timesheets"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/time-card/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/time-card/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "time card calculator",
      "calculate my hours worked",
      "hours worked calculator",
      "timesheet calculator",
      "how many hours is 8 to 5",
      "overtime calculator",
      "make a timesheet",
      "convert hours and minutes to decimal"
    ],
    "tools": [
      {
        "name": "calculate_time_card",
        "title": "Calculate time card",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "A standard week with lunch breaks",
          "prompt": "Calculate my hours this week: Mon 8:45-5:15, Tue 9-6, Wed 8:30-5, Thu 9-5:30, Fri 8-4, 30 min lunch each day",
          "tools_triggered": [
            "calculate_time_card"
          ],
          "expected_behavior": "Card shows exactly 40.00 hours with no overtime, a per-day table, and Excel/PDF timesheet downloads."
        },
        {
          "description": "A single shift",
          "prompt": "How many hours is 7:50 AM to 4:20 PM with a 45 minute break?",
          "tools_triggered": [
            "calculate_time_card"
          ],
          "expected_behavior": "Answers 7.75 hours (7h 45m)."
        },
        {
          "description": "California daily overtime with pay",
          "prompt": "Make a timesheet for Jane: Mon-Fri 9 to 6, Sat 9 to 1, $22/hour, California overtime",
          "tools_triggered": [
            "calculate_time_card"
          ],
          "expected_behavior": "Card shows 49 hours: 40 regular and 9 overtime, gross pay $1,177.00, and timesheet downloads."
        },
        {
          "description": "An overnight shift",
          "prompt": "I worked from 10pm to 6:30am last night with a 30 minute break, how many hours is that?",
          "tools_triggered": [
            "calculate_time_card"
          ],
          "expected_behavior": "Answers 8 hours, marking the shift as ending the next day."
        },
        {
          "description": "Weekly overtime pay at a given rate",
          "prompt": "I worked 10 hours a day Monday to Friday at $18 an hour. What is my pay with overtime?",
          "tools_triggered": [
            "calculate_time_card"
          ],
          "expected_behavior": "Card shows 50 hours (40 regular, 10 overtime) and gross pay of $990.00."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How much will I take home from a $60,000 salary after taxes?",
          "expected_behavior": "Does not call Handy Time Card Calculator: Take-home pay and taxes are a paycheck question, not a time card."
        },
        {
          "prompt": "How many days until my vacation on July 4?",
          "expected_behavior": "Does not call Handy Time Card Calculator: Counting days between dates is not adding up work hours."
        },
        {
          "prompt": "Write me a polite email asking my manager for overtime approval.",
          "expected_behavior": "Does not call Handy Time Card Calculator: Writing an email needs no calculation."
        }
      ]
    }
  },
  {
    "slug": "invoice-generator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/invoice-generator/mcp",
    "interface": {
      "displayName": "Handy Invoice Generator",
      "shortDescription": "Professional PDF invoices",
      "longDescription": "Create a polished invoice, quote, estimate, proforma, receipt or credit note as a PDF, with exact totals.\n\nDescribe the job in plain words (\"invoice Acme for 12 hours of design at $85 and a $150 setup fee, net 15\") and get a print-ready PDF: your business details and optional logo, bill-to and ship-to blocks, a clean item table, and a totals block with subtotal, discounts, tax, shipping, amount paid and balance due. Tax can be one rate or per line (sales tax, VAT, GST), discounts can be per line or on the whole document, and every amount is computed to the cent with the same per-line rounding accounting software uses. Any currency, with its proper symbol; letter or A4 paper; your brand colour.\n\nAlso download the line items as Excel (with live formulas) or CSV. For real transactions you made: it does not create pay stubs or payroll documents. Nothing is stored.",
      "category": "Business & Operations",
      "defaultPrompt": [
        "Make an invoice from Bright Pixel Studio to Acme Corp: website design $2,400, hosting setup $150, 6 hrs editing at $85, net 15",
        "Create a quote in EUR for kitchen cabinets €4,250 with 5% off, 16 hours installation at €65, 19% VAT",
        "Receipt for a photography session: ¥55,000 plus 20 prints at ¥1,320, 10% consumption tax, paid by card"
      ],
      "capabilities": [
        "Invoices, quotes, estimates, proformas, receipts and credit notes",
        "Professional PDF with your details, logo and brand colour",
        "Per-line or document tax (sales tax, VAT, GST) and discounts",
        "Exact totals to the cent: shipping, deposits, balance due",
        "Any currency with the right symbol; letter or A4",
        "Line items as Excel with formulas, or CSV"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/invoice-generator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/invoice-generator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "invoice generator",
      "make an invoice",
      "create invoice pdf",
      "invoice template",
      "quote template",
      "estimate for a client",
      "receipt maker",
      "proforma invoice",
      "credit note",
      "freelance invoice"
    ],
    "tools": [
      {
        "name": "create_invoice",
        "title": "Create invoice",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Freelance invoice, past due",
          "prompt": "Make an invoice from Bright Pixel Studio to Acme Corp dated Aug 15 2026: website design $2,400, hosting setup $150, 6 hours content editing at $85/h. Net 30.",
          "tools_triggered": [
            "create_invoice"
          ],
          "expected_behavior": "Invoice INV-2026-0001 for $3,060.00, due Sep 14, 2026, flagged 17 days overdue, with PDF, Excel and CSV downloads."
        },
        {
          "description": "Sales tax, a document discount and shipping",
          "prompt": "Invoice Riverside Youth Soccer for 12 printed T-shirts at $14.50, a $45 setup fee and 3 hoodies at $32.99. 10% discount, NYC sales tax 8.875%, $25 shipping.",
          "tools_triggered": [
            "create_invoice"
          ],
          "expected_behavior": "Subtotal $317.97, discount $31.80, sales tax $25.39, shipping $25.00: total and balance due $336.56."
        },
        {
          "description": "UK VAT invoice with mixed rates and a deposit",
          "prompt": "VAT invoice in GBP from Northlight Consulting Ltd (VAT GB123456789) to Harbour & Co: strategy workshop £1,800 and 500 brochures at £0.84 at 20% VAT, 10 printed books at £12.50 zero-rated. £500 deposit paid, due 31 Oct, A4.",
          "tools_triggered": [
            "create_invoice"
          ],
          "expected_behavior": "Subtotal £2,345.00, VAT £444.00, total £2,789.00, £500 deposit, balance due £2,289.00."
        },
        {
          "description": "A quote in euros with a line discount and taxable delivery",
          "prompt": "Quote for Familie Weber: kitchen cabinets €4,250 with 5% off, 16 hours installation at €65, €120 delivery. 19% VAT on everything including delivery.",
          "tools_triggered": [
            "create_invoice"
          ],
          "expected_behavior": "Quote QUO-2026-0001: subtotal €5,077.50, VAT €987.53, delivery €120.00, total €6,185.03, valid until Oct 31, 2026."
        },
        {
          "description": "A receipt in a zero-decimal currency",
          "prompt": "Receipt for Tanaka Yuki: photography session ¥55,000 and 20 prints at ¥1,320, plus 10% consumption tax. Paid by card.",
          "tools_triggered": [
            "create_invoice"
          ],
          "expected_behavior": "Receipt RCT-2026-0001: ¥81,400 plus ¥8,140 tax, ¥89,540 paid in full."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Make me a pay stub for my employee for the last two weeks.",
          "expected_behavior": "Does not call Handy Invoice Generator: Pay stubs and payroll documents are out of scope."
        },
        {
          "prompt": "What is 8.25% sales tax on $129.99?",
          "expected_behavior": "Does not call Handy Invoice Generator: A one-off sales tax calculation is not a document."
        },
        {
          "prompt": "Write a polite email reminding my client their invoice is late.",
          "expected_behavior": "Does not call Handy Invoice Generator: Writing an email needs no document or calculation."
        }
      ]
    }
  },
  {
    "slug": "expense-report",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/expense-report/mcp",
    "interface": {
      "displayName": "Handy Expense Report Maker",
      "shortDescription": "Receipts to a ready report",
      "longDescription": "Turn a pile of receipts into a finished expense report: totals by category, what is reimbursable, and a signed-off PDF and Excel file.\n\nList your expenses in any order (\"Delta $412, Hilton 2 nights $189, dinner with client $86\") or upload receipt photos, and add mileage trips. Foreign receipts are converted to your currency at the European Central Bank reference rate for the date of each receipt (weekends use the previous business day), and mileage uses the IRS business rate for the date you drove (72.5 cents per mile until June 30, 2026 and 76 cents from July 1, 2026), or your company rate. Optional per-diem limits flag days over the meals or lodging cap, company-paid items are kept out of the reimbursable total, and a cash advance is netted off.\n\nDownload an Excel workbook with live formulas (expenses, mileage and a summary sheet) or a printable PDF with approval signature lines. Nothing is stored.",
      "category": "Business & Operations",
      "defaultPrompt": [
        "Expense report for my Chicago trip: United $412.40 on the company card, Hyatt 2 nights $189, meals $18.75 and $86.40, Ubers",
        "Convert my London receipts to USD and make an expense report: Hotel £540, dinner £62.50, train €48",
        "Mileage log: 42 miles on June 22 and 58 miles on July 8 at the IRS rate"
      ],
      "capabilities": [
        "Totals by category, reimbursable and company-paid",
        "Foreign receipts converted at the ECB rate for each date",
        "Mileage at the IRS rate for the date driven, or your own rate",
        "Per-diem caps for meals and lodging, cash advances netted",
        "Excel workbook with formulas and a summary sheet",
        "Printable PDF with approval signature lines"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/expense-report/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/expense-report/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "expense report",
      "expense report template",
      "travel expense report",
      "reimbursement form",
      "mileage reimbursement",
      "convert receipts to USD",
      "business trip expenses",
      "per diem calculator"
    ],
    "tools": [
      {
        "name": "create_expense_report",
        "title": "Create expense report",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": true
        }
      }
    ],
    "dataSources": [
      {
        "name": "Frankfurter (European Central Bank reference rates)",
        "url": "https://api.frankfurter.dev",
        "purpose": "Exchange rate for each foreign receipt date. Only currency codes and dates are sent."
      }
    ],
    "review": {
      "positiveTestCases": [
        {
          "description": "A domestic trip with mileage and a company-card flight",
          "prompt": "Make my expense report for the Chicago client visit Sep 14-16: United flight $412.40 on the company card, Hyatt $189 x 2 nights, meals $18.75 and $86.40 (client dinner), Ubers $32.10 and $29.85, and I drove 19 miles to the airport and 19 back.",
          "tools_triggered": [
            "create_expense_report"
          ],
          "expected_behavior": "Total spent $986.38, $412.40 paid by the company, $573.98 reimbursable (38 miles at 76 cents = $28.88), with Excel and PDF downloads."
        },
        {
          "description": "Foreign receipts converted at ECB rates",
          "prompt": "Convert my London trip receipts to USD for an expense report: hotel £540 on Sep 7, dinner £62.50 on Sep 9, Eurostar €148 on Sep 11, taxi £38.20 on Saturday Sep 12.",
          "tools_triggered": [
            "create_expense_report"
          ],
          "expected_behavior": "Receipts converted at ECB rates (Saturday Sep 12 uses the Sep 11 rate): $730.65 + $84.78 + $171.56 + $51.60 = $1,038.59 reimbursable."
        },
        {
          "description": "Per-diem cap and a cash advance",
          "prompt": "Expense report with a $75/day meals per diem: Sep 21 breakfast $14.20, lunch $22.80, dinner $59.50; Sep 22 lunch $18 and dinner $41.75; Marriott $210. I got a $200 cash advance.",
          "tools_triggered": [
            "create_expense_report"
          ],
          "expected_behavior": "Sep 21 meals $96.50 are $21.50 over the $75 limit: $344.75 reimbursable, minus the $200 advance leaves $144.75 owed to Luis."
        },
        {
          "description": "Mileage across the July 1 IRS rate change",
          "prompt": "Mileage reimbursement: 42 miles on June 22 and 58 miles on July 8, 2026 at the IRS rate.",
          "tools_triggered": [
            "create_expense_report"
          ],
          "expected_behavior": "42 mi x $0.725 = $30.45 and 58 mi x $0.76 = $44.08: $74.53 reimbursable."
        },
        {
          "description": "A euro-based report with dollar and franc receipts",
          "prompt": "My company reimburses in euros. Zurich conference: ticket $450 on Sep 2, hotel CHF 720 on Sep 3, dinner CHF 96 on Sep 3.",
          "tools_triggered": [
            "create_expense_report"
          ],
          "expected_behavior": "USD and CHF converted to EUR at the ECB rates of Sep 2 and Sep 3: €388.67 + €766.77 + €102.24 = €1,257.68."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Make an invoice for my client for 10 hours of consulting.",
          "expected_behavior": "Does not call Handy Expense Report Maker: Billing a customer is an invoice, not an expense report."
        },
        {
          "prompt": "What is the euro to dollar exchange rate today?",
          "expected_behavior": "Does not call Handy Expense Report Maker: A plain exchange-rate question needs no expense report."
        },
        {
          "prompt": "Help me make a monthly household budget.",
          "expected_behavior": "Does not call Handy Expense Report Maker: Personal budgeting is not business expense reimbursement."
        }
      ]
    }
  },
  {
    "slug": "shift-scheduler",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/shift-scheduler/mcp",
    "interface": {
      "displayName": "Handy Shift Schedule Maker",
      "shortDescription": "Fair rosters that keep rules",
      "longDescription": "Build a week's staff schedule from your shifts and your team's availability, with every rule kept and every gap reported.\n\nDescribe the shifts (\"Open 6 to 2 needs 2 people, Close 2 to 10 needs 1, every day\") and the team (maximum and minimum hours, days or times they can't work, preferred shifts, roles like manager or RN). The scheduler fills the hardest shifts first, spreads hours fairly against each person's maximum, honours preferences when it can, and never breaks a hard rule: one shift per person per day, a minimum rest between shifts (10 hours by default, so no close-then-open), a limit on days in a row, availability and roles. Anything it cannot fill is listed with the reason (everyone left is unavailable, at their hours limit, and so on), so you know exactly whom to ask.\n\nThe card shows the roster grid and everyone's hours. Download it as an Excel roster, a printable PDF, or a calendar file with every shift. The same input always gives the same schedule. Nothing is stored.",
      "category": "Business & Operations",
      "defaultPrompt": [
        "Make a schedule for my café next week: Open 6-2 needs 2, Close 2-10 needs 1, every day. Staff: Ana 40h, Ben 40h, Cara 32h…",
        "Schedule 5 nurses on 12-hour day and night shifts this weekend, 2 per shift",
        "Build a fair weekly rota for 4 people, nobody works more than 5 days in a row"
      ],
      "capabilities": [
        "Fills shifts fairly against each person's maximum hours",
        "Respects availability, time-off windows, roles and preferences",
        "Minimum rest between shifts and a limit on days in a row",
        "Reports every unfilled shift with the reason",
        "Roster grid and hours per person",
        "Excel roster, printable PDF and calendar (.ics) downloads"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/shift-scheduler/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/shift-scheduler/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "shift schedule maker",
      "employee schedule",
      "make a staff rota",
      "weekly work schedule",
      "roster generator",
      "schedule my employees",
      "shift planner",
      "nurse shift schedule"
    ],
    "tools": [
      {
        "name": "make_shift_schedule",
        "title": "Make a shift schedule",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "A café week, everything filled",
          "prompt": "Make a schedule for my café for the week of Oct 5: Open 6am-2pm needs 2 people, Close 2pm-10pm needs 1, every day. Staff: Ana 40h, Ben 40h, Cara 32h (not Sundays), Dev 32h (no weekends), Eli 24h (prefers closing), Fran 16h.",
          "tools_triggered": [
            "make_shift_schedule"
          ],
          "expected_behavior": "Hero \"21 of 21 shifts filled\" (168 hours); Eli gets only Close shifts as preferred; nobody over their maximum, no close followed by an open, Cara off Sunday and Dev off the weekend; Excel, PDF and calendar downloads."
        },
        {
          "description": "Short-staffed: gaps reported, not hidden",
          "prompt": "Schedule 3 people (40h max each) on Morning 7-3 and Evening 3-11, 2 people per shift, Monday to Sunday starting Oct 12.",
          "tools_triggered": [
            "make_shift_schedule"
          ],
          "expected_behavior": "15 of 28 shifts filled (each person 5 shifts, 40 h); the 13 open slots are listed with the reason (everyone is at their maximum hours or already working that day)."
        },
        {
          "description": "12-hour nursing shifts with an overnight",
          "prompt": "Schedule 5 RNs for Fri Oct 9 to Sun Oct 11: Day 7am-7pm and Night 7pm-7am, 2 RNs each. Max 36 hours each. Priya can't do nights.",
          "tools_triggered": [
            "make_shift_schedule"
          ],
          "expected_behavior": "All 12 shifts filled (144 h), nobody over 36 h, Priya only on Day shifts, and no one goes from a Night (ending 7 AM) straight into a Day shift."
        },
        {
          "description": "Preferences and a part-timer's minimum",
          "prompt": "Weekday schedule for Oct 5-9: Front 9-5 needs 1, Phones 12-8 needs 1. Tom prefers Front, Uma prefers Phones, Val is part-time and needs at least 16 hours, max 24.",
          "tools_triggered": [
            "make_shift_schedule"
          ],
          "expected_behavior": "All 10 shifts filled; Val gets at least 16 hours; Tom works only Front and Uma only Phones."
        },
        {
          "description": "Time-window availability",
          "prompt": "Make next week's schedule (from Oct 12): Open 7-3 and Close 3-11, 1 person each, every day. Sam can't work before noon on weekdays. Team: Sam, Tia, Ugo, each max 40h.",
          "tools_triggered": [
            "make_shift_schedule"
          ],
          "expected_behavior": "All 14 shifts filled; Sam never opens on a weekday; nobody exceeds 40 h."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "I worked 8:30 to 5 with a 30 minute lunch, how many hours is that?",
          "expected_behavior": "Does not call Handy Shift Schedule Maker: Adding up hours already worked is a time card, not building a schedule."
        },
        {
          "prompt": "Find a time for a meeting with my team in London and New York.",
          "expected_behavior": "Does not call Handy Shift Schedule Maker: A meeting across time zones, not a staff roster."
        },
        {
          "prompt": "Write a polite message asking my team for their availability next week.",
          "expected_behavior": "Does not call Handy Shift Schedule Maker: Writing a message needs no scheduling."
        }
      ]
    }
  },
  {
    "slug": "profit-margin",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/profit-margin/mcp",
    "interface": {
      "displayName": "Handy Profit Margin Calculator",
      "shortDescription": "Margin, markup and pricing",
      "longDescription": "Work out profit margin, markup and the right selling price, exactly, including marketplace and payment fees.\n\nGive any two of cost, price, margin or markup and the card solves the rest, with a clear split of the price into cost, fees and profit. Add percentage and per-unit fees (card processing, marketplace referral fees) to see your real net margin, fixed costs to see break-even units and revenue, and test discounts to see the new margin and how many more sales you need to earn the same profit. Or start from a cost and a target margin to get the lowest price that hits it after fees, with charm-price options like 19.99 and their exact margins.\n\nSliders for price and percentage off update the numbers instantly, and a CSV table shows margin at a range of price points. Margin vs markup is spelled out every time, so the two never get mixed up.",
      "category": "Finance",
      "defaultPrompt": [
        "I buy a product for $40 and sell it for $65. What is my margin and markup?",
        "What price do I need for a 60% margin on an $18 item after a 15% marketplace fee?",
        "Cost $30, price $50: what happens to my margin with a 20% discount?"
      ],
      "capabilities": [
        "Solves cost, price, margin or markup from any two",
        "Net margin after percentage and per-unit fees",
        "Break-even units and revenue from fixed costs",
        "Discount impact and the sales lift needed",
        "Price for a target margin, with charm prices",
        "Price and discount sliders; CSV price table"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/profit-margin/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/profit-margin/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "profit margin calculator",
      "margin calculator",
      "markup calculator",
      "margin vs markup",
      "what price for 40% margin",
      "gross margin",
      "break even calculator",
      "pricing calculator",
      "net margin after fees"
    ],
    "tools": [
      {
        "name": "calculate_margin",
        "title": "Calculate margin",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      },
      {
        "name": "price_for_margin",
        "title": "Price for a target margin",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Margin and markup from cost and price",
          "prompt": "I buy a product for $40 and sell it for $65. What is my margin and markup?",
          "tools_triggered": [
            "calculate_margin"
          ],
          "expected_behavior": "$25 profit per unit: 38.46% margin and 62.5% markup."
        },
        {
          "description": "Price from a cost and a target margin",
          "prompt": "My cost is $12 and I want a 40% margin. What price, and what markup is that?",
          "tools_triggered": [
            "calculate_margin"
          ],
          "expected_behavior": "Price $20.00, $8 profit, which is a 66.67% markup."
        },
        {
          "description": "Net margin after payment fees",
          "prompt": "I sell an online course for $49.99, it costs me $18.50 per student, and card processing takes 2.9% + $0.30. Net margin?",
          "tools_triggered": [
            "calculate_margin"
          ],
          "expected_behavior": "Fees $1.75 per sale; net profit $29.74 and net margin 59.49% (gross margin 62.99%)."
        },
        {
          "description": "Discount impact and break-even",
          "prompt": "Cost $30, price $50, I sell about 400 a month with $5,000 fixed costs. What does a 20% discount do to my margin, and where do I break even?",
          "tools_triggered": [
            "calculate_margin"
          ],
          "expected_behavior": "40% margin now; break-even at 250 units. A 20% discount cuts the margin to 25% and needs 100% more sales (800 units) for the same profit."
        },
        {
          "description": "Price for a margin after a marketplace fee",
          "prompt": "What price do I need for a 60% margin on an $18 item after a 15% marketplace referral fee?",
          "tools_triggered": [
            "price_for_margin"
          ],
          "expected_behavior": "At least $72.00 (18 ÷ (1 - 0.15 - 0.60)); charm price $72.99 gives a 60.34% margin."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How much sales tax is on a $200 purchase in Texas?",
          "expected_behavior": "Does not call Handy Profit Margin Calculator: Sales tax is a different calculation."
        },
        {
          "prompt": "What return did my stock make if I bought at $40 and sold at $65?",
          "expected_behavior": "Does not call Handy Profit Margin Calculator: Investment return, not a product margin."
        },
        {
          "prompt": "Write a pricing page for my SaaS product.",
          "expected_behavior": "Does not call Handy Profit Margin Calculator: Copywriting needs no margin maths."
        }
      ]
    }
  },
  {
    "slug": "sales-tax",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/sales-tax/mcp",
    "interface": {
      "displayName": "Handy Sales Tax Calculator",
      "shortDescription": "Sales tax, VAT and GST",
      "longDescription": "Add or remove sales tax, VAT or GST exactly, with current rates for every US state, Canadian province and 38 countries.\n\nAsk \"what is the sales tax on $129.99 in Texas\", \"how much VAT is in €59.90\", or \"price before tax for $287.44 in Quebec\" and get the net, tax and total to the cent, with each component shown (state and local, GST and PST, QST, HST). Add several items with their own rates (zero-rated food, a reduced VAT rate), switch between adding tax and extracting it from a tax-inclusive price, and compare the same purchase across up to six places.\n\nUS rates are state rates as of July 1, 2026; city and county taxes vary, so the card shows the state average and accepts the exact combined rate from your receipt. VAT and GST tables cover the EU 27, the UK, Norway, Switzerland, Australia, New Zealand, Japan, Singapore, India and Mexico. Not tax advice.",
      "category": "Finance",
      "defaultPrompt": [
        "What is the sales tax on $129.99 in Texas?",
        "How much VAT is included in €59.90 in Germany?",
        "Compare sales tax on a $1,000 laptop in California, Texas, New York, Oregon, Ontario and the UK"
      ],
      "capabilities": [
        "Add tax or extract it from a tax-inclusive price",
        "All 50 states and DC, with average local rates",
        "Canada GST, HST, PST and QST by province",
        "VAT and GST for the EU 27, UK and 11 more countries",
        "Several items with their own rates",
        "Compare one purchase across up to 6 places"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/sales-tax/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/sales-tax/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "sales tax calculator",
      "how much is sales tax",
      "reverse sales tax calculator",
      "vat calculator",
      "remove vat",
      "gst calculator",
      "hst calculator",
      "price before tax",
      "sales tax by state"
    ],
    "tools": [
      {
        "name": "calculate_sales_tax",
        "title": "Calculate sales tax",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      },
      {
        "name": "compare_tax_rates",
        "title": "Compare tax rates",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "US state sales tax, state rate only",
          "prompt": "What is the sales tax on $129.99 in Texas?",
          "tools_triggered": [
            "calculate_sales_tax"
          ],
          "expected_behavior": "Texas state rate 6.25%: $8.12 tax, $138.11 total, with a note that local taxes average 1.95% (about $10.66 at 8.2% combined)."
        },
        {
          "description": "Extract VAT from a tax-inclusive price",
          "prompt": "How much VAT is included in €59.90 in Germany?",
          "tools_triggered": [
            "calculate_sales_tax"
          ],
          "expected_behavior": "€59.90 includes €9.56 VAT at 19%; the price before tax is €50.34."
        },
        {
          "description": "Quebec GST + QST",
          "prompt": "I am buying a $250 bike in Montreal. How much tax?",
          "tools_triggered": [
            "calculate_sales_tax"
          ],
          "expected_behavior": "GST 5% $12.50 + QST 9.975% $24.94 = $37.44 tax; total $287.44."
        },
        {
          "description": "UK VAT with mixed rates per item",
          "prompt": "Add UK VAT: a laptop £899, two books at £24.99 (zero-rated), and a child car seat £150 at the 5% rate.",
          "tools_triggered": [
            "calculate_sales_tax"
          ],
          "expected_behavior": "Net £1,098.98; VAT £179.80 + £0 + £7.50 = £187.30; total £1,286.28."
        },
        {
          "description": "Compare one purchase across six places",
          "prompt": "Compare sales tax on a $1,000 laptop in California, Texas, New York, Oregon, Ontario and the UK.",
          "tools_triggered": [
            "compare_tax_rates"
          ],
          "expected_behavior": "Oregon $0; New York $40 (state only); Texas $62.50; California $72.50; Ontario HST $130; UK VAT $200. Lowest Oregon; US local taxes flagged."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How much federal income tax will I pay on $85,000?",
          "expected_behavior": "Does not call Handy Sales Tax Calculator: Income tax is not sales tax."
        },
        {
          "prompt": "Make an invoice with 8.875% sales tax for my client.",
          "expected_behavior": "Does not call Handy Sales Tax Calculator: Making an invoice document is a different job."
        },
        {
          "prompt": "Should I register for VAT as a freelancer in Germany?",
          "expected_behavior": "Does not call Handy Sales Tax Calculator: A legal/registration question with no calculation."
        }
      ]
    }
  },
  {
    "slug": "gantt-chart",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/gantt-chart/mcp",
    "interface": {
      "displayName": "Handy Gantt Chart Maker",
      "shortDescription": "Timelines with a critical path",
      "longDescription": "Turn a list of tasks into a scheduled Gantt chart with real dates, dependencies and the critical path.\n\nGive each task a duration, what it waits for, an owner, progress and a phase. The plan is scheduled on a working-day calendar (Monday to Friday by default, or any days you choose, minus holidays), with finish-to-start links and lags. You get the exact finish date, each task's start and finish, how many days each can slip (float), and the critical path: the chain of tasks that sets the end date. Loops in the dependencies are caught and named.\n\nThe card draws the chart with phases, progress bars, milestones as diamonds, dependency arrows, weekends shaded and a today line. Download the chart as an SVG, the schedule as an Excel workbook with a week-by-week grid, a CSV, and a calendar file of the milestones. Nothing is stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "Make a gantt chart: design 5 days, build 10 days after design, test 3 days, docs 4 days after design, launch when all done",
        "Project timeline for a kitchen remodel starting Oct 5, skip weekends and Thanksgiving",
        "When will we finish? Plan 3d, order parts 2d (wait 2 days after plan), install 4d"
      ],
      "capabilities": [
        "Schedules tasks on working days, skipping weekends and holidays",
        "Finish-to-start dependencies with lags, loops detected",
        "Critical path and float for every task",
        "Gantt chart with phases, progress, milestones and a today line",
        "SVG, Excel (with a week grid), CSV and calendar downloads"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/gantt-chart/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/gantt-chart/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "make a gantt chart",
      "gantt chart maker",
      "project timeline",
      "project schedule from these tasks",
      "critical path calculator",
      "when will my project finish",
      "project plan with dependencies"
    ],
    "tools": [
      {
        "name": "make_gantt_chart",
        "title": "Make a Gantt chart",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "A small software project",
          "prompt": "Make a gantt chart starting Monday Oct 5: design 5 days, build 10 days after design, test 3 days after build, docs 4 days after design, launch when test and docs are done",
          "tools_triggered": [
            "make_gantt_chart"
          ],
          "expected_behavior": "Finishes Wed, Oct 28, 2026 after 18 working days; critical path A → B → C → E; Docs has 9 days of float."
        },
        {
          "description": "Holidays and a lag",
          "prompt": "Plan 3 days starting Nov 23, then order parts 2 days but wait 2 days after planning first, then install 4 days. We are off Nov 26 and 27 for Thanksgiving.",
          "tools_triggered": [
            "make_gantt_chart"
          ],
          "expected_behavior": "Plan Nov 23-25; order starts Wed, Dec 2 after the holiday weekend and a 2-day lag; finish Wed, Dec 9 (11 working days)."
        },
        {
          "description": "Phases, owners and progress",
          "prompt": "Kitchen remodel from Oct 1: demo 3d (Mike, done), plumbing 2d and electrical 3d after demo, drywall 4d after both, then cabinets 3d and paint 2d, countertop template once cabinets are in, countertops 5d, final inspection at the end.",
          "tools_triggered": [
            "make_gantt_chart"
          ],
          "expected_behavior": "Finishes Mon, Oct 26 (18 working days); critical path demo → elec → dry → cab → tmpl → top → insp; plumbing float 1, paint float 6."
        },
        {
          "description": "Calendar days",
          "prompt": "Event plan in calendar days from Oct 1: book venue 7 days, invitations 3 days, RSVPs 14 days, then the event.",
          "tools_triggered": [
            "make_gantt_chart"
          ],
          "expected_behavior": "Venue Oct 1-7, invitations Oct 8-10, RSVPs Oct 11-24, event milestone Sat, Oct 24 (24 days)."
        },
        {
          "description": "Six-day work weeks",
          "prompt": "Construction works Monday to Saturday. Foundation 10 days from Oct 5, then framing 12 days. When is framing done?",
          "tools_triggered": [
            "make_gantt_chart"
          ],
          "expected_behavior": "Foundation Oct 5-15, framing Oct 16-29; finishes Thu, Oct 29."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How many business days are there between Oct 5 and Dec 18?",
          "expected_behavior": "Does not call Handy Gantt Chart Maker: Counting days between two dates is a date calculator question, not a project schedule."
        },
        {
          "prompt": "Make me a to-do list for moving house.",
          "expected_behavior": "Does not call Handy Gantt Chart Maker: A checklist without durations or dependencies needs no scheduling."
        },
        {
          "prompt": "Make a weekly shift rota for my 5 baristas.",
          "expected_behavior": "Does not call Handy Gantt Chart Maker: Staff rosters are not project timelines."
        }
      ]
    }
  },
  {
    "slug": "paycheck-calculator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/paycheck-calculator/mcp",
    "interface": {
      "displayName": "Handy Paycheck Calculator",
      "shortDescription": "Take-home pay after taxes",
      "longDescription": "Estimate your take-home pay per paycheck and per year in any US state, with 2026 federal withholding, Social Security, Medicare, state income tax and state payroll taxes.\n\nEnter a salary or an hourly rate, how often you are paid, your filing status and state. Add 401(k), HSA and pre-tax health premiums, children and other dependents from your W-4, extra withholding or the two-jobs box. Federal tax follows the IRS 2026 percentage method (Publication 15-T, updated for the One Big Beautiful Bill Act). Social Security is 6.2% up to the 2026 wage base of $184,500 and Medicare is 1.45% plus 0.9% over $200,000. State income tax covers all 50 states and DC, with each state's source and year, and notable payroll taxes such as California SDI, New York disability and paid family leave, New Jersey TDI and FLI, Washington paid leave and WA Cares. New York City and Yonkers residents can include the city tax.\n\nThe card shows take-home per paycheck, a chart of where the money goes and a per-paycheck and yearly breakdown; slide the salary or 401(k), or switch state and pay frequency. A second tool converts pay between hourly, weekly, biweekly, monthly and yearly. Estimates, not tax advice. Nothing is stored.",
      "category": "Finance",
      "defaultPrompt": [
        "What's my take-home pay on $85,000 in California, paid every two weeks?",
        "Paycheck calculator Texas: $60,000 salary, single, biweekly",
        "$25 an hour is how much a year?"
      ],
      "capabilities": [
        "2026 federal withholding by the IRS percentage method (Pub. 15-T)",
        "Social Security, Medicare and additional Medicare tax",
        "State income tax for all 50 states and DC, with sources",
        "State payroll taxes: CA SDI, NY PFL, NJ TDI/FLI, WA PFML and more",
        "401(k), HSA, pre-tax premiums, dependents and extra withholding",
        "Hourly, weekly, biweekly, monthly and yearly pay conversion"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/paycheck-calculator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/paycheck-calculator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "paycheck calculator",
      "take home pay calculator",
      "salary after taxes",
      "paycheck calculator texas",
      "85k after taxes california",
      "how much is my paycheck after taxes",
      "$25 an hour is how much a year",
      "hourly to salary calculator",
      "net pay calculator"
    ],
    "tools": [
      {
        "name": "calculate_paycheck",
        "title": "Calculate take-home pay",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      },
      {
        "name": "convert_pay",
        "title": "Convert pay",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "85k after taxes in California",
          "prompt": "What's my take-home pay on $85,000 in California? Single, paid every two weeks.",
          "tools_triggered": [
            "calculate_paycheck"
          ],
          "expected_behavior": "Take-home $2,456.25 per paycheck ($63,862.40 a year): federal $379.62, Social Security $202.69, Medicare $47.40, CA income tax $140.77, CA SDI $42.50."
        },
        {
          "description": "Texas, no state income tax",
          "prompt": "Paycheck calculator Texas: $60,000 salary, single, biweekly",
          "tools_triggered": [
            "calculate_paycheck"
          ],
          "expected_behavior": "Take-home $1,938.07 every two weeks: federal $193.08, Social Security $143.08, Medicare $33.46, no state tax."
        },
        {
          "description": "New York City family with a 401(k)",
          "prompt": "Married, two kids, $150,000 salary in New York City, paid monthly, 6% to my 401k. What do I take home?",
          "tools_triggered": [
            "calculate_paycheck"
          ],
          "expected_behavior": "Take-home $9,106.18 a month: 401(k) $750, federal $746.67, FICA $956.25, NY $525.57, NYC $378.40, SDI $2.60, PFL $34.33."
        },
        {
          "description": "Pennsylvania head of household with benefits",
          "prompt": "Head of household in Pennsylvania, $72,000, paid twice a month, one child. I put $100 per paycheck in an HSA and pay $120 per paycheck for health insurance.",
          "tools_triggered": [
            "calculate_paycheck"
          ],
          "expected_behavior": "Take-home $2,375.55 twice a month: federal $106.43 after the $2,200 child credit, PA 3.07% $85.35."
        },
        {
          "description": "Hourly to yearly",
          "prompt": "$25 an hour is how much a year?",
          "tools_triggered": [
            "convert_pay"
          ],
          "expected_behavior": "$52,000 a year at 40 hours a week, $4,333.33 a month, $2,000 every two weeks."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How much will I owe in self-employment tax on $80,000 of 1099 income?",
          "expected_behavior": "Does not call Handy Paycheck Calculator: Self-employment tax on contractor income, not a W-2 paycheck."
        },
        {
          "prompt": "Calculate my hours this week: Mon 9-5, Tue 9-6.",
          "expected_behavior": "Does not call Handy Paycheck Calculator: Adding up worked hours is a time card job."
        },
        {
          "prompt": "Help me fill out my 1040 tax return.",
          "expected_behavior": "Does not call Handy Paycheck Calculator: Filing a return is not a paycheck estimate."
        }
      ]
    }
  },
  {
    "slug": "loan-calculator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/loan-calculator/mcp",
    "interface": {
      "displayName": "Handy Loan Calculator",
      "shortDescription": "Payments and amortization",
      "longDescription": "Work out the exact monthly payment on a car loan, personal loan, student loan or mortgage, see how much interest you will pay in total, and download the full amortization schedule.\n\nGive the amount (or the price and down payment), the APR and the term. The card shows the monthly payment rounded to the cent like a lender does, the total interest, the total paid and the payoff date, a chart of the balance over time and a year-by-year table, with every monthly payment in the full view. Add an extra monthly payment or one-time lump sums to see how many months and how much interest they save. Drag the APR slider, switch the term or change the extra payment and the card recalculates.\n\nComparing offers? Put 2 to 4 loans side by side, with fees, to see which costs least overall and which has the lowest payment. Download the schedule as an Excel workbook with live formulas or as CSV. Nothing is stored.",
      "category": "Finance",
      "defaultPrompt": [
        "Car loan: $35,000 at 6.9% for 60 months. What is my payment?",
        "Mortgage of $400,000 at 6.5% for 30 years, what if I pay $200 extra a month?",
        "Compare 3 car loan offers: 5.9% for 60 months, 6.4% for 72 months, 4.9% for 48 months on $28,000"
      ],
      "capabilities": [
        "Monthly payment rounded to the cent, with the final payment adjusted",
        "Total interest, total paid and payoff date",
        "Extra monthly and one-time payments: months and interest saved",
        "Balance chart and year-by-year amortization table",
        "Amortization schedule as Excel (live formulas) or CSV",
        "Side-by-side comparison of 2 to 4 loan offers"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/loan-calculator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/loan-calculator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "loan calculator",
      "car loan calculator",
      "auto loan payment calculator",
      "mortgage payment calculator",
      "amortization schedule",
      "personal loan calculator",
      "student loan payoff calculator",
      "extra payment calculator",
      "compare loan offers"
    ],
    "tools": [
      {
        "name": "calculate_loan",
        "title": "Calculate loan payment",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      },
      {
        "name": "compare_loans",
        "title": "Compare loan offers",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "A 5-year car loan",
          "prompt": "Car loan: $35,000 at 6.9% for 60 months. What is my payment?",
          "tools_triggered": [
            "calculate_loan"
          ],
          "expected_behavior": "Monthly payment $691.39, total interest $6,483.56, 60 payments, schedule downloads."
        },
        {
          "description": "30-year mortgage",
          "prompt": "What is the monthly payment on a $400,000 mortgage at 6.5% for 30 years?",
          "tools_triggered": [
            "calculate_loan"
          ],
          "expected_behavior": "Principal and interest $2,528.27 a month, 360 payments, $510,179.81 total interest."
        },
        {
          "description": "Mortgage with $200 extra a month",
          "prompt": "Mortgage of $400,000 at 6.5% for 30 years, what if I pay $200 extra a month?",
          "tools_triggered": [
            "calculate_loan"
          ],
          "expected_behavior": "Same $2,528.27 payment; 293 payments instead of 360 (5 years 7 months sooner), saving $111,892.52 of interest."
        },
        {
          "description": "Price and down payment",
          "prompt": "I'm buying a $32,000 car with $5,000 down, 7.5% APR for 72 months. Payment and total interest?",
          "tools_triggered": [
            "calculate_loan"
          ],
          "expected_behavior": "Borrowing $27,000: $466.83 a month, $6,612.06 in total interest."
        },
        {
          "description": "Compare three offers",
          "prompt": "Compare 3 car loan offers on $28,000: credit union 5.9% for 60 months, dealer 6.4% for 72 months, bank 4.9% for 48 months with a $300 fee",
          "tools_triggered": [
            "compare_loans"
          ],
          "expected_behavior": "Bank costs least overall ($3,190.53 in interest and fees) while the dealer has the lowest payment ($469.35)."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "I have three credit cards with different balances. Should I pay the highest interest first?",
          "expected_behavior": "Does not call Handy Loan Calculator: Paying down several existing debts is a debt payoff plan, not a single loan calculation."
        },
        {
          "prompt": "If I save $500 a month at 7% for 20 years, how much will I have?",
          "expected_behavior": "Does not call Handy Loan Calculator: Savings growth is compound interest, not a loan."
        },
        {
          "prompt": "What credit score do I need to get approved for a car loan?",
          "expected_behavior": "Does not call Handy Loan Calculator: An eligibility question with no calculation to run."
        }
      ]
    }
  },
  {
    "slug": "debt-payoff",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/debt-payoff/mcp",
    "interface": {
      "displayName": "Handy Debt Payoff Planner",
      "shortDescription": "Snowball vs avalanche plan",
      "longDescription": "Plan how to pay off credit cards and loans: get your debt-free date, the order your debts get cleared and the total interest, month by month.\n\nList each debt with its balance, APR and minimum payment, and say how much you can put toward debt each month. The planner simulates every month: interest accrues, every minimum gets paid, and everything extra goes to one target debt, highest interest rate first (avalanche) or smallest balance first (snowball). When a debt is paid off its payment rolls into the next one. Compare both methods to see the difference in interest and months, move the budget slider to see how much sooner you finish, and download the full month-by-month plan as an Excel workbook.\n\nIf the budget does not cover the minimums, or a debt would never be paid off, the planner says so plainly. Nothing is stored.",
      "category": "Finance",
      "defaultPrompt": [
        "Snowball or avalanche? Visa $5,000 at 22.99% min $150, Mastercard $2,500 at 18.5% min $75. I can pay $500 a month",
        "When will I be debt free if I pay $900 a month on my car loan, credit card and student loan?",
        "Make a debt snowball plan for my credit cards"
      ],
      "capabilities": [
        "Month-by-month simulation with interest, minimums and rollover",
        "Avalanche (highest APR first) and snowball (smallest balance first)",
        "Debt-free date, payoff order and total interest",
        "Side-by-side comparison of both methods",
        "Budget slider to see how extra money changes the date",
        "Excel month-by-month payment plan"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/debt-payoff/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/debt-payoff/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "debt payoff calculator",
      "debt snowball calculator",
      "debt avalanche calculator",
      "snowball vs avalanche",
      "when will I be debt free",
      "credit card payoff plan",
      "pay off credit card debt",
      "debt free date calculator"
    ],
    "tools": [
      {
        "name": "plan_debt_payoff",
        "title": "Plan debt payoff",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Three credit cards, compare both methods",
          "prompt": "Snowball or avalanche? Visa $5,000 at 22.99% min $150, Mastercard $2,500 at 18.5% min $75. I can pay $500 a month",
          "tools_triggered": [
            "plan_debt_payoff"
          ],
          "expected_behavior": "Avalanche leads: store card, Visa, then Mastercard, debt-free in 16 months (Feb 2028) with $1,294.37 interest; snowball takes 17 months and $82.10 more."
        },
        {
          "description": "Snowball with four debts",
          "prompt": "Debt snowball plan: car loan $8,000 at 6.9% min $250, credit card $3,200 at 24% min $96, medical bill $1,200 at 0% min $50, student loan $15,000 at 5.5% min $165. I have $900 a month.",
          "tools_triggered": [
            "plan_debt_payoff"
          ],
          "expected_behavior": "Medical bill, credit card, car loan, then student loan: debt-free in 34 months (Aug 2029), $2,686.75 interest."
        },
        {
          "description": "One credit card with a fixed payment",
          "prompt": "How long to pay off $12,000 on a credit card at 21% if I pay $500 a month?",
          "tools_triggered": [
            "plan_debt_payoff"
          ],
          "expected_behavior": "32 months (paid off Jun 2029) and $3,700.43 of interest."
        },
        {
          "description": "Avalanche with a big budget",
          "prompt": "Avalanche plan: personal loan $9,500 at 11.5% min $310, Amex $4,200 at 27.24% min $126. Budget $1,200 a month starting January 2027.",
          "tools_triggered": [
            "plan_debt_payoff"
          ],
          "expected_behavior": "Amex is paid off first (Jun 2027), debt-free in Jan 2028 after 13 payments, $1,066.64 interest."
        },
        {
          "description": "Snowball vs avalanche on two cards",
          "prompt": "Is snowball or avalanche better for me? Card A $1,000 at 29.99% min $40, Card B $6,000 at 15.99% min $180, $450 a month.",
          "tools_triggered": [
            "plan_debt_payoff"
          ],
          "expected_behavior": "Both methods target Card A first here, so they match: 18 months and $933.47 interest either way."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What will my monthly payment be on a $25,000 car loan at 7% for 5 years?",
          "expected_behavior": "Does not call Handy Debt Payoff Planner: A single new loan payment is a loan calculator question, not a multi-debt payoff plan."
        },
        {
          "prompt": "Should I consolidate my credit card debt with a personal loan or a balance transfer card?",
          "expected_behavior": "Does not call Handy Debt Payoff Planner: Product advice with no debts listed to simulate."
        },
        {
          "prompt": "How much will $10,000 grow in 10 years at 5%?",
          "expected_behavior": "Does not call Handy Debt Payoff Planner: Savings growth, not paying off debt."
        }
      ]
    }
  },
  {
    "slug": "compound-interest",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/compound-interest/mcp",
    "interface": {
      "displayName": "Handy Compound Interest",
      "shortDescription": "Savings growth and goals",
      "longDescription": "See exactly how savings and investments grow with compound interest, and how much to save each month to hit a goal.\n\nEnter a starting amount, a monthly or yearly contribution, the annual rate and the number of years. Choose daily, monthly, quarterly or annual compounding, deposits at the start or end of each period, a yearly raise in your contributions, and an inflation rate to see the result in today's money. The card shows the final balance, how much you deposited versus how much interest earned, a chart of deposits vs growth and a year-by-year table. Drag the rate and years sliders to compare scenarios.\n\nSaving toward something? Give the target and the deadline to get the monthly amount needed, or the monthly amount to get how long it takes. Download the year-by-year table as an Excel workbook with live formulas. An illustration, not investment advice.",
      "category": "Finance",
      "defaultPrompt": [
        "If I invest $500 a month at 8% for 30 years, how much will I have?",
        "How much is $10,000 worth after 20 years at 7% compounded monthly?",
        "How much do I need to save each month to have $50,000 in 5 years?"
      ],
      "capabilities": [
        "Exact compound growth with daily, monthly, quarterly or annual compounding",
        "Monthly or yearly contributions, at the start or end of each period",
        "Yearly contribution raises and inflation-adjusted results",
        "Deposits vs growth chart and year-by-year table",
        "Monthly amount needed for a goal, or the time it takes",
        "Excel year-by-year table with live formulas"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/compound-interest/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/compound-interest/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "compound interest calculator",
      "investment calculator",
      "savings calculator",
      "how much will my savings grow",
      "retirement savings calculator",
      "savings goal calculator",
      "how much to save each month",
      "future value calculator"
    ],
    "tools": [
      {
        "name": "calculate_compound_interest",
        "title": "Calculate compound interest",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      },
      {
        "name": "savings_goal",
        "title": "Plan a savings goal",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "A lump sum compounded monthly",
          "prompt": "How much is $10,000 worth after 20 years at 7% compounded monthly?",
          "tools_triggered": [
            "calculate_compound_interest"
          ],
          "expected_behavior": "$40,387.39, of which $30,387.39 is interest."
        },
        {
          "description": "Monthly investing for 30 years",
          "prompt": "If I invest $500 a month at 8% for 30 years, how much will I have?",
          "tools_triggered": [
            "calculate_compound_interest"
          ],
          "expected_behavior": "$745,179.72 from $180,000 of deposits ($565,179.72 of growth)."
        },
        {
          "description": "Annual compounding with inflation and raises",
          "prompt": "Start with $5,000, add $200 a month increasing 3% a year, 5% compounded annually for 10 years. What is it worth in today's money with 2.5% inflation?",
          "tools_triggered": [
            "calculate_compound_interest"
          ],
          "expected_behavior": "$43,118.65 after 10 years ($32,513.31 deposited), worth $33,684.22 in today's money."
        },
        {
          "description": "Monthly amount for a goal",
          "prompt": "I have $5,000 saved. How much do I need to save each month to have $50,000 in 5 years at 4.5%?",
          "tools_triggered": [
            "savings_goal"
          ],
          "expected_behavior": "$651.44 a month for 60 months."
        },
        {
          "description": "Time to reach a goal",
          "prompt": "I have $50,000 invested and add $1,000 a month at 7%. How long until I have $1 million?",
          "tools_triggered": [
            "savings_goal"
          ],
          "expected_behavior": "287 months (23 years 11 months)."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What is the monthly payment on a $20,000 loan at 6% for 4 years?",
          "expected_behavior": "Does not call Handy Compound Interest: A loan payment, not savings growth."
        },
        {
          "prompt": "Which index fund should I buy for retirement?",
          "expected_behavior": "Does not call Handy Compound Interest: Investment product advice, nothing to calculate."
        },
        {
          "prompt": "What was $100 in 1980 worth in today's dollars?",
          "expected_behavior": "Does not call Handy Compound Interest: Historical inflation adjustment uses CPI data, not a compound interest projection."
        }
      ]
    }
  },
  {
    "slug": "inflation-calculator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/inflation-calculator/mcp",
    "interface": {
      "displayName": "Handy Inflation Calculator",
      "shortDescription": "Old money in today's dollars",
      "longDescription": "Find out what an amount of money from any year is worth today, using official consumer price index data built in: US CPI-U back to 1913, UK CPI and the long-run RPI back to 1800, Canada CPI back to 1914 and the euro area HICP back to 1996.\n\nAsk \"what is $100 in 1990 worth today\" or \"how much was a $40,000 salary in 2005 in 2025 dollars\" and the card shows the equivalent amount, the cumulative inflation, the average yearly rate and what today's money would have bought back then, with a chart of the value year by year and a table of decade milestones. Compare specific months too (January 2020 to January 2026). Move the from and to year sliders to explore. \"Today\" means the latest month published by the statistics office, and the current year uses its latest month rather than a partial average.\n\nData: US CPI-U: U.S. Bureau of Labor Statistics, CPI-U series CUUR0000SA0, through August 2026; UK CPI: Office for National Statistics, CPI series D7BT, through August 2026; UK RPI (long run): Office for National Statistics, long-run RPI series CDKO, through August 2026; Canada CPI: Statistics Canada, tables 18-10-0004-01 and 18-10-0005-01, through August 2026; Euro area HICP: Eurostat, HICP (prc_hicp_aind, prc_hicp_minr), through August 2026. Download the year-by-year values as CSV.",
      "category": "Finance",
      "defaultPrompt": [
        "What is $100 in 1990 worth today?",
        "How much would a $50,000 salary in 2000 be in 2025 dollars?",
        "What is £100 from 1970 worth now in the UK?"
      ],
      "capabilities": [
        "Official CPI data built in: US from 1913, UK from 1800, Canada from 1914, euro area from 1996",
        "Monthly precision where published, latest month for \"today\"",
        "Equivalent amount, cumulative and average yearly inflation",
        "Buying-power comparison in both directions",
        "Year-by-year chart, decade milestones and CSV download"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/inflation-calculator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/inflation-calculator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "inflation calculator",
      "what is $100 in 1990 worth today",
      "value of a dollar over time",
      "CPI inflation calculator",
      "buying power calculator",
      "salary adjusted for inflation",
      "how much is 1980 money worth today",
      "UK inflation calculator"
    ],
    "tools": [
      {
        "name": "adjust_for_inflation",
        "title": "Adjust for inflation",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Classic: $100 in 1990 today",
          "prompt": "What is $100 in 1990 worth today?",
          "tools_triggered": [
            "adjust_for_inflation"
          ],
          "expected_behavior": "$256.30 in August 2026 dollars (CPI-U 130.7 to 334.980), +156.3% cumulative."
        },
        {
          "description": "A salary between two years",
          "prompt": "How much would a $50,000 salary in 2000 be in 2025 dollars?",
          "tools_triggered": [
            "adjust_for_inflation"
          ],
          "expected_behavior": "$93,479.38 using the 2000 and 2025 annual averages (172.2 to 321.943), +87.0%."
        },
        {
          "description": "Month to month",
          "prompt": "How much did prices rise from January 2020 to January 2026? What does $1,000 then equal now?",
          "tools_triggered": [
            "adjust_for_inflation"
          ],
          "expected_behavior": "$1,000 in January 2020 equals $1,260.81 in January 2026 (257.971 to 325.252): +26.08%."
        },
        {
          "description": "UK long run",
          "prompt": "What is £100 from 1970 worth now in the UK?",
          "tools_triggered": [
            "adjust_for_inflation"
          ],
          "expected_behavior": "Uses the long-run RPI (CPI starts 1988): £2,275.24 in August 2026 (73.1 to 1,663.2)."
        },
        {
          "description": "Current partial year",
          "prompt": "Canada: what is $20 from 1980 worth in 2026?",
          "tools_triggered": [
            "adjust_for_inflation"
          ],
          "expected_behavior": "2026 is partial, so August 2026 (169.8) is used and the card says so: C$77.18 (1980 average 44.0)."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How much will $10,000 be worth in 20 years if I invest it at 7%?",
          "expected_behavior": "Does not call Handy Inflation Calculator: A future investment projection, not historical inflation."
        },
        {
          "prompt": "Convert 100 US dollars to euros.",
          "expected_behavior": "Does not call Handy Inflation Calculator: Currency conversion, not inflation."
        },
        {
          "prompt": "Why is inflation so high right now?",
          "expected_behavior": "Does not call Handy Inflation Calculator: An economics explanation, no amount to adjust."
        }
      ]
    }
  },
  {
    "slug": "bill-splitter",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/bill-splitter/mcp",
    "interface": {
      "displayName": "Handy Bill Splitter",
      "shortDescription": "Split the bill, to the cent",
      "longDescription": "Split a restaurant bill fairly: who had what, with tax and tip shared in proportion, and shares that add up to the total exactly.\n\nList the items and who had them (or upload a photo of the receipt), mark shared plates, and add tax, tip, a service charge or a coupon. Each person pays for their own items plus their fair part of the extras; a shared appetizer is split between the people who had it. Prefer simple? Switch to an even split. Leftover cents are allocated so the shares sum to the bill to the cent, and you can round everyone up to the next 0.50 or 1.00, with the extra going to the tip.\n\nSay who paid and get a ready-to-send summary (\"Alex owes Sam $28.35\"). A tip slider and an even/itemized switch update the card instantly. Nothing is stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "Split the bill: Alex pizza $18, Sam burger $16.50, Jordan salmon $24, shared nachos $12, 8.875% tax, 20% tip",
        "Split $100 plus $8 tax and a 20% tip evenly between 3 people",
        "We are 4, the bill is $124 plus $10.85 tax, tip 18%, round everyone up to the next dollar"
      ],
      "capabilities": [
        "Itemized split: each pays for what they had",
        "Shared items split between the people who had them",
        "Tax and tip shared in proportion, or an even split",
        "Service charges, coupons, tip before or after tax",
        "Shares that sum to the bill exactly; optional round-up",
        "Who owes whom, as a summary to paste in the group chat"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/bill-splitter/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/bill-splitter/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "split the bill",
      "bill splitter",
      "tip calculator",
      "who owes what",
      "split a restaurant check",
      "split tip and tax",
      "how much does each person owe",
      "divide the bill"
    ],
    "tools": [
      {
        "name": "split_bill",
        "title": "Split the bill",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Itemized dinner with shared plates, tax, tip and a payer",
          "prompt": "Split the bill: Alex had pizza $18, Sam a burger $16.50, Jordan salmon $24, we shared nachos $12, Sam and Jordan had 2 beers at $7. Tax 8.875%, 20% tip. Sam paid.",
          "tools_triggered": [
            "split_bill"
          ],
          "expected_behavior": "Total $108.90 (subtotal $84.50, tax $7.50, tip $16.90). Alex $28.35, Sam $35.44, Jordan $45.11; Alex owes Sam $28.35 and Jordan owes Sam $45.11."
        },
        {
          "description": "Even split with a leftover cent",
          "prompt": "Split $100 plus $8 tax and a 20% tip evenly between Mia, Noah and Liam.",
          "tools_triggered": [
            "split_bill"
          ],
          "expected_behavior": "Total $128.00: Mia $42.67, Noah $42.67, Liam $42.66 (shares add up exactly)."
        },
        {
          "description": "Round everyone up to the next dollar",
          "prompt": "We are 4: Ana, Ben, Cara and Dev. Bill $124 plus $10.85 tax, 18% tip, round everyone up to the next dollar.",
          "tools_triggered": [
            "split_bill"
          ],
          "expected_behavior": "$157.17 before rounding; everyone pays $40.00, so the tip becomes $25.15 and the total $160.00."
        },
        {
          "description": "A coupon and a tip on the post-tax total",
          "prompt": "Kim had ramen $15.50, Lee bibimbap $17, we shared gyoza $8. $5 coupon, 7% tax, 15% tip on the total after tax. Kim paid.",
          "tools_triggered": [
            "split_bill"
          ],
          "expected_behavior": "Subtotal $40.50 - $5 coupon + $2.49 tax + $5.70 tip = $43.69. Kim $21.04, Lee $22.65; Lee owes Kim $22.65."
        },
        {
          "description": "A euro bill with a service charge and a shared bottle",
          "prompt": "Split our Paris dinner (10% service, no tip): Léa salade 14.50, Tom steak frites 22, Inès moules 19, Max burger 17, Zoé soupe 9.50, a 24€ planche for everyone and a 32€ bottle of wine for Léa, Tom and Inès.",
          "tools_triggered": [
            "split_bill"
          ],
          "expected_behavior": "Total €151.80 (subtotal €138 + €13.80 service): Léa €32.97, Tom €41.22, Inès €37.90, Max €23.98, Zoé €15.73."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How should my roommates and I split rent for rooms of different sizes?",
          "expected_behavior": "Does not call Handy Bill Splitter: Rent splitting is not a restaurant bill."
        },
        {
          "prompt": "Make an expense report for my business dinner.",
          "expected_behavior": "Does not call Handy Bill Splitter: Business reimbursement is an expense report."
        },
        {
          "prompt": "What is the etiquette for tipping in Japan?",
          "expected_behavior": "Does not call Handy Bill Splitter: An etiquette question with no bill to split."
        }
      ]
    }
  },
  {
    "slug": "date-calculator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/date-calculator/mcp",
    "interface": {
      "displayName": "Handy Date Calculator",
      "shortDescription": "Days, business days, holidays",
      "longDescription": "Count the days between two dates, add days, weeks, months or business days to a date, and look up public holidays, with exact answers and a mini calendar.\n\nAsk \"how many business days between Oct 1 and Dec 31 in the US\", \"how many days until Christmas\", \"what date is 30 working days from today in the UK\" or \"what is 6 months after August 31\". The card shows calendar days, weeks and days, months and days, and business days, skipping weekends and the official public holidays of your country (and state or region, if you give one). Month-end dates are handled properly (Jan 31 plus one month is the last day of February).\n\nHolidays come from the open Nager.Date database (over 100 countries). Only official public holidays count as days off; bank-only, school and observance days are listed separately. Download a country's holidays as a calendar file. Nothing is stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "How many business days are there between Oct 1 and Dec 31, 2026 in the US, including both dates?",
        "How many days until Christmas?",
        "What date is 10 working days after December 18 in England?"
      ],
      "capabilities": [
        "Days between two dates in days, weeks, months and business days",
        "Countdowns to any date from today in your time zone",
        "Adds days, weeks, months, years or business days to a date",
        "Skips official public holidays for 100+ countries and their regions",
        "Lists a year of public holidays with the next one coming up",
        "Mini calendar plus a holiday calendar file"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/date-calculator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/date-calculator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "days between dates",
      "how many days until",
      "business days calculator",
      "working days between two dates",
      "add business days to a date",
      "date calculator",
      "public holidays this year",
      "how many weeks until",
      "what date is 90 days from today"
    ],
    "tools": [
      {
        "name": "days_between",
        "title": "Days between dates",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": true
        }
      },
      {
        "name": "add_to_date",
        "title": "Add to a date",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": true
        }
      },
      {
        "name": "list_holidays",
        "title": "List public holidays",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": true
        }
      }
    ],
    "dataSources": [
      {
        "name": "Nager.Date",
        "url": "https://date.nager.at",
        "purpose": "Public holidays by country, year and region (country code and year only are sent)."
      }
    ],
    "review": {
      "positiveTestCases": [
        {
          "description": "Business days in a quarter, US federal holidays",
          "prompt": "How many business days are there between Oct 1 and Dec 31, 2026 in the US, including both dates?",
          "tools_triggered": [
            "days_between"
          ],
          "expected_behavior": "Hero shows 63 business days out of 92 calendar days, skipping Veterans Day, Thanksgiving and Christmas (Columbus Day is bank-only nationally, so it is not skipped)."
        },
        {
          "description": "Countdown to Christmas from today",
          "prompt": "How many days until Christmas?",
          "tools_triggered": [
            "days_between"
          ],
          "expected_behavior": "Hero shows 85 days until Christmas, counted from today (Thu, Oct 1, 2026 in New York)."
        },
        {
          "description": "Business days forward across Christmas in England",
          "prompt": "What date is 10 working days after December 18, 2026 in England?",
          "tools_triggered": [
            "add_to_date"
          ],
          "expected_behavior": "Wednesday, Jan 6, 2027: Christmas Day, the Boxing Day substitute (Dec 28) and New Year's Day are skipped."
        },
        {
          "description": "Month-end clamping",
          "prompt": "What is the date 6 months after August 31, 2026?",
          "tools_triggered": [
            "add_to_date"
          ],
          "expected_behavior": "Sunday, Feb 28, 2027 (February has no 31st), flagged as a weekend."
        },
        {
          "description": "A year of regional holidays",
          "prompt": "What are the public holidays in Bavaria in 2026, and when is the next one?",
          "tools_triggered": [
            "list_holidays"
          ],
          "expected_behavior": "Lists 12 public holidays (9 national plus Epiphany, Corpus Christi and All Saints' Day for Bavaria); the next is German Unity Day, Sat Oct 3, in 2 days. Offers an .ics download."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What time is it in Tokyo when it is 3 PM in New York?",
          "expected_behavior": "Does not call Handy Date Calculator: Converting clock times between time zones is not date arithmetic."
        },
        {
          "prompt": "Add my dentist appointment on March 3 at 2 PM to my calendar.",
          "expected_behavior": "Does not call Handy Date Calculator: Creating a calendar event is not counting days."
        },
        {
          "prompt": "How old will I be in 2040 if I was born in 1990?",
          "expected_behavior": "Does not call Handy Date Calculator: Simple year subtraction the model answers directly; no dates or holidays involved."
        }
      ]
    }
  },
  {
    "slug": "time-zone-converter",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/time-zone-converter/mcp",
    "interface": {
      "displayName": "Handy Time Zone Converter",
      "shortDescription": "Convert times, plan meetings",
      "longDescription": "Convert a time between cities and find meeting times across time zones, with daylight saving time handled exactly.\n\nAsk \"what time is 3 PM New York in London and Tokyo\" or \"find a 1 hour slot for New York, London and Berlin next week\". The card shows each city's local time, day and UTC offset, a 24 hour strip per location with working hours and the overlap highlighted, and any clock changes that fall in your dates (for example the week when Europe has changed its clocks and the US has not). For meetings it ranks the slots by how well they fit everyone's working hours (default 9 to 5 local, adjustable per person), and gives you a calendar invite (.ics) and a Google Calendar link for the best one.\n\nIt uses the standard IANA time zone database built into the runtime. Nothing is stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "What time is 3 PM New York on October 15 in London and Tokyo?",
        "Find a 1 hour meeting time for New York and London on October 6",
        "Convert 10:00 IST to EST on December 1"
      ],
      "capabilities": [
        "Converts a time to up to 10 cities at once",
        "Exact daylight saving time for any date, with clock changes flagged",
        "Finds meeting slots across up to 10 locations and 7 days",
        "Per-person working hours, weekends skipped",
        "24 hour strip per city with the overlap highlighted",
        "Calendar invite (.ics) and Google Calendar link"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/time-zone-converter/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/time-zone-converter/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "time zone converter",
      "what time is it in",
      "convert EST to IST",
      "meeting planner time zones",
      "best time for a meeting across time zones",
      "world clock",
      "PST to London time",
      "time difference between"
    ],
    "tools": [
      {
        "name": "convert_time",
        "title": "Convert a time",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      },
      {
        "name": "find_meeting_time",
        "title": "Find a meeting time",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "One time to two cities, crossing midnight",
          "prompt": "What time is 3 PM New York on October 15, 2026 in London and Tokyo?",
          "tools_triggered": [
            "convert_time"
          ],
          "expected_behavior": "London 8:00 PM (BST, UTC+1) the same day; Tokyo 4:00 AM on Fri, Oct 16 (+1 day)."
        },
        {
          "description": "The DST gap week (Europe has changed, the US has not)",
          "prompt": "My client in LA wants a call at 9am their time on Oct 28. What time is that for me in London?",
          "tools_triggered": [
            "convert_time"
          ],
          "expected_behavior": "4:00 PM in London (7 hours ahead, not the usual 8), with notes that London changed clocks on Oct 25 and Los Angeles changes on Nov 1."
        },
        {
          "description": "Abbreviations, crossing back a day",
          "prompt": "Convert 10:00 IST to EST on December 1, 2026",
          "tools_triggered": [
            "convert_time"
          ],
          "expected_behavior": "11:30 PM on Mon, Nov 30 in New York (EST, UTC−5), the previous day."
        },
        {
          "description": "Two offices, one day",
          "prompt": "Find a 1 hour meeting time for our New York and London teams on October 6, 2026",
          "tools_triggered": [
            "find_meeting_time"
          ],
          "expected_behavior": "Best slot 10:00 AM New York = 3:00 PM London (both in hours); the overlap is 9:00 AM-12:00 PM New York (3 hours). Offers .ics and Google Calendar."
        },
        {
          "description": "A week that spans a DST change",
          "prompt": "Find a 1 hour slot for New York and London between Oct 22 and Oct 28, 2026",
          "tools_triggered": [
            "find_meeting_time"
          ],
          "expected_behavior": "Best slot Mon, Oct 26, 10:30 AM New York = 2:30 PM London: after London changes clocks on Oct 25 the overlap grows from 3 to 4 hours. The DST change is called out."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "How many days until my flight on December 20?",
          "expected_behavior": "Does not call Handy Time Zone Converter: Counting days between dates is date arithmetic, not a time-zone conversion."
        },
        {
          "prompt": "Schedule a meeting with Sarah tomorrow at 2 PM on my Google Calendar.",
          "expected_behavior": "Does not call Handy Time Zone Converter: Booking on the user's real calendar needs a calendar integration; no time zones are involved."
        },
        {
          "prompt": "Why do we have daylight saving time?",
          "expected_behavior": "Does not call Handy Time Zone Converter: A history question the model can answer without any conversion."
        }
      ]
    }
  },
  {
    "slug": "calendar-maker",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/calendar-maker/mcp",
    "interface": {
      "displayName": "Handy Calendar Event Maker",
      "shortDescription": "Dates to a calendar file",
      "longDescription": "Turn a list of dates into calendar events you can import in one click: a syllabus, a shift schedule, a class timetable, deadlines with reminders.\n\nPaste or upload your schedule (a syllabus PDF, a screenshot of your shifts, a list of deadlines) and ask \"add these to my calendar\". Each event gets the right date, start and end time in your time zone (or all day), location, notes and reminders such as 1 day before each deadline. Repeating events become proper calendar series: \"class every Monday and Wednesday 10 to 11:15 until December 12, except Thanksgiving week\", \"rent on the 1st of every month\", \"team meeting on the first Tuesday\". Overnight shifts, end-before-start mistakes, dates in the past and duplicates are flagged before you import.\n\nYou get one .ics file for Apple Calendar, Google Calendar and Outlook with up to 200 events, plus Google Calendar links for single events. The card lists everything by month with counts. Nothing is stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "Add my class to my calendar: every Mon and Wed 10:00 to 11:15 until Dec 12, no class Thanksgiving week",
        "Turn these syllabus deadlines into calendar events with a reminder 1 day before each",
        "Make a calendar file for my shifts next week"
      ],
      "capabilities": [
        "Up to 200 events in one .ics file for any calendar app",
        "Repeating events: daily, weekly on chosen days, monthly, yearly",
        "Skip dates for holidays and breaks",
        "Reminders before each event",
        "Flags overnight times, past dates and duplicates",
        "Google Calendar links for single events"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/calendar-maker/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/calendar-maker/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "add to my calendar",
      "create calendar events",
      "syllabus to calendar",
      "make an ics file",
      "shift schedule to calendar",
      "recurring event every monday",
      "import events into google calendar",
      "remind me before each deadline"
    ],
    "tools": [
      {
        "name": "create_calendar_events",
        "title": "Create calendar events",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "A weekly class with a break",
          "prompt": "Add my BIO 101 lecture to my calendar: every Monday and Wednesday 10:00 to 11:15 starting Oct 5 until Dec 12, room SCI 204. No class Thanksgiving week (Nov 23 and 25). I'm in Chicago.",
          "tools_triggered": [
            "create_calendar_events"
          ],
          "expected_behavior": "One weekly series with 18 dates (8 in October, 7 in November, 3 in December), RRULE FREQ=WEEKLY;BYDAY=MO,WE;UNTIL=20261213T055959Z and two skipped dates; .ics download."
        },
        {
          "description": "Syllabus deadlines with reminders",
          "prompt": "Here is my syllabus. Put the deadlines and exams in my calendar and remind me 1 day before each: Essay 1 due Oct 16, midterm Oct 28 2-3:30pm, proposal due Nov 6, Essay 2 due Nov 20, final project Dec 4, final exam Dec 14 9-11am.",
          "tools_triggered": [
            "create_calendar_events"
          ],
          "expected_behavior": "6 events, 2 per month from October to December, each with a 1-day reminder, in one .ics plus Google Calendar links."
        },
        {
          "description": "A shift schedule with a night shift",
          "prompt": "Add my shifts to my calendar: Mon Oct 5 7am-3pm, Tue Oct 6 3pm-11pm, Thu Oct 8 11pm-7am. I work at Mercy Hospital in Denver.",
          "tools_triggered": [
            "create_calendar_events"
          ],
          "expected_behavior": "3 events; the night shift is read as ending at 7:00 AM on Fri, Oct 9, with a note."
        },
        {
          "description": "One appointment with a Google Calendar link",
          "prompt": "Make a calendar invite for my dentist appointment on October 14 at 3:30 PM, 45 minutes, at 12 Main St. I'm in New York.",
          "tools_triggered": [
            "create_calendar_events"
          ],
          "expected_behavior": "One event 3:30-4:15 PM EDT (19:30-20:15 UTC) with a 1-hour reminder; .ics and a Google Calendar link."
        },
        {
          "description": "A monthly all-day reminder",
          "prompt": "Remind me that rent is due on the 1st of every month for the next 12 months, 3 days before.",
          "tools_triggered": [
            "create_calendar_events"
          ],
          "expected_behavior": "One all-day monthly series of 12 dates from Nov 1, 2026 to Oct 1, 2027 with a 3-day reminder."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What meetings do I have tomorrow?",
          "expected_behavior": "Does not call Handy Calendar Event Maker: Reading the user's existing calendar needs a calendar connection; this plugin only creates files."
        },
        {
          "prompt": "What time is 2 PM London in Los Angeles?",
          "expected_behavior": "Does not call Handy Calendar Event Maker: A time-zone conversion, not creating events."
        },
        {
          "prompt": "How many weeks are left in the semester if it ends December 12?",
          "expected_behavior": "Does not call Handy Calendar Event Maker: Counting days between dates, not making calendar events."
        }
      ]
    }
  },
  {
    "slug": "golden-hour",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/golden-hour/mcp",
    "interface": {
      "displayName": "Handy Golden Hour & Sunset",
      "shortDescription": "Sun times for photographers",
      "longDescription": "Find golden hour, blue hour, sunrise, sunset and twilight for any place and date, computed with the NOAA solar algorithm, with a chart of the sun's height through the day.\n\nAsk \"when is golden hour in Santorini tomorrow\", \"sunset time in Paris on October 15\" or \"golden hours in Iceland for my trip next week\". The card leads with the next golden hour, then sunrise, sunset, day length and solar noon, every twilight phase from astronomical dawn to dusk, the moon phase, and a chart of the sun's elevation with the golden and blue hour bands. For a trip (up to 31 days) you get a day-by-day table. Polar day and night are handled.\n\nDownload the golden hours as calendar events so your phone reminds you before the light is best. Times are rounded to the minute and assume a flat horizon. Nothing is stored.",
      "category": "Travel",
      "defaultPrompt": [
        "When is golden hour in San Francisco today?",
        "Sunset and golden hour in Paris October 15 to 17",
        "What time is sunrise in New York on the summer solstice?"
      ],
      "capabilities": [
        "Golden hour and blue hour, morning and evening",
        "Sunrise, sunset, solar noon and day length",
        "Civil, nautical and astronomical twilight",
        "Chart of the sun's elevation through the day",
        "Day-by-day table for trips up to 31 days, with moon phase",
        "Golden hours as calendar events (.ics)"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/golden-hour/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/golden-hour/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "golden hour today",
      "sunset time",
      "sunrise time",
      "blue hour",
      "when is golden hour",
      "photography light times",
      "twilight times",
      "what time does the sun set"
    ],
    "tools": [
      {
        "name": "sun_times",
        "title": "Sun times and golden hour",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Today, leading with the next golden hour",
          "prompt": "When is golden hour in San Francisco today?",
          "tools_triggered": [
            "sun_times"
          ],
          "expected_behavior": "It is 8 AM there, so the hero is the evening golden hour starting 6:18 PM; sunrise 7:05 AM and sunset 6:52 PM (USNO: 7:05 and 18:52). Moon about 71% lit, waning gibbous."
        },
        {
          "description": "Summer solstice in New York",
          "prompt": "What time is sunrise and sunset in New York on the summer solstice, June 21, 2026?",
          "tools_triggered": [
            "sun_times"
          ],
          "expected_behavior": "Sunrise 5:25 AM, sunset 8:31 PM, solar noon 12:58 PM, day length 15h 6m (USNO: 05:25, 20:31, 12:58)."
        },
        {
          "description": "Southern hemisphere summer",
          "prompt": "Golden hour and sunset at Bondi in Sydney on December 21, 2026?",
          "tools_triggered": [
            "sun_times"
          ],
          "expected_behavior": "Evening golden hour from 7:29 PM to 8:23 PM; sunrise 5:41 AM and sunset 8:05 PM (USNO: 05:41, 20:05)."
        },
        {
          "description": "Polar night above the Arctic Circle",
          "prompt": "Is there any golden hour in Tromsø on December 21?",
          "tools_triggered": [
            "sun_times"
          ],
          "expected_behavior": "Polar night: no sunrise, but a midday golden hour about 10:30 AM to 12:55 PM and civil twilight 9:31 AM to 1:53 PM (USNO: 09:31, 13:53)."
        },
        {
          "description": "A three-day trip",
          "prompt": "I'm in Paris October 15 to 17. When are sunset and golden hour each day?",
          "tools_triggered": [
            "sun_times"
          ],
          "expected_behavior": "A 3-day table: sunrise 8:11, 8:12, 8:14 AM and sunset 7:01, 6:59, 6:57 PM (matching USNO), evening golden hour from about 6:18 PM, a waxing crescent moon, and an .ics with 6 golden-hour events."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Will it be cloudy at sunset in Santorini tomorrow?",
          "expected_behavior": "Does not call Handy Golden Hour & Sunset: A weather forecast, not sun position."
        },
        {
          "prompt": "What time is it in Tokyo right now?",
          "expected_behavior": "Does not call Handy Golden Hour & Sunset: A clock or time-zone question, not sun times."
        },
        {
          "prompt": "Give me tips for shooting portraits at golden hour.",
          "expected_behavior": "Does not call Handy Golden Hour & Sunset: Photography advice the model answers without any calculation."
        }
      ]
    }
  },
  {
    "slug": "word-counter",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/word-counter/mcp",
    "interface": {
      "displayName": "Handy Word Counter",
      "shortDescription": "Exact counts and post limits",
      "longDescription": "Count words, characters, sentences and paragraphs exactly, and check text against the real limits of the platforms you post to.\n\nPaste anything from a tweet to a 15,000-word chapter. The card shows the word count, characters with and without spaces (emoji and accented letters count as one, the way you see them), sentences, paragraphs, lines, reading and speaking time, average word and sentence length, Flesch reading ease and Flesch-Kincaid grade, and the top keywords with their density.\n\nCheck limits the way each platform counts them: X (Twitter) post 280, Threads post 500, LinkedIn post 3000, LinkedIn headline 220, Instagram caption 2200, TikTok caption 4000, YouTube title 100, YouTube description 5000, Google title tag 60, Meta description 160, Google Ads headline 30, Google Ads description 90, SMS text message 160, App Store subtitle 30, Amazon product title 200, Common App essay 650. X posts use the weighted count (links count 23, emoji 2), SMS shows GSM-7 or Unicode encoding and how many segments it sends as, and Google Ads counts double-width characters twice. Add your own word or character limits too. When you are over, the card shows exactly where the cut falls and the text that fits.\n\nYour text is counted and not stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "How many words and characters is this? [paste your text]",
        "Will this fit in a tweet and a LinkedIn headline? [paste text]",
        "Is my college essay under 650 words? [paste essay]"
      ],
      "capabilities": [
        "Exact word, character, sentence and paragraph counts (Unicode-aware)",
        "Checks X, Threads, LinkedIn, Instagram, TikTok, YouTube, SEO and Google Ads limits",
        "SMS encoding (GSM-7 or Unicode) and segment count",
        "Shows where the cut falls and the text that fits",
        "Reading time, speaking time, Flesch reading ease and grade level",
        "Top keywords with density"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/word-counter/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/word-counter/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "word counter",
      "character counter",
      "how many words is this",
      "count characters with spaces",
      "twitter character counter",
      "meta description length checker",
      "sms character counter",
      "essay word count 650",
      "reading time calculator"
    ],
    "tools": [
      {
        "name": "count_words",
        "title": "Count words and check limits",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Contractions, a hyphenated word, numbers and an emoji",
          "prompt": "How many words and characters is this: I can't believe it's already 2026! Our well-known café opened in 1998, and we've served 12,500 cups since. 😀 Come visit.",
          "tools_triggered": [
            "count_words"
          ],
          "expected_behavior": "Card shows 20 words, 120 characters (100 without spaces) and 3 sentences: contractions, \"well-known\" and \"12,500\" each count once, the emoji counts as one character."
        },
        {
          "description": "X post with a link and an emoji, plus Threads",
          "prompt": "Will this fit on X and Threads? \"Just shipped v2.0 of our open-source parser! Read the release notes: https://github.com/example/parser/releases/tag/v2.0.0 🚀\"",
          "tools_triggered": [
            "count_words"
          ],
          "expected_behavior": "12 words (the link counts as one); X counts 95 of 280 (the link counts 23, the rocket 2), 185 left; Threads 124 of 500. Both fit."
        },
        {
          "description": "Meta description and Google Ads description over the limit",
          "prompt": "Check this meta description length: Learn how to brew perfect pour-over coffee at home with our step-by-step guide, covering grind size, water temperature, ratios, and the gear you actually need to get started today.",
          "tools_triggered": [
            "count_words"
          ],
          "expected_behavior": "180 characters, 29 words: 20 over the ~160 meta description guideline (the cut falls in \"need to\", so what fits ends at \"actually need\"), and 90 over a Google Ads description."
        },
        {
          "description": "SMS forced into Unicode by one en dash",
          "prompt": "How many SMS segments is this? Hi Maria, your table for 4 is booked for Friday at 7:30 pm. Reply YES to confirm or call us to change it – thank you!",
          "tools_triggered": [
            "count_words"
          ],
          "expected_behavior": "117 characters and 25 words; the en dash is not in the GSM-7 alphabet, so it sends as Unicode (70 per SMS) in 2 segments. A plain hyphen would make it 1 SMS."
        },
        {
          "description": "A custom word limit with keywords",
          "prompt": "Does this fit a 25-word limit? Cold brew coffee is smooth and sweet. To make cold brew coffee, steep coarse grounds in cold water for 16 hours. Strain it, chill it, and serve the coffee over ice.",
          "tools_triggered": [
            "count_words"
          ],
          "expected_behavior": "31 words in 3 sentences, 6 over the 25-word limit (what fits ends at \"Strain it, chill it\"); top keywords \"coffee\" and \"cold\" (3 each, 9.7%)."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Write me a 280-character tweet announcing our new product.",
          "expected_behavior": "Does not call Handy Word Counter: Writing new text is the model's job; counting only applies once there is text to check."
        },
        {
          "prompt": "Translate this paragraph into Spanish.",
          "expected_behavior": "Does not call Handy Word Counter: Translation needs no counting."
        },
        {
          "prompt": "How many items are on my grocery list: eggs, milk, bread?",
          "expected_behavior": "Does not call Handy Word Counter: Counting list items is trivial and not a text-length question."
        }
      ]
    }
  },
  {
    "slug": "citation-generator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/citation-generator/mcp",
    "interface": {
      "displayName": "Handy Citation Generator",
      "shortDescription": "APA, MLA, Chicago and more",
      "longDescription": "Turn DOIs, ISBNs and links into correctly formatted citations in APA 7, MLA 9, Chicago 17 (author-date or notes and bibliography), Harvard (Cite Them Right) or IEEE.\n\nGive a DOI and the real record is fetched from Crossref; give an ISBN and the book is looked up on Open Library; give a web address and the page's own citation data is read (scholarly citation tags, Dublin Core, schema.org, OpenGraph). Nothing is made up: a field no source provides is left out and flagged, so you know exactly what to add.\n\nThe card shows your reference list formatted with italics and a hanging indent, a plain-text copy, in-text citations or footnotes for each source, and what is missing. Author lists follow each style's rules (et al., ampersands, initials), titles get the right capitalization, and the list is sorted the way the style requires. Switch styles in one tap. Download a Word document or HTML page with real italics, or BibTeX and RIS files for Zotero, EndNote, Mendeley and LaTeX. Up to 30 sources at a time.",
      "category": "Education & Research",
      "defaultPrompt": [
        "Cite this in APA 7: 10.1038/nature14539",
        "Make an MLA works cited list for these links: [paste URLs]",
        "Chicago citation for the book with ISBN 9780262033848"
      ],
      "capabilities": [
        "APA 7, MLA 9, Chicago 17 (both systems), Harvard and IEEE",
        "Real metadata from Crossref (DOI), Open Library (ISBN) and web pages",
        "Never invents details: missing fields are flagged",
        "In-text citations and Chicago footnotes",
        "Word and HTML lists with italics and hanging indent",
        "BibTeX and RIS for reference managers"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/citation-generator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/citation-generator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "citation generator",
      "cite this in apa",
      "mla citation",
      "chicago citation",
      "harvard referencing",
      "ieee citation",
      "make a works cited page",
      "cite a website",
      "doi to citation",
      "bibliography generator"
    ],
    "tools": [
      {
        "name": "create_citation",
        "title": "Create citations",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": true
        }
      }
    ],
    "dataSources": [
      {
        "name": "Crossref",
        "url": "https://api.crossref.org",
        "purpose": "Article and book metadata for DOIs"
      },
      {
        "name": "Open Library",
        "url": "https://openlibrary.org",
        "purpose": "Book metadata for ISBNs"
      },
      {
        "name": "The web pages you cite",
        "url": "https://example.com",
        "purpose": "Reads the title, author and date metadata of each page you ask to cite"
      }
    ],
    "review": {
      "positiveTestCases": [
        {
          "description": "A journal article by DOI in APA 7",
          "prompt": "Cite this in APA 7: 10.1038/nature14539",
          "tools_triggered": [
            "create_citation"
          ],
          "expected_behavior": "LeCun, Y., Bengio, Y., & Hinton, G. (2015). Deep learning. Nature, 521(7553), 436–444. https://doi.org/10.1038/nature14539 (journal and volume in italics), with (LeCun et al., 2015) in text."
        },
        {
          "description": "A book by ISBN in Chicago author-date",
          "prompt": "Chicago author-date citation for ISBN 9780262033848",
          "tools_triggered": [
            "create_citation"
          ],
          "expected_behavior": "Cormen, Thomas H., Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. 2009. Introduction to Algorithms. Cambridge, MA, USA: MIT Press. In text: (Cormen et al. 2009)."
        },
        {
          "description": "Harvard list with a 34-author article and a book missing its place",
          "prompt": "Harvard references for 10.1038/s41586-021-03819-2 and ISBN 978-0-374-53355-7",
          "tools_triggered": [
            "create_citation"
          ],
          "expected_behavior": "Sorted list: Jumper, J. et al. (2021) ‘Highly accurate protein structure prediction with AlphaFold’, Nature, 596(7873), pp. 583–589, then Kahneman, D. (2013) Thinking, fast and slow, flagged as missing its place of publication."
        },
        {
          "description": "An arXiv preprint from its URL in IEEE",
          "prompt": "IEEE reference for https://arxiv.org/abs/1706.03762",
          "tools_triggered": [
            "create_citation"
          ],
          "expected_behavior": "[1] A. Vaswani et al., “Attention is all you need,” 2017, arXiv:1706.03762. (8 authors, so et al.)"
        },
        {
          "description": "A news page from its URL in MLA 9",
          "prompt": "MLA citation for https://www.nasa.gov/news-release/nasa-armstrong-celebrates-80-years-of-flight-innovation/",
          "tools_triggered": [
            "create_citation"
          ],
          "expected_behavior": "Whiting, Teresa. “NASA Armstrong Celebrates 80 Years of Flight Innovation.” NASA, 28 Sept. 2026, www.nasa.gov/news-release/nasa-armstrong-celebrates-80-years-of-flight-innovation/. (site name dropped from the title, author and date read from the page)."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Find me five peer-reviewed sources about climate change and coral reefs.",
          "expected_behavior": "Does not call Handy Citation Generator: Finding sources is research, not formatting citations the user already has."
        },
        {
          "prompt": "Summarize the paper \"Attention Is All You Need\".",
          "expected_behavior": "Does not call Handy Citation Generator: Summarising a paper needs no citation formatting."
        },
        {
          "prompt": "What is the difference between APA and MLA style?",
          "expected_behavior": "Does not call Handy Citation Generator: A general question about styles, answerable without formatting any source."
        }
      ]
    }
  },
  {
    "slug": "gpa-calculator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/gpa-calculator/mcp",
    "interface": {
      "displayName": "Handy GPA Calculator",
      "shortDescription": "GPA, finals and grade goals",
      "longDescription": "Calculate GPA exactly, weighted and unweighted, and find the score you need on a final exam.\n\nList your classes with letter grades (A-, B+), percentages or grade points, plus credits and level (regular, honors, AP, IB or dual-enrollment college). The card shows your unweighted and weighted GPA, quality points per course and, if you add your previous GPA and credits, your new cumulative GPA. Switch between the 4.0 and 4.3 scales and set your school's honors and AP bonuses or percent cutoffs.\n\nAsk what you need on your final: give your grade now and how much the final counts (or each syllabus category and its weight), and the card shows the exact score needed for your target, the score for every letter grade, whether it is already locked in or out of reach, and a slider to see the course grade for any final score.\n\nPlanning ahead? Enter your cumulative GPA, credits so far and a target, and see the GPA you need on your upcoming credits, whether it is possible on your scale, and how each result would move your cumulative. For students and parents. Just the maths: grades are not stored.",
      "category": "Education & Research",
      "defaultPrompt": [
        "Calculate my GPA: English Honors A-, AP Bio B+, Algebra II A, Spanish B, AP US History A-",
        "I have an 85% and the final is worth 20%. What do I need to get a 90?",
        "My GPA is 3.2 after 60 credits. What do I need next semester (15 credits) to get a 3.3?"
      ],
      "capabilities": [
        "Unweighted and weighted GPA (honors, AP, IB, dual enrollment)",
        "Letter grades, percentages or grade points; 4.0 or 4.3 scale",
        "Quality points per course and a new cumulative GPA",
        "Final exam score needed, for every letter grade, with a what-if slider",
        "Weighted syllabus categories (homework, quizzes, midterm, final)",
        "GPA needed on upcoming credits to reach a goal"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/gpa-calculator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/gpa-calculator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "calculate my gpa",
      "gpa calculator",
      "weighted gpa calculator",
      "college gpa calculator",
      "cumulative gpa",
      "what do I need on my final",
      "final grade calculator",
      "how to raise my gpa"
    ],
    "tools": [
      {
        "name": "calculate_gpa",
        "title": "Calculate GPA",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      },
      {
        "name": "final_grade_needed",
        "title": "Final exam score needed",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      },
      {
        "name": "gpa_goal",
        "title": "GPA needed for a goal",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "High-school weighted GPA with honors and AP",
          "prompt": "Calculate my weighted and unweighted GPA: English 10 Honors A-, AP Biology B+, Algebra II A, Spanish II B, AP US History A-",
          "tools_triggered": [
            "calculate_gpa"
          ],
          "expected_behavior": "Unweighted GPA 3.54 and weighted GPA 4.04 (+0.5 honors, +1.0 AP), with a quality-points table."
        },
        {
          "description": "College term with credit hours, percentages and a prior cumulative GPA",
          "prompt": "College GPA: Calculus I 4 credits 91%, Chemistry 4 credits B, Writing 3 credits 95%, Psychology 3 credits C+. My cumulative was 3.40 over 30 credits. What is my new cumulative GPA?",
          "tools_triggered": [
            "calculate_gpa"
          ],
          "expected_behavior": "Term GPA 3.26 (45.7 quality points over 14 credits), new cumulative GPA 3.36 over 44 credits."
        },
        {
          "description": "Final exam: target out of reach",
          "prompt": "I have an 85% in the class and the final is worth 20%. What do I need on the final to get a 90?",
          "tools_triggered": [
            "final_grade_needed"
          ],
          "expected_behavior": "Needs 110% on the final: not possible (100% gives 88%). The table shows a B- (80%) needs 60%."
        },
        {
          "description": "Final exam from weighted syllabus categories",
          "prompt": "Homework is 20% (I have 95), quizzes 15% (88), midterm 25% (82) and the final is 40%. What do I need on the final for a B+?",
          "tools_triggered": [
            "final_grade_needed"
          ],
          "expected_behavior": "Current grade 87.83%; needs 85.75% on the final for a B+ (87%)."
        },
        {
          "description": "GPA goal over upcoming credits",
          "prompt": "My GPA is 3.2 after 60 credits. What do I need next semester (15 credits) to get to a 3.3?",
          "tools_triggered": [
            "gpa_goal"
          ],
          "expected_behavior": "Needs a 3.70 GPA over the 15 credits; straight 4.0s would reach 3.36."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Which AP classes should I take junior year to look good for colleges?",
          "expected_behavior": "Does not call Handy GPA Calculator: Course-selection advice, not a calculation."
        },
        {
          "prompt": "Convert my 3.6 GPA to the UK degree classification system.",
          "expected_behavior": "Does not call Handy GPA Calculator: International grade conversion is not one of these calculations."
        },
        {
          "prompt": "What is the average GPA of admitted students at Stanford?",
          "expected_behavior": "Does not call Handy GPA Calculator: Admissions statistics are a lookup, not the user's own grade maths."
        }
      ]
    }
  },
  {
    "slug": "text-compare",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/text-compare/mcp",
    "interface": {
      "displayName": "Handy Text Compare",
      "shortDescription": "See exactly what changed",
      "longDescription": "Compare two versions of a text and see exactly what changed, word by word, line by line or character by character.\n\nPaste the original and the revised version of an essay, contract clause, cover letter, product description or code snippet. The card shows a redline with deletions struck through and insertions highlighted, how similar the two versions are, how many words were added, removed and changed, and a numbered list of every change (\"quick\" → \"fast\"). Switch between word, line and character comparison, and ignore case, whitespace or punctuation when they do not matter.\n\nThe comparison uses the Myers diff algorithm, the same minimal-edit method behind version control tools, so nothing is missed or invented. Download a standalone HTML redline report to share or print. Your texts are compared and not stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "Compare these two versions of my paragraph and show what changed: [original] / [revised]",
        "What changed between these two contract clauses? [paste both]",
        "Diff these two lists line by line: [list 1] / [list 2]"
      ],
      "capabilities": [
        "Word, line or character comparison with a redline view",
        "Similarity score and counts of words added, removed and changed",
        "Numbered list of every change",
        "Ignore case, whitespace or punctuation",
        "Downloadable HTML redline report"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/text-compare/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/text-compare/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "compare two texts",
      "text compare",
      "diff checker",
      "what changed between these two versions",
      "compare documents",
      "find differences between two texts",
      "redline"
    ],
    "tools": [
      {
        "name": "compare_texts",
        "title": "Compare two texts",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "A sentence with swaps, an insertion and punctuation",
          "prompt": "What changed? Original: \"The quick brown fox jumps over the lazy dog.\" Revised: \"The fast brown fox leaps over the very lazy dog!\"",
          "tools_triggered": [
            "compare_texts"
          ],
          "expected_behavior": "73.68% similar, 4 changed regions: 2 words changed (quick → fast, jumps → leaps), 1 added (very), 0 removed, and \".\" → \"!\"."
        },
        {
          "description": "A contract clause redline",
          "prompt": "Redline these: \"The Tenant shall pay rent of $1,200 on the first day of each month.\" vs \"The Tenant shall pay rent of $1,250 on or before the fifth day of each month.\"",
          "tools_triggered": [
            "compare_texts"
          ],
          "expected_behavior": "80% similar, 3 changes: \"1,200\" → \"1,250\", added \"or before\", \"first\" → \"fifth\"; redline report download."
        },
        {
          "description": "Two lists compared line by line",
          "prompt": "Diff these lists line by line. List 1: apples, bananas, cherries, dates. List 2: apples, blueberries, cherries, dates, elderberries.",
          "tools_triggered": [
            "compare_texts"
          ],
          "expected_behavior": "66.67% similar: bananas → blueberries, and elderberries added."
        },
        {
          "description": "Spelling changes, character by character",
          "prompt": "Show the character differences between \"Please analyze the color of the center.\" and \"Please analyse the colour of the centre.\"",
          "tools_triggered": [
            "compare_texts"
          ],
          "expected_behavior": "93.67% similar by character: z → s, u added, and the er/re swap in centre."
        },
        {
          "description": "Ignoring case and spacing",
          "prompt": "Are these the same if you ignore capitals and spacing? \"Hello   World\" and \"hello world\"",
          "tools_triggered": [
            "compare_texts"
          ],
          "expected_behavior": "Identical (100%) once case and whitespace are ignored."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Proofread my essay and fix the grammar.",
          "expected_behavior": "Does not call Handy Text Compare: Editing one text is not comparing two versions."
        },
        {
          "prompt": "Compare the iPhone 16 and the Pixel 9.",
          "expected_behavior": "Does not call Handy Text Compare: A product comparison, not a text diff."
        },
        {
          "prompt": "Check whether my essay is plagiarized from the internet.",
          "expected_behavior": "Does not call Handy Text Compare: Plagiarism detection searches the web; this tool only compares two texts the user provides."
        }
      ]
    }
  },
  {
    "slug": "qr-code",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/qr-code/mcp",
    "interface": {
      "displayName": "Handy QR Code Generator",
      "shortDescription": "Wi-Fi, links, contacts, events",
      "longDescription": "Make a QR code that works: for a link, Wi-Fi network, contact card, email, text message, phone call, map location or calendar event, and download it as PNG, SVG or a printable PDF.\n\nEach type is encoded in the exact format phone cameras expect: Wi-Fi codes join the network in one tap (special characters in the name or password are escaped correctly), contact cards are vCard 3.0, emails and texts open pre-filled, events carry the right time zone. Choose the error correction level (L, M, Q or H), the size, the quiet zone and your colors. Color pairs that will not scan, such as light codes on dark backgrounds or low-contrast combinations, are refused with an explanation.\n\nDownload a crisp PNG at print resolution, a vector SVG for any size, or a PDF with one large code and a caption, or a sheet of up to 48 copies for stickers and table tents. The card shows what the code contains (Wi-Fi passwords masked), its version and the smallest size to print it. Nothing is stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "Make a QR code for my menu at https://example.com/menu",
        "QR code so guests can join my Wi-Fi: network \"Home Guest\", password sunflower42",
        "Create a contact card QR code for my business card"
      ],
      "capabilities": [
        "Links, text, Wi-Fi, contact cards, email, SMS, phone, map locations and calendar events",
        "Correct payload formats with special characters escaped",
        "Error correction L/M/Q/H, size, quiet zone and custom colors",
        "Refuses color pairs that will not scan, and says why",
        "PNG, SVG and a printable PDF (one large code or a sheet of copies)"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/qr-code/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/qr-code/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "qr code generator",
      "make a qr code",
      "wifi qr code",
      "qr code for my website",
      "vcard qr code",
      "qr code for menu",
      "printable qr code",
      "qr code with custom colors"
    ],
    "tools": [
      {
        "name": "create_qr_code",
        "title": "Create QR code",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Link to a restaurant menu",
          "prompt": "Make a QR code for our menu at https://example.com/menu",
          "tools_triggered": [
            "create_qr_code"
          ],
          "expected_behavior": "A version 2 (25×25) code at error correction M that opens https://example.com/menu, with PNG/SVG/PDF downloads."
        },
        {
          "description": "Wi-Fi with characters that must be escaped",
          "prompt": "Wi-Fi QR code for guests. Network: Cafe; Guest   Password: p@ss:word,1\"\\",
          "tools_triggered": [
            "create_qr_code"
          ],
          "expected_behavior": "Encodes WIFI:T:WPA;S:Cafe\\; Guest;P:p@ss\\:word\\,1\\\"\\\\;; with the password masked on the card and in the model payload."
        },
        {
          "description": "Business card contact (vCard)",
          "prompt": "Make a QR code for my business card: Ana Rivera, Head of Design at Northwind Studio, mobile +1 (415) 555-0123, ana@northwind.example, northwind.example",
          "tools_triggered": [
            "create_qr_code"
          ],
          "expected_behavior": "A vCard 3.0 with N:Rivera;Ana;;;, the cleaned mobile number +14155550123, email and https:// website."
        },
        {
          "description": "Calendar event in a time zone",
          "prompt": "QR code for our open house on Oct 17, 2026 from 2 to 5 pm at 12 Elm St, Springfield (Central time)",
          "tools_triggered": [
            "create_qr_code"
          ],
          "expected_behavior": "A VEVENT from 19:00 to 22:00 UTC (2-5 pm CDT, UTC-5), location escaped (comma → \\,)."
        },
        {
          "description": "Brand colors and a sticker sheet",
          "prompt": "QR code to instagram.com/northwindstudio in navy #1F2A44 on cream #FFF8E7, a sheet of 12 stickers, high error correction",
          "tools_triggered": [
            "create_qr_code"
          ],
          "expected_behavior": "Navy on cream at 13.47:1 contrast (scans well), https:// added, error correction H, and a 12-up PDF sheet."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What does this QR code in my photo say?",
          "expected_behavior": "Does not call Handy QR Code Generator: Decoding an existing image; this plugin only creates codes."
        },
        {
          "prompt": "Make a UPC barcode for my product, number 03600029145",
          "expected_behavior": "Does not call Handy QR Code Generator: A retail product barcode (UPC/EAN), not a QR code."
        },
        {
          "prompt": "Who invented the QR code and why is it square?",
          "expected_behavior": "Does not call Handy QR Code Generator: A general-knowledge question about QR codes, answered in chat."
        }
      ]
    }
  },
  {
    "slug": "barcode",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/barcode/mcp",
    "interface": {
      "displayName": "Handy Barcode Generator",
      "shortDescription": "UPC, EAN, Code 128 labels",
      "longDescription": "Make scannable barcodes with correct check digits, and print them on standard label sheets.\n\nSupports UPC-A, UPC-E, EAN-13, EAN-8, Code 128, Code 39, ITF-14, GS1-128, Data Matrix and PDF417. Enter a UPC or EAN without its last digit and the check digit is calculated; enter the full number and it is verified, with a clear explanation and the corrected number if it is wrong. Choose whether to print the digits under the bars and the image size.\n\nDownload a single barcode as a vector SVG or a 300 dpi PNG. For a batch of up to 100 values, such as SKUs or product numbers, get a print-ready PDF on Avery 5160 (30 per sheet), 5163 (10 per sheet) or 5167 (80 per sheet) labels, plus a CSV of every value with its check digit and status. Invalid values are listed, not silently dropped.\n\nRetail UPC and EAN numbers must be licensed from GS1; this tool draws the barcode for a number you already have. Nothing is stored.",
      "category": "Business & Operations",
      "defaultPrompt": [
        "Make a UPC-A barcode for 03600029145",
        "Print Code 128 labels on Avery 5160 for these SKUs: TEE-BLK-S, TEE-BLK-M, TEE-BLK-L",
        "Is 5901234123456 a valid EAN-13?"
      ],
      "capabilities": [
        "UPC-A, UPC-E, EAN-13, EAN-8, Code 128, Code 39, ITF-14, GS1-128, Data Matrix, PDF417",
        "Computes and verifies check digits, and explains a wrong one",
        "Vector SVG and 300 dpi PNG downloads",
        "Batch of up to 100 values onto Avery 5160, 5163 or 5167 label sheets (PDF)",
        "CSV of values with check digits and validation status"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/barcode/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/barcode/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "barcode generator",
      "upc barcode generator",
      "ean 13 barcode",
      "code 128 barcode",
      "barcode labels avery 5160",
      "check digit calculator",
      "sku barcode labels",
      "printable barcodes"
    ],
    "tools": [
      {
        "name": "create_barcode",
        "title": "Create barcode",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "UPC-A from 11 digits: check digit computed",
          "prompt": "Make a UPC-A barcode for 03600029145",
          "tools_triggered": [
            "create_barcode"
          ],
          "expected_behavior": "Check digit 2 is added, giving 036000291452; SVG, PNG and an Avery 5160 sheet PDF are offered with the GS1 note."
        },
        {
          "description": "UPC-A with a wrong check digit",
          "prompt": "Make a barcode for UPC 036000291453",
          "tools_triggered": [
            "create_barcode"
          ],
          "expected_behavior": "Refused with the reason: the check digit should be 2, not 3; offers 036000291452."
        },
        {
          "description": "EAN-13 from 12 digits",
          "prompt": "I need an EAN-13 barcode for 590123412345 without text under it",
          "tools_triggered": [
            "create_barcode"
          ],
          "expected_behavior": "Check digit 7 added: 5901234123457."
        },
        {
          "description": "Batch of SKUs on Avery 5160 labels",
          "prompt": "Make Code 128 barcode labels on Avery 5160 for my SKUs: TEE-BLK-S, TEE-BLK-M, TEE-BLK-L, TEE-WHT-S, TEE-WHT-M, TEE-WHT-L, HOOD-GRY-M, HOOD-GRY-L, CAP-NVY, CAP-RED, MUG-11OZ, TOTE-NAT",
          "tools_triggered": [
            "create_barcode"
          ],
          "expected_behavior": "12 valid Code 128 labels on one Avery 5160 sheet (30 per sheet), with the PDF and a CSV."
        },
        {
          "description": "ITF-14 carton labels with one bad value",
          "prompt": "Carton labels, ITF-14, on 2x4 labels: 1001234567890, 10012345678902, 10012345678909",
          "tools_triggered": [
            "create_barcode"
          ],
          "expected_behavior": "Two labels (check digit 2 added to the first; the second verified) and the third refused: its check digit should be 2, not 9."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What product is UPC 036000291452 and how much does it cost?",
          "expected_behavior": "Does not call Handy Barcode Generator: A product lookup; this plugin draws barcodes and checks digits, it has no product database."
        },
        {
          "prompt": "Make a QR code that opens my website",
          "expected_behavior": "Does not call Handy Barcode Generator: A QR code, not a linear or label barcode."
        },
        {
          "prompt": "How do I get a UPC code for my product to sell on Amazon?",
          "expected_behavior": "Does not call Handy Barcode Generator: Advice about GS1 registration, answered in chat; nothing to generate yet."
        }
      ]
    }
  },
  {
    "slug": "color-palette",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/color-palette/mcp",
    "interface": {
      "displayName": "Handy Color Palette Generator",
      "shortDescription": "Palettes and WCAG contrast",
      "longDescription": "Build a color palette from one or more base colors, with exact WCAG contrast numbers and ready-to-paste code.\n\nGive a hex code, an rgb() or hsl() value, a CSS color name, or just describe a mood or brand and let ChatGPT pick the starting colors. Choose a harmony (complementary, analogous, triadic, split-complementary, tetradic or monochromatic) and 3 to 8 colors. Colors are generated on the perceptual OKLCH wheel, and the primary gets a Tailwind-style 50 to 950 scale of tints and shades with even perceived steps.\n\nEvery color shows its hex, RGB, HSL and OKLCH values, its contrast against white and black, and the text color that reads best on it. A contrast matrix shows which color pairs pass WCAG AA. Copy the palette as CSS variables, a Tailwind v4 theme or v3 config, SCSS variables or W3C design tokens, or download an SVG swatch sheet.\n\nThe contrast checker gives the exact WCAG 2.x ratio for any text and background pair, pass or fail for AA and AAA (normal and large text) and UI components, and the nearest passing color if a pair fails. Nothing is stored.",
      "category": "Creativity",
      "defaultPrompt": [
        "Make a 5-color palette from #3B82F6",
        "Brand colors for a calm, earthy wellness studio",
        "Is #777777 text on white accessible?"
      ],
      "capabilities": [
        "Complementary, analogous, triadic, split-complementary, tetradic and monochromatic palettes",
        "Tailwind-style 50-950 tints and shades, perceptually even (OKLCH)",
        "Exact WCAG 2.x contrast for every color and pair, with the best text color",
        "Nearest passing color when a pair fails AA or AAA",
        "CSS variables, Tailwind, SCSS and W3C design token exports",
        "Downloadable SVG swatch sheet"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/color-palette/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/color-palette/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "color palette generator",
      "color scheme from hex",
      "complementary colors",
      "brand color palette",
      "tailwind color scale",
      "tints and shades",
      "contrast checker",
      "wcag color contrast",
      "is this color accessible"
    ],
    "tools": [
      {
        "name": "generate_palette",
        "title": "Generate color palette",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      },
      {
        "name": "check_contrast",
        "title": "Check color contrast",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Complementary palette from a hex code",
          "prompt": "Make me a complementary color palette from #3B82F6 with 5 colors",
          "tools_triggered": [
            "generate_palette"
          ],
          "expected_behavior": "Five colors starting with #3B82F6; the primary sits at step 500 of its scale, has 3.68:1 contrast on white (so it takes black text), and the card offers CSS/Tailwind exports and an SVG sheet."
        },
        {
          "description": "Brand palette from a mood (model picks the base colors)",
          "prompt": "I need brand colors for a calm, earthy wellness studio. Six colors, analogous.",
          "tools_triggered": [
            "generate_palette"
          ],
          "expected_behavior": "Six colors: the two chosen bases first (#7A9E7E sage, #D9C5A0 sand), then generated analogous hues."
        },
        {
          "description": "Single contrast check that fails AA by a hair",
          "prompt": "Is #777777 text on a white background accessible?",
          "tools_triggered": [
            "check_contrast"
          ],
          "expected_behavior": "4.48:1: fails AA for normal text (needs 4.5:1), passes for large text and UI; the nearest passing gray is #767676 at 4.54:1."
        },
        {
          "description": "Several pairs at once",
          "prompt": "Check my UI colors: white text on #3B82F6 buttons, and #1E293B body text on #F8FAFC",
          "tools_triggered": [
            "check_contrast"
          ],
          "expected_behavior": "White on #3B82F6 is 3.68:1 (fails AA for normal text, fine for large text and UI); #1E293B on #F8FAFC is 13.98:1 (passes AAA)."
        },
        {
          "description": "Monochromatic tints and shades of a brand color",
          "prompt": "Give me a monochromatic palette and Tailwind-style tints and shades for #0F766E",
          "tools_triggered": [
            "generate_palette"
          ],
          "expected_behavior": "Five teal tones from light to dark; #0F766E lands at step 700 of the 50-950 scale."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Which Benjamin Moore paint color is closest to sage green for my bedroom?",
          "expected_behavior": "Does not call Handy Color Palette Generator: A paint-brand catalogue lookup, not palette generation or contrast maths."
        },
        {
          "prompt": "Make the background of my logo PNG transparent",
          "expected_behavior": "Does not call Handy Color Palette Generator: Image editing; this plugin works with color values, not image files."
        },
        {
          "prompt": "What does the color red symbolize in Chinese culture?",
          "expected_behavior": "Does not call Handy Color Palette Generator: A general-knowledge question about color meaning, answered in chat."
        }
      ]
    }
  },
  {
    "slug": "email-signature",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/email-signature/mcp",
    "interface": {
      "displayName": "Handy Email Signature Maker",
      "shortDescription": "Gmail, Outlook, Apple Mail",
      "longDescription": "Create a professional email signature that looks right in Gmail, Outlook and Apple Mail, then copy it in one click.\n\nGive your name, title, company, phone numbers, email, website, address and social profiles (LinkedIn, X, Instagram, GitHub and more), plus an optional tagline, pronouns or legal disclaimer. Pick a template (classic, modern with an accent bar, compact one-line or two columns), a brand color and a web-safe font, and optionally a colored initials badge.\n\nThe signature is built the way email clients need it: nested tables with fixed widths and inline styles only, no images to get blocked, no CSS that Outlook's Word engine drops. Phone numbers become tap-to-call links and your email a mailto link. If your brand color is too light to read as text, a darker shade is used for the text and the color is kept for the accents.\n\nCopy the formatted signature straight into your mail settings, copy the raw HTML or a plain-text version, or download it as an HTML file. Step-by-step install instructions for Gmail, Outlook (new, web and classic desktop) and Apple Mail are included. Nothing is stored.",
      "category": "Communication",
      "defaultPrompt": [
        "Make an email signature: Ana Rivera, Head of Design at Northwind, +1 415 555 0123, ana@northwind.example",
        "Modern email signature with a teal accent bar and my LinkedIn",
        "Compact one-line signature for Outlook"
      ],
      "capabilities": [
        "Classic, modern (accent bar), compact one-line and two-column templates",
        "Table-based, inline-styled HTML that survives Gmail, Outlook and Apple Mail",
        "Tap-to-call phone and mailto links, social profiles as text links",
        "Brand color (auto-darkened for readable text), web-safe fonts, initials badge",
        "One-click rich copy, raw HTML, plain-text version and an HTML file",
        "Install steps for Gmail, Outlook and Apple Mail"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/email-signature/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/email-signature/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "email signature generator",
      "email signature maker",
      "gmail signature",
      "outlook signature",
      "html email signature",
      "professional email signature",
      "apple mail signature",
      "email signature template"
    ],
    "tools": [
      {
        "name": "create_email_signature",
        "title": "Create email signature",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Classic signature with phone, email and website",
          "prompt": "Make me an email signature: Ana Rivera, Head of Design at Northwind Studio, mobile +1 (415) 555-0123, ana@northwind.example, northwind.example",
          "tools_triggered": [
            "create_email_signature"
          ],
          "expected_behavior": "A classic table-based signature with a tel:+14155550123 link, a mailto link and https://northwind.example."
        },
        {
          "description": "Modern template with socials, badge and brand color",
          "prompt": "Modern email signature with a left accent bar in #0EA5E9, initials badge, LinkedIn and GitHub links. Sam Lee, Staff Engineer, Acme. sam@acme.example",
          "tools_triggered": [
            "create_email_signature"
          ],
          "expected_behavior": "A modern signature with a #0EA5E9 bar and \"SL\" badge; links use a darker sky blue because #0EA5E9 is only 2.77:1 on white."
        },
        {
          "description": "Compact one-line signature",
          "prompt": "Short one-line email signature for Outlook: Priya Shah, Account Manager, Contoso, +44 20 7946 0958",
          "tools_triggered": [
            "create_email_signature"
          ],
          "expected_behavior": "One line in Verdana: name, role, tap-to-call +442079460958."
        },
        {
          "description": "Two columns with a legal disclaimer and pronouns",
          "prompt": "Two-column signature in Georgia for Dr. Maya Cohen (she/her), Partner at Cohen & Field LLP, 212-555-0187, with our confidentiality disclaimer",
          "tools_triggered": [
            "create_email_signature"
          ],
          "expected_behavior": "Two columns with a navy divider, \"Cohen &amp; Field LLP\" escaped, and the disclaimer in small grey text."
        },
        {
          "description": "Hostile input is escaped",
          "prompt": "Signature for \"Tom <script>alert(1)</script> O'Neil\", title \"R&D <b>Lead</b>\"",
          "tools_triggered": [
            "create_email_signature"
          ],
          "expected_behavior": "Everything shows as literal text: no script or bold tag is injected."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Write an email to my landlord asking to fix the heating, and sign it from me",
          "expected_behavior": "Does not call Handy Email Signature Maker: Writing an email body; the model does that in chat."
        },
        {
          "prompt": "Design an HTML newsletter template for our monthly product update",
          "expected_behavior": "Does not call Handy Email Signature Maker: A newsletter layout, not a personal signature."
        },
        {
          "prompt": "How do I add an image logo to my existing Outlook signature?",
          "expected_behavior": "Does not call Handy Email Signature Maker: A how-to question about an existing signature with images, answered in chat."
        }
      ]
    }
  },
  {
    "slug": "password-generator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/password-generator/mcp",
    "interface": {
      "displayName": "Handy Password Generator",
      "shortDescription": "Made on your device",
      "longDescription": "Generate strong passwords, passphrases and PINs right on your own device, with an honest estimate of how long they would take to crack.\n\nChoose a random password (8 to 64 characters, with or without capitals, digits and symbols, and optionally without look-alike characters such as l, 1, O and 0), a passphrase of 3 to 10 random words from the EFF word list, or a PIN. The card makes up to 10 at once using your browser's cryptographic random number generator. The passwords never pass through our server or the chat, and the assistant cannot see them.\n\nEvery result shows its entropy in bits and the average time to crack it in four clearly stated scenarios, from online guessing to a GPU cluster attacking a stolen password database. You can also ask how strong a type of password is (for example \"12 characters, letters and digits\") without ever sharing a real one. Nothing is stored.",
      "category": "Security",
      "defaultPrompt": [
        "Generate a strong 16-character password",
        "Give me a memorable 6-word passphrase",
        "How long would an 8-character lowercase password take to crack?"
      ],
      "capabilities": [
        "Random passwords, word passphrases and PINs, up to 10 at once",
        "Generated in your browser: never sent to the server or the chat",
        "Character sets, length, look-alike exclusion, separators",
        "Exact entropy in bits for the chosen settings",
        "Crack-time estimates with stated attack speeds"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/password-generator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/password-generator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "password generator",
      "strong password",
      "random password",
      "passphrase generator",
      "pin generator",
      "how long to crack password",
      "password entropy",
      "secure password ideas"
    ],
    "tools": [
      {
        "name": "generate_password",
        "title": "Generate password",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      },
      {
        "name": "estimate_crack_time",
        "title": "Estimate crack time",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": true
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Strong 16-character password",
          "prompt": "Generate a strong 16-character password",
          "tools_triggered": [
            "generate_password"
          ],
          "expected_behavior": "The card generates 3 passwords from 87 characters: 16 × log2(87) = 103.09 bits. No password appears in the chat."
        },
        {
          "description": "Six-word passphrase",
          "prompt": "Give me a memorable passphrase, 6 words",
          "tools_triggered": [
            "generate_password"
          ],
          "expected_behavior": "6 words from the 1,296-word EFF short list: 6 × log2(1296) = 62.04 bits."
        },
        {
          "description": "PIN",
          "prompt": "I need a random 6 digit PIN",
          "tools_triggered": [
            "generate_password"
          ],
          "expected_behavior": "One 6-digit PIN in the card: 6 × log2(10) = 19.93 bits (weak on its own; fine behind a lockout)."
        },
        {
          "description": "No symbols, no look-alikes",
          "prompt": "20 character password with no symbols and no confusing characters like l and 1, give me 5",
          "tools_triggered": [
            "generate_password"
          ],
          "expected_behavior": "Pool 24 + 24 + 8 = 56 characters: 20 × log2(56) = 116.15 bits."
        },
        {
          "description": "Crack time for a weak policy",
          "prompt": "How long would it take to crack an 8-character password with only lowercase letters?",
          "tools_triggered": [
            "estimate_crack_time"
          ],
          "expected_behavior": "8 × log2(26) = 37.60 bits; 26^8 = 208,827,064,576 combinations, so about 10.4 seconds on average at 10^10 guesses/s."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What's my Gmail password?",
          "expected_behavior": "Does not call Handy Password Generator: Retrieving an existing password: impossible and not this plugin; never handle real passwords."
        },
        {
          "prompt": "Is my password Summer2024! strong enough?",
          "expected_behavior": "Does not call Handy Password Generator: Shares a real password; the plugin never accepts one. The model should advise not sharing it and offer a new one instead."
        },
        {
          "prompt": "How do I reset my Netflix password?",
          "expected_behavior": "Does not call Handy Password Generator: Account recovery steps for a service, answered in chat."
        }
      ]
    }
  },
  {
    "slug": "materials-calculator",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/materials-calculator/mcp",
    "interface": {
      "displayName": "Handy DIY Materials Calculator",
      "shortDescription": "Concrete, paint, mulch, floors",
      "longDescription": "Work out exactly how much concrete, paint, mulch, gravel, soil, flooring, tile or sod to buy, with the math shown.\n\nConcrete: slabs, footings, walls, post holes and columns, round slabs and stairs, in feet and inches or meters and centimeters. Get cubic yards, cubic feet and cubic meters, plus the number of 40, 50, 60 or 80 lb premix bags using published bag yields, with a waste allowance you can adjust.\n\nPaint: rooms or single walls, minus doors and windows, with ceilings, coats and primer, turned into gallons and quarts to buy. Landscaping: mulch, gravel, topsoil, sand and compost in cubic yards, bags and approximate tons for any mix of rectangles, circles and triangles. Flooring, tile and sod: square footage with waste and the number of boxes or pallets.\n\nMeasurements like 12 ft 6 in, 10'6\", 4 1/2 in or 3.5 m are read exactly and echoed back so you can check them. The card gives a tickable shopping list, every step of the arithmetic, and sliders for waste and bag size. Nothing is stored.",
      "category": "Productivity",
      "defaultPrompt": [
        "How many bags of concrete do I need for a 10x10 slab 4 inches thick?",
        "How much paint do I need for a 12x14 bedroom with 8 ft ceilings, one door and two windows?",
        "How much mulch do I need for a 20 by 10 foot bed, 3 inches deep?"
      ],
      "capabilities": [
        "Concrete for slabs, footings, walls, columns, round slabs and stairs",
        "Bags of 40/50/60/80 lb premix from published yields, or ready-mix yards",
        "Paint in gallons and quarts, minus doors and windows, with primer",
        "Mulch, gravel, topsoil and sand in yards, bags and tons",
        "Flooring, tile and sod square footage with waste and boxes",
        "Feet-and-inches or metric inputs, read exactly and shown back"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/materials-calculator/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/materials-calculator/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "how many bags of concrete do I need",
      "concrete calculator",
      "how much paint do I need",
      "how much mulch do I need",
      "square footage calculator",
      "how many yards of gravel",
      "flooring calculator",
      "topsoil calculator"
    ],
    "tools": [
      {
        "name": "concrete_calculator",
        "title": "Concrete calculator",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      },
      {
        "name": "paint_calculator",
        "title": "Paint calculator",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      },
      {
        "name": "area_volume_calculator",
        "title": "Mulch, gravel and flooring calculator",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Concrete slab in bags",
          "prompt": "How many bags of concrete do I need for a 10x10 slab 4 inches thick?",
          "tools_triggered": [
            "concrete_calculator"
          ],
          "expected_behavior": "33.33 cu ft = 1.2346 cu yd; with 10% extra 36.67 cu ft ÷ 0.60 = 61.1, so 62 bags of 80 lb."
        },
        {
          "description": "Paint for a bedroom with ceiling",
          "prompt": "How much paint do I need for a 12x14 bedroom with 8 ft ceilings, one door and two windows, 2 coats, ceiling too?",
          "tools_triggered": [
            "paint_calculator"
          ],
          "expected_behavior": "Walls 416 - 20 - 30 = 366 sq ft × 2 coats / 350 = 2.09 gal: buy 2 gallons + 1 quart; ceiling 168 × 2 / 350 = 0.96 gal: 1 gallon."
        },
        {
          "description": "Mulch for a bed",
          "prompt": "How much mulch do I need for a 20 by 10 foot bed, 3 inches deep?",
          "tools_triggered": [
            "area_volume_calculator"
          ],
          "expected_behavior": "200 sq ft × 0.25 ft = 50 cu ft = 1.85 cu yd, or 25 bags of 2 cu ft."
        },
        {
          "description": "Gravel driveway in yards and tons",
          "prompt": "How many yards of gravel for a driveway 50 ft long and 12 ft wide, 4 inches deep?",
          "tools_triggered": [
            "area_volume_calculator"
          ],
          "expected_behavior": "600 sq ft × 1/3 ft = 200 cu ft = 7.41 cu yd, about 10 tons at 2,700 lb per yard."
        },
        {
          "description": "Flooring in feet and inches",
          "prompt": "Laminate for a room 12 ft 6 in by 15 ft 3 in, boxes cover 22.5 sq ft. How many boxes?",
          "tools_triggered": [
            "area_volume_calculator"
          ],
          "expected_behavior": "12.5 × 15.25 = 190.63 sq ft; +10% = 209.69 sq ft ÷ 22.5 = 9.32, so 10 boxes."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "What color should I paint my living room?",
          "expected_behavior": "Does not call Handy DIY Materials Calculator: Color advice needs no quantity calculation."
        },
        {
          "prompt": "How much does a yard of concrete cost near me?",
          "expected_behavior": "Does not call Handy DIY Materials Calculator: Local prices are not a quantity calculation."
        },
        {
          "prompt": "Convert 5 feet 9 inches to centimeters.",
          "expected_behavior": "Does not call Handy DIY Materials Calculator: A plain unit conversion, not a materials estimate."
        }
      ]
    }
  },
  {
    "slug": "spin-wheel",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/spin-wheel/mcp",
    "interface": {
      "displayName": "Handy Spin the Wheel",
      "shortDescription": "Fair picks, teams and dice",
      "longDescription": "Spin a wheel of names, split people into random teams, roll dice and flip coins with real, verifiable randomness.\n\nType the names or choices and the card spins a wheel that lands on a winner picked with a cryptographic random number generator before the animation starts, so the chat and the wheel always agree. Draw several winners with or without repeats, give some options better odds, or run an elimination where each winner leaves the wheel.\n\nSplit a class, office or party into random teams by number of teams or team size, balance them by a skill rating, and keep certain people together or apart. Roll any dice in standard notation (2d6+3, 4d6 drop lowest, d20 with advantage) with the exact odds of every total charted, flip one coin or a thousand, or draw random numbers in any range with no repeats.\n\nEvery number comes from unbiased rejection sampling. Nothing is stored.",
      "category": "Entertainment",
      "defaultPrompt": [
        "Spin the wheel: Ana, Ben, Chloe, Dev, Ella, Finn",
        "Split these 12 people into 3 random teams: Ana, Ben, Chloe, Dev, Ella, Finn, Gia, Hal, Ivy, Jon, Kai, Lea",
        "Roll 4d6 drop lowest six times for my D&D character"
      ],
      "capabilities": [
        "Spinning wheel of 2-100 names that lands on a fairly drawn winner",
        "Several winners, weighted odds and elimination rounds",
        "Random teams by count or size, balanced by skill, with together/apart rules",
        "Dice notation with advantage, drop lowest and exact odds charts",
        "Coin flips and random numbers in any range, with or without repeats",
        "Cryptographic randomness with unbiased rejection sampling"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/spin-wheel/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/spin-wheel/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "spin the wheel",
      "pick a random name",
      "random name picker",
      "random team generator",
      "roll a dice",
      "flip a coin",
      "random number between 1 and 100",
      "wheel of names",
      "dice roller"
    ],
    "tools": [
      {
        "name": "spin_wheel",
        "title": "Spin the wheel",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": false
        }
      },
      {
        "name": "make_teams",
        "title": "Make random teams",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": false
        }
      },
      {
        "name": "roll_dice",
        "title": "Roll dice, flip coins, pick numbers",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Spin a wheel of names",
          "prompt": "Spin the wheel: Ana, Ben, Chloe, Dev, Ella, Finn",
          "tools_triggered": [
            "spin_wheel"
          ],
          "expected_behavior": "A spinning wheel of 6 names lands on one winner; odds 1 in 6 (16.7%) each."
        },
        {
          "description": "Three raffle winners, one removed, weighted",
          "prompt": "Draw 3 different winners from Ana, Ben, Chloe, Dev, Ella; Ben already won last week so leave him out. Ana bought 3 tickets.",
          "tools_triggered": [
            "spin_wheel"
          ],
          "expected_behavior": "Three distinct winners from Ana, Chloe, Dev, Ella (Ben removed); Ana has 3/6 = 50% odds on the first draw."
        },
        {
          "description": "Balanced teams with a keep-apart rule",
          "prompt": "Make 2 balanced teams for basketball. Skills: Ana 9, Ben 7, Chloe 6, Dev 5, Ella 4, Finn 3. Keep Ana and Ben apart.",
          "tools_triggered": [
            "make_teams"
          ],
          "expected_behavior": "Two teams of 3, each with skill total 17 (spread 0), Ana and Ben on different teams."
        },
        {
          "description": "D&D ability scores",
          "prompt": "Roll 4d6 drop lowest six times for my D&D character",
          "tools_triggered": [
            "roll_dice"
          ],
          "expected_behavior": "Six totals between 3 and 18, each from four dice with the lowest dropped; expected average 12.24."
        },
        {
          "description": "A random number in a range",
          "prompt": "Give me a random number between 1 and 100",
          "tools_triggered": [
            "roll_dice"
          ],
          "expected_behavior": "One integer from 1 to 100, with 1 in 100 odds."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Organize a Secret Santa for my family of 8 with private links.",
          "expected_behavior": "Does not call Handy Spin the Wheel: Secret Santa needs private, hidden assignments: a different plugin."
        },
        {
          "prompt": "What is the probability of rolling two sixes with two dice?",
          "expected_behavior": "Does not call Handy Spin the Wheel: A probability question with no actual roll; the model can explain it."
        },
        {
          "prompt": "Make a round robin schedule for 6 teams.",
          "expected_behavior": "Does not call Handy Spin the Wheel: Fixtures and brackets are a tournament tool, not random teams."
        }
      ]
    }
  },
  {
    "slug": "secret-santa",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/secret-santa/mcp",
    "interface": {
      "displayName": "Handy Secret Santa Generator",
      "shortDescription": "Private draws, one link each",
      "longDescription": "Draw names for a Secret Santa and give every person a private link that shows only their own match, so the organizer can join in too.\n\nList the participants, add couples or housemates who should not draw each other, one-way rules (\"the kids shouldn't draw Grandma\"), and optionally forbid two people drawing each other. The draw uses a cryptographic random number generator, makes every valid assignment equally likely, and if the rules make a draw impossible it says exactly which people and which rule cause it.\n\nNobody sees the full list of matches: not the organizer, not ChatGPT. Instead the card gives a private link for each person, a ready-to-send message with the budget and exchange date, and a CSV of every name and link for email or chat. Each person opens their link, taps to reveal who they are buying for, and sees the budget, date and your note on a festive page that works on any phone, in light or dark mode.\n\nNothing is stored: the matches live only inside the encrypted links.",
      "category": "Productivity",
      "defaultPrompt": [
        "Draw names for our office Secret Santa: Ana, Ben, Chloe, Dev, Ella, Finn, Gia and Hal. $30 limit, exchange Dec 18.",
        "Secret Santa for my family of 6, but couples (Mom and Dad, Sam and Alex) can't draw each other",
        "Make private Secret Santa links for my friends with a $25 budget and a note about the party"
      ],
      "capabilities": [
        "Random draw where nobody gets themselves",
        "Couples and one-way exclusions, optional no mutual pairs",
        "Explains exactly why a draw is impossible",
        "A private reveal link per person: nobody sees the whole list",
        "Ready-to-send messages and a CSV of all links",
        "Festive, mobile-friendly reveal page with tap to reveal"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/secret-santa/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/secret-santa/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "secret santa generator",
      "secret santa name draw",
      "draw names for secret santa",
      "secret santa with exclusions",
      "white elephant gift exchange names",
      "kris kringle draw",
      "gift exchange name picker",
      "online secret santa"
    ],
    "tools": [
      {
        "name": "draw_secret_santa",
        "title": "Draw Secret Santa",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false,
          "idempotentHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Office draw with budget and date",
          "prompt": "Draw names for our office Secret Santa: Ana, Ben, Chloe, Dev, Ella, Finn, Gia and Hal. $30 limit, exchange Dec 18.",
          "tools_triggered": [
            "draw_secret_santa"
          ],
          "expected_behavior": "8 private links and messages, budget $30, exchange Fri, Dec 18; no pairing visible anywhere."
        },
        {
          "description": "Family with couples who must not draw each other",
          "prompt": "Secret Santa for my family of 6, but couples (Mom and Dad, Sam and Alex) can't draw each other, and no two people should get each other.",
          "tools_triggered": [
            "draw_secret_santa"
          ],
          "expected_behavior": "6 private links; couples excluded both ways and no mutual pairs; budget $50."
        },
        {
          "description": "One-way rule",
          "prompt": "Gift exchange for Mom, Dad, Sam, Alex, Jordan and Riley. Jordan and Riley are kids so they shouldn't draw Mom.",
          "tools_triggered": [
            "draw_secret_santa"
          ],
          "expected_behavior": "6 private links; Jordan and Riley cannot draw Mom (Mom may draw them)."
        },
        {
          "description": "Smallest group with a note",
          "prompt": "Secret Santa for Ana, Ben and Chloe. Note: wrap it in newspaper!",
          "tools_triggered": [
            "draw_secret_santa"
          ],
          "expected_behavior": "3 private links; the note shows on every reveal page."
        },
        {
          "description": "A 20-person draw with a CSV",
          "prompt": "We have 20 people in the club, make Secret Santa links I can paste into emails, $20 budget, party on December 12.",
          "tools_triggered": [
            "draw_secret_santa"
          ],
          "expected_behavior": "20 private links and messages, plus a CSV of all names and links."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Pick one random name from Ana, Ben and Chloe.",
          "expected_behavior": "Does not call Handy Secret Santa Generator: A single random pick is a wheel or name picker, not a gift-exchange draw."
        },
        {
          "prompt": "What should I buy my Secret Santa for under $30?",
          "expected_behavior": "Does not call Handy Secret Santa Generator: Gift ideas are a conversation, not a draw."
        },
        {
          "prompt": "Split my 12 coworkers into 3 teams for the holiday quiz.",
          "expected_behavior": "Does not call Handy Secret Santa Generator: Team splitting is a different tool."
        }
      ]
    }
  },
  {
    "slug": "tournament-bracket",
    "mcpServerUrl": "https://plugins-worker.demos.42a.ai/tournament-bracket/mcp",
    "interface": {
      "displayName": "Handy Tournament Bracket Maker",
      "shortDescription": "Brackets, fixtures, standings",
      "longDescription": "Make a tournament bracket or round robin schedule for any number of teams or players, then fill in results as you play.\n\nSingle elimination uses standard seeding (1 plays the lowest seed, 2 the next lowest) and gives byes to the top seeds when the field is not a power of two. Double elimination adds a full losers bracket and a grand final with a reset if the losers-bracket winner takes the first game. Round robin builds a fair fixture list with the circle method, once or home-and-away, and one team sitting out each round when the count is odd.\n\nReport results by match id (\"R1-M3: Hawks won 21-17\") and the bracket advances, or the standings update with wins, draws, losses, points (3/1/0 by default) and tiebreaks by head-to-head, then score difference. Download a printable PDF bracket and an Excel schedule. Nothing is stored.",
      "category": "Entertainment",
      "defaultPrompt": [
        "Make a bracket for 12 teams",
        "Round robin schedule for 6 teams: Lions, Tigers, Bears, Wolves, Hawks, Sharks",
        "Double elimination bracket for our 8-player ping-pong tournament"
      ],
      "capabilities": [
        "Single elimination with standard seeding and byes for top seeds",
        "Double elimination with losers bracket and grand final reset",
        "Round robin fixtures by the circle method, once or twice",
        "Advances the bracket from reported results and scores",
        "Standings with points and head-to-head tiebreaks",
        "Printable PDF bracket and Excel schedule"
      ],
      "logo": "https://plugins-worker.demos.42a.ai/tournament-bracket/icon.svg",
      "websiteURL": "https://plugins-worker.demos.42a.ai/tournament-bracket/",
      "supportURL": "https://plugins-worker.demos.42a.ai/support",
      "privacyPolicyURL": "https://plugins-worker.demos.42a.ai/privacy",
      "termsOfServiceURL": "https://plugins-worker.demos.42a.ai/terms",
      "developerName": "42a"
    },
    "keywords": [
      "make a bracket for 12 teams",
      "tournament bracket maker",
      "round robin schedule for 6 teams",
      "march madness style bracket",
      "double elimination bracket",
      "single elimination bracket with byes",
      "round robin generator",
      "league schedule maker"
    ],
    "tools": [
      {
        "name": "make_bracket",
        "title": "Make a tournament bracket",
        "annotations": {
          "readOnlyHint": true,
          "destructiveHint": false,
          "openWorldHint": false
        }
      }
    ],
    "dataSources": [],
    "review": {
      "positiveTestCases": [
        {
          "description": "Single elimination with byes",
          "prompt": "Make a bracket for 12 teams: Aces, Bulls, Comets, Dragons, Eagles, Falcons, Giants, Hawks, Ironclads, Jets, Knights, Lynx",
          "tools_triggered": [
            "make_bracket"
          ],
          "expected_behavior": "11 matches over 4 rounds; seeds 1-4 get byes; first games are 8v9, 5v12, 7v10, 6v11."
        },
        {
          "description": "Round robin fixtures",
          "prompt": "Round robin schedule for 6 teams: Lions, Tigers, Bears, Wolves, Hawks, Sharks",
          "tools_triggered": [
            "make_bracket"
          ],
          "expected_behavior": "15 matches over 5 rounds, 3 per round, every pair meets exactly once."
        },
        {
          "description": "March Madness style region with first results",
          "prompt": "March madness style bracket for these 16 seeded teams, Houston is the 1 seed down to Creighton 16. Houston beat Creighton 78-52 and Purdue beat Michigan 70-66.",
          "tools_triggered": [
            "make_bracket"
          ],
          "expected_behavior": "1 plays 16 and 8 plays 9; Houston and Purdue advance to meet in R2-M1."
        },
        {
          "description": "Double elimination with the first round played",
          "prompt": "Double elimination bracket for 8 players: Ana, Ben, Chloe, Dev, Ella, Finn, Gia, Hal (in seed order). Ana beat Hal, Ella beat Dev.",
          "tools_triggered": [
            "make_bracket"
          ],
          "expected_behavior": "14 matches (plus a reset if needed); Hal and Dev drop to losers round 1 (L1-M1); Ana meets Ella in W2-M1."
        },
        {
          "description": "Round robin standings with a head-to-head tiebreak",
          "prompt": "Our 4-team league: Lions 2-1 Wolves, Tigers 0-0 Bears, Bears 1-0 Lions, Wolves 3-1 Tigers, Lions 1-1 Tigers, Bears 0-2 Wolves. Standings?",
          "tools_triggered": [
            "make_bracket"
          ],
          "expected_behavior": "Wolves champions on 6 pts; Bears second on 4 above Lions on 4 by head-to-head; Tigers 2."
        }
      ],
      "negativeTestCases": [
        {
          "prompt": "Split my 10 friends into 2 random teams for soccer.",
          "expected_behavior": "Does not call Handy Tournament Bracket Maker: Random team splitting, not a tournament."
        },
        {
          "prompt": "Who won the 2025 NCAA basketball tournament?",
          "expected_behavior": "Does not call Handy Tournament Bracket Maker: A sports fact, not making a bracket."
        },
        {
          "prompt": "Spin a wheel to pick which game we play tonight.",
          "expected_behavior": "Does not call Handy Tournament Bracket Maker: A random pick, not a bracket."
        }
      ]
    }
  }
]