> Lettrove docs 1.x · https://docs.lettrove.com/docs/app/mcp

# MCP server

Connect Claude, Cursor or any [MCP](https://modelcontextprotocol.io) client once, and it can work in
Lettrove as you: design an email from a brief, check who is in a list, send a test, send to a list
at nine tomorrow, and tell you who opened it. One address, one sign-in, exactly your permissions.

**Server address:** `https://lettrove.com/api/mcp`

It is also listed in the MCP registry as `com.lettrove/lettrove`, for clients that install servers
from there.

## Connect

### Claude Code

1. In a terminal, add the server:

   ```bash
   claude mcp add --transport http lettrove https://lettrove.com/api/mcp
   ```

2. Inside Claude Code type `/mcp`, choose **lettrove**, then **Authenticate**. Your browser opens on
   Lettrove: sign in if you are not, then **Allow**.
3. Back in Claude Code the server shows as connected. Try: "list my emails in Lettrove".

### Claude (claude.ai and the desktop app)

1. **Settings → Connectors → Add custom connector.**
2. Name it Lettrove and paste the address: `https://lettrove.com/api/mcp`.
3. Claude reads the server and pre-selects the right options; leave them: Authentication **Sign in
   now** (everyone signs in through Lettrove) and OAuth client **Register automatically** (Claude
   registers itself; nothing to copy). No request headers. Click **Add**.
4. On the Lettrove card click **Connect**; your browser opens Lettrove: sign in if you are not, then
   **Allow**. Lettrove then appears in the tools menu of every chat.

On a Team or Enterprise plan an Owner adds the connector in Organization settings, and Claude shows
it to every member of that organization. That is how Claude works, not a sign the account is
shared: each member clicks Connect and signs in to Lettrove as themselves, and only their own
Lettrove account is ever listed under **Settings → Profile → Connected apps**.

### Cursor

1. **Settings → MCP → Add new global MCP server**, or put this in `.cursor/mcp.json`:

   ```json
   {
     "mcpServers": {
       "lettrove": { "url": "https://lettrove.com/api/mcp" }
     }
   }
   ```

2. Cursor asks you to sign in the first time a tool is used. Allow, and it stays connected.

### Any MCP client

- **Transport:** Streamable HTTP, at `https://lettrove.com/api/mcp`.
- **Authorization:** OAuth 2.1 with PKCE, discovered from the `401` (RFC 9728). Dynamic client
  registration is on, so there is no client id to copy.
- **Scopes:** `mcp:tools` for everything that reads and edits; `mcp:send` to send; `mcp:contacts`
  to create lists and add people.

The first time, your browser opens Lettrove: sign in if you are not, then a screen asks whether to let
the app work as you. Allow, and you are done; it stays connected until you disconnect it.

## What it can do

Eighteen tools, each the same operation the app itself performs. **Needs** is your role in the
workspace ([roles](/docs/app/team#roles)); sending also needs the Send scope, and building lists the
Contacts scope, both granted when connecting.

| Tool | Does | Needs |
|---|---|---|
| `list_workspaces` | Your workspaces and your role in each | — |
| `list_emails` · `get_email` | Saved emails; one email as a summary, its compiled HTML, or its design document | Viewer |
| `create_email` | A new email: blank, from a template, or designed by the assistant from a brief | Editor |
| `edit_email` | The assistant changes a saved email from an instruction, saved as a new revision | Editor |
| `list_templates` | Gallery templates to start from | — |
| `sending_status` | Whether the workspace can send, and as whom | Editor |
| `send_test_email` | One email to one address, from your verified sender | Editor + Send scope |
| `list_test_sends` | Your recent tests and what the provider reported | — |
| `list_contact_lists` | Your Audiences lists with counts | Editor |
| `describe_audience` | People, duplicates, fields with blanks, sample contacts, before a send | Editor |
| `create_contact_list` | A new list made by hand: name, the consent basis you state, and its columns | Admin + Contacts scope |
| `add_list_field` | Add a column (merge tag) to a list | Admin + Contacts scope |
| `add_contacts` | Add up to 500 people to a list; each row checked, bad rows returned with the reason | Admin + Contacts scope |
| `send_campaign` | Send to lists now or at a time, with open and click tracking switches | Admin + Send scope |
| `list_campaigns` · `get_campaign` | Sends and their live figures: delivered, bounced, complained, opened, unsubscribed, per list too | Editor |
| `cancel_campaign` | Cancel a scheduled send, or stop one in progress | Admin + Send scope |

A refusal comes back in plain words with a code (`forbidden`, `insufficient_scope`,
`sender_not_configured`, `fields_missing`…), so the assistant can explain it or fix it, never guess.

Before the first send in a workspace the assistant calls `sending_status`. If the workspace cannot
send yet, it stops and tells you: [sending needs a verified domain and a sender address](/docs/app/sending),
which you set up yourself in Lettrove. That cannot be done through these tools.

## Things to say

- "Create an email in Lettrove announcing our September webinar: warm, short, one button to register."
- "Which of my lists has the most contacts, and how many have a first name?"
- "Send the 'Autumn Linen Sale' email to me as a test."
- "Send 'Welcome Aboard' to the Newsletter list tomorrow at 09:00 and track opens."
- "How did yesterday's send go? Anyone bounce?"
- "Shorten the headline of the launch email and make the button say 'Reserve my seat'."

## How it stays yours

- **Your permissions, never more.** Every call is checked against your role in that workspace, the
  same check the app makes. A viewer cannot create; an editor cannot send to a list. The Send and
  Contacts scopes are a second lock on top: without them, nothing sends and no list is created.
- **No password shared.** OAuth 2.1 with PKCE. The app gets a short-lived token bound to this
  address, refreshed while you allow it.
- **Nothing new is stored.** The server uses the same services as the app, so an email it creates
  is an ordinary email with its author recorded, and a send it starts is an ordinary send on the
  status page.
- **One click to disconnect.** Settings → Profile → Connected apps → Disconnect. The app is refused
  at its next token refresh and has to ask you again.

## Questions

**Which workspace does it act in?** Your default one. Every tool takes an optional `workspaceId`;
with more than one workspace, the assistant asks which you mean (`list_workspaces`).

**Does it work on a self-hosted or preview Lettrove?** Yes: the address is simply that site plus
`/api/mcp`.

**Who operates this server?** CareersCV, the company that builds and runs Lettrove. Questions and
security reports: support@lettrove.com.
