# Loops.so — how to use (mcp.ai)

Connect your Loops.so account and use 12 tools for email straight from your AI agent. Connect with your own API key. The email platform for modern SaaS. A better way to send product, marketing, and transactional email.

## Option A — via MCP (recommended)
Remote MCP endpoint (HTTP, streamable): `https://api.mcp.ai/p_loops_so?ms=1787295900000`
Add it as a custom/remote MCP connector in your client (Claude, Cursor, VS Code…), then authenticate when prompted. Once connected, ask the agent to use the server's tools (e.g. `loops_so_create_contact`).

## Option B — via direct REST API
Base URL: `https://api.mcp.ai/api/loops_so`
Auth: `Authorization: Bearer sk_live_…` — create a workspace API key at https://mcp.ai/settings/api-keys
Discover endpoints: `GET https://api.mcp.ai/api/loops_so/_endpoints`

### Endpoints
- `POST https://api.mcp.ai/api/loops_so/create/contact` — Tool to add a new contact to your Loops audience. Use when you need to create a contact with email and optional properties like name, subscription status, or custom attributes. Returns 409 if contact 
  - body: { email: string, source?: string, userId?: string, lastName?: string, firstName?: string, userGroup?: string, subscribed?: boolean, mailingLists?: object }
- `POST https://api.mcp.ai/api/loops_so/create/contact/property` — Tool to add a custom contact property to your Loops team. Use when you need to store additional contact data beyond default fields. Properties must have unique names in camelCase format and a specifie
  - body: { name: string, type: string }
- `POST https://api.mcp.ai/api/loops_so/delete/contact` — Tool to delete a contact by email address or user ID. Use when you need to remove a contact from Loops. Either email or userId must be provided to identify the contact.
  - body: { email?: string, userId?: string }
- `POST https://api.mcp.ai/api/loops_so/find/contact` — Tool to search for a contact by email or userId. Use when you need to find a specific contact's details including subscription status and custom properties. Exactly one of email or userId must be prov
  - body: { email?: string, userId?: string }
- `POST https://api.mcp.ai/api/loops_so/get/contact/properties` — Tool to retrieve a list of your account's contact properties from Loops.so. Use when you need to view all available contact properties or filter to only custom properties created by your team.
  - body: { list?: string }
- `POST https://api.mcp.ai/api/loops_so/get/dedicated/sending/ips` — Tool to retrieve a list of Loops' dedicated sending IP addresses. Use when you need to get IP addresses for whitelisting purposes.
- `POST https://api.mcp.ai/api/loops_so/get/mailing/lists` — Tool to retrieve all mailing lists associated with your Loops account. Use when you need to browse or manage mailing list information.
- `POST https://api.mcp.ai/api/loops_so/list/custom/fields` — Tool to retrieve a list of custom contact properties. Use when you need to view available custom fields for contacts. Note: This endpoint is deprecated in favor of 'List contact properties'.
- `POST https://api.mcp.ai/api/loops_so/list/transactional/emails` — Tool to retrieve a list of published transactional emails. Use when you need to view all available transactional email templates. Supports pagination with perPage and cursor parameters.
  - body: { cursor?: string, perPage?: integer }
- `POST https://api.mcp.ai/api/loops_so/send/event` — Tool to send events to trigger emails in Loops. Use when you need to track user actions and trigger automated email workflows based on those events.
  - body: { email?: string, userId?: string, eventName: string, mailingLists?: object, idempotencyKey?: string, eventProperties?: object }
- `POST https://api.mcp.ai/api/loops_so/test/api/key` — Tool to test API key validity and retrieve team information. Use to verify API credentials are working correctly.
- `POST https://api.mcp.ai/api/loops_so/update/contact` — Tool to update an existing contact by email or userId. Use when you need to modify contact properties or re-subscribe contacts. Creates a new contact if no matching record exists.
  - body: { email?: string, source?: string, userId?: string, lastName?: string, firstName?: string, userGroup?: string, subscribed?: boolean, mailingLists?: object }

## Example prompts
- "What can I do in Loops.so?"
- "Show me a summary of my Loops.so account"

## More
- Page: https://mcp.ai/loops_so
- Agent spec (llms.txt): https://mcp.ai/loops_so/llms.txt
- Postman collection: https://mcp.ai/loops_so/postman.json
