Integrate the MiniWebtool Color Scheme Generator API into this project.

## Your task

1. Read the reference below.
2. Ask me where this belongs in the codebase if it is not obvious.
3. Write the integration in the language and style of the surrounding code:
   a small typed client function, errors handled, key read from the
   environment (never hard-coded, never committed).
4. Verify with `/dry-run` first, then exactly one live call.
5. Show me the diff and the live result.

## Credit budget — follow these exactly

This API is metered. A live call costs 1 credit; the free tier
includes 1,000 credits per month. Burning them during integration is the
single most common way to waste this key.

1. **Do all wiring against `/dry-run`, which costs 0 credits.** It validates the
   payload for real and returns a sample result with the exact response shape.
   Iterate there until your request builds and your parsing works.
2. **Make at most ONE live `/run` call** — a single end-to-end confirmation once
   dry-run passes. Print the result, then stop.
3. **Never call the API from unit tests, examples, or a retry loop.** Assert
   against the sample response captured from `/dry-run` instead.
4. **On 4xx, fix the payload — do not retry.** The error body is RFC 7807
   `application/problem+json` and says exactly what is wrong.
5. **On 429, honour `Retry-After`** and back off; do not tighten the loop.
6. **Read `X-MWT-Credits-Remaining`** on every response. If it drops below 50,
   stop making live calls and tell me.
7. If the integration needs repeated calls at runtime, **cache by input** — this
   tool is deterministic, so the same input always returns the same output.

## The API

**Color Scheme Generator** — Generate complementary, analogous, triadic, square, tetradic, and monochromatic palettes.

- Live endpoint: `POST https://api.miniwebtool.com/v1/tools/color-scheme-generator/run` — costs 1 credit
- Dry run: `POST https://api.miniwebtool.com/v1/tools/color-scheme-generator/dry-run` — costs 0 credits, same auth and validation
- Auth: `Authorization: Bearer <MINIWEBTOOL_API_KEY>`
- Content type: `application/json`
- Tool version: `2026-04-22` (output shape is stable within a major version)
- Full machine-readable spec: `https://api.miniwebtool.com/v1/openapi.json`

### Request body

| field | type | required | notes |
|---|---|---|---|
| `base_color` | str | no | (default `#6366f1`) |
| `scheme` | str | no | one of: all, complementary, analogous, triadic, split_complementary, square, tetradic, monochromatic — all \| complementary \| analogous \| triadic \| split_complementary \| square \| tetradic \| monochromatic (default `all`) |
| `precision` | int | no | (default `1`) |

Example request body:

```json
{
  "base_color": "#6366f1",
  "scheme": "all",
  "precision": 1
}
```

### Response envelope

