# Lettr MCP connector

Connect Lettr to Elaichi and Claude, ChatGPT, Cursor, Microsoft Copilot and the Elaichi Agent can look up audience contacts, build lists, manage topics and update contact properties, with every call running as the person who signed in.

Source: https://elaichi.ai/connectors/lettr/

## Facts

| | |
| --- | --- |
| Application | Lettr |
| Category | Email |
| AI tools | 71 |
| Authentication | Connects with an API key |
| Bring your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, Microsoft Copilot, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. Connected tools are never listed one by one, however few there are. The endpoint advertises `search_tools` and `execute_tool` instead |

## What you can ask once Lettr is connected

- Add these emails to the newsletter list as new contacts
- Which topics is sarah@acme.com subscribed to?
- Create a plan tier property and fill it for these contacts

## Connect Lettr in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick Lettr.
2. Optionally set Share with, then press Connect.
3. Paste a Lettr API key. One person generates a token in Lettr and pastes it once. Everyone else works through Share with, and never sees it.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which Lettr tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## Lettr MCP connector for Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## Lettr MCP connector for Claude Code

Endpoint: https://api.elaichi.ai/mcp

1. In a terminal, run `claude mcp add` with the endpoint.
2. Start Claude Code and run `/mcp`.
3. Pick elaichi, then sign in and approve in the browser.

```bash
claude mcp add --transport http elaichi --scope user https://api.elaichi.ai/mcp
```

Use `--scope project` instead to share it with the repository through `.mcp.json`.

## Lettr MCP connector for ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web. The plugin directory lives at chatgpt.com/plugins.

## Lettr MCP connector for Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Lettr MCP connector for Microsoft Copilot

Endpoint: https://api.elaichi.ai/mcp

1. In Copilot Studio, open your agent, then Tools, Add a tool, New tool and Model Context Protocol.
2. Paste the endpoint into Server URL, choose OAuth 2.0, then Dynamic discovery, and press Create.
3. Create a new connection, sign in and approve, then press Add to agent.
4. Under Channels, open Teams and Microsoft Copilot and make the agent available in Microsoft Copilot.

Microsoft Copilot was called Microsoft 365 Copilot. Keep the tool on end-user credentials, so each person signs in as themselves.

## Connect Lettr to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Every scope the client asks for starts ticked except "Delete things", which you tick yourself. Calling a Lettr tool needs "Use your connected apps". Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Think hard before granting Use your connected apps, which can also delete in connected apps and cannot be undone.

## What teams do with Lettr through Elaichi

### Add new sign-ups to the right list

Marketing. After a webinar, paste the attendee emails and have them created as Lettr contacts and added to the follow-up list in one go.

### Keep a prospect's details current

Sales. After a call, update the contact's company, role and custom properties in Lettr so the next send goes out with accurate details.

### Check what someone is subscribed to

Support. Look up a contact in Lettr to see which lists and topics they are on before answering a question about unwanted email.

### Clean up stale lists and topics

Operations. Find lists nobody sends to anymore and remove them, or bulk remove contacts from a list that has run its course.

### Build a list for a single event

Events. Create a new Lettr list, add the registrants in bulk, and subscribe them to an event updates topic.

### Add a property to segment on

Product. Create a custom audience property such as plan tier, then fill it in on existing Lettr contacts so campaigns can target the right people.

## Elaichi vs Zapier MCP vs Composio for Lettr

All three can connect Lettr to an AI assistant, and all three have admin controls. They differ in where access lives and how you pay.

| What to check | Elaichi | Zapier MCP | Composio |
| --- | --- | --- | --- |
| Where the AI connects | One address for the whole organization. Endpoint: https://api.elaichi.ai/mcp | A server per member, created at sign-in. | An MCP endpoint per team, or an SDK. |
| Control over Lettr tools | Allow or restrict single Lettr tools, per role or user. | App and action restrictions on the account. | Role permissions, down to the action. |
| Record of calls | One audit entry per Lettr call. | A History tab of tool calls. | A log of every tool call. |
| Single sign-on | SAML or OIDC, plus SCIM, on Gold. | SAML on Enterprise. | SAML and OIDC on Enterprise. |
| Price | Free for one person; $15 per user per month on Gold. | 2 tasks per successful call. | Billed per tool call. |

