SpamTitan API Patterns — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited SpamTitan API Patterns (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The SpamTitan MCP server provides AI tool integration with the SpamTitan email security platform by TitanHQ. It exposes tools covering quarantine queue management, email flow statistics, and sender allowlist/blocklist management. The API uses an API key passed as an HTTP header.
SpamTitan authenticates using an API key passed via HTTP header:
| Header | Description |
|---|---|
X-SpamTitan-API-Key | Your SpamTitan API key |
Generate credentials at: SpamTitan Admin Interface > Settings > API
Environment Variables:
export SPAMTITAN_API_KEY="your-api-key"IMPORTANT: Never hardcode credentials. Always use environment variables.
The server registers nine tools. There is no separate list tool for either sender list and no separate per-domain statistics tool — both capabilities are arguments on the tools below.
| Tool | Parameters | Description |
|---|---|---|
spamtitan_get_queue | page, per_page, sender, recipient, subject, reason | List messages in the quarantine queue. No `domain` parameter — see the warning below. |
spamtitan_get_message | message_id (required) | Get details for a specific quarantined message |
spamtitan_release_message | message_id (required) | Release a quarantined message to the recipient |
spamtitan_delete_message | message_id (required) | ⚠ Permanently delete a quarantined message. Irreversible |
On a multi-tenant appliance the listing therefore spans every tenant, and per-customer filtering has to be done client-side on recipient after the fetch. This is easy to miss because the sibling spamtitan_get_stats does take domain. See the quarantine skill and GOVERNANCE.md.
| Tool | Parameters | Description | ||||
|---|---|---|---|---|---|---|
spamtitan_get_stats | period (today\ | yesterday\ | last_7_days\ | last_30_days\ | last_90_days), domain | Email flow statistics. Pass domain for a single customer's numbers |
Per-domain statistics are real — they are the domain argument on this tool, not a separate tool.
| Tool | Parameters | Description | ||
|---|---|---|---|---|
spamtitan_manage_allowlist | action (required: add\ | remove\ | list), sender, note | Add, remove, or list sender allowlist entries |
spamtitan_manage_blocklist | action (required: add\ | remove\ | list), sender, note | ⚠ HIGH-IMPACT. Add, remove, or list sender blocklist entries. Changes deliverability for real users |
Listing is action: "list" on the same tool — there is no separate list tool. action is the only required parameter; sender is required by the handler for add and remove. Omitting action makes the server elicit it from the caller, which an unattended agent cannot answer.
| Tool | Parameters | Description |
|---|---|---|
spamtitan_status | — | Show credentials status and available domains |
spamtitan_navigate | domain (required) | Discover tools by domain. This domain is a tool category, not a mail domain |
The quarantine queue uses page/per-page pagination:
page (1-based) and per_page (default 50, max 200)per_pageExample workflow:
spamtitan_get_queue with page=1, per_page=100page=2per_page results are returnedSpamTitan enforces API rate limits per API key:
| Code | Meaning | Resolution |
|---|---|---|
| 401 | Unauthorized | Check X-SpamTitan-API-Key header value |
| 403 | Forbidden | Insufficient API key permissions |
| 404 | Not Found | Resource doesn't exist or wrong ID |
| 422 | Unprocessable Entity | Invalid request parameters |
| 429 | Rate Limited | Wait and retry after delay |
| 500 | Server Error | Retry; contact TitanHQ support if persistent |
{
"error": {
"code": 401,
"message": "Invalid or missing API key"
}
}sender,recipient, subject, reason — rather than paging the whole appliance. There is no date filter and no domain filter on spamtitan_get_queue.
recipient (a fulladdress) or filter the results client-side on the recipient's domain. Do not tell an operator the listing is scoped to their customer when it is not.
spamtitan_get_stats does accept domain, so per-customer statistics aregenuinely scoped server-side. The asymmetry with the queue is the trap.
message_idper call. Iterate deliberately and confirm each destructive call.
using the note parameter on spamtitan_manage_allowlist / spamtitan_manage_blocklist
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.