Arsel MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | HTTP port. Defaults to 8077. | |
| ARSEL_API_KEY | Yes | Your Arsel API key. Required for stdio mode (running locally). Create one in the dashboard under API keys. | |
| ARSEL_API_URL | No | Arsel API base URL. Defaults to https://api.arsel.sa/v1. | |
| ARSEL_AUTH_SERVER | No | OAuth authorization server. Defaults to https://api.arsel.sa. | |
| ARSEL_MCP_PUBLIC_URL | No | Public URL of this server; the OAuth token audience. Defaults to https://mcp.arsel.sa. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list-contactsA | Purpose: List contacts, or look one person up. Use when: the user asks "is X a contact?", "who is in this list?", "who has this tag?". Pass an exact Not for: counting a list or tag (get-list and get-tag return |
| get-contactA | Get one contact by id, with its custom properties and whether it is suppressed (unreachable because of a bounce, complaint or unsubscribe). |
| create-contactA | Create a contact. At least one of |
| update-contactA | Update a contact. Omitted fields are unchanged and
|
| list-listsA | List contact lists with their contact counts. Lists are static audiences that campaigns target. Don't read ids or timestamps back to the user unless they ask for them. |
| get-listA | Get one contact list and its contact count. To see its members, call list-contacts with |
| create-listC | Create an empty contact list. |
| update-listB | Rename a contact list or change its description. |
| add-contacts-to-listA | Add contacts to a list, keeping their other memberships. This can start the organization's active automations, which may send messages. |
| remove-contacts-from-listA | Remove contacts from a list. The contacts themselves are kept. Confirm with the user first, naming the list. |
| list-tagsA | List tags with their contact counts. Don't read ids or timestamps back to the user unless they ask for them. |
| get-tagA | Get one tag and its contact count. To see who has it, call list-contacts with |
| create-tagC | Create a tag. |
| update-tagC | Rename a tag or change its description. |
| add-tag-to-contactsA | Add a tag to contacts. This can start the organization's active automations, which may send messages. |
| remove-tag-from-contactsA | Remove a tag from contacts. This can start the organization's active automations, which may send messages. |
| list-email-campaignsA | List email campaigns, optionally by name or status. Don't read ids or timestamps back to the user unless they ask for them. |
| get-email-campaignB | Get one email campaign: status, sender, subject, template, audience and schedule. |
| create-email-campaignA | Create an email campaign. Every field is optional, so a draft can be built up step by step. The audience is the union of |
| update-email-campaignA | Update an email campaign. Only |
| list-sms-campaignsA | List SMS campaigns, optionally by name or status. Don't read ids or timestamps back to the user unless they ask for them. |
| get-sms-campaignA | Get one SMS campaign: status, content, sender, segment count and schedule. |
| create-sms-campaignA | Create an SMS campaign. The audience is the union of |
| update-sms-campaignA | Update an SMS campaign. Only |
| list-push-campaignsB | List push notification campaigns, optionally by name or status. Don't read ids or timestamps back to the user unless they ask for them. |
| get-push-campaignA | Get one push campaign: status, notification content, targeting and schedule. |
| create-push-campaignA | Create a push notification campaign for the organization's app users. The audience is the union of |
| update-push-campaignA | Update a push campaign. Only |
| list-in-app-campaignsA | List in-app message campaigns (messages shown inside the organization's app or website), optionally by name or status. Don't read ids or timestamps back to the user unless they ask for them. |
| get-in-app-campaignB | Get one in-app campaign: status, layout, content, trigger and targeting. |
| create-in-app-campaignA | Create an in-app message campaign. The campaign is saved as a |
| update-in-app-campaignA | Update an in-app campaign. Unlike other channels an |
| clone-in-app-campaignA | Copy an in-app campaign into a new |
| list-templatesA | List the organization's own email templates. An email campaign uses one through its |
| get-templateA | Get one email template, including its HTML. |
| create-templateA | Create an email template from HTML. The HTML is sanitized and an unsubscribe link is added automatically. To start from a professionally designed layout instead, use copy-gallery-template. |
| update-templateB | Rename an email template or replace its HTML. |
| list-gallery-categoriesA | List the filters (types, seasons, features, industries) that list-gallery-templates accepts. |
| list-gallery-templatesA | Browse Arsel's gallery of ready-made email designs. Copy one into the organization with copy-gallery-template. |
| get-gallery-templateB | Get one gallery design, including its HTML. |
| copy-gallery-templateA | Copy a gallery design into the organization's templates, where it can be edited and used by campaigns. |
| list-contact-propertiesA | List the organization's custom contact fields: the keys a contact's |
| get-contact-propertyC | Get one custom contact field. |
| create-contact-propertyA | Define a custom contact field. |
| update-contact-propertyA | Change a custom field's display name, description or fallback value. Pass |
| list-eventsA | List the event types the organization tracks from its apps (e.g. order.completed), with their payload schemas and conversion setup. Don't read ids or timestamps back to the user unless they ask for them. |
| get-eventC | Get one event type. |
| create-eventB | Define an event type that apps can send and automations can react to. The name cannot be changed later. |
| update-eventA | Change an event type's description, schema or conversion setup. |
| list-emailsA | List transactional emails with their delivery status. Transactional messages are the one-off sends an application makes through the API (receipts, one-time passwords), not campaigns. Don't read ids or timestamps back to the user unless they ask for them. |
| get-emailB | Get one transactional emails message with its delivery status. |
| list-sms-messagesA | List transactional sms with their delivery status. Transactional messages are the one-off sends an application makes through the API (receipts, one-time passwords), not campaigns. Don't read ids or timestamps back to the user unless they ask for them. |
| get-sms-messageA | Get one transactional sms message with its delivery status. |
| list-whatsapp-messagesA | List transactional whatsapp with their delivery status. Transactional messages are the one-off sends an application makes through the API (receipts, one-time passwords), not campaigns. Don't read ids or timestamps back to the user unless they ask for them. |
| get-whatsapp-messageA | Get one transactional whatsapp message with its delivery status. |
| list-push-notificationsA | List transactional push with their delivery status. Transactional messages are the one-off sends an application makes through the API (receipts, one-time passwords), not campaigns. Don't read ids or timestamps back to the user unless they ask for them. |
| get-push-notificationB | Get one transactional push message with its delivery status. |
| list-contact-push-devicesA | List a contact's registered push devices, to check whether they can receive push notifications. |
| get-push-device-importA | Get the progress and per-row errors of a bulk push-device import. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 59 tools
Most tools target a clearly distinct resource and action, with explicit guidance separating campaigns from transactional messages and templates from gallery designs. A few pairs like get-email vs get-email-campaign and list-emails vs list-email-campaigns could be confused, but the descriptions resolve them well.
Tool names follow a highly predictable kebab-case verb_noun pattern throughout, e.g. list-contacts, create-email-campaign, add-contacts-to-list, clone-in-app-campaign. Minor singular/plural differences such as get-email vs list-emails are still readable and consistent with the overall convention.
With 59 tools, the surface is very large even for a multi-channel marketing platform, and the repeated CRUD patterns across contacts, lists, tags, campaigns, templates, properties, events, and transactional messages create significant cognitive load. Many operations could likely be grouped or parameterized by channel/resource rather than exposed as separate tools.
The server covers create/read/update for core resources, but there are notable lifecycle gaps: no delete operations for contacts, lists, tags, campaigns, templates, properties, or events, and sending/scheduling campaigns is explicitly left to the dashboard. Transactional messages support only list/get, which limits the surface for testing or inspecting sends.