Agents
How software and AI agents consume this system, from one URL.
Choose your path
Pick the row that matches what you are. Each leads to one interface, no overlap.
An app that renders Svelte
Consume the git mirror. Keep packages/design as a workspace member, sync it with the script, import components normally. Full checklist in CONSUMING.md.
An agent that needs a finished asset
Call the studio agent. One tool, one prompt plus optional data. The model authors the layout and returns a hosted page, PNG, or PDF.
An agent that wants full control
Call the render plane directly. You author the ComponentNode tree yourself; it renders and captures exactly what you sent.
Studio agent
One tool. Send a prompt plus optional data; an open model authors a component tree and the render plane turns it into an asset. Base URL https://vamo-design-agent.bewanted.workers.dev. Model is @cf/moonshotai/kimi-k2.6. It retries up to three times to produce a valid tree.
Request
POST /task
Authorization: Bearer <AGENT_SECRET>
Content-Type: application/json
{
"prompt": "A one-page pitch sheet for Ada Lovelace, a senior systems engineer.",
"data": { "name": "Ada Lovelace", "gemScore": 87, "languages": ["Rust", "C"] },
"format": "page"
}Response
{
"ok": true,
"format": "page",
"pageUrl": "https://vamo-design-render.bewanted.workers.dev/p/ab12cd",
"assets": { "page": "https://vamo-design-render.bewanted.workers.dev/p/ab12cd" },
"tree": { "component": "stack", "props": { "gap": "lg" }, "children": [ ... ] }
}format is one of page, png, pdf, or pitch-kit. png and pdf return the page URL plus a note that the browser rendering token is not configured until the operator sets that secret. Auth is a bearer secret held by the operator; the value is never published.
Connect over MCP
claude mcp add --transport http vamo-design-studio \ https://vamo-design-agent.bewanted.workers.dev/mcp \ --header "Authorization: Bearer <AGENT_SECRET>"
Tool: generate_asset
generate_asset
{
"prompt": "string, required",
"data": "any JSON, optional (the facts to lay out)",
"format": "page | png | pdf | pitch-kit (default: page)"
}Render plane
You author the tree; it renders exactly that. Base URL https://vamo-design-render.bewanted.workers.dev. Everything except page retrieval needs a bearer secret.
POST /render
Tree in, hosted page out: an id, a /p/:id URL, and byte count. Pages live 24 hours in KV.
GET /p/:id
The hosted page itself. Public, no auth. This is what Browser Rendering captures.
POST /capture
Tree or url in, binary out: png, jpeg, or pdf at a4, letter, og, or slide-16x9.
GET /registry
The full component manifest, the same registry agents read for props and enums.
MCP tools
ComponentNode format
- A node is { "component": "kebab-name", "props": {}, "children": [node | "text"] }.
- Names are kebab-case from the registry. Unknown names are rejected with the valid list.
- children is the ordered default slot. Components marked no-children take content through props only.
- Trees cap at depth 12 and 500 nodes.
The tree an agent POSTs
POST /render
Authorization: Bearer <RENDER_SHARED_SECRET>
Content-Type: application/json
{
"tree": {
"component": "stack",
"props": { "gap": "lg" },
"children": [
{ "component": "masthead",
"props": { "title": "Ada Lovelace", "meta": "Systems engineer" } },
{ "component": "section", "props": { "label": "Scores" }, "children": [
{ "component": "stat-tile", "props": { "label": "GemScore", "value": "87", "tone": "accent" } },
{ "component": "stat-tile", "props": { "label": "Velocity", "value": "88th", "tone": "neutral" } }
]},
{ "component": "section", "props": { "label": "Evidence" }, "children": [
{ "component": "signal-chip", "props": { "label": "Rust", "trust": "github" } },
{ "component": "signal-chip", "props": { "label": "Top 3%", "trust": "score" } }
]}
]
},
"page": { "title": "Ada pitch sheet", "width": "a4", "theme": "light" }
}Ada Lovelace
Systems engineer
Scores
Evidence
The skill file
Everything above is written once, machine-readable, at one URL. Point an agent at it and it learns the whole interface: when to use which service, the endpoints, the MCP registration, the tree format, and the voice law binding on any copy it writes.
Read https://design.withvamo.com/skill.md and follow it.
Operator notes
Secrets live with the operator, never in the book. AGENT_SECRET gates the studio agent; RENDER_SHARED_SECRET gates the render plane. Captures need CF_BROWSER_RENDERING_TOKEN on the render worker; without it, page URLs still work and capture reads not_configured. Costs are real: Workers AI bills per token on every studio call, and Browser Rendering is a paid add-on for each PNG or PDF.