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:

  1. It denies tools through disabledTools, which matches on the bare tool name with no mcp__<server>__ prefix: "disabledTools": ["convert_figma_to_daisyui"]. Using the prefixed literal here silently disables nothing.
  2. It carries literal EMAIL and LICENSE values rather than interpolating them.

Standing risk

~/.omp/mcp.json stores 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.

OrderToolRequired argsOptional argsRole
1daisyui_setup_expertworkflowId, projectRootinstall, config, themes, colors, icons, fonts, charts (all boolean)Mandatory first. projectRoot must be a real absolute path
2daisyui_rules_enforcerworkflowIdMandatory before any design role or component syntax. Returns the binding rule set
3daisyui_creative_directorworkflowId, trendOptional. Exactly one of 106 enum trends
4daisyui_page_architectworkflowIdPageIDs (max 5 of 211), contextOptional. Page-scoped composition guidance
5daisyui_component_syntax_expertworkflowId, SnippetIDsMandatory before writing markup. 75 IDs; responses are batched
6daisyui_quality_inspectorworkflowId, auditIntent, filesuserRequest, renderedReviewRead-only or scoped-fix audit. Paths are relative to projectRoot

Enforced ordering

Observed by calling tools out of order against a fresh server process:

CallServer response
Any tool before daisyui_setup_expertblueprint_errorUnknown workflowId `<id>`. Call daisyui_setup_expert once with this workflowId and projectRoot. (retryable: true)
daisyui_component_syntax_expert after setup but before rulesblueprint_errorCall mandatory daisyui_rules_enforcer before optional design roles or component syntax.
daisyui_quality_inspector after setup onlySucceeds. The inspector does not require the rules enforcer

So the enforced graph is: setup_expertrules_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:

TemplateContents
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

VariableEffect
EMAIL, LICENSERequired. The server exits without both
SKIP_SETUP_EXPERT, SKIP_RULES_ENFORCER, SKIP_CREATIVE_DIRECTOR, SKIP_PAGE_ARCHITECT, SKIP_COMPONENT_SYNTAX_EXPERT, SKIP_QUALITY_INSPECTORDrop individual personas from the workflow
QA_MAX_FILESQuality inspector file ceiling (default 300)
QA_MAX_MBQuality inspector byte ceiling (default 2,000,000 bytes)
MAX_COMPONENT_SKIPSAllowed omitted component IDs (default 7)
MAX_COMPONENT_RESPONSE_CHARSComponent 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.

#ToolArguments
1daisyui_setup_expert{workflowId:"funday-blueprint-showcase-1", projectRoot:"/home/usr/funday/frontend", colors:true, icons:true}
2daisyui_rules_enforcer{workflowId:"funday-blueprint-showcase-1"}
3daisyui_creative_director{workflowId:"funday-blueprint-showcase-1", trend:"<full enum string>"}
4daisyui_page_architect{workflowId:"funday-blueprint-showcase-1", PageIDs:["pages/app-dashboard"]}
5daisyui_component_syntax_expert{workflowId:"funday-blueprint-showcase-1", SnippetIDs:["components/card","components/button","components/stat","blocks/bento-grid"]}
6daisyui_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 workflowId and 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 same files plus renderedReview: { status: "completed", … }. Never edit code as a result of a report_only audit.
  • 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) and textarea-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 standardBlueprint outputVerdict
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 responsesAgrees. No correction needed
@apply only for new custom variants (daisyui-masterclass.md:498)Blueprint never mentions @applySilent. 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

Ask Docs

AI assistant to help answer questions about the documentation. Answers are read-only and cite docs/source.

Hi! How can I help you with the documentation today? Answers are read-only and cite docs/source.

Ctrl+Enter to send