CamelMailer MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CAMELMAILER_API_KEY | Yes | Server API key from your CamelMailer dashboard. | |
| CAMELMAILER_BASE_URL | No | Base URL of your CamelMailer instance. Defaults to https://app.camelmailer.com | https://app.camelmailer.com |
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 |
|---|---|
| send_emailA | Send a transactional email through CamelMailer. Provide html_body and/or text_body. Queues one message per recipient and returns their ids. |
| send_email_with_templateA | Render a stored CamelMailer template (Mustache-style {{ variables }}) against template_model and send it. Fields set directly (e.g. subject) override the rendered ones. |
| list_emailsA | List messages of the CamelMailer server, newest first. Filter by scope, status, tag, substring query or message stream. |
| get_emailA | Retrieve one message by id, including its SMTP delivery attempts. |
| list_templatesA | List all stored message templates of the CamelMailer server. |
| render_templateA | Preview a stored template rendered against a variable model — returns the rendered subject, html_body and text_body without sending anything. |
| get_statsB | Message counters of the server (sent, pending, bounced, opens, clicks, …), optionally limited to a created_at time window. |
| list_bouncesC | List bounced messages, filtered and paginated. |
| dmarc_summaryA | DMARC compliance summary over the stored aggregate reports: pass rate, top sending sources and disposition totals. |
| list_streamsA | List the message streams of the server. A stream is transactional or broadcast; broadcast streams are the ones campaigns and subscribers belong to. |
| get_streamA | Retrieve one message stream by permalink. |
| create_streamA | Create a message stream. Set permalink explicitly when you need to know it up front; the API derives one from the name otherwise. |
| update_streamB | Update a message stream. Only the given fields change. |
| archive_streamA | Archive a message stream. Archived streams reject new messages. |
| send_to_streamA | SENDS MAIL IMMEDIATELY to every subscriber of a broadcast stream. Give either a subject with a body, or a template permalink. Recipients past the per-request cap of 1000 come back as skipped, so a larger audience wants a campaign. |
| list_campaignsA | List broadcast campaigns, newest first. Pass stream to narrow to one broadcast stream. |
| get_campaignA | Retrieve one campaign with its statistics: total, sent, delivered, failed, opened, clicked and unsubscribed. |
| create_campaign_draftA | Write a campaign WITHOUT sending it. Leave scheduled_at unset and the campaign stays a draft; set it and the server sends when due. This is the tool to use when a campaign should be reviewed first — use send_campaign_now only when it should go out immediately. |
| send_campaign_nowA | CREATES A CAMPAIGN AND SENDS IT IMMEDIATELY to every subscriber of the stream. There is no draft to review and no schedule; the send starts before this returns. Use create_campaign_draft unless the mail really should go out now. |
| update_campaignA | Edit a draft or scheduled campaign. Set scheduled_at to schedule it, or clear_schedule to drop it back to a draft. Touching neither leaves the schedule standing. A campaign that is already sending cannot be edited. |
| send_campaignA | SENDS AN EXISTING CAMPAIGN NOW, whatever its schedule said. The send starts immediately and cannot be undone for messages already queued. |
| cancel_campaignA | Cancel a scheduled or in-flight campaign. Messages already queued are not recalled. |
| list_subscribersA | List a broadcast stream's subscribers, subscribed and unsubscribed alike. A broadcast send to an address that is not subscribed is refused, so this list is the audience. |
| add_subscriberA | Add or update one subscriber of a broadcast stream. Upserts by address, so calling it twice is safe. |
| import_subscribersA | Add many addresses to a broadcast stream at once, all as subscribed. Blanks and duplicates within the request are skipped, so the reported count can be lower than the number of addresses passed. |
| record_complaintA | Record a spam complaint against an address: writes a stream-scoped suppression and flips the subscription to unsubscribed. Idempotent, so a feedback loop can replay it safely. |
| remove_subscriberA | Remove a subscriber from a broadcast stream entirely. To stop mailing someone while keeping the record, set their status to unsubscribed with add_subscriber instead. |
| list_layoutsA | List the template layouts of the server. A layout wraps every template that uses it, so header, footer and styling live in one place. |
| get_layoutA | Retrieve one layout by permalink, including its wrappers. |
| create_layoutA | Create a template layout. html_wrapper has to embed the body with {{{ content }}}; anything else is refused with ValidationError. |
| update_layoutB | Update a layout. Only the given fields change. |
| delete_layoutA | Delete a layout. Templates that referenced it fall back to no wrapper. |
| list_inboundA | List inbound and held messages, newest first. Covers mail arriving through an inbound route as well as outbound mail the spam filter put on hold. |
| get_inboundA | Retrieve one inbound or held message by id. |
| retry_inboundA | Put an inbound message back on the delivery queue, for instance after fixing the route it should have matched. |
| bypass_inboundA | RELEASE A HELD MESSAGE past the hold and deliver it. The hold is what the spam filter put there, so check the message before releasing it. |
| list_api_requestsA | List the server's own logged API requests, newest first. Useful when a send did not arrive and the question is whether the request ever reached the API, and with what answer. |
| list_tagsA | Tags used by the server's recent messages, most used first — the vocabulary available to the tag filter of list_emails. |
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 38 tools
Most tools target a distinct resource and action, and descriptions explicitly disambiguate near-overlaps like send_campaign_now vs send_campaign and send_to_stream vs create_campaign_draft. A few pairs, such as get_email vs get_inbound and list_emails vs list_bounces, could still cause misselection if an agent is not careful.
The naming is predominantly lowercase snake_case verb_noun, e.g. list_campaigns, create_layout, update_stream, cancel_campaign. Minor deviations like dmarc_summary, send_campaign_now, and send_email_with_template break the exact pattern but remain readable and predictable.
At 38 tools, this is well beyond the typical 3-15 tool sweet spot and above the 25-tool threshold for a heavy surface. Although the tools are organized into logical domains, the sheer number makes navigation and selection harder for an agent.
The surface is broad, covering transactional sends, campaigns, streams, subscribers, layouts, inbound handling, and stats, but template management is read-only: list_templates and render_template exist with no create_template/update_template/delete_template. There are also lifecycle gaps like no delete_campaign, delete_stream, or unarchive_stream.