Koskamo

Email Spam Tester MCP

An MCP server for email deliverability testing that allows agents to reserve disposable addresses, send test emails, and retrieve detailed reports containing 42 technical checks with RFC citations, spam scores, and inbox placement data.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Email Spam Tester MCP logo, by Serhii TanichevCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by Serhii Tanichev
MCP endpoint (Streamable HTTP)
https://email-spam-tester.com/mcp
Vendor documentation

What its tools do

4 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Can change data (1)

4 of 4 have a description · 4 of 4 declare behavior hints · 4 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Warning Does not report a server version
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Reserve a disposable email address for testing
  • Retrieve a detailed spam score and technical check report
  • Check inbox placement across major providers like Gmail and Outlook
  • Analyze raw message headers and source code

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
email-spam-tester unreported
MCP protocol negotiated in check
2025-11-25
Tools
4 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Test an email before sending it. Call get_test_address, have the draft sent to the address it returns (with include_placement, to every recipient it lists, with the marker in the subject), then call wait_for_report with the slug. Fix what it reports, then test again with a fresh address. Scores are comparable between runs.

Tools

4 advertised

get_test_address — Get a test address
Advertised by the server during the last successful anonymous check.
Open-world

Reserve a single-use address to send a draft email to, for a full check. Returns the address and the URL its report will appear at. The address accepts exactly one message and expires after an hour. The email has to be sent by the person, from the platform or mailbox they really send from: half the checks read what that platform adds. The report covers 42 checks (SPF, DKIM, DMARC, reverse DNS, TLS, blocklists, content, links, the Gmail and Yahoo bulk-sender rules) and a plan of what to fix. lang is decided now because the message arrives minutes later over SMTP, which carries no hint of who is waiting for it. What wait_for_report returns quotes check lines in English whatever it is set to; the person following report_url sees their own language.

get_test_address input schema
{
  "type": "object",
  "title": "get_test_addressArguments",
  "properties": {
    "lang": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Lang",
      "default": null,
      "description": "ISO code of the language the report and the fix plan are written in for the person who opens the report page, for example \"en\", \"de\" or \"pt-BR\". Defaults to the language of the conversation. Unknown codes fall back to English."
    },
    "include_placement": {
      "type": "boolean",
      "title": "Include Placement",
      "default": false,
      "description": "Also check which folder (inbox, spam, promotions) the email lands in at different mailbox providers, from the same send. The email then goes to a list of recipients instead of one address and needs a marker in the subject; both come back. Some provider inboxes are public test inboxes: the subject, the sender name and the folder are shown on a public web page, so it suits messages that are not confidential."
    }
  }
}
get_test_address output schema
{
  "type": "object",
  "title": "Output",
  "required": [
    "view"
  ],
  "properties": {
    "view": {
      "type": "string",
      "title": "View",
      "description": "Which card to draw."
    }
  },
  "description": "What every tool returns for the card; `view` says which card.",
  "additionalProperties": true
}
get_test_address annotations
{
  "title": "Get a test address",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
wait_for_report — Wait for the report
Advertised by the server during the last successful anonymous check.
Advertised read-only

Wait until the message arrives and has been analysed, then summarise it. Call it after the email has been sent to the address from get_test_address. Blocks rather than returning "not ready yet": an agent told to poll writes a sleep loop and usually gives up before the analysis finishes. Provider placement keeps filling in for up to 30 minutes after the report; get_report reads the latest.

wait_for_report input schema
{
  "type": "object",
  "title": "wait_for_reportArguments",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "title": "Slug",
      "description": "The slug get_test_address returned, the last part of the report URL."
    },
    "timeout_seconds": {
      "type": "integer",
      "title": "Timeout Seconds",
      "default": 150,
      "maximum": 600,
      "minimum": 5,
      "description": "How long to block waiting for the message and its analysis, in seconds. The checks are ready in well under a minute; the fix plan takes about another one. Past this the tool returns what it has."
    }
  }
}
wait_for_report output schema
{
  "type": "object",
  "title": "Output",
  "required": [
    "view"
  ],
  "properties": {
    "view": {
      "type": "string",
      "title": "View",
      "description": "Which card to draw."
    }
  },
  "description": "What every tool returns for the card; `view` says which card.",
  "additionalProperties": true
}
wait_for_report annotations
{
  "title": "Wait for the report",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_report — Read a report
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a report by its slug without waiting, with provider placement so far. The report stays at its link for good and anyone with the link can read it: the checks, the score, the fix plan, and the subject and sender of the email.

get_report input schema
{
  "type": "object",
  "title": "get_reportArguments",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "title": "Slug",
      "description": "The slug of a test, the last part of the report URL."
    }
  }
}
get_report output schema
{
  "type": "object",
  "title": "Output",
  "required": [
    "view"
  ],
  "properties": {
    "view": {
      "type": "string",
      "title": "View",
      "description": "Which card to draw."
    }
  },
  "description": "What every tool returns for the card; `view` says which card.",
  "additionalProperties": true
}
get_report annotations
{
  "title": "Read a report",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_message_source — Read the received message
Advertised by the server during the last successful anonymous check.
Advertised read-only

The message exactly as it was received: headers, both bodies, source. Useful when a finding points at a header and the agent needs to see what it actually sent rather than what it believes it sent. The message is kept for an hour after it arrives and then deleted; within that hour anyone with the slug can read it. After that only the report remains.

get_message_source input schema
{
  "type": "object",
  "title": "get_message_sourceArguments",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "title": "Slug",
      "description": "The slug of a test whose message has already arrived."
    }
  }
}
get_message_source output schema
{
  "type": "object",
  "title": "get_message_sourceOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "string",
      "title": "Result"
    }
  }
}
get_message_source annotations
{
  "title": "Read the received message",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

0 advertised

No prompt definitions available.

Resources

1 advertised

email-spam-tester-card — Email Spam Tester card

Advertised by the server during the last successful anonymous check.

The test address, the report and provider placement.

email-spam-tester-card URI
ui://widget/email-spam-tester-v3.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
5698 ms
95th percentile latency
5698 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 5698 ms · metadata changed · 4 tool(s), 1 resource(s), 0 resource template(s), 0 prompt(s); warnings: Does not report a server version

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http email-spam-tester-mcp https://email-spam-tester.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add email-spam-tester-mcp --url https://email-spam-tester.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable email-spam-tester-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "email-spam-tester-mcp": {
      "url": "https://email-spam-tester.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "email-spam-tester-mcp": {
      "type": "streamableHttp",
      "url": "https://email-spam-tester.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start email-spam-tester-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "email-spam-tester-mcp": {
      "type": "http",
      "url": "https://email-spam-tester.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http email-spam-tester-mcp https://email-spam-tester.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://email-spam-tester.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "email-spam-tester-mcp": {
      "serverUrl": "https://email-spam-tester.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Email Spam Tester MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.