Sources: Zapier MCP [docs](https://docs.zapier.com/mcp/get-started/quickstart), [security](https://docs.zapier.com/mcp/manage/security), [usage](https://docs.zapier.com/mcp/features/usage); Composio [docs](https://docs.composio.dev/docs/composio-connect), [gateway](https://composio.dev/mcp-gateway), [enterprise](https://composio.dev/enterprise), [pricing](https://composio.dev/pricing). Checked September 2026.

Longer take: [Zapier MCP alternative](/blog/zapier-mcp-alternative/) and [when you don't need an MCP gateway](/blog/when-you-dont-need-an-mcp-gateway/).

## Frequently asked questions

### How do I connect Lettr to Claude?

Connect Lettr in Elaichi by pasting a Lettr API key, which is the only sign-in step Lettr needs; there is no OAuth application to register and no client ID or secret to generate. Then in Claude open Customize, then Connectors, then Add, and paste https://api.elaichi.ai/mcp. Sign in with your Elaichi account and Lettr is ready to use in Claude.

### Does Lettr work with ChatGPT and Cursor as well as Claude?

Yes. Once Lettr is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, Microsoft Copilot, any other MCP client, and the Elaichi Agent. You connect Lettr once and every client sees it.

### What can an AI agent actually do with my Lettr audience?

It can look up any Lettr audience contact, create new contacts one at a time or in bulk, update their details and custom properties, and remove them. It can create and rename lists and topics, add contacts to lists in bulk, and subscribe contacts to topics. Short asks like "add these ten emails to the newsletter list" work better than long paragraphs.

### Does connecting Lettr give the AI my whole audience?

No more than the person who signed in already has. Every call to Lettr runs with that person's own access, so an agent sees the contacts, lists, topics and properties they could already see in Lettr. Elaichi can narrow that further with restrictions, and it never widens it.

### Can my team share one Lettr connection?

Yes. One person connects Lettr with an API key and shares the connection with a team in Elaichi, so nobody else ever handles the key. Each teammate still signs in to Elaichi as themselves, so the audit log names who created, updated or deleted each Lettr contact or list.

### Can I stop an agent from deleting or changing things in Lettr?

Yes. Restrictions in Elaichi work per action, so you can allow looking up and updating Lettr contacts while restricting deleting contacts, lists or topics, for a role or for one person. A restricted action still shows up in Elaichi's tool search, flagged as restricted, but no client can run it, whatever the prompt says.

### What happens to a Lettr connection when someone leaves?

Offboarding them in Elaichi ends their access to Lettr through every client at once. If they shared a Lettr connection, it keeps working for everyone else on the team. If you want Lettr gone entirely, disconnect it once in Elaichi and it disappears from Claude, ChatGPT, Cursor, Microsoft Copilot and every other client.

### Does the Lettr MCP connector work with Gemini, Codex, Claude Code or other MCP clients?

Yes. Lettr is reached over the same MCP endpoint every client uses, so anything that speaks MCP can call it — Gemini, Codex, Claude Code, Windsurf, Cline, Zed and OpenCode among them — alongside Claude, ChatGPT, Cursor, Microsoft Copilot, and the Elaichi Agent. The tools on offer and the access behind them are identical whichever client asks. Only the setup screen differs.

### Is Elaichi an alternative to Zapier MCP for Lettr?

Yes. Both let Claude, ChatGPT or Cursor use Lettr. Zapier MCP fits a team that already automates in Zapier, since each person signs in and acts as themselves in that account. Elaichi fits when IT wants one address for the whole company, per-tool rules by role, and a record of every Lettr call.

### How is Elaichi different from Composio for Lettr?

Composio gives AI agents tools and sign-in handling across 1,000+ apps, for developers building agents or people using an assistant, billed per tool call. Elaichi gives a company's own people governed access to Lettr: one address, restrictions per role or user, and $15 per user per month. Both have role permissions and a log of every call.

## All 71 Lettr tools

Every tool below is callable through https://api.elaichi.ai/mcp once Lettr is connected, subject to the toolbox it is in and the restrictions on the caller.

- **Lettr audience contact lists bulk create** (Create). Bulk attach contacts to lists (POST /api/audience/contacts/lists/bulk). Attach every combination of `contact_ids × list_ids` (up to 1000 contacts × 50 lists). Existing pairs are reported in `already_attached`. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: contact_ids, list_ids.
- **Lettr audience contact lists bulk delete** (Delete). Bulk detach contacts from lists (DELETE /api/audience/contacts/lists/bulk). Detach every combination of `contact_ids × list_ids` (up to 1000 contacts × 50 lists). Pairs that were not attached are reported in `not_present`. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: contact_ids, list_ids.
- **Create a Lettr audience contact list** (Create). Attach contact to list (POST /api/audience/contacts/{contactId}/lists/{listId}). Add a contact to a list. Returns `201` if the contact was newly attached, or `200` if the contact was already in the list. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: contact_id, list_id.
- **Delete a Lettr audience contact list by ID** (Delete). Detach contact from list (DELETE /api/audience/contacts/{contactId}/lists/{listId}). Remove a contact from a list. Idempotent — returns `204` whether the pair existed or not. Requires the `audience:write` scope and is blocked for sandbox API keys. Lettr answers 204 with no body. Required: id, contact_id.
- **Lettr audience contact topics bulk create** (Create). Bulk subscribe contacts to topics (POST /api/audience/contacts/topics/bulk). Subscribe every combination of `contact_ids × topic_ids` (up to 1000 contacts × 50 topics). Pairs that already exist are reported in `already_subscribed`. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: contact_ids, topic_ids.
- **Lettr audience contact topics bulk delete** (Delete). Bulk unsubscribe contacts from topics (DELETE /api/audience/contacts/topics/bulk). Remove every combination of `contact_ids × topic_ids`. Pairs that did not exist are ignored. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: contact_ids, topic_ids.
- **Create a Lettr audience contact topic** (Create). Subscribe contact to topic (POST /api/audience/contacts/{contactId}/topics/{topicId}). Subscribe a contact to a topic. Returns `201` if the subscription is new, or `200` if the contact was already subscribed. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: contact_id, topic_id.
- **Delete a Lettr audience contact topic by ID** (Delete). Unsubscribe contact from topic (DELETE /api/audience/contacts/{contactId}/topics/{topicId}). Unsubscribe a contact from a topic. Idempotent — returns `204` whether the subscription existed or not. Requires the `audience:write` scope and is blocked for sandbox API keys. Lettr answers 204 with no body. Required: id, contact_id.
- **List all Lettr audience contacts** (List). List audience contacts (GET /api/audience/contacts). List contacts with pagination and filtering. Requires the `audience:read` scope. Truto pages with page / per_page (limit = page size, at most 100) until the last page.
- **Create a Lettr audience contact** (Create). Create a contact (POST /api/audience/contacts). Create a single contact. If `double_opt_in` is provided the contact is created in `unverified` status and receives a confirmation email — they become `subscribed` only after clicking the confirmation link. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: email.
- **Lettr audience contacts bulk create** (Create). Bulk create contacts (POST /api/audience/contacts/bulk). Create up to 1000 contacts in a single request. Send `contacts` to give each row its own properties, lists and topics, or the legacy `emails` array when the whole batch shares one property map.
- **Get single Lettr audience contact by ID** (Get). Show a contact (GET /api/audience/contacts/{contactId}). Retrieve a single contact. Requires the `audience:read` scope. Required: id.
- **Update a Lettr audience contact by ID** (Update). Update a contact (PATCH /api/audience/contacts/{contactId}). Partially update a contact. If no fields are provided the contact is returned unchanged. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: id.
- **Delete a Lettr audience contact by ID** (Delete). Delete a contact (DELETE /api/audience/contacts/{contactId}). Permanently delete a contact. Requires the `audience:write` scope and is blocked for sandbox API keys. Lettr answers 204 with no body. Required: id.
- **List all Lettr audience lists** (List). List audience lists (GET /api/audience/lists). Returns all audience lists for the authenticated team. Requires the `audience:read` scope. Truto pages with page / per_page (limit = page size, at most 100) until the last page.
- **Create a Lettr audience list** (Create). Create an audience list (POST /api/audience/lists). Create a new audience list. The name must be unique within the team. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: name.
- **Lettr audience lists bulk delete** (Delete). Bulk delete audience lists (DELETE /api/audience/lists/bulk). Delete up to 50 lists in a single request. All `list_ids` must belong to the authenticated team. If any list has segments restricted to it, nothing is deleted and the response is `409` `list_in_use`. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: list_ids.
- **Get single Lettr audience list by ID** (Get). Show an audience list (GET /api/audience/lists/{listId}). Retrieve a single audience list. Requires the `audience:read` scope. Required: id.
- **Update a Lettr audience list by ID** (Update). Update an audience list (PATCH /api/audience/lists/{listId}). Partially update an audience list. If no fields are provided the existing list is returned unchanged. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: id.
- **Delete a Lettr audience list by ID** (Delete). Delete an audience list (DELETE /api/audience/lists/{listId}). Permanently delete an audience list. A list that segments are restricted to cannot be deleted (`409` `list_in_use`): remove the restriction from those segments or delete them first. Requires the `audience:write` scope and is blocked for sandbox API keys. Lettr answers 204 with no body. Required: id.
- **List all Lettr audience properties** (List). List audience properties (GET /api/audience/properties). List the team's custom contact properties. Requires the `audience:read` scope. Truto pages with page / per_page (limit = page size, at most 100) until the last page.
- **Create a Lettr audience property** (Create). Create a property (POST /api/audience/properties). Create a new property that contacts can store. The `name` and `type` fields are immutable after creation — to change them, delete the property and create a new one. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: name, type.
- **Get single Lettr audience property by ID** (Get). Show a property (GET /api/audience/properties/{propertyId}). Retrieve a single property. Requires the `audience:read` scope. Required: id.
- **Update a Lettr audience property by ID** (Update). Update a property (PATCH /api/audience/properties/{propertyId}). Update the property's fallback value. The `name` and `type` fields cannot be changed (they would orphan data on existing contacts). If the request body contains no recognized fields, the property is returned unchanged with a `200` response. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: id.
- **Delete a Lettr audience property by ID** (Delete). Delete a property (DELETE /api/audience/properties/{propertyId}). Permanently delete a property. Requires the `audience:write` scope and is blocked for sandbox API keys. Lettr answers 204 with no body. Required: id.
- **List all Lettr audience segments** (List). List audience segments (GET /api/audience/segments). List segments with pagination. Requires the `audience:read` scope. Truto pages with page / per_page (limit = page size, at most 100) until the last page.
- **Create a Lettr audience segment** (Create). Create a segment (POST /api/audience/segments). Create a segment defined by condition groups (conditions within a group are joined by OR; groups are joined by AND). Requires the `audience:write` scope and is blocked for sandbox API keys. Required: name, conditions.
- **Get single Lettr audience segment by ID** (Get). Show a segment (GET /api/audience/segments/{segmentId}). Retrieve a single segment. Requires the `audience:read` scope. Required: id.
- **Update a Lettr audience segment by ID** (Update). Update a segment (PATCH /api/audience/segments/{segmentId}). Partially update a segment. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: id.
- **Delete a Lettr audience segment by ID** (Delete). Delete a segment (DELETE /api/audience/segments/{segmentId}). Permanently delete a segment. Requires the `audience:write` scope and is blocked for sandbox API keys. Lettr answers 204 with no body. Required: id.
- **List all Lettr audience topics** (List). List audience topics (GET /api/audience/topics). List topics with pagination. Requires the `audience:read` scope. Truto pages with page / per_page (limit = page size, at most 100) until the last page.
- **Create a Lettr audience topic** (Create). Create a topic (POST /api/audience/topics). Create a topic. The `default_subscription` field is set at creation and cannot be changed later. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: name.
- **Get single Lettr audience topic by ID** (Get). Show a topic (GET /api/audience/topics/{topicId}). Retrieve a single topic. Requires the `audience:read` scope. Required: id.
- **Update a Lettr audience topic by ID** (Update). Update a topic (PATCH /api/audience/topics/{topicId}). Partially update a topic. The `default_subscription` field is immutable. Requires the `audience:write` scope and is blocked for sandbox API keys. Required: id.
- **Delete a Lettr audience topic by ID** (Delete). Delete a topic (DELETE /api/audience/topics/{topicId}). Permanently delete a topic. Requires the `audience:write` scope and is blocked for sandbox API keys. Lettr answers 204 with no body. Required: id.
- **List all Lettr auth check** (List). Validate API Key (GET /api/auth/check). Validate the provided API key and return associated team information. Use this endpoint to verify API key validity in client libraries.
- **List all Lettr campaign events** (List). List campaign engagement events (GET /api/campaigns/{campaignId}/events). Returns engagement events (opens, clicks, bounces, etc.) for a campaign, with optional filtering by type, recipient email, and date range. Uses cursor-based pagination: keep requesting with the returned `next_cursor` until it is `null`. Truto pages with the cursor (limit = page size, at most 100) until next_cursor is null. Required: campaign_id.
- **Create a Lettr campaign schedule** (Create). Schedule a campaign (POST /api/campaigns/{campaignId}/schedule). Schedules a campaign for future delivery, or reschedules an already-scheduled campaign to a new time. The campaign transitions to (or stays) `scheduled` and is dispatched automatically at the given time. Requires the `campaigns:write` scope. Not available to sandbox keys. Required: campaign_id, scheduled_at.
- **Lettr campaign schedules cancel** (Cancel). Unschedule a campaign (POST /api/campaigns/{campaignId}/unschedule). Cancels a scheduled send, returning the campaign to `draft`. Also clears a delivery time staged on a `draft` in the web editor, so the draft can then be sent with the send endpoint. The campaign must be `scheduled`, or a `draft` with a staged delivery time. Requires the `campaigns:write` scope. Not available to sandbox keys. Required: campaign_id.
- **List all Lettr campaigns** (List). List campaigns (GET /api/campaigns). Returns a paginated list of campaigns for the authenticated team, each with embedded engagement stats. Requires the `campaigns:read` scope. Truto pages with page / per_page (limit = page size, at most 100) until the last page.
- **Create a Lettr campaign** (Create). Create a campaign (POST /api/campaigns). Creates a draft campaign. Give the content as `html_content` (optionally with the editor's `json_content`) or as a `template_id`, whose HTML is copied onto the campaign. Every list, segment, topic and template must belong to your team. The sender domain is checked when the campaign is sent, not here; language override senders are checked here and must use a verified sending domain. idempotency_key is sent as the Idempotency-Key header.
- **Get single Lettr campaign by ID** (Get). Show a campaign (GET /api/campaigns/{campaignId}). Retrieve a single campaign with embedded stats and rendered HTML content. Requires the `campaigns:read` scope. Required: id.
- **Lettr campaigns send** (Send). Send a campaign now (POST /api/campaigns/{campaignId}/send). Immediately dispatches a draft campaign. The campaign must be a draft with a subject, sender email, and content. Sending is asynchronous; the campaign transitions to `preparing`. Requires the `campaigns:write` scope. Not available to sandbox keys. Required: campaign_id.
- **List all Lettr domains** (List). List Domains (GET /api/domains). Retrieve all sending domains registered with your account. Returns domains with their current status, verification state, and timestamps.
- **Create a Lettr domain** (Create). Create Domain (POST /api/domains). Register a new sending domain with your account. The domain will be created with SparkPost and stored as approved by default, unless global domain reputation marks it for review or blacklist. Adding a domain your team already has returns `409` and leaves its DNS records and verification status unchanged. Required: domain.
- **Get single Lettr domain by ID** (Get). Get Domain (GET /api/domains/{domain}). Retrieve details of a single sending domain including DNS records and tracking domain configuration. Required: id.
- **Delete a Lettr domain by ID** (Delete). Delete Domain (DELETE /api/domains/{domain}). Delete a sending domain. This removes the domain from both SparkPost and the Lettr system. The domain will no longer be available for sending emails. Lettr answers 204 with no body. Required: id.
- **Lettr domains verify** (Verify). Verify Domain (POST /api/domains/{domain}/verify). Verify a domain's DNS records (DKIM and CNAME) with SparkPost. This triggers a verification check and returns the current status of DNS records. Required: domain.
- **List all Lettr email events** (List). List Email Events (GET /api/emails/events). Retrieve email events (deliveries, bounces, opens, clicks, etc.) for your account. Events are returned in reverse chronological order. If no `from` date is provided, defaults to the last 10 days. Truto pages with the cursor (limit = page size, at most 100) until next_cursor is null. Lists (events, recipients) are sent comma-separated.
- **Create a Lettr email** (Create). Send Email (POST /api/emails). Send a transactional email with optional attachments, tracking, and personalization. At least one of `html` or `text` content must be provided. Supply `Idempotency-Key` for safe retries using SparkPost native transmission idempotency. Keys are namespaced per Lettr API key and retained by SparkPost for 24 hours. idempotency_key is sent as the Idempotency-Key header. Required: from, to.
- ...and 21 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
