Does a pixel-art MCP server help Claude? Pixelbolt tested with and without

In a benchmark we planned in advance and ran on 3 November 2026, Pixelbolt 0.11.0 connected as an MCP server made no measurable difference to the results of Claude Haiku, Sonnet and Opus 5.5 on 12 pixel-art requests in Claude Code: every check passed in 32 of 36 tasks with it and 31 without, a blind Claude judge split the pairs 18 to 13 with 5 ties (one of the 18 by default; sign test p = 0.47), and the Pixelbolt runs cost 1.47 times as much. No model and no total met our rule for saying Pixelbolt helps. On the five animation and effect tasks, which this release was built to improve, the Pixelbolt arm won 9 of 15 pairs, exactly the 60% bar we set before the run, though a split that size often happens by chance (p = 0.61); a repeat the same day won 7 of its 11 decided animation and effect pairs but passed 30 tasks against 32, which would have failed that bar. Earlier versions showed no measurable help: Pixelbolt main f964f40 (26 and 27 October, three runs) and 0.9.0 (23 October), whose animations and effects lost most of their pairs.

We make Pixelbolt. We planned this test and wrote its rules down before the first run. Before run 3 we also decided that this page would go up only if run 3 passed the animation bar; the earlier runs alone stayed unpublished. Every number is here, including the losses: the method, scripts, every job's result and files, and every judge verdict are below.

Runs 23, 26 and 27 October and 3 November 2026 · Pixelbolt 0.9.0, main f964f40 (server version 0.9.1) and 0.11.0 (npm) · Claude Code 2.1.302 · Last checked 4 November 2026

The results on Pixelbolt 0.11.0 (run 3, 3 November)

Each setup is an "arm": Pixelbolt available, or nothing installed. "Valid" means every requested file exists at the requested name and passes all the deterministic checks in the method. "Pairs" are the blind judge's verdicts, one per task, counted for an arm only when it won with the two results shown in both orders.

ModelArmValid (of 12)Pairs won vs nothing installedCalled PixelboltCost of 12 tasksMedian time
Haiku 5.5Pixelbolt 0.11.0 available119 vs 2, 1 tie (1 of the 9 by default)11 of 12$0.1248 s
Nothing installed9––$0.1157.5 s
Sonnet 5.5Pixelbolt 0.11.0 available113 vs 7, 2 ties9 of 12$1.1930 s
Nothing installed11––$0.8134 s
Opus 5.5Pixelbolt 0.11.0 available106 vs 4, 2 ties12 of 12$3.3959.5 s
Nothing installed11––$2.2761.5 s

The same-day repeat (same version, same settings)

ModelValid with Pixelbolt / with nothing (of 12)Pairs won vs nothing installedCalled PixelboltCost with / withoutMedian time with / without
Haiku 5.59 / 107 vs 5 (2 of the 7 and 1 of the 5 by default)10 of 12$0.10 / $0.1142.5 s / 54.5 s
Sonnet 5.510 / 114 vs 3, 5 ties11 of 12$1.36 / $0.7835.5 s / 32.5 s
Opus 5.511 / 116 vs 4, 2 ties12 of 12$3.31 / $2.2055.5 s / 54 s
All30 / 32 (of 36)17 vs 12, 7 ties (p = 0.46)33 of 36$4.76 / $3.10 (1.54×)

