Skip to content

marlinjai/lumitra-sites

v0.1.0MIT

Build, edit and publish websites in Lumitra Sites (the editor at app.lumitra.co) from an agent: read a site, write it in small validated batches with a version lock, check the preview in a browser, and publish only with the person's own approval. Ships the build-a-site, edit-a-site and redesign-a-site skills and the remote lumitra-sites MCP server.

Lumitra Sites Agent Plugin

An Agent Plugin (v1.0.0) that lets an AI agent build, edit and publish websites in Lumitra Sites, the visual website editor at app.lumitra.co. The agent reads a site, writes it in small validated batches on a version lock (so it never overwrites a person editing the same site), checks the preview in a browser, and publishes only when the person asks and approves it themselves.

It ships four components, discovered at the fixed locations the spec defines:

ComponentPathWhat it does
Skill build-a-siteskills/build-a-site/SKILL.mdFrom a brief to a checked draft: design direction, vocabulary, structure, small batches, the preview at every breakpoint, publish only when asked.
Skill edit-a-siteskills/edit-a-site/SKILL.mdTargeted changes to an existing site: read first, outline, targeted batches, verify.
Skill redesign-a-siteskills/redesign-a-site/SKILL.mdScreenshot every breakpoint, critique, revise in passes, look again.
MCP server lumitra-sitesmcp.json, .mcp.jsonThe remote Lumitra Sites server at https://app.lumitra.co/api/mcp (Streamable HTTP). Nothing runs on your machine.

Tools

ToolWhat it does
list_sitesThe sites of your company: id, name, status, last change, address.
get_siteA site's pages, breakpoints, theme tokens, components, address and current version.
get_pageAn outline of one page with node ids and styles per breakpoint, in parts for long pages.
describe_vocabularyHow to write: the batch operations, the node format, tags, fonts, motion, and a site's own breakpoints, tokens and components.
create_siteA new, empty draft site with one home page.
apply_batchUp to 200 edit operations in one all or nothing write, on the version you read.
generate_pageA page or section drafted from a brief by the editor's own generator.
find_imagesCredited stock photos (Unsplash), with the props that place them.
preview_urlThe editor preview link of the draft.
publishPublish the draft, with the person's approval.
list_revisionsThe published versions of a site, and which one is live.
rollbackServe an earlier published version again, with the person's approval.

Before you start: a company API key

The server acts for one company: the company your API key belongs to. Keys come from auth.lumitra.co, Lumitra's sign-in service, not from the editor:

  1. Sign in at auth.lumitra.co and open your company's settings, then API Keys.
  2. Create a key with the owner or admin role. A key with the member role reaches no sites workspace, so every call with it is refused.
  3. Give it the sites grant (the app it may use). Lumitra Sites must also be enabled for your company; while it is not, calls answer sites_not_enabled.
  4. Copy the key once into your password manager or secrets store. Never paste it into a chat with an agent, into a repository or into a shared file.

Then set it in the environment that launches your agent client:

export LUMITRA_SITES_API_KEY="..."   # read from your secrets store, not typed into history

Install

Claude Code (plugin, recommended)

This repository is a plugin marketplace of one:

/plugin marketplace add marlinjai/lumitra-sites-plugin
/plugin install lumitra-sites@lumitra-sites

That installs the three skills and the server entry in .mcp.json:

{ "type": "http", "url": "https://app.lumitra.co/api/mcp", "headers": { "Authorization": "Bearer ${LUMITRA_SITES_API_KEY}" } }

Claude Code expands ${LUMITRA_SITES_API_KEY} from its own environment each time it connects, so the key is never written into a configuration file. Start Claude Code from a shell where the variable is set.

When the variable is not set, Claude Code still loads the server, shows a missing-variable warning for it in claude mcp list, and sends the text ${LUMITRA_SITES_API_KEY} itself as the key. The server answers that with 401 a valid company API key is required, so every tool call fails until you set the variable and restart Claude Code. Nothing else is sent.

