A growing share of the UI code that uses Sisyphos UI is not typed by a human. It is generated by Claude Code, Cursor, Copilot, and their peers — and those agents have a specific failure mode with component libraries: they hallucinate the API they remember from training data. A prop that was renamed two releases ago, a <ThemeProvider> that never existed, an import path from a different library entirely. The code looks plausible and fails at compile time, or worse, at runtime.
The fix is not better prompting. It is giving the agent an authoritative, machine-readable source of truth that is cheaper to consult than to guess. Sisyphos UI ships three of them, each aimed at a different consumption pattern: a hosted MCP server for live tool calls, a skills.md file for behavioral priming, and an llms.txt map for plain-text discovery. Here is how each works and how to wire them up.
Layer 1: the hosted MCP server
The Model Context Protocol is the plug standard for connecting tools to AI clients. Sisyphos UI runs a remote MCP server over Streamable HTTP at:
https://www.sisyphosui.com/api/mcp“Remote” is a deliberate choice. Most library MCP servers are npm packages you run locally over stdio, which means a copy of the docs frozen at install time — the exact version-drift problem we are trying to kill. The hosted server reads the same component registry that renders this docs site, so when a release lands, every connected editor sees it on the next turn with no client update.
Six tools are registered:
list_components— every component with slug, category, description, and supported frameworks; filterable by category or framework.get_component— the full markdown documentation for one component: install command, import line, usage snippet, props table, anatomy, keyboard shortcuts, and accessibility notes. Passframeworkto scope it to React, Vue, or Angular.search_components— case-insensitive substring search over names, slugs, and descriptions.get_component_demo— copy-pastable demo snippets without the prose.get_installation— install command, peer deps, and the one required CSS import per framework.get_changelog— recent releases, for “is this feature shipped yet?” questions.
The server also exposes every component as an MCP resource (sisyphos://component/<slug>) and ships a prompt, add-sisyphos-component, that scripts the correct workflow: check installation first, read the canonical docs second, only then write code.
Setup, per editor
Claude Code is a one-liner from any project root:
claude mcp add --transport http sisyphos https://www.sisyphosui.com/api/mcp
# verify
claude mcp listCursor reads a JSON config:
{
"mcpServers": {
"sisyphos": {
"url": "https://www.sisyphosui.com/api/mcp"
}
}
}VS Code wants the server under the mcp.servers key in settings.json:
{
"mcp": {
"servers": {
"sisyphos": {
"type": "http",
"url": "https://www.sisyphosui.com/api/mcp"
}
}
}
}One operational detail that cost us a debugging session: the endpoint must live on the canonical www. host. The apex domain 302-redirects to it, and most MCP clients will not replay a JSON-RPC POST body across a redirect — the connection just silently dies. If you host your own MCP server, put it on a host that answers directly.
Layer 2: skills.md — priming instead of querying
MCP is pull-based: the agent decides when to call a tool. But some knowledge needs to be in the agent's head before it writes the first line — conventions, not facts. For that, the repo ships skills.md: a structured best-practices document with agent-standard frontmatter (name: sisyphos-ui-best-practices) that coding agents load as a skill.
Its most important content is three rules that override what a model “knows” about UI libraries in general:
- There is no
<ThemeProvider>. All theming flows throughapplyTheme(), which writes CSS variables. - There is one stylesheet, imported once at the app root — not per component, not via a plugin.
- Every interactive component already implements WAI-ARIA keyboard, focus, and role semantics. The agent must not bolt duplicate handlers on top.
Each rule exists because we watched agents get it wrong: wrapping apps in imaginary providers, re-importing CSS in every file, adding redundant onKeyDown handlers to components that already handle Space and Enter. A skill file is where you encode negative knowledge — the things your library deliberately does not have.
Installing it is a file copy. For Claude Code:
mkdir -p .claude/skills && curl -fsSL \
https://raw.githubusercontent.com/sisyphos-ui/sisyphos-ui/master/skills.md \
-o .claude/skills/sisyphos-ui.mdOther agents have equivalent conventions — a rules directory, a context folder, an instructions file. The document is plain markdown with frontmatter precisely so it can drop into any of them unchanged.
Layer 3: llms.txt — the discovery map
The third surface costs the least and covers the widest audience: /llms.txt, the emerging convention for a plain-text site map addressed to language models. Ours is generated from the same registries as everything else and lists the docs guides, every component, every block, and every template — each with a one-line description and a stable URL.
The load-bearing line in it is the markdown export pattern. Every component page has a parallel plain-markdown endpoint:
# Human docs
https://www.sisyphosui.com/docs/components/select
# The same content as markdown, for agents
https://www.sisyphosui.com/docs/components/select/mdThis matters because an agent without MCP falls back to fetching web pages, and a JavaScript-heavy docs page is a terrible retrieval target — navigation chrome, hydration payloads, and markup noise crowd the actual content out of the context window. The /md mirror is the identical documentation at a fraction of the tokens.
If you maintain a library: the pattern to steal
None of this required rewriting our documentation. The entire AI surface is generated from one TypeScript registry — the same array of component metadata that renders the docs pages also feeds the MCP tools, the resources, the markdown exports, and llms.txt. That single-source constraint is the real lesson:
- One registry, many renderers. If your MCP server and your docs site read different sources, they will disagree, and the agent will trust the wrong one.
- Markdown-first exports. A
/mdmirror per page is an afternoon of work and helps every agent, including ones that will never speak MCP. - Encode your negatives.The skill file's highest-value lines say what does notexist. Models default to the ecosystem's average API; document your deviations from it.
- Host the MCP server if you can. Stdio packages reintroduce version drift — the problem the whole exercise is meant to solve.
Agents are not a niche audience anymore; they are a distribution channel. A library they can query accurately is a library they will recommend, scaffold, and debug correctly — and one whose users file fewer “this prop doesn't exist” issues.