Skip to main content
Glama
thenewit-eu

mailfact-mcp

Official
by thenewit-eu

mailfact-mcp

Read-only MCP server for a Mailfact tenant. Tools return DMARC counts and rows. They do not recommend a policy, score a domain, or call a model.

The server speaks Authorization: Token to the Mailfact API and identifies itself with User-Agent: mailfact-mcp/<version>.

Configure

Variable

Required

Default

MAILFACT_API_TOKEN

yes

—

MAILFACT_API_URL

no

https://api.mailfact.app

Mint the token in the product (POST /api/v1/tokens/). A read scope is enough. The raw value is shown once.

Self-hosted and external_billing deployments use the same server: set MAILFACT_API_URL to that origin (https://api.example.com, with or without a trailing /api/v1).

Until this package is on npm, run it from a checkout.

npm install
npm run build
MAILFACT_API_TOKEN=dmr_… node dist/index.js

Related MCP server: mcp-bd-readonly

Cursor

Add the token in Cursor after installing. The deeplink does not carry it, and it uses npx, so it works once the package is published.

Install in Cursor

Or ~/.cursor/mcp.json (use node and the dist/index.js path until publish):

{
  "mcpServers": {
    "mailfact": {
      "command": "npx",
      "args": ["-y", "mailfact-mcp"],
      "env": {
        "MAILFACT_API_TOKEN": "dmr_…",
        "MAILFACT_API_URL": "https://api.mailfact.app"
      }
    }
  }
}

Claude Desktop and Claude Code

Same mcpServers block, in claude_desktop_config.json or the project's .mcp.json.

Tools

Tool

API

list_domains

GET /domains/?fqdn=

get_domain

GET /domains/{id}/

get_alignment_summary

GET /reports/records/summary/?group_by=day

get_reporter_coverage

GET /reports/records/summary/?group_by=reporter_org

list_sending_sources

GET /reports/records/summary/?group_by=source_ip (also source_ip_asn, header_from)

query_records

GET /reports/records/

list_aggregate_reports

GET /reports/aggregate/

get_report_records

GET /reports/aggregate/{id}/records/

whoami

GET /me/ and GET /billing/entitlement/resolved/

Fact-table tools return at most 50 rows. truncated: true means the response was cut. Paginated tools also return next_cursor; pass it back as cursor. They do not follow further pages themselves.

reporter_org, header_from, and the other third-party name fields are cut at 120 characters.

Not exposed: token minting, billing checkout, forensic message bodies.

Tests

npm test

npm test checks row caps and error details. It does not call the API.

npm run test:e2e rebuilds the sibling dmarc-reporting web image, ingests a real aggregate report, and calls the tools over stdio. It needs Docker. GitHub Actions does not run it.

GitHub Actions runs npm test on every push and pull request. It does not call the dev API. A self-hosted runner on this public repository would let a fork pull request execute its own workflow on that machine.

The live dev test stays manual: npm run test:e2e:live. That command loads the read token from .env.e2e.

Available Tools

9 tools
get_alignment_summaryAlignment by dayA
Read-only

Per-day message counts: total, DMARC pass, DMARC fail, and disposition (none, quarantine, reject). Counts are message-weighted. Default window is 30 days, clamped at 365. If the window has more than 50 days, the most recent 50 are returned and truncated is true. Pass an earlier day_before to see the days before those.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoDomain id. Omit to include every domain on the token.
day_afterNoInclusive lower bound, YYYY-MM-DD. Default is 30 days ago.
day_beforeNoInclusive upper bound, YYYY-MM-DD. Default is today.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavior on top: counts are message-weighted, the window defaults to 30 days and is clamped at 365, results are capped at 50 days with a truncated flag, and paging backward is done via day_before. This discloses the exact response-shaping and limit behavior an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with what is returned (counts and dispositions) before the window rules and the paging escape hatch. Every sentence carries distinct information and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating the returned fields (total, DMARC pass, DMARC fail, disposition) plus the truncated flag, and it covers defaults, clamping, and paging. An agent has everything needed to call this correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description earns an extra point by adding parameter meaning the schema omits: the 365-day clamp, the 50-day truncation with a truncated flag, and the backward-paging pattern using day_before. It does not restate the domain filter semantics, but the schema already covers those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource and output shape: per-day message counts broken into total, DMARC pass, DMARC fail, and disposition buckets, with message-weighted semantics. That is far more specific than a tautology. It stops short of a 5 because it never contrasts itself with sibling tools like get_report_records or query_records that an agent might otherwise pick for DMARC data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is operational rather than selective: it explains the default 30-day window, the 365-day clamp, the 50-day truncation, and how to page backward with an earlier day_before. That is genuinely useful, but there is no statement of when to choose this tool over the sibling reporting tools, which is the main when-to-use decision an agent faces.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_domainGet domainB
Read-only

One domain by id, including its published DMARC policy snapshot and the RUA tag to publish.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDomain id from list_domains.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful content disclosure (the response includes a DMARC policy snapshot and the RUA tag to publish), but with no output schema it does not describe remaining fields, auth needs, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence with no filler, front-loaded on the resource and key. It is a noun-phrase fragment rather than a full sentence, and 'the RUA tag to publish' is slightly compressed, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-record getter with annotations covering safety and a fully documented parameter, the definition is adequate. With no output schema, however, the description only partially describes the return payload and omits behaviors such as not-found handling, so a gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required id parameter with 100% schema description coverage, including the hint that it comes from list_domains. The description adds nothing about the id beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (one domain) and its retrieval key (by id), and lists the distinctive payload it returns (DMARC policy snapshot, RUA tag), so an agent can separate it from list_domains. It lacks an explicit verb and does not name a sibling directly, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the 'by id' phrasing and the schema note that the id comes from list_domains suggest a list-then-detail flow. There is no explicit when-to-use statement, no exclusions, and no named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reporter_coverageReporter coverageA
Read-only

One row per receiving mailbox provider (the DMARC reporter_org), with message-weighted pass/fail counts and sources_seen. Sorted by volume descending. At most 50 rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoDomain id. Omit to include every domain on the token.
day_afterNoInclusive lower bound, YYYY-MM-DD. Default is 30 days ago.
day_beforeNoInclusive upper bound, YYYY-MM-DD. Default is today.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: the row granularity, the sort order (volume descending), and the hard cap of 50 rows, which tells the agent results are truncated rather than complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, and the most important fact (what a row represents) is front-loaded. The sort order and row cap follow as useful qualifiers rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the necessary work of explaining the returned row shape, its fields, ordering, and cardinality cap. It omits only the default date-window behavior, which the schema already supplies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so domain, day_after, and day_before are fully documented in the schema, including defaults. The description adds no additional parameter meaning, which is the expected baseline when the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource precisely: one row per receiving mailbox provider (DMARC reporter_org) with message-weighted pass/fail counts. An agent knows exactly what data comes back, though it never names a contrasting sibling such as get_alignment_summary to differentiate scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance. With siblings like get_alignment_summary and list_sending_sources that also summarize DMARC data, the description leaves the agent to infer which tool answers which question.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_report_recordsRecords inside one aggregate reportA
Read-only

Re-parses one aggregate XML into per-record rows (source, count, alignment, disposition, identifiers). Third-party strings are length-capped. At most 50 rows. When truncated is true, pass next_offset back as offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAggregate report id.
offsetNonext_offset from a truncated response.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, non-destructive), so the description's added value is real: it discloses that third-party strings are length-capped (lossy output), caps results at 50 rows, and defines the truncation/next_offset contract. That is genuine behavioral context beyond the structured fields, though it omits error behavior for an invalid id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, each carrying distinct information: what is produced, what is degraded, and how to page. The pagination rule is stated last where it is needed, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned row fields (source, count, alignment, disposition, identifiers) and the truncation flag, so the agent knows the shape of the result. The remaining gap is routing: it never says how to obtain the report id or when this beats query_records.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are documented there, so the baseline is 3. The description only reinforces the schema by explaining the next_offset → offset round-trip, adding no syntax or format detail the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: re-parses one aggregate XML into per-record rows, and enumerates the row fields. Clear what it produces, though it never names which sibling to use first (list_aggregate_reports) to obtain the id it requires.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'one aggregate XML' plus the pagination instruction ('when truncated is true, pass next_offset back as offset'), which tells the agent how to continue an existing sequence. It gives no when-to-use vs query_records or list_aggregate_reports, and no preconditions beyond the pagination loop.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_aggregate_reportsList aggregate reportsA
Read-only

