basecoat-ui
Basecoat UI MCP is an offline Model Context Protocol server that lets AI agents discover, compose, and statically validate Basecoat UI (shadcn/ui-style) components, macro layouts, design sessions, and semantic rules without network access.
Search and retrieve component templates for Astro or HTML (
search_components,get_component_details).Statically validate HTML/Astro source for Basecoat migration, rhythm, FSM bindings, scripts, spacing, and hierarchy (
validate_composition).Search macro layout blocks and read blueprint sections like manifest, structure, slots, ports, rules, dependencies, and provenance (
search_macro_blocks,get_macro_block).Create persistent design sessions, read focused design context, apply atomic graph patches, and validate design graphs (
begin_design,get_design_context,apply_design_patch,validate_design).Access semantic rhythm rules with project-local overrides and FSM recipes (
get_rhythm_rules,get_fsm_recipe).Read design resources for rhythm, theming, framework integration, and host project
DESIGN.md(basecoat://design/rhythm,basecoat://design/theming,basecoat://integration/frameworks,basecoat://project/context).Operate entirely offline over stdio with bounded responses, cursor pagination, no runtime network requests, and no writes to host application source files.
Enables composing Basecoat UI components in Astro projects, with setup guidance for Vite, Tailwind CSS 4, selective JavaScript imports, and native dialog wiring.
Provides Tailwind CSS 4 integration for Basecoat UI components, including CSS ordering and stylesheet setup for Astro or static HTML projects.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@basecoat-uiSearch for a card component template"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
The server exposes a deterministic, offline registry for AI coding agents instead of requiring clients to scrape documentation. It runs over local stdio with zero runtime network requests, bounded < 2 KB responses, and bounded lexical/heuristic static source validation. The host application remains responsible for rendering, data access, authentication, sessions, credentials, OAuth, captcha, and other runtime behavior.
Install
Requires Node.js 22.14.0 or newer.
Quick Start by Client
Cursor (.cursor/mcp.json)
{
"mcpServers": {
"basecoat-ui": {
"command": "npx",
"args": ["-y", "@intellmedia/basecoat-ui-mcp", "--project-root", "${workspaceFolder}"]
}
}
}Claude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"basecoat-ui": {
"command": "npx",
"args": ["-y", "@intellmedia/basecoat-ui-mcp", "--project-root", "/absolute/path/to/your/application"]
}
}
}Claude Code (CLI)
claude mcp add basecoat-ui -- npx -y @intellmedia/basecoat-ui-mcp --project-root $(pwd)Generic npx (no install)
{
"mcpServers": {
"basecoat-ui": {
"command": "npx",
"args": ["-y", "@intellmedia/basecoat-ui-mcp", "--project-root", "/absolute/path/to/your/application"]
}
}
}npm
npm install --global @intellmedia/basecoat-ui-mcpAdd the server to an MCP client. Use an absolute path for the host application so design context and persistent sessions belong to the intended project:
{
"mcpServers": {
"basecoat-ui": {
"command": "basecoat-ui-mcp",
"args": ["--project-root", "/absolute/path/to/your/application"]
}
}
}The compiled entry can also be invoked directly:
{
"mcpServers": {
"basecoat-ui": {
"command": "node",
"args": [
"/absolute/path/to/node_modules/@intellmedia/basecoat-ui-mcp/dist/server/stdio.js",
"--project-root",
"/absolute/path/to/your/application"
]
}
}
}Published packages include prebuilt dist/ and the immutable semantic snapshot
under src/semantics/. Server startup reads that snapshot and does not write
inside the installed package. The package contract test builds first, creates
and extracts an actual npm tarball, marks the extracted package tree read-only,
starts its dist/server/stdio.js under a network tripwire, completes MCP
initialize and tool-list requests, and closes the connection. A source checkout
does not include dist/.
From source
git clone https://github.com/zygiu-zygis/basecoat-ui-mcp.git
cd basecoat-ui-mcp
npm ci
npm run build
npm start -- --project-root /absolute/path/to/your/application--project-root takes precedence over BASECOAT_PROJECT_ROOT, which takes precedence over the launch directory. The selected directory is the host project, not the MCP installation directory. The server exposes stdio only.
Related MCP server: Maket
Project-root configuration
The configured root controls two things:
DESIGN.mdis read from that directory bybasecoat://project/context.Persistent macro sessions are stored under
<project-root>/.basecoat/designer/..basecoat/rhythm.jsonis an optional strict override. It must live under a real.basecoatdirectory inside the project root, be a regular non-symlink file no larger than 65,536 UTF-8 bytes, and resolve inside that root; missing or rejected files leave the packaged profile unchanged. Matching mapping IDs replace in place and keep packaged order.
Only that exact directory is used. The server does not walk parent directories. Keep .basecoat/ in the host project and back it up if design sessions are part of your workflow. The MCP server never writes host application source files.
Basecoat MCP tools
The server exposes three component tools, six macro tools, and two semantic tools. Every macro and semantic result is a bounded MCP packet of at most 1,999 UTF-8 bytes. Larger result sets use cursors; responses are not sliced mid-JSON.
Component tools
search_componentsreturns up to 8 compact{id, name, intent}summaries and never returns markup.intentandqueryare optional; an empty search returns an empty list.get_component_detailsreturns one Astro or HTML template with dependencies and composition guidance. Oversized entries fail closed.theme-toggleresolves totheme-switcher.validate_compositionstatically checks up to 256 KiB (262,144 UTF-8 bytes) of HTML or Astro source and returns at most 24 issues. Passcodeorhtml, and optionalsemanticProfileordensityProfile(comfortable|compact). It does not render, execute, resolve application modules, or certify accessibility.
Macro tools
The macro layer is this project's curated, project-specific composition system for shells, auth flows, data workspaces, slots, ports, rules, and recipes. It is compiled into a pinned registry snapshot. These layout contracts are not supplied automatically by shadcn or by MCP.
search_macro_blocks- find compatible blueprint blocks by query, role, family, or tag.get_macro_block- read a block section such asmanifest,structure,slots,ports,rules,dependencies, orprovenance.begin_design- create a persistent design session and pin its profile and registry revision. Pinned registries are hash-verified on load.get_design_context- read session lists or focused views such asoverview,graph,rules,focus, andnext.apply_design_patch- apply atomic graph changes withexpectedRevisionand an idempotentoperationId. A committed mutation always returns a success acknowledgement; oversized optional payload may be omitted withtruncated: true.validate_design- validate a draft or complete design graph and page its diagnostics.
Design sessions persist under <project-root>/.basecoat/designer/. Registry revisions are content-addressed; a session keeps using its pinned revision even after the package snapshot changes. Design snapshots use the form d:<designId>@<revision>.
Curated block blueprints:
Shells & Navigation:
app-shell,sidebar-dashboard-shell,sidebar-inset-shell,sidebar-collapsible-icon,sidebar-mobile-flyout,page-header.Authentication:
auth-recovery,auth-reset,auth-sign-in,auth-sign-up,auth-split-screen.Application & Workspace:
dashboard-workspace,dashboard-main,dashboard-activity,data-workspace,data-table,data-table-detail-layout,detail-drawer-panel,product-detail-layout,settings-workspace.Forms & Data:
data-bulk-actions,data-filters,data-pager,form-section.Navigation & Utility:
sidebar-nav,empty-state,error-boundary,newsletter-waitlist,pricing-tiers,segmented-toggle,svg-area-chart.
Multi-block recipes:
workspace-dashboard- full analytics dashboard (KPI cards, activity chart, records table).workspace-settings- application shell with navigation, header, and settings workspace tabs.workspace-detail- data table workspace with slide-over detail inspection drawer.auth-flow- bidirectional authentication flow between sign-in and sign-up cards.auth-split-flow- split-screen auth frame pairing sign-in and sign-up with hero media.data-records- records page with filters, table, and pager.marketing-pricing- 3-tier pricing table paired with newsletter/waitlist banner.
Semantic tools
The semantic layer provides compiled rhythm profiles and finite state machine recipes:
get_rhythm_rules- access approved spacing, typography, surfaces, borders, and layout patterns by profile and family filters.get_fsm_recipe- read interaction states, events, transitions, guards, and actions fordialog,navigation(collapsible-navigation),auth-flow, andtabs.
Semantic tools use the same bounded pagination as macro tools. Each rhythm record keeps the semantic token ID separate from its approved Tailwind utility. Put the utility in class; keep the semantic ID in design metadata and agent reasoning. Project overrides from <project-root>/.basecoat/rhythm.json are reflected in an effective content ref and revision. FSM recipes are structural metadata, not runtime implementations.
End-to-end example
A dashboard page can follow this sequence:
get_design_context(view="sessions")
begin_design(designId="admin", profile="app-default", operationId="begin-admin")
get_rhythm_rules(profile="default", family="density")
search_macro_blocks(q="shell", limit=8)
apply_design_patch(
designId="admin",
expectedRevision=0,
operationId="add-dashboard",
operations=[{ op: "instantiate_recipe",
recipe: "workspace-dashboard",
pagePrefix: "admin" }]
)
get_design_context(view="overview", designId="admin")
get_macro_block(idOrRef="app-shell", section="structure", designId="admin")
get_fsm_recipe(recipe="dialog", section="transitions")Implement the selected component leaves in the host project, then record completed regions with apply_design_patch(record_written). Finish with validate_design(mode="complete") and validate_composition on the generated Astro or HTML source. After a conflict or restart, reread the session and use the returned revision and cursors.
Copy templates/cursor/basecoat-designer.mdc into a host project's .cursor/rules for agent guidance. The MCP server does not write consumer application source files.
Auditing or restyling an existing UI
No design session is needed. Read basecoat://design/theming and basecoat://design/rhythm, call get_component_details for each control you change, then run validate_composition on the rendered layout source including <head> scripts and <style>. Theme rules:
theme-strategy-mixed-@media (prefers-color-scheme: dark)combined with the.darkclass strategy (dark tokens leak into light mode).theme-storage-key- a theme script persists under a key other than Basecoat'sthemeMode, creating a second resolver that drifts fromwindow.basecoat.theme.
Check light and dark screenshots with an OS dark preference and empty localStorage before deploying.
Source adaptation and offline import
The macro importer is intentionally local-first. It accepts a checked-out or otherwise
locally saved shadcn-style registry-item.json, a reviewed mapping, and a local
dependency lock:
npm run import:blocks -- \
--item=/path/to/registry-item.json \
--mapping=/path/to/mapping.json \
--lock=/path/to/dependency-lock.json \
--dry-runThis command does not fetch live shadcn registry items, install packages, execute upstream code, or make runtime network requests. Unknown, unlocked, or explicitly unsupported dependencies produce diagnostics instead of guesses. Omitted OAuth, captcha, session, credential, and other application features are reported as obligations. The importer emits only the curated structural block; the host application must implement the runtime behavior.
The mapping and resulting provenance make the boundary explicit: shadcn-style source is an input reference, while layout contracts, slots, ports, rules, and recipes are curated adaptations owned by this project's macro layer. They are not features provided by shadcn or by MCP. Upstream refreshes are separate maintainer authoring operations and never occur from the MCP server.
Basecoat design resources
basecoat://design/rhythmprovides content hierarchy, spacing, typography, component-family, and structural composition rules.basecoat://design/themingprovides the Basecoat token contract, all 8 official style packs (Vega, Nova, Maia, Lyra, Mira, Luma, Sera, Rhea), class-based dark mode viawindow.basecoat.theme(themeModekey), no-flash bootstrap, and form-control/autofill pitfalls. Read it before restyling or auditing an existing UI.basecoat://integration/frameworksprovides Astro, Next.js, Express, Vite, Tailwind CSS 4 (including style pack imports like@import "basecoat-css/vega";), selective Basecoat JavaScript, and native dialog setup.basecoat://project/contextreads the configured host project'sDESIGN.mdon demand. Output is capped at 6,000 UTF-8 bytes and truncates on a newline or sentence boundary when possible. Symlinks and non-regular files are refused.
Recommended flow:
Read the rhythm and project-context resources.
Decide content hierarchy and layout.
Search summaries, then request details only for selected components.
Read the integration resource when connecting production assets.
Validate the final source.
Minimal HTML example
The host application supplies its compiled Tailwind and Basecoat stylesheet:
<link rel="stylesheet" href="/assets/basecoat.css">
<button type="button" class="btn" data-variant="default">Save changes</button>Header Control Cluster (Style Preset Selector + Theme Switcher)
<div class="flex items-center gap-2">
<select id="style-variant-select" class="select h-8 w-28 text-sm leading-none" aria-label="Style pack">
<option value="vega">Vega</option>
<option value="nova">Nova</option>
<option value="maia">Maia</option>
<option value="lyra">Lyra</option>
<option value="mira">Mira</option>
<option value="luma">Luma</option>
<option value="sera">Sera</option>
<option value="rhea">Rhea</option>
</select>
<button type="button" aria-label="Toggle dark mode" data-tooltip="Toggle dark mode" data-side="bottom" onclick="window.basecoat.theme.toggle()" class="btn size-8" data-variant="outline" data-size="icon">
<span class="hidden dark:block" aria-hidden="true"><svg class="lucide lucide-sun size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2m-7.07-2.93 1.41-1.41m11.32-11.32 1.41-1.41M2 12h2m16 0h2m-2.93 7.07-1.41-1.41M6.34 6.34 4.93 4.93"/></svg></span>
<span class="block dark:hidden" aria-hidden="true"><svg class="lucide lucide-moon size-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg></span>
</button>
</div>Basecoat 1.x uses btn with data-variant and data-size. Interactive components list the granular JavaScript modules the host must load.
Macro-Driven Dashboard Generation
The MCP server provides a robust set of macro layouts (search_macro_blocks) that enable connected LLMs to predictably assemble complex layouts (like Shadcn dashboards) out-of-the-box.
Layout Neutrality: Supports both sidebar (
sidebar-dashboard-shell,sidebar-inset-shell) and top-bar architectures (topbar-shell,topbar-nav).Strict Validation: The
validate_compositiontool ensures that generated layouts adhere to the Basecoat CSS theming contracts, strict spacing rhythm scales (0, 2, 4, 6, 8, 12), and proper landmark accessibility.Agent Guidance: LLMs are encouraged to use
search_macro_blocksto find ashell(layout wrapper), anddashboard-mainordashboard-workspaceto populate themaincontainer, guaranteeing deterministic, pixel-perfect Shadcn/ui parody without React runtime artifacts.
Registry and exclusions
The checked-in registry contains 41 searchable templates: 39 curated from
the Basecoat 1.0.2 upstream inventory and two MCP-only templates
(segmented-toggle and svg-area-chart):
accordion, alert, alert-dialog, avatar, badge, breadcrumb, button, button-group, card, chart, checkbox, combobox, command, dialog, drawer, dropdown-menu, empty, field, input, input-group, item, kbd, label, native-select, popover, progress, radio-group, scroll-area, segmented-toggle, select, sidebar, skeleton, slider, svg-area-chart, switch, table, tabs, textarea, theme-switcher, toast, tooltip
The maintenance snapshot records 41 discovered upstream components. pagination and spinner remain excluded from search and details until manually curated. Slider uses basecoat-css/range, not a slider module.
The runtime has no network client, remote documentation dependency, frontend framework runtime, remote media analysis, or bundled host assets. Generated templates may not use basecoat-css/all; each controller is imported explicitly. Search results do not contain markup, newly discovered components are never auto-promoted, and JSON or HTML is never sliced to fit a response budget.
Astro and static HTML use cases
In Astro, use the integration resource for Vite, Tailwind CSS 4, CSS ordering, selective controller imports, native <dialog> wiring, and ClientRouter hooks. In static HTML, copy the listed built controller files from basecoat-css into the host application's asset directory and preserve dependency order. Chart templates require host-supplied Chart.js.
Maintainers can refresh the pinned Basecoat snapshot only with an explicit immutable
commit source, for example npm run sync -- --ref <40-character-commit-sha>.
This is the only command that uses HTTPS. It validates schema, exports, notices,
response budgets, version direction, and atomic replacement before changing the
registry. It does not refresh shadcn mappings or macro blocks.
Development and verification
Install dependencies with npm ci, then run the focused checks:
npm run check
npm pack --dry-run
npm audit --omit=devnpm run check type-checks, verifies both compiled snapshots, builds and runs
the Node test suite, and checks the branch diff for whitespace errors. The test
suite also exercises the packed read-only MCP bin offline. npm pack --dry-run
checks the package file allowlist without retaining a tarball.
npm audit --omit=dev checks production dependencies against the npm advisory
database and therefore requires network access. Maintainers can
verify the pinned Basecoat source with:
For release parity evidence, run the local-only routine before and after any approved publication:
npm run release:check -- --phase=pre-release --write=tmp/release-pre.json
npm run release:check -- --phase=post-release --write=tmp/release-post.jsonThe routine discovers surfaces from current repository metadata, compares local
authoritative values, and records current, expected, correction, status,
and verification. It checks package identity, server manifest parity, stdio
transport, advertised capabilities, install metadata, and restrained
discoverability copy. It never performs network requests or external writes;
GitHub, npm, the MCP Registry, and directory/catalog corrections remain
explicitly approved manual actions. Do not treat badges, download counts,
upstream references, or search-result snippets as release authority.
npm run sync -- --ref <40-character-commit-sha> --checkThe sync command is the only network boundary. Macro authoring changes require
npm run compile:blocks; review the generated
src/macros/registry.snapshot.json and then run
npm run compile:blocks:check.
Contributing
Create a focused branch from the default branch.
Keep component templates, macro contracts, and documentation aligned with checked-in source.
Run
npm run typecheck,npm run compile:semantics:check,npm run compile:blocks:check, andnpm run test.Run
npm pack --dry-runwhen package contents or metadata change.Describe behavior changes, bounded-output effects, and any required host application work in the pull request.
Do not add GitHub Actions workflows. Upstream registry refreshes and macro authoring are maintainer-reviewed changes, not server startup tasks.
Troubleshooting
The server starts but reads the wrong project: set an absolute
--project-rootorBASECOAT_PROJECT_ROOT. The fallback is the process launch directory.DESIGN.mdis not available: place a regular file at the configured root. Parent directories and symlinks are not followed.A source checkout cannot start: run
npm run buildbeforenpm start.A macro result has a cursor: request the next page with that cursor; do not concatenate or parse partial JSON. Changed registry, design, or effective rhythm revisions make prior cursors stale.
An apply acknowledgement includes
truncated: true: the mutation committed; reread context or validation tools for the omitted detail.An importer diagnostic mentions OAuth, captcha, or an unsupported dependency: implement or resolve it in the host application or reviewed mapping. The importer does not guess runtime behavior.
A design patch conflicts: reread
get_design_context, use its current revision, and send a new uniqueoperationId.
See ARCHITECTURE.md for runtime boundaries, persistence, packet limits, and sync policy. Report reproducible defects in the issue tracker.
Author, license, and upstream attribution
Created and maintained by Žygimantas Jasiulionis / Intellmedia under the MIT License.
Basecoat UI is an independent MIT-licensed project by Ronan Berder. Adapted templates and metadata retain the complete Basecoat notice in THIRD_PARTY_NOTICES.md. Basecoat adapts design patterns from shadcn/ui; the notice preserves that attribution. No Basecoat CSS or shadcn source is vendored here.
Available Tools
11 toolsapply_design_patchAIdempotent
Apply one atomic list of design graph operations with expectedRevision and operationId. Replay with the same operationId returns the original receipt. A committed mutation always acknowledges success; oversized optional fields may be omitted with truncated:true. Does not write application source files.
| Name | Required | Description | Default |
|---|---|---|---|
| designId | Yes | ||
| operations | Yes | ||
| operationId | Yes | ||
| expectedRevision | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, openWorld=false, so the safety profile is covered. The description adds real value beyond them: replay with the same operationId returns the original receipt, committed mutations always acknowledge success, and oversized optional fields may be omitted with truncated:true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action and the atomicity contract. Every sentence carries information; no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity mutation tool with no output schema and 0% parameter documentation, the description covers idempotency, truncation, and the source-file boundary well. It omits revision-conflict behavior, permission requirements, and the contents of the receipt, leaving gaps an agent author would need to close.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names expectedRevision and operationId and explains operationId's replay semantics, but says nothing about designId or the structure of the operations array, whose meaning rests entirely on the schema's const values and required-field shapes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Apply one atomic list of design graph operations,' scoped with expectedRevision and operationId. It clearly distinguishes this as a mutation-style patch tool, though it never names or contrasts any sibling such as validate_design or begin_design.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Atomicity and the same-operationId replay rule imply when the tool is appropriate, and 'Does not write application source files' is a useful boundary. However, there is no explicit when-to-use/when-not guidance or reference to alternatives among the ten sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
begin_designAIdempotent
Create a persistent design session under the host project root. Pass designId, profile (alias or ref), operationId, and optional decisions. Pins and hash-verifies the packaged macro registry. Idempotent for the same operationId. Oversized optional receipt fields may be omitted with truncated:true after commit.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | ||
| designId | Yes | ||
| decisions | No | ||
| operationId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent, non-destructive, closed-world. The description adds genuinely new behavior: persistence location under the host project root, registry pinning and hash verification, and the truncated:true receipt fallback after commit. It stops short of error/conflict semantics when the same designId is reused with different decisions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then parameters, then behavior, in four tight sentences with no filler. Slightly dense and packs several distinct behaviors into the trailing sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essentials for a mutation with no output schema: persistence, idempotency, registry pinning, and receipt truncation. Missing is what a session enables downstream and any failure/conflict behavior, which matters for a stateful creation tool sitting among several design siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It names designId, profile, operationId and optional decisions, and clarifies profile may be an alias or ref; it also flags decisions as optional. It adds nothing about the nested decisions object's accepted keys/values or the meaning of operationId beyond the schema's string constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Create a persistent design session under the host project root.' An agent can distinguish it from read-only siblings like get_design_context and apply_design_patch. However, it never names a sibling or explicitly contrasts itself with the other design-lifecycle tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: creating a session is naturally the precursor to patching/validating a design, and the idempotency note hints at safe retries. There is no explicit when-to-use, when-not-to-use, or naming of an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_component_detailsARead-onlyIdempotent
Get one minimal component template, dependencies, and composition tips for Astro or HTML. Response is bounded below 2000 UTF-8 bytes.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| environment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds a concrete behavioral constraint by stating the response is bounded to 2000 UTF-8 bytes, and discloses that the result contains a minimal template, dependencies, and composition tips. This adds value beyond the annotations, though the size-bound phrasing is slightly ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short, front-loaded sentences with no filler. The core retrieval statement comes first, and the response-size note is a useful addition. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with two required parameters and no output schema, the description covers the main invocation facts: input language, single-component resource, and response contents and size limit. It does not mention response format or how to discover valid IDs, but the sibling search_components tool likely fills that gap. Overall it is sufficiently complete for a correct call, with minor discoverability gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for missing parameter documentation. It maps the environment parameter to Astro or HTML and implies id selects a single component, but it never explicitly defines id as a component identifier or explains how valid ids are discovered. This is only partial compensation for the absent schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb, 'Get', and names a concrete resource: one minimal component template with dependencies and composition tips, scoped to Astro or HTML. This clearly differentiates it from search_components (searching) and validate_composition (validating), and 'one minimal' signals single-item retrieval rather than a list operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus search_components or validate_composition. The description does not say to use search_components first to find an id, nor does it mention when validation would be more appropriate. Usage context is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_design_contextBRead-onlyIdempotent
Read a focused design view: sessions (no designId), overview, decisions, graph, rules, focus, or next. Pin revision on first read; continuations must match. Does not create sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| view | Yes | ||
| cursor | No | ||
| nodeId | No | ||
| pageId | No | ||
| designId | No | ||
| revision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real behavior: revision must be pinned on the first read and matched on continuations, and it explicitly disclaims side effects ('Does not create sessions'). It does not describe pagination/cursor behavior, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler, and the view enumeration is front-loaded so an agent can key on it immediately. The revision rule follows logically, though the parameter list inside the sentence reads a bit run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, read-only, no-output-schema tool this is only partly adequate: the view selection and revision protocol are covered, but the roles of cursor, nodeId, and pageId are never explained in either the schema or the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across six parameters, so the description carries the full burden. It only explains the 'view' enum and the designId exclusion for 'sessions'; cursor, nodeId, pageId, designId, and revision semantics are left entirely undocumented, leaving most parameters opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('focused design view') and enumerates the seven selectable views, so the agent knows exactly what it retrieves. It also explicitly disclaims session creation, which cleanly separates it from begin_design, though it doesn't position itself against the other read-style siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one concrete conditional rule ('sessions' takes no designId) and a revision-matching rule for continuations, which implies how to chain calls. However, there is no guidance on when to pick a given view over a sibling tool like get_component_details or get_rhythm_rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fsm_recipeBRead-onlyIdempotent
Read finite FSM states, events, guards, actions, or transitions. Recipes are structural metadata, not executable runtime code.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| recipe | No | ||
| section | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds real semantic context beyond that: recipes are structural metadata, not executable runtime code. It omits pagination behavior (limit/cursor) and any authorization or scope notes, so it is useful but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler, and the core capability is front-loaded before the clarifying caveat. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 undocumented parameters, no output schema, and no annotation gaps to lean on for return shape, the description leaves an agent guessing about how to identify a recipe and how to page results. The metadata-vs-runtime clarification is valuable but does not fill the operational gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 4 parameters, so the description must compensate and largely does not. Its enumeration of states/events/guards/actions/transitions effectively documents the 'section' enum, but 'recipe', 'limit', and 'cursor' (including the 32-item page cap and cursor-based paging) are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and enumerates the exact resource kinds (states, events, guards, actions, transitions) it returns, so an agent knows what it gets. It does not differentiate itself from siblings like validate_design or get_design_context, but no sibling appears to overlap this FSM-metadata niche.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternative. The closing clause clarifies what a recipe is but says nothing about when this tool should be selected over validate_composition or other design tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_macro_blockBRead-onlyIdempotent
Retrieve one section of a compiled macro block blueprint (manifest, structure, slots, ports, rules, dependencies, provenance). Follow next cursors until complete. Optional designId pins aliases to that session registry.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| cursor | No | ||
| idOrRef | No | ||
| section | No | ||
| designId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so safety is covered. The description adds genuinely new behavior: retrieval is sectioned and paginated, requiring the caller to iterate next cursors until complete, and that designId scopes alias resolution to a session registry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and section list, then pagination, then the optional scoping parameter. Dense and largely waste-free, though the parenthetical section list duplicates the schema enum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% parameter description coverage, the description carries the full burden. It covers pagination and section enumeration, but leaves id vs idOrRef, default section behavior, and error semantics undocumented for a 5-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 5 parameters. The description partly compensates by listing the valid section values and explaining designId's registry-pinning effect, but it never explains the difference between the two look-alike identity parameters id and idOrRef, which is the most consequential ambiguity for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (one section of a compiled macro block blueprint), and enumerates the section types, which lets an agent distinguish it from the search-oriented sibling search_macro_blocks. It stops short of naming a specific alternative the way a 5 would.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Follow next cursors until complete" is actionable pagination guidance and the designId sentence hints at when to supply it. However, there is no explicit when-to-use vs when-not, and no routing to a sibling such as get_component_details for non-macro blocks, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rhythm_rulesARead-onlyIdempotent
Read the effective semantic rhythm profile by family, including project-local overrides under a contained .basecoat/rhythm.json. Semantic IDs and approved implementation utilities are returned separately. Results are content-addressed and cursor-paginated; changed effective revisions invalidate prior cursors.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| family | No | ||
| profile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety bar is low, yet the description adds real behavioral context: results are content-addressed and cursor-paginated, and changed effective revisions invalidate prior cursors. That cursor-invalidation rule is genuinely useful and not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is read, followed by the separate-return caveat and pagination semantics. Dense but each sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description only partially compensates by sketching return structure (IDs/utilities separate, content-addressed). With 0% param coverage and no output schema, gaps remain around limit and profile semantics, leaving the definition adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema documents nothing. The description indirectly explains 'family' (read by family) and 'cursor' (cursor-paginated, invalidated on revision change), but leaves 'limit' and 'profile' entirely unaddressed, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (effective semantic rhythm profile) with scope qualifier 'by family'. It is clearly distinct from the design/component/macro siblings, but the tool name says 'rhythm rules' while the description says 'rhythm profile', a minor terminology drift.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: you read the rhythm profile here, and semantic IDs/utilities are 'returned separately' (hinting at other tools). There is no explicit when-to-use/when-not, no named alternative, and no prerequisite stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_componentsARead-onlyIdempotent
Find up to 8 compact component summaries by intent and/or query (either field may be omitted). No matches returns an empty list; no markup is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| intent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world behavior. The description adds genuinely new behavioral facts beyond them: the hard cap of 8 results, empty-list-on-no-match, and that no markup is returned. It does not mention ranking or ordering of results, but the additions are real value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the result cap and the empty-result behavior front-loaded, and no filler. It is perhaps overly terse given the undocumented param distinction, but nothing in it wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-param search tool with rich annotations and no output schema, the description covers the essentials (cap, empty result, no markup). It stops short of defining the intent/query distinction or result ordering, which are the remaining gaps an agent would hit in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for both params. It clarifies that both are optional and combinable ('and/or'), but never explains what 'intent' means versus 'query' — the central semantic distinction an agent needs to fill them correctly. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (component summaries), and scopes it with 'up to 8 compact' and 'by intent and/or query'. 'Compact summaries' implicitly distinguishes it from get_component_details, though it never names the sibling or explains the boundary explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(either field may be omitted)' tells the agent both params are optional, which is useful invocation guidance. However, there is no explicit when-to-use-this-vs-validate_composition/get_component_details routing, so usage must be inferred from 'compact summaries'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_macro_blocksARead-onlyIdempotent
Search approved macro layout blocks by query, role, family, or tag. Optional design/page/slot context filters to slot-compatible roles. Returns summaries and immutable refs only; use cursors for more.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| tag | No | ||
| role | No | ||
| limit | No | ||
| cursor | No | ||
| family | No | ||
| pageId | No | ||
| slotId | No | ||
| designId | No | ||
| parentNodeId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real value beyond that: results are limited to 'approved' blocks, it returns 'summaries and immutable refs only', and it discloses cursor-based pagination for larger result sets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler; the primary purpose is front-loaded and the return/pagination caveat follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 10 undocumented parameters, the description successfully conveys the result shape (summaries + refs) and pagination, but omits the meaning of limit and parentNodeId and never clarifies the approved-only constraint's implications. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 10 parameters, so the description must compensate. It maps the main filters (q/role/family/tag) and alludes to designId/pageId/slotId via 'design/page/slot context', but leaves limit, cursor semantics, and parentNodeId entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search approved macro layout blocks') and enumerates the filter dimensions (query, role, family, tag). It distinguishes the tool from a generic search, though it never names the nearest sibling search_components to clarify the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage via 'Optional design/page/slot context filters to slot-compatible roles', which tells the agent when the context filters are relevant, and 'use cursors for more' covers continuation. However there is no explicit when-not-to-use guidance or routing to an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_compositionARead-onlyIdempotent
Statically check HTML/Astro source for Basecoat migration errors, semantic rhythm, FSM bindings, missing scripts, nested cards, spacing and hierarchy issues. Pass code or alias html and optionally a semanticProfile and densityProfile. Does not render or evaluate dynamic code.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| html | No | ||
| densityProfile | No | ||
| semanticProfile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=false, so the agent knows this is a safe, deterministic read. The description adds the static-only constraint and enumerates check categories, but doesn't mention what a successful/failed check returns (no output schema) or any limits on code size beyond what the schema maxLength provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence enumerating checks and one sentence covering inputs plus the non-rendering caveat. Front-loaded with the core action; no filler. Slightly list-heavy but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 4-param tool with 0% schema coverage and no output schema, the description tells what it checks and the input names, and clarifies no dynamic evaluation. It still leaves the parameter semantics (profiles, code vs html) and the nature of the result incomplete, so it's minimally adequate but has gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It mentions passing 'code' or alias 'html' and optionally semanticProfile and densityProfile, but gives no meaning for the enum values (comfortable/compact), no format for semanticProfile (max 64 chars), and no explanation of when to use code vs html. The alias relationship is noted but semantics beyond names are absent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (statically check) and resource (HTML/Astro source) with clear scope: Basecoat migration errors, semantic rhythm, FSM bindings, missing scripts, nested cards, spacing/hierarchy. Distinguishes from sibling validate_design (which covers design validation) by focusing on static composition/lint checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States it's a static check and explicitly says 'Does not render or evaluate dynamic code,' which is a useful boundary. However, it doesn't explain when to use this versus validate_design or apply_design_patch, nor any prerequisites or typical workflow positions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_designARead-onlyIdempotent
Validate a design session (or one page) in draft or complete mode. Returns totals plus paginated diagnostics. A plan-ready graph is not proof of rendered correctness.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | draft | |
| cursor | No | ||
| pageId | No | ||
| designId | Yes | ||
| revision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds genuinely useful context: it discloses the return shape (totals plus paginated diagnostics) and warns that a plan-ready graph is not proof of rendered correctness, framing the tool's limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences, front-loaded with the action and scope and followed by the one caveat that matters. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully does describe the return (totals plus paginated diagnostics) and the pagination model. The remaining gap is parameter semantics for cursor/revision/designId, though annotations already carry the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Five parameters with 0% schema description coverage, yet the description only obliquely touches two of them ('draft or complete mode' maps to mode, 'or one page' hints at pageId). cursor, revision, and designId semantics remain entirely undocumented, so the description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (design session or one page) with a scope qualifier (draft or complete mode). Clear without opening the schema, but it never distinguishes itself from the sibling validate_composition, so an agent must guess which validator applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by naming the two modes and the optional page-level scope, but gives no explicit when-to-use rule, no prerequisites, and no guidance on choosing this tool over validate_composition or when draft vs complete is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.6.2- Changed
apply_design_patch4 fields changed- removed
Input schema / properties / operations / items / additionalPropertiesRemoved value: -{} - added
Input schema / properties / operations / items / oneOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "op": { + "const": "instantiate_recipe", + "type": "string" + }, + "pagePrefix": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "recipe": { + "maxLength": 64, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "op", + "recipe", + "pagePrefix" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bindings": { + "additionalProperties": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "propertyNames": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "type": "object" + }, + "block": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "node": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "op": { + "const": "attach_block", + "type": "string" + }, + "order": { + "maximum": 10000, + "minimum": 0, + "type": "integer" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "parent": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "slot": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + } + }, + "required": [ + "op", + "page", + "parent", + "slot", + "node", + "block" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "block": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "node": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "op": { + "const": "replace_block", + "type": "string" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + } + }, + "required": [ + "op", + "page", + "node", + "block" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "node": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "op": { + "const": "remove_block", + "type": "string" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "removeSubtree": { + "type": "boolean" + } + }, + "required": [ + "op", + "page", + "node", + "removeSubtree" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "from": { + "additionalProperties": false, + "properties": { + "node": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "port": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + } + }, + "required": [ + "node", + "port" + ], + "type": "object" + }, + "id": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "op": { + "const": "connect_ports", + "type": "string" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "relation": { + "enum": [ + "controls", + "data" + ], + "type": "string" + }, + "to": { + "additionalProperties": false, + "properties": { + "node": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "port": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + } + }, + "required": [ + "node", + "port" + ], + "type": "object" + } + }, + "required": [ + "op", + "page", + "id", + "relation", + "from", + "to" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "connection": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "op": { + "const": "disconnect_ports", + "type": "string" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + } + }, + "required": [ + "op", + "page", + "connection" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "key": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "op": { + "const": "set_decision", + "type": "string" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "scope": { + "enum": [ + "project", + "page" + ], + "type": "string" + }, + "value": { + "anyOf": [ + { + "maxLength": 200, + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "op", + "scope", + "key", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "node": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "op": { + "const": "record_written", + "type": "string" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + }, + "planDigest": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "sourcePath": { + "maxLength": 260, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "op", + "page", + "node", + "sourcePath", + "planDigest" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "op": { + "const": "mark_plan_ready", + "type": "string" + }, + "page": { + "maxLength": 64, + "minLength": 1, + "pattern": "^[a-z][a-z0-9-]*$", + "type": "string" + } + }, + "required": [ + "op", + "page" + ], + "type": "object" + } +] - removed
Input schema / properties / operations / items / propertyNamesRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / operations / items / typeRemoved value: -"object"
- Changed
get_macro_block2 fields changed- added
Input schema / properties / idAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "idOrRef", - "section" -]
9 tool updates
v1.4.0- Added
apply_design_patch - Added
begin_design - Added
get_design_context - Added
get_fsm_recipe - Added
get_macro_block - Added
get_rhythm_rules - Added
search_macro_blocks - Changed
validate_composition4 fields changed- changed
Input schema / properties / code / maxLengthPrevious value: -65536New value: +262144 - added
Input schema / properties / densityProfileAdded value: +{ + "enum": [ + "comfortable", + "compact" + ], + "type": "string" +} - changed
Input schema / properties / html / maxLengthPrevious value: -65536New value: +262144 - added
Input schema / properties / semanticProfileAdded value: +{ + "maxLength": 64, + "type": "string" +}
- Added
validate_design
2 tool updates
v1.0.3- Changed
search_components1 field changed- removed
Input schema / requiredRemoved value: -[ - "intent", - "query" -]
- Changed
validate_composition2 fields changed- added
Input schema / properties / htmlAdded value: +{ + "maxLength": 65536, + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "code" -]
3 tool updates
v1.0.1- First observed
get_component_details - First observed
search_components - First observed
validate_composition
TDQS
Scored across 11 tools
Each tool targets a distinct resource+action: component search/detail, macro search/detail, design session lifecycle, validation, rhythm rules, and FSM recipes. The only mild overlap is validate_composition vs validate_design, but descriptions clearly separate static source validation from design-session validation.
All tools use consistent snake_case with verb_noun patterns (search_, get_, validate_, apply_, begin_). Minor noun number differences (get_component_details vs get_macro_block) do not break predictability.
11 tools are well-scoped for a UI framework covering components, macros, design sessions, validation, and metadata. No tool appears redundant; each earns its place.
The surface covers discovery, detail retrieval, validation, design session creation/patching/reading, and auxiliary rules/recipes. Minor gaps exist: no explicit end/delete design session operation, and rhythm/FSM recipes are read-only with no update path, but core workflows are covered.
Maintenance
Related MCP Connectors
Live React design-system APIs, patterns, and code validation so AI agents build real UI, not slop.
Access and maintain design system docs, tokens, components, skills, and contexts across any project.
- ZeroCMSOAuthio.zerocms
AI-native Git-based CMS for Astro. Create and publish content in the browser, without learning git.
Provides style context & tokens to design or restyle web UIs in any framework
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides programmatic access to 30+ Basecoat CSS (HTML port of ShadCN UI) components with usage documentation, setup scripts, and theme switching code. Enables AI assistants to help developers build accessible HTML interfaces with forms, navigation, feedback, interactive, and layout components.726 npm13MIT
- AlicenseAqualityAmaintenanceLocal-first visual design workspace for AI assistants. Compose wireframes and branded multi-page HTML/CSS documents with live preview, annotations, brand and asset libraries, typed data collections, layout validation, PDF export, and draft-only Gmail handoff.142 npm20MIT
- AlicenseNot gradedqualityCmaintenanceFederates UI component registries, enabling AI agents to fetch exact component code, dependencies, and setup prerequisites directly into the workspace. Includes sandboxed previews, anti-slop layout auditing, and offline-to-cloud telemetry sync.5 npm1MIT
- AlicenseNot gradedqualityBmaintenanceProvides coding agents with local tools to inspect project UI inventories, propose and compare visual direction boards, compile versioned design contracts and DTCG tokens, retrieve section-specific blueprints, and audit running interfaces with browser evidence including screenshots, accessibility findings, and overflow measurements.MIT