daisyUI Blueprint MCP
What: a licensed MCP server that gates daisyUI work behind a chain of specialist personas.
Who: any agent writing or revising daisyUI markup in frontend/ or games/*.
When: before writing component markup — not after.
Blueprint is not a snippet lookup. You choose the workflowId and pass the same string to
every tool in the task; the server keys all accumulated state off it. Two orderings are enforced
server-side and rejected with blueprint_error (see Enforced ordering).
Treat it as a workflow you enter, not a reference you query.
Everything on this page was observed against daisyui-blueprint@1.5.6. initialize reports
serverInfo {"name":"daisyui-blueprint","version":"1.5.6","title":"daisyUI Blueprint"} and
capabilities resources, tools, prompts, completions.
Configuration
The server is registered twice, and the two registrations use different syntax for the same deny.
.mcp.json — tracked, project-scoped
{
"mcpServers": {
"daisyui-blueprint": {
"type": "stdio",
"command": "npx",
"args": ["-y", "daisyui-blueprint@latest"],
"env": {
"EMAIL": "${DAISYUI_BLUEPRINT_EMAIL}",
"LICENSE": "${DAISYUI_BLUEPRINT_LICENSE}"
}
}
}
}The two variables interpolate from the env block in .claude/settings.local.json, which is
gitignored globally (~/.config/git/ignore). The license key must never land in .mcp.json —
that file is tracked. Without both variables the server exits immediately with
🔑 License validation failed: Env variables missing.
The Figma converter is denied here with the fully-prefixed permission literal:
"permissions": { "deny": ["mcp__daisyui-blueprint__convert_figma_to_daisyui"] }~/.omp/mcp.json — untracked home config
The same server is registered for omp under mcpServers["daisyui-blueprint"]. Two differences
matter:
- It denies tools through
disabledTools, which matches on the bare tool name with nomcp__<server>__prefix:"disabledTools": ["convert_figma_to_daisyui"]. Using the prefixed literal here silently disables nothing. - It carries literal
EMAILandLICENSEvalues rather than interpolating them.
Standing risk
~/.omp/mcp.jsonstores the Blueprint credentials in plaintext outside the repository. It is not committed, so the key never reaches version control, but any process that can read the home directory can read the license. Rotating or externalising that credential is a separate security decision and is deliberately not bundled with Blueprint documentation changes. Never paste the license value into a report, diff, log, doc, or commit message.
Both files are plain JSON with no comment support. A syntax error in either one silently disables every MCP server for that client, so validate them after editing.
MCP servers bind at session start, so a session that predates a config change will not see the tools. Restart the client, or speak stdio JSON-RPC to the server directly to verify a change without waiting for a restart.
The persona chain
Argument names below are copied from the live inputSchema; the casing is exact.
| Order | Tool | Required args | Optional args | Role |
|---|---|---|---|---|
| 1 | daisyui_setup_expert | workflowId, projectRoot | install, config, themes, colors, icons, fonts, charts (all boolean) | Mandatory first. projectRoot must be a real absolute path |
| 2 | daisyui_rules_enforcer | workflowId | — | Mandatory before any design role or component syntax. Returns the binding rule set |
| 3 | daisyui_creative_director | workflowId, trend | — | Optional. Exactly one of 106 enum trends |
| 4 | daisyui_page_architect | workflowId | PageIDs (max 5 of 211), context | Optional. Page-scoped composition guidance |
| 5 | daisyui_component_syntax_expert | workflowId, SnippetIDs | — | Mandatory before writing markup. 75 IDs; responses are batched |
| 6 | daisyui_quality_inspector | workflowId, auditIntent, files | userRequest, renderedReview | Read-only or scoped-fix audit. Paths are relative to projectRoot |
Enforced ordering
Observed by calling tools out of order against a fresh server process:
| Call | Server response |
|---|---|
Any tool before daisyui_setup_expert | blueprint_error — Unknown workflowId `<id>`. Call daisyui_setup_expert once with this workflowId and projectRoot. (retryable: true) |
daisyui_component_syntax_expert after setup but before rules | blueprint_error — Call mandatory daisyui_rules_enforcer before optional design roles or component syntax. |
daisyui_quality_inspector after setup only | Succeeds. The inspector does not require the rules enforcer |
So the enforced graph is: setup_expert → rules_enforcer → {creative_director,
page_architect, component_syntax_expert}, with quality_inspector depending only on
setup_expert. Nothing forces creative director before page architect.
trend must be the whole enum string
daisyui_creative_director rejects a bare trend label. The enum values embed their own guidance,
and the argument must match one verbatim:
"Data-Dense Utilitarian UI - Good for Developer tools, operations software, analytics, trading,
logistics, and internal enterprise systems."Passing just "Data-Dense Utilitarian UI" returns
MCP error -32602: Input validation error: Invalid option: expected one of ….
workflowId scope
One agent, one cohesive task, one design direction. Reuse it across sections of the same page or
related pages sharing a design. Mint a new one for a different design direction or an alternative
variant. Never reuse another parallel agent’s workflowId — the page architect response
states explicitly that “Every parallel agent must use a distinct workflowId”, and setup expert
stores projectRoot against it.
State is held per server process. A fresh npx daisyui-blueprint process knows no prior
workflowId, so a whole chain must run inside one connection.
Snippet IDs
75 total: 68 components/* (components/button, components/card, components/modal,
components/timeline, components/theme-controller, …) plus 7 blocks/*
(blocks/bento-grid, blocks/features-section, blocks/hero-section, blocks/logo-marquee,
blocks/product-feature, blocks/social-proof-section, blocks/testimonial-wall).
Responses are batched against MAX_COMPONENT_RESPONSE_CHARS and MAX_COMPONENT_SKIPS. When a
response reports remaining IDs, re-call with the same workflowId and only the remaining IDs
until none remain.
Audit intent
fix_changes— after this workflow edited UI code. Findings may be fixed only within the changed scope, then the audit reruns.report_only— for an explicitly requested read-only audit. Findings are reported and project files must not be edited.
The inspector returns one action to follow: fix and rerun, perform rendered checks and rerun once, report, stop, or finalize. Its report arrives as JSON in the tool result — no MCP resource read required. It does not replace diff, build, test, or browser verification.
Under the hood
Tool surface (tools/list)
Eleven tools: the six daisyui_* personas above plus five converters —
convert_figma_to_daisyui, convert_bootstrap_to_daisyui, convert_picture_to_theme,
convert_screenshot_to_daisyui, convert_tailwind_to_daisyui.
Prompt surface (prompts/list)
Four prompts, distinct from the tools and named in prose rather than snake_case:
Bootstrap to daisyUI, Picture to Theme, Screenshot to daisyUI, Tailwind to daisyUI.
There is no Figma prompt — the Figma path is tool-only.
Resources
resources/list is empty. All resources are templated; resources/templates/list returns
four URI schemes:
| Template | Contents |
|---|---|
snippet://{path} | Component and block syntax |
page://{id} | Page architecture contexts |
rule://{id} | Individual rule documents |
setup://{id} | Setup guidance (colors, icons, themes, …) |
Environment knobs
| Variable | Effect |
|---|---|
EMAIL, LICENSE | Required. The server exits without both |
SKIP_SETUP_EXPERT, SKIP_RULES_ENFORCER, SKIP_CREATIVE_DIRECTOR, SKIP_PAGE_ARCHITECT, SKIP_COMPONENT_SYNTAX_EXPERT, SKIP_QUALITY_INSPECTOR | Drop individual personas from the workflow |
QA_MAX_FILES | Quality inspector file ceiling (default 300) |
QA_MAX_MB | Quality inspector byte ceiling (default 2,000,000 bytes) |
MAX_COMPONENT_SKIPS | Allowed omitted component IDs (default 7) |
MAX_COMPONENT_RESPONSE_CHARS | Component syntax batch size (default 24,000) |
Other observed defaults: maxPages 5, figmaTimeoutMs 15000.
Error codes
workflow.setup-expert-missing, workflow.rules-enforcer-missing,
workflow.page-components-not-retrieved, workflow.page-components-not-used,
audit.unclassified-sources, audit.unsupported-target-skipped, and the generic
blueprint_error. Ordering violations surface as blueprint_error with retryable: true.
Converters
The four non-Figma converters bypass the chain entirely — they skip every optional tool and the Quality Inspector. The server describes them as a fallback for when MCP prompts are unavailable and the user explicitly asks for that workflow. They are not a shortcut around Law 19: if you are writing Funday markup, run the chain.
convert_figma_to_daisyui is denied repo-wide. Funday has no Figma source of truth, so a
Figma-derived design cannot be reconciled against any Funday standard. The deny is expressed
twice, with the different literals documented in Configuration: the prefixed
mcp__daisyui-blueprint__convert_figma_to_daisyui in .claude/settings.local.json, and the bare
convert_figma_to_daisyui in ~/.omp/mcp.json. Neither .cursor/mcp.json nor .vscode/mcp.json
exists in this repository.
Showcase runbook
A full read-only chain, all six personas, one workflowId, mutating nothing. This is the exact
sequence used to verify this page; it must run inside a single server connection.
| # | Tool | Arguments |
|---|---|---|
| 1 | daisyui_setup_expert | {workflowId:"funday-blueprint-showcase-1", projectRoot:"/home/usr/funday/frontend", colors:true, icons:true} |
| 2 | daisyui_rules_enforcer | {workflowId:"funday-blueprint-showcase-1"} |
| 3 | daisyui_creative_director | {workflowId:"funday-blueprint-showcase-1", trend:"<full enum string>"} |
| 4 | daisyui_page_architect | {workflowId:"funday-blueprint-showcase-1", PageIDs:["pages/app-dashboard"]} |
| 5 | daisyui_component_syntax_expert | {workflowId:"funday-blueprint-showcase-1", SnippetIDs:["components/card","components/button","components/stat","blocks/bento-grid"]} |
| 6 | daisyui_quality_inspector | {workflowId:"funday-blueprint-showcase-1", auditIntent:"report_only", files:[{path:"src/lib/components/Feedback.svelte"}]} |
Rules that are not optional:
- Re-call step 5 with the same
workflowIdand only the remaining IDs until none remain. - Follow the single action step 6 returns. If it returns
manual_review, perform the rendered checks it names and rerun once with the samefilesplusrenderedReview: { status: "completed", … }. Never edit code as a result of areport_onlyaudit. - Never call
convert_figma_to_daisyui.
Observed result
All six returned successfully. Step 6 returned status: "issues", action: "report",
editPolicy: "read_only", summary {filesAudited: 1, issueCount: 3, warningCount: 1} against
frontend/src/lib/components/Feedback.svelte, with three finding codes:
daisyui.unknown-class× 2 —select-bordered(:47) andtextarea-bordered(:58). Both were removed in daisyUI 5; the bordered look is now the default for those controls.daisyui.color-treatment× 3 —range-primary(:55),badge-primary(:56),btn-primary(:59) judged too dense for one component.accessibility.form-control-name× 2 — the select and textarea have no accessible name; a fieldset legend names the group, not the individual control.
Per report_only these were reported and not fixed.
Conflicts with Funday standards
Blueprint governs how markup gets written. It does not override Funday design policy — when Blueprint output conflicts with the Funday standards pages, the standards win and the Blueprint output is corrected.
Checked against daisyUI Masterclass for the showcase run:
| Funday standard | Blueprint output | Verdict |
|---|---|---|
Pure Solid Beauty — no backdrop-blur, glass, or opacity backgrounds (daisyui-masterclass.md:545) | Creative Director for the Data-Dense Utilitarian trend independently instructs “Avoid decorative gradients, blurred orbs, glassmorphism, neon glows…”; Component Syntax adds “Do not add decorative gradients or effects unless the page context requires them” | Agrees. No correction needed. A different trend (Glassmorphism, Liquid Glass, Aurora UI, Holographic) would conflict — do not select one |
Semantic colours only, no hardcoded Tailwind palette (daisyui-masterclass.md:544) | Rules Enforcer: “Do not use arbitrary color utilities … or raw fixed palette values for theme-aware UI. Use daisyUI semantic colors instead.” Zero raw-palette classes appear anywhere in the six responses | Agrees. No correction needed |
@apply only for new custom variants (daisyui-masterclass.md:498) | Blueprint never mentions @apply | Silent. The Funday rule stands unmodified |
Games may keep a deliberate :root custom-property override (e.g. games/mines/src/app.css pins --color-base-100) | Rules Enforcer: “Do not define brand or interface colors as :root or :host custom properties” | Conflicts. Funday keeps the documented per-game override where a game deliberately overrides its theme’s base colour. Treat Blueprint’s rule as the default and the override as an explicit, commented exception |
Related
- DaisyKit Cheat Sheet — Midway portable kit quick-start
- daisyUI Masterclass — Funday production patterns
- daisyUI SSOT — vendor snapshot from
llms.txt - MCP configuration — transport and config-file precedence