# Zupost

## MCP Server

> Category: Getting started

---

## Pages


### Getting started

- [What is Zupost?](https://docs.zupost.com/getting-started/what-is-zupost)
- [Rate Limits](https://docs.zupost.com/getting-started/rate-limits)
- [MCP Server](https://docs.zupost.com/getting-started/mcp-server)

### Quickstart

- [Node.js](https://docs.zupost.com/quickstart/node-js)
- [SMTP](https://docs.zupost.com/quickstart/smtp)

### Resources

- [Security](https://docs.zupost.com/resources/security)
- [Acceptable Use](https://docs.zupost.com/resources/acceptable-use)
- [Data Processing](https://docs.zupost.com/resources/data-processing)

---

# MCP Server

Zupost speaks the ++[Model Context Protocol](https://modelcontextprotocol.io)++, so you can let an AI agent build and maintain your email templates for you. Connect your client once, then simply describe what you need in plain language. The agent works in the same project you already use in the dashboard, so everything it does shows up there right away.

## Connecting

The server is hosted at `https://mcp.zupost.com/mcp`. There is nothing to install and no key to paste anywhere.

### Claude Code

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

### Codex

Add the server to `~/.codex/config.toml`:

```toml name="config.toml"
[mcp_servers.zupost]
url = "https://mcp.zupost.com/mcp"
auth = "oauth"
```

Then sign in once:

```bash
codex mcp login zupost
```

### Claude Desktop, Cursor and other clients

Most other clients read a JSON config:

```json name="mcp.json"
{
	"mcpServers": {
		"zupost": {
			"type": "http",
			"url": "https://mcp.zupost.com/mcp"
		}
	}
}
```

The first request opens your browser so you can sign in to Zupost and approve access. Your client remembers the login and renews it on its own from then on.

## What you are approving

The consent screen asks for three things:

- Reading your projects, templates, layouts and folders.
- Creating and changing templates, layouts and folders.
- Sending test emails from your verified sending domains.

Sending is its own permission on purpose, because a test mail really leaves the system and lands in someone's inbox. An agent also never gets more rights than you have: if your role in the project may not delete templates, neither may the agent.

## Start with a project

Everything happens inside one project, so that is the first thing to settle. Ask your agent to list your projects and pick the one you want to work in. It stays selected for the rest of the conversation.

## What to ask for

From there on you can just say what you want:

- "Create a password reset email and use the same layout as the welcome mail."
- "Change the button in the invoice mail to dark green and make the headline shorter."
- "Show me what the welcome mail looks like right now."
- "Put all onboarding mails into a folder called Onboarding."
- "Send me the password reset mail as a test."

## Good to know

Templates are built out of the same building blocks as the editor in the dashboard, not out of raw HTML. An agent can only produce things the editor supports as well, so nothing it writes can break your template.

A layout is the shared frame around your mails, with the header, the footer and your branding. Changing a layout changes every template that sits inside it, so be specific when you only mean one mail.

Test mails need a verified sending domain. If the agent tells you it has no address to send from, add and verify a domain in the dashboard first.

Every change is a real change in your project. There is no separate sandbox, so treat it like working in the dashboard yourself. Your subject line and preview text update automatically whenever the content changes.

If an agent makes a lot of changes very quickly it can run into a rate limit and will simply wait a moment before continuing.

## Sending in production

The MCP server is meant for building and maintaining templates, not for your live traffic. Once a template exists, send it by id through the Zupost API or SDK. See ++[Node.js](https://docs.zupost.com/quickstart/node-js)++ for that side of it.
