---
title: "EasyDMARC MCP server for AI agents - actionlake"
description: "Give Claude 111 EasyDMARC actions through one MCP server: DNS lookup, domains. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/easydmarc
updated: 2026-10-23
---

Connectors · MSP & PSA

# EasyDMARC MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to EasyDMARC and the rest of your systems. It gives your agent 111 EasyDMARC actions (80 reads, 22 writes and 9 that wait for a confirmation) and holds the EasyDMARC credential itself, so the agent never does. It paces EasyDMARC's limits and records every call.

[Connect EasyDMARC free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "easydmarc.organizations.list",
  intent: "check which EasyDMARC account is connected"
}
# List organizations · read · 1 upstream call
```

- 111 actions in one signed file
- 80 read look, never change
- 22 write create and update
- 9 wait for a yes destructive, confirmed first

Set up

## Connect EasyDMARC in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect EasyDMARC.
   OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `client_id` EasyDMARC API client ID
   - `client_secret` EasyDMARC API client secret, shown with the client ID when the client is created
   ```
   account { op: "connections.requirements", service: "easydmarc" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "easydmarc.organizations.list" }
   # list organizations · read · 1 upstream call
   check { action: "easydmarc.domains.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

EasyDMARC at a glance

**Sign-in**

OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in.

**You provide**

`client_id` `client_secret`

**Limits we pace to**

60 calls a minute, per connection

**API covered**

EasyDMARC Public API v1 (OpenAPI 3.0.0, info.version 1.0.0)`api2.easydmarc.com`

**Built from**

EasyDMARC's documentation, read 23 October 2026[OpenAPI spec (GitHub)](https://raw.githubusercontent.com/easydmarc/public-api-docs/HEAD/specs/easydmarc-openapi.json) [developers.easydmarc.com](https://developers.easydmarc.com/public-api/easydmarc-api)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

42 of 80 reads, for up to 5 minutes; a write clears what it affects

**Shared entities**

3, so ask can line EasyDMARC up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in EasyDMARC.

111 actions in 17 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **80** read look, never change
- **22** write create and update
- **9** destructive wait for a confirmation

1. ### DNS lookup
   37
   37 read · 0 write · 0 destructive
   DNS lookup for a record · DNS lookup for aaaa record · DNS lookup for bimi record · DNS lookup for cname record
2. ### Domains
   11
   5 read · 5 write · 1 destructive
   List domains · Get domain by ID · Create new domain · Update an existing domain
3. ### Aggregate reports
   7
   7 read · 0 write · 0 destructive
   Get aggregate report by ID · Get DMARC aggregations data · Get authentication pass rates · Get distinct property values
4. ### Domain groups
   7
   2 read · 3 write · 2 destructive
   List domain groups · Get domain group details · Create a new domain group · 🚧 Add domains to a domain group
5. ### Subscriptions
   7
   2 read · 4 write · 1 destructive
   List subscriptions for an organization · Cancel a subscription · Assign a subscription (partner-admin flow) · List subscriptions for multiple organizations
6. ### Webhooks
   7
   3 read · 2 write · 2 destructive
   Get the list of webhook deliveries · Get a specific webhook · Create a new webhook · Update a webhook
7. ### DNS intelligence
   6
   6 read · 0 write · 0 destructive
   List available DNS Intelligence checks · List available DNS lookup types · List available DNS Intelligence profile operations · Run a batch of DNS Intelligence checks against a domain
8. ### Failure reports
   6
   6 read · 0 write · 0 destructive
   Get failure reports · Get aggregated statistics for failure reports · Get failure report by ID · Download all attachments as a ZIP archive

**9 more areas · 23 actions**

- Organizations **6**
- Users **5**
- Invoices **3**
- Payment sources **3**
- Billing info **2**
- Audit log **1**
- Magic links **1**
- Partner **1**
- Plans **1**

Top actions

## The EasyDMARC API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 20 of EasyDMARC's 20 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `easydmarc.domains.list` List domains | List domains. | read | `comm.sending_domain.list` 18 connectors |
| `easydmarc.users.get` Get User | Get User. | read | `identity.user.get` 399 connectors |
| `easydmarc.webhooks.list_deliveries` Get the list of webhook deliveries | Get the list of webhook deliveries. | read | `automation.webhook_delivery.list` 33 connectors |
| `easydmarc.domains.get` Get domain by ID | Get domain by ID. | read | `comm.sending_domain.get` 14 connectors |
| `easydmarc.webhooks.get` Get a specific webhook | Get a specific webhook. | read | `automation.webhook.get` 162 connectors |
| `easydmarc.invoices.list` List invoices for an organization | List invoices for an organization. | read | `finance.invoice.list` 101 connectors |
| `easydmarc.domains.create` Create new domain | Create new domain. | write | `comm.sending_domain.create` 15 connectors |
| `easydmarc.webhooks.create` Create a new webhook | Create a new webhook. | write | `automation.webhook.create` 209 connectors |
| `easydmarc.organizations.list` List organizations | List organizations. | read | `platform.tenant.list` 70 connectors |
| `easydmarc.invoices.get` Get invoice details | Get invoice details. | read | `finance.invoice.get` 102 connectors |
| `easydmarc.domains.update` Update an existing domain | Update an existing domain. | write | `comm.sending_domain.update` 12 connectors |
| `easydmarc.domains.delete` Delete a domain | Delete a domain. | destructive | `comm.sending_domain.delete` 14 connectors |

Try it

## Prompts to paste into Claude.

Each one names the EasyDMARC actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   Who has access in EasyDMARC? List every user and their role.
   calls `easydmarc.organizations.list_users`
2. Write write
   Create new domain in EasyDMARC. Show me exactly what you will send before you save it.
   calls `easydmarc.domains.create`

Governance for EasyDMARC

## Destructive actions wait for a yes.

9 EasyDMARC actions are destructive. These are all of them:

- Delete a domain `easydmarc.domains.delete`
- Delete a webhook `easydmarc.webhooks.delete`
- Cancel a subscription `easydmarc.subscriptions.cancel`
- Delete an organization `easydmarc.organizations.delete`
- Delete a domain group `easydmarc.domain_groups.delete`
- Remove a payment source `easydmarc.payment_sources.delete`
- Regenerate webhook secret `easydmarc.webhooks.regenerate_secret`
- Remove a domain from a domain group `easydmarc.domain_groups.remove_domain`
- Revoke org access `easydmarc.users.revoke_organization_access`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do easydmarc.domains.delete confirm_policy: **human**

Delete a domain?

**intent:** the user asked me to delete a domain

run suspended · waiting for a named person · key _easydmarc-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "easydmarc-agent",
  allowed_actions: ["easydmarc.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "easydmarc.domains.delete", approver: "lead@example.com" },
    { match: "easydmarc.webhooks.delete", approver: "lead@example.com" },
    { match: "easydmarc.subscriptions.cancel", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to EasyDMARC only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What EasyDMARC costs on actionlake.

Every EasyDMARC action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call EasyDMARC refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 111 EasyDMARC actions
- 6 actions page each page of a long list is one call
- 42 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every EasyDMARC action.

111 actions by area: the id your agent calls, what it does, and its effect.

**DNS lookup 37**

- `easydmarc.dns_lookup.a` DNS lookup for a record read
- `easydmarc.dns_lookup.a_batch` DNS lookup batch for a record read
- `easydmarc.dns_lookup.aaaa` DNS lookup for aaaa record read
- `easydmarc.dns_lookup.aaaa_batch` DNS lookup batch for aaaa record read
- `easydmarc.dns_lookup.bimi` DNS lookup for bimi record read
- `easydmarc.dns_lookup.bimi_batch` DNS lookup batch for bimi record read
- `easydmarc.dns_lookup.bimi_validate` Validate BIMI record read
- `easydmarc.dns_lookup.cname` DNS lookup for cname record read
- `easydmarc.dns_lookup.cname_batch` DNS lookup batch for cname record read
- `easydmarc.dns_lookup.dkim` DNS lookup for dkim record read
- `easydmarc.dns_lookup.dkim_batch` DNS lookup batch for dkim record read
- `easydmarc.dns_lookup.dkim_records_by_selectors` Get DKIM records by selectors with domain read
- `easydmarc.dns_lookup.dmarc` DNS lookup for dmarc record read
- `easydmarc.dns_lookup.dmarc_batch` DNS lookup batch for dmarc record read
- `easydmarc.dns_lookup.dmarc_record_by_structure` Get DMARC record by structure read
- `easydmarc.dns_lookup.dmarc_record_structure` Get DMARC record structure read
- `easydmarc.dns_lookup.dmarc_records_raw` Get raw DMARC records read
- `easydmarc.dns_lookup.dmarc_verification_status_batch` POST /v1/dns-lookup/dmarc/verification-status-batch read
- `easydmarc.dns_lookup.mta_sts` MTA-STS lookup read
- `easydmarc.dns_lookup.mta_sts_cname` CNAME lookup for MTA-STS record read
- `easydmarc.dns_lookup.mta_sts_generate` Generate MTA-STS record and policy file read
- `easydmarc.dns_lookup.mta_sts_mx_records` MX records for MTA-STS read
- `easydmarc.dns_lookup.mta_sts_policy_cname` CNAME lookup for MTA-STS policy host read
- `easydmarc.dns_lookup.mx` DNS lookup for mx record read
- `easydmarc.dns_lookup.mx_batch` DNS lookup batch for mx record read
- `easydmarc.dns_lookup.ns` DNS lookup for ns record read
- `easydmarc.dns_lookup.ns_batch` DNS lookup batch for ns record read
- `easydmarc.dns_lookup.ptr` DNS lookup for ptr record read
- `easydmarc.dns_lookup.ptr_batch` DNS lookup batch for ptr record read
- `easydmarc.dns_lookup.spf` DNS lookup for spf record read
- `easydmarc.dns_lookup.spf_batch` DNS lookup batch for spf record read
- `easydmarc.dns_lookup.spf_lookup_result` Get SPF record lookup result read
- `easydmarc.dns_lookup.tls_rpt` DNS lookup for TLS-RPT record read
- `easydmarc.dns_lookup.tls_rpt_cname` CNAME lookup for TLS-RPT record read
- `easydmarc.dns_lookup.tls_rpt_generate` Generate TLS-RPT record read
- `easydmarc.dns_lookup.txt` DNS lookup for txt record read
- `easydmarc.dns_lookup.txt_batch` DNS lookup batch for txt record read

**Domains 11**

- `easydmarc.domains.create` Create new domain write
- `easydmarc.domains.create_batch` Create new domains in batch write
- `easydmarc.domains.delete` Delete a domain destructive
- `easydmarc.domains.get` Get domain by ID read
- `easydmarc.domains.get_setup` Get setup info read
- `easydmarc.domains.list` List domains read
- `easydmarc.domains.overview` List domains with the domain details read
- `easydmarc.domains.patch` Partially update a domain write
- `easydmarc.domains.search` 🚧 Search and filter domains with advanced filtering and ordering read
- `easydmarc.domains.set_setup` Verify domain write
- `easydmarc.domains.update` Update an existing domain write

**Aggregate reports 7**

- `easydmarc.aggregate_reports.aggregations` Get DMARC aggregations data read
- `easydmarc.aggregate_reports.auth_pass_rates` Get authentication pass rates read
- `easydmarc.aggregate_reports.distinct_property` Get distinct property values read
- `easydmarc.aggregate_reports.get` Get aggregate report by ID read
- `easydmarc.aggregate_reports.query` Get RUA reports raw data read
- `easydmarc.aggregate_reports.volume` Get RUA email volume data read
- `easydmarc.aggregate_reports.volume_history` Get volume data by report period read

**Domain groups 7**

- `easydmarc.domain_groups.add_domains` 🚧 Add domains to a domain group write
- `easydmarc.domain_groups.create` Create a new domain group write
- `easydmarc.domain_groups.delete` Delete a domain group destructive
- `easydmarc.domain_groups.get` Get domain group details read
- `easydmarc.domain_groups.list` List domain groups read
- `easydmarc.domain_groups.remove_domain` Remove a domain from a domain group destructive
- `easydmarc.domain_groups.update` Update an existing domain group write

**Subscriptions 7**

- `easydmarc.subscriptions.assign` Assign a subscription (partner-admin flow) write
- `easydmarc.subscriptions.cancel` Cancel a subscription destructive
- `easydmarc.subscriptions.list` List subscriptions for an organization read
- `easydmarc.subscriptions.list_bulk` List subscriptions for multiple organizations read
- `easydmarc.subscriptions.renew` Renew the subscription write
- `easydmarc.subscriptions.set_auto_renew` Enable or disable automatic renewal write
- `easydmarc.subscriptions.update_price` Upgrade/downgrade plan write

**Webhooks 7**

- `easydmarc.webhooks.create` Create a new webhook write
- `easydmarc.webhooks.delete` Delete a webhook destructive
- `easydmarc.webhooks.get` Get a specific webhook read
- `easydmarc.webhooks.list` Get webhook list for specific owner read
- `easydmarc.webhooks.list_deliveries` Get the list of webhook deliveries read
- `easydmarc.webhooks.regenerate_secret` Regenerate webhook secret destructive
- `easydmarc.webhooks.update` Update a webhook write

**DNS intelligence 6**

- `easydmarc.dns_intelligence.list_checks` List available DNS Intelligence checks read
- `easydmarc.dns_intelligence.list_lookups` List available DNS lookup types read
- `easydmarc.dns_intelligence.list_profiles` List available DNS Intelligence profile operations read
- `easydmarc.dns_intelligence.run_checks` Run a batch of DNS Intelligence checks against a domain read
- `easydmarc.dns_intelligence.run_lookup` Perform a DNS lookup against a domain read
- `easydmarc.dns_intelligence.run_profiles` Run a batch of profile operations against a domain read

**Failure reports 6**

- `easydmarc.failure_reports.aggregates` Get aggregated statistics for failure reports read
- `easydmarc.failure_reports.get` Get failure report by ID read
- `easydmarc.failure_reports.get_all_attachments_url` Download all attachments as a ZIP archive read
- `easydmarc.failure_reports.get_attachment_url` Download specific attachment from a failure report read
- `easydmarc.failure_reports.get_eml_url` Download EML file for a failure report read
- `easydmarc.failure_reports.list` Get failure reports read

**Organizations 6**

- `easydmarc.organizations.create` Create a new organization write
- `easydmarc.organizations.delete` Delete an organization destructive
- `easydmarc.organizations.get` Get organization details read
- `easydmarc.organizations.list` List organizations read
- `easydmarc.organizations.list_users` List users of an organization read
- `easydmarc.organizations.update` Partially update existing organization write

**Users 5**

- `easydmarc.users.create` Create user write
- `easydmarc.users.get` Get User read
- `easydmarc.users.invite` Invite user write
- `easydmarc.users.revoke_organization_access` Revoke org access destructive
- `easydmarc.users.update_info` Update User Info write

**Invoices 3**

- `easydmarc.invoices.get` Get invoice details read
- `easydmarc.invoices.get_pdf_url` Get invoice PDF URL read
- `easydmarc.invoices.list` List invoices for an organization read

**Payment sources 3**

- `easydmarc.payment_sources.create` Add a payment source write
- `easydmarc.payment_sources.delete` Remove a payment source destructive
- `easydmarc.payment_sources.list` List payment sources for an organization read

**Billing info 2**

- `easydmarc.billing_info.get` Get billing information for an organization read
- `easydmarc.billing_info.upsert` Create or update billing information write

**Audit log 1**

- `easydmarc.audit_log.list` Get audit logs with filters read

**Magic links 1**

- `easydmarc.magic_links.create` Generate login magic link write

**Partner 1**

- `easydmarc.partner.get` Get the current partner read

**Plans 1**

- `easydmarc.plans.list` List plans read

Questions

## The EasyDMARC MCP server, answered.

**Is there an EasyDMARC MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 111 EasyDMARC actions across DNS lookup, domains, aggregate reports and domain groups, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by EasyDMARC.

**What do I need to connect EasyDMARC?**

EasyDMARC API client ID and EasyDMARC API client secret, shown with the client ID when the client is created. The free call account { op: "connections.requirements", service: "easydmarc" } lists exactly what to paste.

**Can an AI agent delete or change things in EasyDMARC?**

Only if its key allows it, and only with an explicit confirmation. 9 EasyDMARC actions are destructive, including delete a domain, delete a webhook and cancel a subscription. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my EasyDMARC API limit?**

actionlake paces every call to the limits in the EasyDMARC service file: 60 calls a minute per connection. Repeated reads are answered from cache (42 EasyDMARC actions can be), which never reaches EasyDMARC.

**What does an EasyDMARC action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (6 EasyDMARC actions page). Cache hits, searches, dry runs and calls EasyDMARC refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which EasyDMARC API does it cover?**

The EasyDMARC Public API v1 (OpenAPI 3.0.0, info.version 1.0.0) at api2.easydmarc.com. It is built from EasyDMARC's documentation as read on 23 October 2026. 111 actions in 17 areas, each one in the signed service file (version 1.0.0).

**Does actionlake keep my EasyDMARC data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your EasyDMARC credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like EasyDMARC

Shares the most action names with

- [Tailscale 8](https://actionlake.com/connectors/tailscale)
- [Huntress 7](https://actionlake.com/connectors/huntress)
- [Automox 6](https://actionlake.com/connectors/automox)
- [SMTP2GO 6](https://actionlake.com/connectors/smtp2go)
- [Blumira 5](https://actionlake.com/connectors/blumira)
- [Liongard 5](https://actionlake.com/connectors/liongard)

Joins with, on shared entities

- [Slack 2](https://actionlake.com/connectors/slack)
- [Gusto 2](https://actionlake.com/connectors/gusto)
- [Microsoft 365 Users 2](https://actionlake.com/connectors/microsoft-365-users)
- [Cloudflare 2](https://actionlake.com/connectors/cloudflare)
- [Amazon Ads API 2](https://actionlake.com/connectors/amazon-ads-api)
- [Flagsmith 2](https://actionlake.com/connectors/flagsmith)

Browse

- [All MSP & PSA connectors](https://actionlake.com/connectors/category/msp-and-psa)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by EasyDMARC; the name is the vendor's own. Counts are from the EasyDMARC service file, version 1.0.0.

## Give your agent EasyDMARC today.

[Connect EasyDMARC free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/easydmarc
More: https://actionlake.com/llms.txt
