# Your client sites, run by an agent.

> Connect Claude Code, Cursor, or any MCP client and run the whole CMS by prompt. Agents stage edits. People publish.

## Remote MCP

`https://cmsbrew.com/api/mcp`

Authenticate with `Authorization: Bearer <your key>`. Works with Claude Code, Cursor, any client that accepts a URL and a header. Claude.ai needs OAuth, which this endpoint does not do yet.

## Connected in three commands

1. **Sign in** Mint a key in the dashboard and store it. The command opens the page for you.

   ```bash
   npx cmsbrew login
   ```
2. **Connect a site** Run it inside a checkout and it reads the origin remote. Name the repository instead for CI or a monorepo.

   ```bash
   npx cmsbrew connect
   ```
3. **Connect your agent** Detects the MCP clients on your machine, shows the config it will add, and asks before writing.

   ```bash
   npx cmsbrew setup
   ```

Works with Claude Code, Cursor, Windsurf, Codex.

Then paste your first prompt into your agent:

> You're connected to CMS Brew. Call list_sites to see my sites, then get_manifest on one of them and tell me what a client could safely edit there.

## MCP tools

| Tool | What it does |
| --- | --- |
| `list_sites` | Every connected site, with status, framework, and unpublished edits. |
| `connect_site` | Connect a GitHub repository and map its editable fields. |
| `get_manifest` | Read the fields a site exposes, and the guard tier on each one. |
| `edit_content` | Make a content edit in plain language. It lands as a draft. |
| `list_escalations` | Requests routed to the team because they need a developer. |

## What that looks like

### Connect a site

```
$ Connect acme/marketing-site and tell me what my client will be able to edit.
connect_site  repo: acme/marketing-site
Scanning repo structure...
Detected: astro
29 editable fields mapped
Site ready: cmsbrew.com/dashboard?site=acme
```

### Check the guards

```
$ What can a client change on the homepage, and what needs me?
get_manifest  site: acme, page: /
21 fields open. Headings, body copy, photos, phone.
5 fields warn first. Page title, meta description, alt text.
3 fields are yours. Pricing table, legal footer, nav labels.
A client editing an open field never waits for you.
```

### Make an edit

```
$ Change the homepage headline to 'Roasted the morning we ship it'.
edit_content  site: acme, field: home.hero.headline
Staged as a draft. Nothing is live.
No publish tool exists, at any key preset.
Open the dashboard to review it and ship it yourself.
```

## Permissions

The CLI and the MCP server reach the same API the dashboard uses. Every key carries a preset, chosen when it is minted and enforced on the server.

| Preset | Can | Cannot |
| --- | --- | --- |
| Setup only | Connect repositories, read sites and manifests. | Edit or publish. |
| Safe agent access (default) | Everything above, plus content edits that land as a draft. | Publish to the live site. |
| Full access | Everything above, plus publish and revert. | Act outside the workspace it was minted for. |

- **No publish tool. At any tier.** Publishing commits to a live production site, so it stays a decision a person makes in the dashboard. The agent stages the work and stops.
- **Keys cannot mint keys.** Minting is closed to every key and open only to a signed-in operator. A narrow preset is one call away from meaningless the moment that is not true.
- **A key never outranks its owner.** It acts as the person who created it. Remove them from the workspace and their keys stop working on the next call.

---

- [Home](https://cmsbrew.com/)
- [Features](https://cmsbrew.com/features)
- [Full product details](https://cmsbrew.com/llms-full.txt)