One row per ingested aggregate XML. Use the id with get_report_records. Does not follow pagination: when truncated is true, pass next_cursor back as cursor. The cursor carries the filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNo
domainNo
reporter_orgNoSubstring of the reporter name.
date_end_afterNoISO-8601 timestamp.
date_end_beforeNoISO-8601 timestamp.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe read-only profile, so the bar is lower, and the description clears it by disclosing a non-obvious pagination contract: it does not follow standard pagination, truncation is signalled by 'truncated', and 'next_cursor' must be passed back as 'cursor'. This is exactly the kind of behavior an agent could not infer from structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each carrying distinct information: result shape, downstream use, pagination quirk, cursor semantics. Front-loaded with the row semantics and free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must document the return fields, and it does name 'truncated' and 'next_cursor' and explain their meaning. Filter parameters (domain, reporter_org, date bounds) are left untouched, but their names are largely self-describing, so the omission is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 60%, and 'cursor' has no schema description at all. The description compensates by explaining what the cursor is for ('The cursor carries the filters') and how to advance it, which is the highest-risk parameter to get wrong. The filter params remain undocumented, so it does not fully close the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource and its granularity precisely: 'One row per ingested aggregate XML.' Combined with the name, an agent knows exactly what is returned, and the mention of get_report_records begins to separate it from siblings. It stops short of explicitly stating what filters scope the list, which keeps it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear downstream step ('Use the id with get_report_records') and explains the pagination protocol, which is genuine usage guidance. However, it never says when to choose this over siblings like query_records or get_alignment_summary, so alternative selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_domainsList domainsA
Read-only