"By default": the pair went to the only arm that delivered a readable file. In run 3, Haiku's no-tool oak tree (T05) ended with no file after Claude Code refused its python3 command. In the repeat, Haiku's no-tool sword (T04) and grass tile (T09) ended with no file after Claude Code refused their Python commands (the sword is the cell re-run under change 7: its first run had delivered a sword drawn by another job's leftover script, and every python3 command the re-run used to run its script was refused), and Haiku's walk cycle with Pixelbolt (T08) stopped after two turns, saying its $0.60 budget was nearly spent when it had used $0.002. Costs are Claude Code's own estimate at list price; in run 3 the Pixelbolt arm's 36 tasks cost $4.70 against $3.20. No job hit its turn, time or dollar cap, every job ran Claude Code 2.1.302, and every verdict counted on this page came from a judge on 2.1.302 (see change 7).

Animations and effects: the bar we set for 0.11.0

Before run 3 we wrote down one more test, for this release: the Pixelbolt arm must win at least 60% of the decided pairs on the five moving tasks (coin spin, slime idle, walk cycle, campfire, smoke puff; 15 pairs over the three models; ties and by-default wins don't count) and pass at least as many tasks overall as nothing installed. Run 3 won 9 of 15, with no ties: exactly 60%, so one pair going the other way would have failed it, and a sign test on 9 against 6 gives p = 0.61. The plan decides the bar on run 3 alone. The repeat would have failed it: it won 7 of its 11 decided moving pairs (64%), but passed 30 tasks against 32. This bar is ours, for one release; it is not the rule for saying Pixelbolt helps Claude.

TaskRun 3 (won-lost-tie, 3 pairs)Run 3's repeat (3 pairs)Main f964f40, three runs pooled (9 pairs)
T06 coin spin, 6 frames of 16×162-1-01-1-14-2-3
T07 slime idle, 8 frames of 32×322-1-02-1-01-8-0
T08 walk cycle, 6 frames of 32×321-2-01-1-1 (the loss by default)3-5-1
T11 campfire loop, 8 frames of 32×321-2-01-2-00-7-2
T12 smoke puff, 8 frames of 32×323-0-02-0-12-6-1
All five9-6-07-5-310-28-7

Won-lost-tie for the Pixelbolt arm against nothing installed. Per-task counts are descriptive: one run per cell. The two tasks where a shipped preset fits the request, the slime and the smoke, went 5-1 in run 3 (repeat 4-1-1); the coin, walk cycle and campfire went 4-5 (repeat 3-4-2). Before run 3 we had checked that the smoke-puff preset, cut to 8 of its 19 frames, passes our checks.

Two smoke puff animations by Claude Sonnet 5.5, eight frames each. Top, Pixelbolt 0.11.0 available: a small outlined ball grows into a shaded, outlined cloud, darkens, splits into blobs and shrinks away. Bottom, nothing installed: a small puff grows into a lumpy cloud that fades out through a checkerboard dither.
T12, a one-shot 32×32 smoke puff, Sonnet 5.5, run 3, a pair the Pixelbolt arm won. Top: Pixelbolt 0.11.0 available; Sonnet compiled the shipped smoke-puff preset, which has 19 frames, kept 8 evenly spaced ones with Pixelbolt's patch tool and rendered them. Bottom: nothing installed, Sonnet's own code. The judge picked the top one in both orders, for its clean outlines and shading; it called the bottom one's dithered fade noisy.
Two campfire animations by Claude Opus 5.5, eight frames each. Top, Pixelbolt 0.11.0 available: a small, ragged flame with scattered sparks above two crossed logs. Bottom, nothing installed: a tall, shaded flame with an outline above crossed logs.
T11, a looping 32×32 campfire, Opus 5.5, run 3, a pair the Pixelbolt arm lost. Top: Pixelbolt 0.11.0 available; Opus read Pixelbolt's campfire preset (32×48, 9 colours), compiled an edited 32×32 version and rendered it. Bottom: nothing installed, Opus's own code. The judge picked the bottom one in both orders, calling the top one's flames small, noisy and scattered.

Every run side by side (never pooled across versions)

RunPixelboltValid with it (of 36)Valid with nothing (of 36)Pairs won with vs without (ties)Sign test pStatic tasks, pairs*Moving tasks, pairs*Cost with / without
Run 1, 23 Oct0.9.0283210 vs 20 (6)0.109-9-31-11-3$6.94 / $3.50 (1.99×)
Run 2, 26 Octmain f964f40303014 vs 13 (9)1.010-6-54-7-4$4.91 / $3.19 (1.54×)
Repeat 1, 26 Octmain f964f40333015 vs 16 (5)1.011-6-44-10-1$5.58 / $3.31 (1.68×)
Repeat 2, 27 Octmain f964f40312818 vs 14 (4)0.6016-3-22-11-2$5.14 / $3.15 (1.63×)
Run 3, 3 Nov0.11.0323118 vs 13 (5)0.479-7-59-6-0$4.70 / $3.20 (1.47×)
Run 3's repeat, 3 Nov0.11.0303217 vs 12 (7)0.4610-7-47-5-3$4.76 / $3.10 (1.54×)

* Won-lost-tie for the Pixelbolt arm; static = T01 to T05, T09 and T10 (7 tasks × 3 models), moving = T06 to T08, T11 and T12 (5 × 3). Splitting by kind was planned only for run 3's bar above; otherwise these columns are descriptive. "Sign test p" is how likely a split at least this uneven would be by chance if neither arm were better (ties dropped; under 0.05 was our bar). Cost ratios are from unrounded costs. Told (exploratory, runs 1 and 2 only): run 1 27 valid and pairs 7 vs 21 (p = 0.013); run 2 32 valid and pairs 15 vs 17 (p = 0.86). By-default wins to the Pixelbolt arm, each a Haiku no-tool job whose Python command was refused: run 2 one, repeat 1 one, repeat 2 three, run 3 one, run 3's repeat two; run 3's repeat also had one the other way (the walk cycle above), and run 1 had one each way (a no-tool python3 refused, and a Pixelbolt run that left its files in output/). Without those cells: run 2 29 vs 30 valid of 35, pairs 13 vs 13; repeat 1 32 vs 30 of 35, pairs 14 vs 16; repeat 2 29 vs 28 of 33, pairs 15 vs 14; run 3 31 vs 31 of 35, pairs 17 vs 13; run 3's repeat 29 vs 31 of 33, pairs 15 vs 11. In repeat 1, two no-tool cells delivered art from another job's leftover script (see Limits); without them (from all 36, its by-default cell kept) it is 32 vs 29 of 34 and pairs 15 vs 15.

Pooled over run 2 and its two repeats (one commit; labelled pooled, with no claim of its own): valid 94 vs 88 of 108, pairs 47 vs 43 (18 ties), sign test p = 0.75. The plan fixed pooling only for those three, so run 3 and its repeat aren't pooled.

What changed in 0.11.0

Where Pixelbolt still loses

When to skip Pixelbolt, and what we didn't test

How the benchmark worked

The plan, tasks, checks, judge and claim rules were written down before the first job ran (PLAN.md). Each change after that is a dated amendment, listed below, and the hashes at each point are in plan-hashes.txt.

The 12 requests

IdRequest (abridged; full text in tasks.json)FilesColours
T0132×32 closed wooden treasure chest with gold trimchest.png8
T0216×16 health potion icon, round bottle, red liquid, corkpotion.png6
T0332×32 knight standing, facing the viewer, top-down RPGknight.png12
T0416×16 sword icon pointing up and to the rightsword.png6
T0548×48 oak tree for a top-down maptree.png10
T06Spinning gold coin, 6 frames of 16×16, loopingcoin_sheet.png, coin.gif6
T07Green slime idle bounce, 8 frames of 32×32, loopingslime_sheet.png, slime.gif8
T08Side-view adventurer walk cycle, 6 frames of 32×32, loopingwalk_sheet.png, walk.gif12
T09Seamless 16×16 grass tile, fully opaquegrass.png5
T103×3 set of 16×16 dirt-path-on-grass tiles in one 48×48 imagepath_tiles.png8
T11Campfire, flames over two crossed logs, 8 frames of 32×32, loopingfire_sheet.png, fire.gif8
T12One-shot smoke puff that billows and fades, 8 frames of 32×32smoke_sheet.png, smoke.gif6

Every request asked for a transparent background except the two tile tasks, which asked for fully opaque tiles.

The checks (one script for every arm)

  1. Files: each requested file exists at its exact name and opens.
  2. Size: exact pixel size; a sheet is N frames wide; every GIF frame is the requested frame size.
  3. Frames: the GIF has exactly N frames, and a looping request's GIF loops forever.
  4. Crisp: every pixel is fully transparent or fully opaque (no soft edges).
  5. Palette: no more opaque colours than the request allows.
  6. Background: sprites and effects have transparent corners in every frame and at least 20% transparent pixels; tiles are fully opaque.
  7. Content: the fullest frame is at least 10% opaque, and no frame is empty (except the last frame of the one-shot smoke).
  8. Motion: consecutive frames differ, and a loop's last frame differs from its first.

Some checks are strict for both arms: a diagonal sword whose tip touches a corner pixel fails the background check, and the oak tree's soft ground shadow, which both arms often drew, fails "crisp".

The blind judge

For each task and model, both arms' files were drawn on one contact sheet as "Left" and "Right": every frame scaled up with nearest-neighbour, then the first frame at 1× and 2×, on a checkerboard; tiles also repeated 3×3. A fresh Claude Opus 5.5 job, with only the Read tool, got the user's request and the sheet, and answered Left, Right or Tie on whether it fulfils the request, reads at its real size, is clean pixel art and, for animations, moves well. Each pair was judged twice with the sides swapped, and an arm won only if it won both times. If only one arm delivered any readable file, it won by default.

What we may claim, set before the runs

"Pixelbolt helps" a model only if it passes at least 3 more tasks than nothing installed and wins more judged pairs; overall, at least 6 more of 36 and a two-sided sign test on the pairs (ties dropped) at p < 0.05. From run 2 on, a claim also needs a repeat on the same version to point the same way. No model and no total met its rule in any run. Closest in run 3: Haiku, 11 vs 9 valid (the rule needs 3 more) with pairs 9 vs 2 (three of the 9 drawn by Haiku's own code with Pixelbolt connected, one by default); in the repeat Haiku passed 9 against 10. Run 3's animation-and-effect bar (above) was added before run 3, for that release only, and is separate from these rules.

Changes to the plan

Each was written before the jobs, or the scoring, it covers, except the correction in change 7.

  1. 23 Oct, after run 1's main jobs were scored and before their judging was read: the told arm, exploratory.
  2. 26 Oct, before run 2: run 2 on main f964f40; only the package changed in the harness. From then on a "helps" claim also needs a repeat on the same version to point the same way.
  3. 26 Oct: the first repeat moved to the same day.
  4. 26 Oct, after the first repeat's other 31 tasks were judged (28 vs 25 valid, pairs 14-13) and before the cut cells ran: its spending cap had been set too low and cut its last five Opus tasks before they ran; the cap was raised and those 10 jobs ran under the same rules (they went 5 vs 5 valid and 1-3-1 in pairs). A dated erratum corrects the times amendments 3 and 4 state.
  5. 27 Oct, before repeat 2: Claude Code pinned to 2.1.302 (the installed client had moved on), each job its own TEMP folder (the /tmp of Git Bash and of Claude Code's Write tool stayed shared), our earlier jobs' leftover scripts moved aside, and a per-job check for scripts a job ran but hadn't written. During repeat 2, before its scoring: the check's code fixed twice to match its own rule after false flags.
  6. 3 Nov, before run 3: run 3 on Pixelbolt 0.11.0 from npm; from repeat 2's setup only the package, the cap and the job names changed, and Opus went back to three at a time. Also fixed then: the animation-and-effect bar and the rule that this page publishes only if run 3 passes it; a repeat if run 3 cost under $15 and finished judging before 17:45 (both held); and a skill arm, fixed in advance but not run, because our harness can't load a skill. After run 3's Haiku jobs, before any scoring: the per-job check fixed once more to match its rule. It had flagged a job for running a script that, as the job's next two commands showed, never existed at that path; its output had been cut to one line.
  7. 3 Nov, a correction after run 3 was scored and judged and its verdicts read, before the repeat was scored or judged: our judge script didn't put the pinned Claude Code first on PATH, so run 3's first judging ran on 2.1.317, the installed client. Run 3 was judged again on 2.1.302 with nothing else changed, and those verdicts are the result: pairs 18-13-5, moving 9-6-0. The first judging (19-14-3, moving also 9-6-0) is kept in the data. Also before any of the repeat's judging: its per-job check flagged one real case (Haiku's no-tool sword ran another job's leftover script of the same name from the shared temporary folder), so that cell was re-run once with no other job running, as the plan's rule says; the first run is kept in the data.

Limits

Reproduce it

The plan, tasks, scripts, every job's result, every judge verdict, every requested file each job delivered and the searches we ran are in data/, one folder per run. Each run folder has its own copy of the runner and judge (paths, job names and caps differ), the tasks.json and prompts its scripts read, and the MCP config the Pixelbolt arm used: unpack the package where that config points (pkg/package/ in the run folder) and set the path to yours. The scripts write each job's files to runs/; our jobs' delivered files are in each run's outputs/, requested files only. The runner calls a small wrapper that runs each claude -p job with an API key, prints its cost and the path of its stream log, and keeps a cost log; swap in your own. To pin Claude Code as we did, put that version's binary first on PATH for both the runner and the judge.

npm pack pixelbolt@0.11.0 && mkdir pkg && tar -xzf pixelbolt-0.11.0.tgz -C pkg   # run 3: pkg/package/
python run_bench.py haiku          # 12 tasks x 2 arms; then sonnet, opus
python stale3.py                   # flags jobs that ran or copied in files they didn't write
python score.py                    # the checks
python judge.py haiku              # blind pairs; then sonnet, opus
python anim_bar_test.py            # run 3's animation-and-effect bar
python compare_runs.py             # every run side by side

Searches this page answers

On 4 November 2026 we searched "can Claude make pixel art sprites", "Claude Code pixel art MCP server benchmark", "does an MCP tool help Claude make better pixel art sprite animation", "Claude Haiku Sonnet Opus pixel art sprite generation comparison" and "AI agent pixel art sprite sheet GIF benchmark valid output palette". None of the results was one of our pages; the last listed Pixelbolt's entry in a directory of MCP servers. The search tool's summaries found model benchmarks and tool listings but no test of the same requests with and without a tool: "I found no comparison of MCP-assisted versus unassisted output" (the results; earlier searches in the same folder).