MCP
The server lives at https://ds.connorforsyth.co/api/mcp. It speaks streamable HTTP, it's public, and it's stateless: there's no key and no session, and each request stands on its own. It answers from the same compiled knowledge that DESIGN.md and these pages are built from, so a rule an agent reads through MCP is word for word the rule you see here.
Connect
Most clients take a config like this:
{
"mcpServers": {
"cf-ui": {
"url": "https://ds.connorforsyth.co/api/mcp"
}
}
}In Claude Code it's one command:
claude mcp add --transport http cf-ui https://ds.connorforsyth.co/api/mcpTools
get_tokens(query)
The colour and radius tokens with their light and dark values. Filter with `query` (matches name and use). Write the semantic Tailwind utility (`bg-primary`, `text-muted-foreground`, `rounded-md`), never the raw value, and never a `dark:` colour override: the tokens already switch with the `.dark` class.
search_components(query)
Call this before hand-authoring UI. Lists the @cf/ui components, optionally filtered by `query` (name, keyword or what it is for). Multi-word queries are matched term by term and ranked, so describe the job ('confirm before deleting', 'keyboard shortcut') rather than guessing a name.
get_component(name, source)
Everything about one component: its role, MUST/SHOULD/MAY rules, guidance, install command, registry address, docs URL and source (the authoritative reference for props and variants).
get_design(slug)
The design foundations and their rules: purpose, principles, styling, colours, typography, iconography, accessibility. Without `slug`, lists the sections; with it, returns that section in full.
Without MCP
Not every agent speaks MCP, and it's more than a small project needs. The same knowledge is published as plain text at /design.md and /llms.txt. To keep a copy in your own repo, where an agent will find it without being told:
bunx shadcn@latest add @cf/designThat writes DESIGN.md at the root. Re-run it when the rules change.