Domains registered on this token's organisation. Pass fqdn for an exact hostname match (case-insensitive, trailing dot stripped). Returns ids the other tools take as domain.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqdnNoExact domain name, e.g. mailfact.app.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, non-destructive, openWorld), so the bar is lower. The description still adds real context the annotations lack: the result set is scoped to the token's organisation, matching is case-insensitive with a trailing dot stripped, and the returned ids are the identifiers other tools accept. It does not address pagination or result size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler; the resource scope, the filter behavior, and the return contract each appear once and in a sensible order. Nothing could be cut without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must carry the return contract, and it does so at a useful level: the ids other tools consume. Minor gaps remain around result count, ordering, and pagination, but for a one-parameter read tool this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already documents fqdn as an exact domain name. The description adds semantics the schema omits, notably case-insensitive matching and trailing-dot normalization, which materially affect how the caller should format the value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (domains), plus the scoping qualifier 'registered on this token's organisation'. An agent can distinguish it from get_domain by the list-vs-single semantics, though the sibling is never named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a usage cue for the fqdn parameter ('Pass fqdn for an exact hostname match') but never states when to prefer this tool over get_domain or the other listing tools. Usage is implied by the resource scope rather than made explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sending_sourcesSending sourcesA
Read-only

One row per sending IP (default), autonomous system, or From domain. Counts are message-weighted, including spf_passed and dkim_passed. Identity strings are the greatest value seen in the window and are length-capped. Sorted by volume descending. At most 50 rows; truncated is true when more existed.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoDomain id. Omit to include every domain on the token.
group_byNoBucket key. Default source_ip.
day_afterNoInclusive lower bound, YYYY-MM-DD. Default is 30 days ago.
day_beforeNoInclusive upper bound, YYYY-MM-DD. Default is today.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, non-destructive, open-world), so the description's job is added context — and it delivers: message-weighted counts, greatest-value-wins identity strings that are length-capped, volume-descending sort, a hard 50-row limit, and a 'truncated' flag. It does not mention auth scope or latency, but the return-behavior disclosure is unusually rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, each carrying a distinct fact (granularity, weighting, identity capping, sort/limit). Information is front-loaded with the row shape. Slightly dense with no explicit lead verb, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain the shape of the return, and it does: one row per bucket, weighted counts, capped identity strings, sort order, row cap and truncation signal. Combined with a fully documented input schema and safety annotations, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so per the rubric the baseline is 3 and the schema already documents domain, group_by, day_after and day_before. The description confirms the source_ip default and clarifies that window bounds are inclusive via the schema rather than adding new syntax, so it adds only marginal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource (sending IPs / autonomous systems / From domains) and the row granularity, plus sorting and the default grouping, so an agent can tell what this returns. It does not explicitly contrast itself with siblings like get_alignment_summary or query_records, but the construct is specific enough to be distinguished.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives such as list_aggregate_reports or query_records, and no prerequisites or exclusions. The default 30-day window and grouping behavior are only implied by the schema, not framed as usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_recordsQuery fact rowsA
Read-only