Claude Code (server only, without the skills)

claude mcp add --transport http lumitra-sites https://app.lumitra.co/api/mcp \
  --header "Authorization: Bearer $LUMITRA_SITES_API_KEY"

Here your shell expands the variable when you run the command, so the key itself is stored in Claude Code's configuration file in plain text. The plugin does not do that, which is why it is the recommended path. If you use this form, add --scope user or --scope local (the default), never --scope project, which writes the key into the repository's .mcp.json.

Cursor and other clients that send a header

Any MCP client that connects to a Streamable HTTP server and can send an Authorization header works. In Cursor (~/.cursor/mcp.json):

{
  "mcpServers": {
    "lumitra-sites": {
      "url": "https://app.lumitra.co/api/mcp",
      "headers": { "Authorization": "Bearer ${env:LUMITRA_SITES_API_KEY}" }
    }
  }
}

and copy the skills/ directories to where the client looks for Agent Skills. Variable syntax differs per client (${VAR} in Claude Code, ${env:VAR} in Cursor); a client that does not expand it sends the literal text and gets the 401 described above.

Clients that sign in with OAuth

claude.ai connectors and Claude Desktop's connectors sign in with OAuth. The Lumitra Sites server accepts a company API key only and offers no OAuth sign-in yet, so those clients cannot connect for now.

Any other Agent Plugins client

Point the client's "add plugin from directory" flow at the repository root: plugin.json and mcp.json are the agent-plugins.org 1.0.0 manifests (the server as streamable-http), and .claude-plugin/ plus .mcp.json are the Claude Code equivalents of the same thing.

How publishing works

The agent never publishes on its own say. publish and rollback need the person's approval:

  • In a client with a confirmation dialog (MCP elicitation), the server asks the person there, with a summary of what goes live.
  • Otherwise the tool answers approvalRequired with an approvalUrl and a summary. The agent gives both to the person, who opens the link on app.lumitra.co. Approving there needs the editor sign-in of someone allowed to publish that site, from the last 15 minutes (an older sign-in is asked to sign in again), and only the page's button records the decision. The agent then calls the tool again with the approvalId.
  • An approval is for exactly one site at one version (and, for a rollback, one revision). Any edit after it, or five minutes passing, makes it invalid, and the agent has to ask again.
  • Nothing the agent reads (page text, tool answers) can approve anything. The skills tell the agent never to open an approval link itself.

A publish can be undone: rollback serves an earlier published version again.

Limits

  • Writes: 60 a minute per key, one at a time; a batch holds at most 200 operations and is all or nothing. Reads: 300 a minute. Stock photo searches: 30 per ten minutes. Approval links: 10 per ten minutes. Generations: one at a time per key.
  • Every write names the version it was based on. If anyone changed the site since, it is refused with site_changed and nothing is written; the agent reads again and redoes the change.
  • Deleting sites or domains is not possible through the server.
  • The preview link needs an editor sign-in at app.lumitra.co; an agent without a signed-in browser hands the link to you.

Troubleshooting

AnswerMeaning
401 a valid company API key is requiredNo key, a wrong key, or the variable was not expanded (see above).
403 sites_not_enabledThe key lacks the sites grant, or Lumitra Sites is not enabled for the company.
403 no_sites_workspaceThe company has no sites workspace the key can act in (a member key, or a brand-new company; retry shortly).
429 / rate_limitedToo many calls; wait the seconds the answer names.
503 auth_unavailableThe sign-in service is briefly unavailable; retry shortly.

Where this comes from

This repository is the published mirror of the plugin. It is generated from plugin/lumitra-sites and plugin/lumitra-sites-mirror in the Lumitra Sites source repository (marlinjai/framer-clone) and checked against them on every sync, so the two cannot drift. Changes go to the source repository. Lumitra Sites itself (the server these tools call) is a hosted service at app.lumitra.co; nothing in this repository runs it.

Links