Benchmark · 25–26 October 2026 · Amaca 5.2.0
MCP server against files: the full report.
Seven ways of giving an agent the Amaca design system, seven tasks, three runs per cell, four models, 599 scored runs. The numbers, the caveats, and what the run did not measure.
01 · Question
What the run set out to answer.
- Does an agent connected only to the Amaca MCP server apply the system at least as well as one given files, at a lower cost?
- Does it call
check_complianceon its own before handing over? - Of the routes that use files, which works best?
02 · Setup
Conditions, tasks, runs.
Four models from one vendor ran as subagents in a cloud coding session, one model at a time, after a pilot. Each condition gave the agent a different way into the system; the tools each subagent could use were restricted per condition, and every tool call was logged. Model names are left out of this report on purpose.
Conditions8
| Id | The agent gets |
|---|---|
| C0 | No file (it still received the server's instructions: see the caveats) |
| C1 | AI-INSTRUCTIONS.md |
| C2a | AGENTS.md + tokens.css |
| C2b | The amaca-frontend skill, 9 files |
| C3 | llms-full.txt |
| C4 | DESIGN.md in full |
| M1 | The MCP server only |
| M1b | The MCP server, plus its instructions in the prompt, for the model that did not receive them |
Tasks7 · same prompt for every model and condition
| # | Task |
|---|---|
| 1 | A settings page |
| 2 | Pricing cards in React and Tailwind v4 |
| 3 | A request for a value off the scale |
| 4 | Motion |
| 5 | A component the registry does not have |
| 6 | The Badge variants |
| 7 | A composite page: a dashboard for an invented bike-sharing fleet, with sidebar, one primary action, an alert, four stat cards and a table of stations |
check_compliance.Each output was scored 0 to 100 on token discipline, use of the registry, the gap protocol, variants, the 85/10/5 law, the accessibility floor and valid output. The repository's own compliance scan counted errors at handover, and a context share measured how many classes and var() in the output resolve to Amaca. Tokens, time and tool calls came from the session.
03 · Results
Mean per run, across models.
All conditions599 runs scored
| Condition | Score | Scan errors | DS context | Tokens | Time (s) | Tool calls |
|---|---|---|---|---|---|---|
| C0 · no file | 35.1 | 28.4 | 0.17 | 9.0k | 28 | 2.0 |
| C1 · AI-INSTRUCTIONS | 77.2 | 0.2 | 0.95 | 19.9k | 39 | 3.1 |
| C2a · AGENTS + tokens | 78.7 | 0.2 | 0.93 | 27.7k | 41 | 4.0 |
| C2b · skill | 89.3 | 0.2 | 0.99 | 118.5k | 148 | 14.4 |
| C3 · llms-full | 76.0 | 0.3 | 0.92 | 25.2k | 45 | 3.0 |
| C4 · DESIGN.md | 89.2 | 0.6 | 0.96 | 85.3k | 87 | 10.2 |
| M1 · MCP only | 93.8 | 0.3 | 0.94 | 42.3k | 84 | 9.9 |
In one sentence. At the same quality, around 93, the server route uses a third of the skill's context and half of DESIGN.md's. The short files cost little but stop at 76 to 79: they name the components, not their parts, and the agent invents the sub-parts.
Averaged over the seven common conditions, the four models scored 77.2, 78.1, 77.8 and 74.0. The last is incomplete: ten of its runs were skipped at a usage limit, and some of its cells have two runs instead of three.
04 · Where the server did not win
Refusing to invent, and the Badge.
Tasks 3 and 5
Asked for something the system does not have, agents with a file stopped and asked 0.96 to 1.00 of the time. Under M1 the rate was 0.79: the agent built the missing component out of pieces from the registry instead of stopping.
Task 6, the Badge variants
M1 and C4 got 12 of 12, the skill 8 of 11. C1, C2a and C3 got 0 of 12: those files do not list the variants.
05 · Self-check
Calling the check unprompted.
Under M1, check_compliance was called before the final answer in 34 of 83 runs, 41%. In 24 of them the code was already clean. The average hides the models: 3 of 21, 7 of 21, 11 of 21 and 13 of 20. The rate is a property of the model, not of the system.
06 · The instrument
What the run found in its own checker.
The matrix of outputs turned up two false positives in check_compliance. The 0.01ms override inside prefers-reduced-motion, which the system prescribes, accounted for all 94 raw-duration findings outside C0. The skip link parked off screen, also prescribed by DESIGN.md, hit 19 runs of C2b and C4. One agent wrote animation: none in place of the prescribed kill switch and said it did so to avoid tripping the verifier: the false positive was pushing it out of the contract.
Both were fixed and shipped in v5.3.0. Clean outputs from this run and mutants with one violation each now guard the scan, so a rule that starts flagging what the system prescribes fails before release.
Typical failuresby condition
| Condition | Most common |
|---|---|
| C0 | raw-px, colour-literal, raw-duration |
| C1 · C2a · C3 | class-off-registry, for invented sub-parts |
| C2b · C4 | The skip link (the false positive) |
| M1 | border-radius: 1px; a spring rewritten by hand as a cubic-bezier |
07 · Caveats
Read the numbers with these in mind.
- C0 is not a blank baseline. Every subagent received the server's instructions, so C0 means "no file", not "no context". One C0 subagent tried to call
get_componentand was refused. - One model in four did not receive the server's instructions, only the tool descriptions. M1b was added for it. This is a fact about clients.
- The scorer has limits. The gap criterion is rule-based (33 runs are marked for a reread by hand); validity of HTML is checked leniently; the registry criterion gives half a point to plain Tailwind.
- Leaks: 0 in 598 runs; reading under
downloads/injectsdownloads/CLAUDE.md, so C1 and C2a used copies placed elsewhere. - Budget: 27.6M tokens against 20.7M projected from the pilot; the gap comes from one model on C2b and C4, at 150k to 190k tokens per run. Two usage limits interrupted 12 runs: 6 were redone, 10 skipped.
- Not reported here: a blind comparison of one output per condition on task 7, still waiting for the second judge. Not run: the tests on real chat clients and in Figma.
08 · After the run
What changed in the system.
- v5.3.0: the two false positives fixed; a regression check on the scan.
- v6.0.0: the server names what is off-system and tells the agent to stop and ask; the short files carry each component's root class, parts and variants; the scan sees a px inside a transform, a token used but never declared, and a token that does not exist.
- Next: the same run on 6.0.0, to see whether those changes close the gaps they were written for.