Day-aggregated fact rows. Use this to drill into one IP, day, or alignment outcome. Does not follow pagination: when truncated is true, pass next_cursor back as cursor. The cursor carries the filters, so the follow-up does not need to restate them. Rows are narrowed and third-party strings are length-capped.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNoExact day, YYYY-MM-DD.
cursorNonext_cursor from a previous truncated response.
domainNo
day_afterNo
source_ipNoExact sending IP.
day_beforeNo
dispositionNo
header_fromNoSubstring of the From domain.
spf_alignedNo
dkim_alignedNo
reporter_orgNoSubstring of the reporter name.
source_ip_asnNo
source_ip_nameNoSubstring of the sender label.
source_ip_as_nameNoSubstring of the AS name.
source_ip_countryNoISO 3166-1 alpha-2.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, non-destructive, open-world), so the bar is lower. The description adds genuinely useful behavior beyond that: rows are narrowed, third-party strings are length-capped, and pagination is non-standard (truncated/next_cursor contract). It doesn't mention auth or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five tight sentences, front-loaded with what the rows are, no repetition, and the pagination contract is stated as a concrete action rather than prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, so the description must carry return semantics, and it does mention truncation/cursor and length-capping. It still doesn't say what a row contains or the shape of the response, but it is adequate for a parameter-driven query tool with strong annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 53%, so several params (domain, day_after, day_before, disposition, alignment booleans) lack descriptions while others (day, cursor, source_ip) are self-evident. The description adds filter semantics for alignment outcome and cursor but does not document the unlabeled parameters, leaving the coverage gap only partially filled.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the resource concretely ('day-aggregated fact rows') and names usable drill axes (IP, day, alignment outcome), which distinguishes its granularity from aggregate/report siblings. It stops short of naming a specific sibling alternative, so an agent still has to infer when to prefer it over get_report_records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('drill into one IP, day, or alignment outcome') and an explicit continuation protocol for truncation, including that the cursor carries filters. No exclusions or named alternatives are stated, so it doesn't reach 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whoamiToken identityB
Read-only

The organisation this token is bound to, and the resolved plan features (api_tokens_enabled, retention_days, and the rest). user is null for an API token.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine value by noting that user is null for an API token, which is a real behavioral quirk an agent must handle. However, it does not describe response shape or what 'the rest' of the plan features contains, and there is no output schema to fall back on.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A compact two-clause sentence with no padding, and the most important content (what identity is returned) comes first. The phrase 'and the rest' is loose and slightly undercuts the precision, keeping it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of explaining return values. It names api_tokens_enabled, retention_days, and the user-null case, but dismisses the remaining fields as 'the rest', leaving an agent unsure what else to expect from a plan-features payload.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. Nothing in the description is needed to explain inputs, and nothing about the input contract is ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource precisely: the organisation the token is bound to plus resolved plan features, and it clarifies the user field semantics for API tokens. It reads as a noun phrase rather than an explicit verb+resource, so it is clear but slightly less crisp than a well-formed definition. No sibling overlaps with identity/plan inspection, so differentiation is not needed here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this tool, when not to, or what alternatives exist. The zero-parameter, obviously diagnostic nature of the tool makes usage inferable, but the description itself provides no guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.0
    • First observedget_alignment_summary
    • First observedget_domain
    • First observedget_report_records
    • First observedget_reporter_coverage
    • First observedlist_aggregate_reports
    • First observedlist_domains
    • First observedlist_sending_sources
    • First observedquery_records
    • First observedwhoami

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation4/5

Most tools target distinct resources (domains, summaries, reporter orgs, sending sources, raw reports), and descriptions clarify boundaries. However, the record-oriented trio (query_records, get_report_records, list_aggregate_reports) plus get_alignment_summary overlap conceptually, so an agent may hesitate between drilling into records versus reports.

Naming Consistency4/5

Names follow a clean verb_noun pattern (list_domains, get_domain, get_alignment_summary, list_sending_sources, query_records). The only deviation is whoami, which is idiomatic but breaks the pattern slightly.

Tool Count5/5

Nine tools is well-scoped for a DMARC aggregate-reporting server, with each tool earning its place across domains, summaries, coverage, sources, and raw records.

Completeness4/5

The read-only reporting surface is broadly complete: domains, policy snapshots, daily summaries, reporter coverage, sending sources, and raw report access are all present. Minor gap: no mutation tools (e.g. registering a domain or publishing a DMARC policy), though read-only may be the intended scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only inspection of Google Ads accounts through MCP, including account inventory, reporting, metadata, change history, and safe GAQL queries.
    Apache 2.0
  • F
    license
    C
    quality
    B
    maintenance
    Provides read-only access to a MySQL inventory and invoicing database through MCP tools, enabling safe SQL queries, table inspection, and financial reporting without any write capabilities.
    13
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables read-only access to Autobase Console projects, clusters, environments, operations, PostgreSQL versions, and extensions through configurable MCP tools. Supports paginated listing and filtering, with limited redacted operation logs and no write or arbitrary execution tools.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables authenticated, read-only access to mailbox folders, tags, message metadata, and message text via MCP, while preventing send, draft, delete, move, tag-change, contact/calendar changes, and attachment downloads.
    MIT