```json
{
  "request_id": "req_01H…",
  "tool": "color-scheme-generator",
  "tool_version": "2026-04-22",
  "credits_used": 1,
  "result": {
    "base_color": {
      "hex": "#6366F1",
      "rgb": {
        "r": 99,
        "g": 102,
        "b": 241
      },
      "rgb_string": "rgb(99, 102, 241)",
      "hsl": {
        "h": 238.7,
        "s": 83.5,
        "l": 66.7
      },
      "hsv": {
        "h": 238.7,
        "s": 58.9,
        "v": 94.5
      },
      "cmyk": {
        "c": 58.9,
        "m": 57.7,
        "y": 0.0,
        "k": 5.5
      },
      "text_color": "#000000",
      "contrast_white": 4.47,
      "contrast_black": 4.7
    },
    "scheme": "all",
    "schemes": {
      "complementary": [
        {
          "hex": "#6366F1",
          "rgb": {
            "r": 99,
            "g": 102,
            "b": 241
          },
          "rgb_string": "rgb(99, 102, 241)",
          "hsl": {
            "h": 238.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 238.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 57.7,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 4.47,
          "contrast_black": 4.7
        },
        {
          "hex": "#F1EE63",
          "rgb": {
            "r": 241,
            "g": 238,
            "b": 99
          },
          "rgb_string": "rgb(241, 238, 99)",
          "hsl": {
            "h": 58.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 58.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 0.0,
            "m": 1.2,
            "y": 58.9,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 1.22,
          "contrast_black": 17.15
        }
      ],
      "analogous": [
        {
          "hex": "#63ADF1",
          "rgb": {
            "r": 99,
            "g": 173,
            "b": 241
          },
          "rgb_string": "rgb(99, 173, 241)",
          "hsl": {
            "h": 208.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 208.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 28.2,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 2.39,
          "contrast_black": 8.78
        },
        {
          "hex": "#6366F1",
          "rgb": {
            "r": 99,
            "g": 102,
            "b": 241
          },
          "rgb_string": "rgb(99, 102, 241)",
          "hsl": {
            "h": 238.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 238.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 57.7,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 4.47,
          "contrast_black": 4.7
        },
        {
          "hex": "#A763F1",
          "rgb": {
            "r": 167,
            "g": 99,
            "b": 241
          },
          "rgb_string": "rgb(167, 99, 241)",
          "hsl": {
            "h": 268.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 268.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 30.7,
            "m": 58.9,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 3.69,
          "contrast_black": 5.7
        }
      ],
      "triadic": [
        {
          "hex": "#6366F1",
          "rgb": {
            "r": 99,
            "g": 102,
            "b": 241
          },
          "rgb_string": "rgb(99, 102, 241)",
          "hsl": {
            "h": 238.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 238.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 57.7,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 4.47,
          "contrast_black": 4.7
        },
        {
          "hex": "#F16366",
          "rgb": {
            "r": 241,
            "g": 99,
            "b": 102
          },
          "rgb_string": "rgb(241, 99, 102)",
          "hsl": {
            "h": 358.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 358.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 0.0,
            "m": 58.9,
            "y": 57.7,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 3.13,
          "contrast_black": 6.72
        },
        {
          "hex": "#66F163",
          "rgb": {
            "r": 102,
            "g": 241,
            "b": 99
          },
          "rgb_string": "rgb(102, 241, 99)",
          "hsl": {
            "h": 118.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 118.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 57.7,
            "m": 0.0,
            "y": 58.9,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 1.47,
          "contrast_black": 14.33
        }
      ],
      "split_complementary": [
        {
          "hex": "#6366F1",
          "rgb": {
            "r": 99,
            "g": 102,
            "b": 241
          },
          "rgb_string": "rgb(99, 102, 241)",
          "hsl": {
            "h": 238.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 238.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 57.7,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 4.47,
          "contrast_black": 4.7
        },
        {
          "hex": "#F1A763",
          "rgb": {
            "r": 241,
            "g": 167,
            "b": 99
          },
          "rgb_string": "rgb(241, 167, 99)",
          "hsl": {
            "h": 28.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 28.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 0.0,
            "m": 30.7,
            "y": 58.9,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 2.01,
          "contrast_black": 10.45
        },
        {
          "hex": "#ADF163",
          "rgb": {
            "r": 173,
            "g": 241,
            "b": 99
          },
          "rgb_string": "rgb(173, 241, 99)",
          "hsl": {
            "h": 88.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 88.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 28.2,
            "m": 0.0,
            "y": 58.9,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 1.35,
          "contrast_black": 15.54
        }
      ],
      "square": [
        {
          "hex": "#6366F1",
          "rgb": {
            "r": 99,
            "g": 102,
            "b": 241
          },
          "rgb_string": "rgb(99, 102, 241)",
          "hsl": {
            "h": 238.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 238.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 57.7,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 4.47,
          "contrast_black": 4.7
        },
        {
          "hex": "#F163AD",
          "rgb": {
            "r": 241,
            "g": 99,
            "b": 173
          },
          "rgb_string": "rgb(241, 99, 173)",
          "hsl": {
            "h": 328.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 328.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 0.0,
            "m": 58.9,
            "y": 28.2,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 2.95,
          "contrast_black": 7.13
        },
        {
          "hex": "#F1EE63",
          "rgb": {
            "r": 241,
            "g": 238,
            "b": 99
          },
          "rgb_string": "rgb(241, 238, 99)",
          "hsl": {
            "h": 58.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 58.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 0.0,
            "m": 1.2,
            "y": 58.9,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 1.22,
          "contrast_black": 17.15
        },
        {
          "hex": "#63F1A7",
          "rgb": {
            "r": 99,
            "g": 241,
            "b": 167
          },
          "rgb_string": "rgb(99, 241, 167)",
          "hsl": {
            "h": 148.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 148.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 0.0,
            "y": 30.7,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 1.43,
          "contrast_black": 14.67
        }
      ],
      "tetradic": [
        {
          "hex": "#6366F1",
          "rgb": {
            "r": 99,
            "g": 102,
            "b": 241
          },
          "rgb_string": "rgb(99, 102, 241)",
          "hsl": {
            "h": 238.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 238.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 57.7,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 4.47,
          "contrast_black": 4.7
        },
        {
          "hex": "#EE63F1",
          "rgb": {
            "r": 238,
            "g": 99,
            "b": 241
          },
          "rgb_string": "rgb(238, 99, 241)",
          "hsl": {
            "h": 298.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 298.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 1.2,
            "m": 58.9,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 2.73,
          "contrast_black": 7.69
        },
        {
          "hex": "#F1EE63",
          "rgb": {
            "r": 241,
            "g": 238,
            "b": 99
          },
          "rgb_string": "rgb(241, 238, 99)",
          "hsl": {
            "h": 58.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 58.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 0.0,
            "m": 1.2,
            "y": 58.9,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 1.22,
          "contrast_black": 17.15
        },
        {
          "hex": "#66F163",
          "rgb": {
            "r": 102,
            "g": 241,
            "b": 99
          },
          "rgb_string": "rgb(102, 241, 99)",
          "hsl": {
            "h": 118.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 118.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 57.7,
            "m": 0.0,
            "y": 58.9,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 1.47,
          "contrast_black": 14.33
        }
      ],
      "monochromatic": [
        {
          "hex": "#EEEEF7",
          "rgb": {
            "r": 238,
            "g": 238,
            "b": 247
          },
          "rgb_string": "rgb(238, 238, 247)",
          "hsl": {
            "h": 240.0,
            "s": 36.0,
            "l": 95.1
          },
          "hsv": {
            "h": 240.0,
            "s": 3.6,
            "v": 96.9
          },
          "cmyk": {
            "c": 3.6,
            "m": 3.6,
            "y": 0.0,
            "k": 3.1
          },
          "text_color": "#000000",
          "contrast_white": 1.15,
          "contrast_black": 18.21
        },
        {
          "hex": "#AEAFEA",
          "rgb": {
            "r": 174,
            "g": 175,
            "b": 234
          },
          "rgb_string": "rgb(174, 175, 234)",
          "hsl": {
            "h": 239.0,
            "s": 58.8,
            "l": 80.0
          },
          "hsv": {
            "h": 239.0,
            "s": 25.6,
            "v": 91.8
          },
          "cmyk": {
            "c": 25.6,
            "m": 25.2,
            "y": 0.0,
            "k": 8.2
          },
          "text_color": "#000000",
          "contrast_white": 2.08,
          "contrast_black": 10.12
        },
        {
          "hex": "#6366F1",
          "rgb": {
            "r": 99,
            "g": 102,
            "b": 241
          },
          "rgb_string": "rgb(99, 102, 241)",
          "hsl": {
            "h": 238.7,
            "s": 83.5,
            "l": 66.7
          },
          "hsv": {
            "h": 238.7,
            "s": 58.9,
            "v": 94.5
          },
          "cmyk": {
            "c": 58.9,
            "m": 57.7,
            "y": 0.0,
            "k": 5.5
          },
          "text_color": "#000000",
          "contrast_white": 4.47,
          "contrast_black": 4.7
        },
        {
          "hex": "#0005EE",
          "rgb": {
            "r": 0,
            "g": 5,
            "b": 238
          },
          "rgb_string": "rgb(0, 5, 238)",
          "hsl": {
            "h": 238.7,
            "s": 100.0,
            "l": 46.7
          },
          "hsv": {
            "h": 238.7,
            "s": 100.0,
            "v": 93.3
          },
          "cmyk": {
            "c": 100.0,
            "m": 97.9,
            "y": 0.0,
            "k": 6.7
          },
          "text_color": "#FFFFFF",
          "contrast_white": 9.31,
          "contrast_black": 2.26
        },
        {
          "hex": "#070AA3",
          "rgb": {
            "r": 7,
            "g": 10,
            "b": 163
          },
          "rgb_string": "rgb(7, 10, 163)",
          "hsl": {
            "h": 238.8,
            "s": 91.8,
            "l": 33.3
          },
          "hsv": {
            "h": 238.8,
            "s": 95.7,
            "v": 63.9
          },
          "cmyk": {
            "c": 95.7,
            "m": 93.9,
            "y": 0.0,
            "k": 36.1
          },
          "text_color": "#FFFFFF",
          "contrast_white": 13.28,
          "contrast_black": 1.58
        }
      ]
    },
    "tints": [
      {
        "hex": "#8587EE",
        "rgb": {
          "r": 133,
          "g": 135,
          "b": 238
        },
        "rgb_string": "rgb(133, 135, 238)",
        "hsl": {
          "h": 238.9,
          "s": 75.5,
          "l": 72.7
        },
        "hsv": {
          "h": 238.9,
          "s": 44.1,
          "v": 93.3
        },
        "cmyk": {
          "c": 44.1,
          "m": 43.3,
          "y": 0.0,
          "k": 6.7
        },
        "text_color": "#000000",
        "contrast_white": 3.14,
        "contrast_black": 6.7
      },
      {
        "hex": "#A4A6ED",
        "rgb": {
          "r": 164,
          "g": 166,
          "b": 237
        },
        "rgb_string": "rgb(164, 166, 237)",
        "hsl": {
          "h": 238.4,
          "s": 67.0,
          "l": 78.6
        },
        "hsv": {
          "h": 238.4,
          "s": 30.8,
          "v": 92.9
        },
        "cmyk": {
          "c": 30.8,
          "m": 30.0,
          "y": 0.0,
          "k": 7.1
        },
        "text_color": "#000000",
        "contrast_white": 2.27,
        "contrast_black": 9.26
      },
      {
        "hex": "#C1C2EF",
        "rgb": {
          "r": 193,
          "g": 194,
          "b": 239
        },
        "rgb_string": "rgb(193, 194, 239)",
        "hsl": {
          "h": 238.7,
          "s": 59.0,
          "l": 84.7
        },
        "hsv": {
          "h": 238.7,
          "s": 19.2,
          "v": 93.7
        },
        "cmyk": {
          "c": 19.2,
          "m": 18.8,
          "y": 0.0,
          "k": 6.3
        },
        "text_color": "#000000",
        "contrast_white": 1.72,
        "contrast_black": 12.23
      },
      {
        "hex": "#DBDCF3",
        "rgb": {
          "r": 219,
          "g": 220,
          "b": 243
        },
        "rgb_string": "rgb(219, 220, 243)",
        "hsl": {
          "h": 237.5,
          "s": 50.0,
          "l": 90.6
        },
        "hsv": {
          "h": 237.5,
          "s": 9.9,
          "v": 95.3
        },
        "cmyk": {
          "c": 9.9,
          "m": 9.5,
          "y": 0.0,
          "k": 4.7
        },
        "text_color": "#000000",
        "contrast_white": 1.35,
        "contrast_black": 15.54
      },
      {
        "hex": "#F3F3FA",
        "rgb": {
          "r": 243,
          "g": 243,
          "b": 250
        },
        "rgb_string": "rgb(243, 243, 250)",
        "hsl": {
          "h": 240.0,
          "s": 41.2,
          "l": 96.7
        },
        "hsv": {
          "h": 240.0,
          "s": 2.8,
          "v": 98.0
        },
        "cmyk": {
          "c": 2.8,
          "m": 2.8,
          "y": 0.0,
          "k": 2.0
        },
        "text_color": "#000000",
        "contrast_white": 1.1,
        "contrast_black": 19.01
      }
    ],
    "shades": [
      {
        "hex": "#262AF1",
        "rgb": {
          "r": 38,
          "g": 42,
          "b": 241
        },
        "rgb_string": "rgb(38, 42, 241)",
        "hsl": {
          "h": 238.8,
          "s": 87.9,
          "l": 54.7
        },
        "hsv": {
          "h": 238.8,
          "s": 84.2,
          "v": 94.5
        },
        "cmyk": {
          "c": 84.2,
          "m": 82.6,
          "y": 0.0,
          "k": 5.5
        },
        "text_color": "#FFFFFF",
        "contrast_white": 7.82,
        "contrast_black": 2.68
      },
      {
        "hex": "#090DD1",
        "rgb": {
          "r": 9,
          "g": 13,
          "b": 209
        },
        "rgb_string": "rgb(9, 13, 209)",
        "hsl": {
          "h": 238.8,
          "s": 91.7,
          "l": 42.7
        },
        "hsv": {
          "h": 238.8,
          "s": 95.7,
          "v": 82.0
        },
        "cmyk": {
          "c": 95.7,
          "m": 93.8,
          "y": 0.0,
          "k": 18.0
        },
        "text_color": "#FFFFFF",
        "contrast_white": 10.55,
        "contrast_black": 1.99
      },
      {
        "hex": "#030699",
        "rgb": {
          "r": 3,
          "g": 6,
          "b": 153
        },
        "rgb_string": "rgb(3, 6, 153)",
        "hsl": {
          "h": 238.8,
          "s": 96.2,
          "l": 30.6
        },
        "hsv": {
          "h": 238.8,
          "s": 98.0,
          "v": 60.0
        },
        "cmyk": {
          "c": 98.0,
          "m": 96.1,
          "y": 0.0,
          "k": 40.0
        },
        "text_color": "#FFFFFF",
        "contrast_white": 14.09,
        "contrast_black": 1.49
      },
      {
        "hex": "#00025F",
        "rgb": {
          "r": 0,
          "g": 2,
          "b": 95
        },
        "rgb_string": "rgb(0, 2, 95)",
        "hsl": {
          "h": 238.7,
          "s": 100.0,
          "l": 18.6
        },
        "hsv": {
          "h": 238.7,
          "s": 100.0,
          "v": 37.3
        },
        "cmyk": {
          "c": 100.0,
          "m": 97.9,
          "y": 0.0,
          "k": 62.7
        },
        "text_color": "#FFFFFF",
        "contrast_white": 17.89,
        "contrast_black": 1.17
      },
      {
        "hex": "#000122",
        "rgb": {
          "r": 0,
          "g": 1,
          "b": 34
        },
        "rgb_string": "rgb(0, 1, 34)",
        "hsl": {
          "h": 238.2,
          "s": 100.0,
          "l": 6.7
        },
        "hsv": {
          "h": 238.2,
          "s": 100.0,
          "v": 13.3
        },
        "cmyk": {
          "c": 100.0,
          "m": 97.1,
          "y": 0.0,
          "k": 86.7
        },
        "text_color": "#FFFFFF",
        "contrast_white": 20.44,
        "contrast_black": 1.03
      }
    ]
  }
}
```

`result` holds the tool output. Errors come back as
`application/problem+json` with `type`, `title`, `status`, and `detail`.

### Getting a key

If `MINIWEBTOOL_API_KEY` is not already in the environment, stop and ask me for
one — do not sign up, scrape, or guess a key. Free keys: https://api.miniwebtool.com/dashboard/
