Loops MCP by usefulapi

Manage Loops contacts, mailing lists, and transactional/event emails.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
83%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,642Tokens (tool definitions)
~1.5 KBTypical response size
Moderate attention impact (1.28% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "loops": {
      "url": "https://loops.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://loops.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (10)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢loops_test_api_key

Verify the configured Loops API key and return the team name — a good first call. Loops API: GET /v1/api-key.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢loops_find_contact(email, userId)

Find a contact by email or userId (supply at least one). Loops API: GET /v1/contacts/find.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "description": "Contact email address to look up.",
      "type": "string"
    },
    "userId": {
      "description": "Contact userId to look up (your app's user id).",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢loops_list_contact_properties(list)

List contact fields / custom properties defined in Loops. Loops API: GET /v1/contacts/properties.

Input Schema

{
  "type": "object",
  "properties": {
    "list": {
      "description": "Which properties to return: all (default) or custom only.",
      "type": "string",
      "enum": [
        "all",
        "custom"
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢loops_list_mailing_lists

List all mailing lists in the Loops account (id + name). Loops API: GET /v1/lists.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴loops_create_contact(email, firstName, lastName, source, subscribed, ...)

Creates a contact in Loops (additive). Loops API: POST /v1/contacts/create.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Contact email address (required)."
    },
    "firstName": {
      "description": "First name.",
      "type": "string"
    },
    "lastName": {
      "description": "Last name.",
      "type": "string"
    },
    "source": {
      "description": "Source label for where the contact came from.",
      "type": "string"
    },
    "subscribed": {
      "description": "Whether the contact is subscribed to email.",
      "type": "boolean"
    },
    "userGroup": {
      "description": "User group segment name.",
      "type": "string"
    },
    "userId": {
      "description": "Your app's user id for this contact.",
      "type": "string"
    },
    "mailingLists": {
      "description": "Map of mailing-list id -> subscribed boolean.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "boolean"
      }
    },
    "properties": {
      "description": "Arbitrary custom contact properties (string/number/boolean); merged into the request body.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      }
    }
  },
  "required": [
    "email"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴loops_update_contact(email, firstName, lastName, source, subscribed, ...)

Updates (or creates) a contact by email/userId. Upserts — creates the contact if not found. Loops API: PUT /v1/contacts/update.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Contact email address (required; identifies the contact)."
    },
    "firstName": {
      "description": "First name.",
      "type": "string"
    },
    "lastName": {
      "description": "Last name.",
      "type": "string"
    },
    "source": {
      "description": "Source label.",
      "type": "string"
    },
    "subscribed": {
      "description": "Whether the contact is subscribed to email.",
      "type": "boolean"
    },
    "userGroup": {
      "description": "User group segment name.",
      "type": "string"
    },
    "userId": {
      "description": "Your app's user id (alternative identifier).",
      "type": "string"
    },
    "mailingLists": {
      "description": "Map of mailing-list id -> subscribed boolean.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "boolean"
      }
    },
    "properties": {
      "description": "Arbitrary custom contact properties (string/number/boolean); merged into the request body.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      }
    }
  },
  "required": [
    "email"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴loops_delete_contact(email, userId)

Deletes a contact from Loops. Destructive. Supply email OR userId. Loops API: POST /v1/contacts/delete.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "description": "Email of the contact to delete.",
      "type": "string"
    },
    "userId": {
      "description": "userId of the contact to delete.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴loops_create_contact_property(name, type)

Creates a custom contact property/field (additive schema change). Loops API: POST /v1/contacts/properties.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name of the custom property to create (required)."
    },
    "type": {
      "type": "string",
      "enum": [
        "string",
        "number",
        "boolean",
        "date"
      ],
      "description": "Data type of the property (required)."
    }
  },
  "required": [
    "name",
    "type"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴loops_send_event(eventName, email, userId, eventProperties, contactProperties, ...)

Sends an event to Loops for a contact — TRIGGERS any automations/loops subscribed to this event. Loops API: POST /v1/events/send.

Input Schema

{
  "type": "object",
  "properties": {
    "eventName": {
      "type": "string",
      "description": "The event name to send (required)."
    },
    "email": {
      "description": "Contact email (supply email or userId).",
      "type": "string"
    },
    "userId": {
      "description": "Contact userId (supply email or userId).",
      "type": "string"
    },
    "eventProperties": {
      "description": "Properties attached to this event.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      }
    },
    "contactProperties": {
      "description": "Contact properties to update alongside the event.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      }
    },
    "mailingLists": {
      "description": "Map of mailing-list id -> subscribed boolean.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "boolean"
      }
    }
  },
  "required": [
    "eventName"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴loops_send_transactional(transactionalId, email, dataVariables, addToAudience, attachments)

SENDS a real transactional email via a Loops template. This dispatches an actual email to the recipient. Loops API: POST /v1/transactional.

Input Schema

{
  "type": "object",
  "properties": {
    "transactionalId": {
      "type": "string",
      "description": "The Loops transactional template id (required)."
    },
    "email": {
      "type": "string",
      "description": "Recipient email address (required)."
    },
    "dataVariables": {
      "description": "Template data variables (string/number) to interpolate into the template.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": [
          "string",
          "number"
        ]
      }
    },
    "addToAudience": {
      "description": "Whether to add the recipient to your audience.",
      "type": "boolean"
    },
    "attachments": {
      "description": "Optional attachments: array of { filename, contentType, data } objects.",
      "type": "array",
      "items": {}
    }
  },
  "required": [
    "transactionalId",
    "email"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools
verifiedversion not recorded10 tools
verifiedversion not recorded10 tools
failed observationversion not recorded—
failed observationversion not recorded—