Abnormal Security Cases
Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and remediation actions, and phishing simulation handling.
Install
npx skills add https://github.com/WYRE-AI/msp-claude-plugins/tree/main/msp-claude-plugins/abnormal/abnormal-security/skills/cases
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install wyre-ai-msp-claude-plugins@llmmart
git clone https://github.com/WYRE-AI/msp-claude-plugins.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole wyre-ai/msp-claude-plugins collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Abnormal Security Abuse Mailbox Cases
Overview
Abnormal Security's Abuse Mailbox automatically processes user-reported suspicious emails. When users forward or report emails to a designated abuse mailbox address, Abnormal analyzes the reported message and creates a case with an AI-generated judgment. This skill covers case lifecycle, triage workflows, remediation actions, and bulk operations.
Anti-triggers
- A compromised mailbox rather than a reported email — sign-in
anomalies, new inbox rules, and session revocation have no surface on
this server at all; investigate identity in the M365 tenant, use
cipp-users. - Threats Abnormal found on its own — no user reported them, so no
case exists; use
Abnormal Security Threats. - User-reported phishing in a different platform — IRONSCALES runs
its own report-to-incident loop from its Outlook and Gmail add-ins,
with separate IDs and its own classification verbs; use
IRONSCALES Incidents. - A user who reported a simulated phish — campaign reporting rates
belong to the training platform; use
KnowBe4 Phishing.
Case Lifecycle
User Reports Email
|
v
Case Created (status: Open)
|
v
AI Analysis (judgment generated)
|
+---> Malicious ---> Auto-Remediate (if configured)
|
+---> Suspicious ---> Analyst Review Required
|
+---> Spam ---> Auto-Dismiss (if configured)
|
+---> Safe ---> Auto-Dismiss (if configured)
|
v
Analyst Action
|
+---> Remediate (quarantine/delete across org)
|
+---> Mark Not Spam (release to inbox)
|
+---> Dismiss (close case, no action)
|
v
Case Closed (status: Done)
Case Field Reference
Core Fields
| Field | Type | Description |
|---|---|---|
caseId |
number | Unique case identifier — numeric, unlike threatId |
severity |
string | Severity level of the case |
affectedEmployee |
string | Email address of the user who reported |
firstReported |
datetime | When the case was first reported |
Judgment Fields
| Field | Type | Description |
|---|---|---|
overallStatus |
string | Case status: Open, Acknowledged, Done |
judgmentStatus |
string | AI judgment: Malicious, Spam, Safe, No Action Needed |
customerVisibleTime |
datetime | When the case became visible in portal |
Reported Message Fields
| Field | Type | Description |
|---|---|---|
reportedMessage.subject |
string | Subject of the reported email |
reportedMessage.senderAddress |
string | Sender of the reported email |
reportedMessage.senderName |
string | Display name of the sender |
reportedMessage.recipientAddress |
string | Recipient of the reported email |
reportedMessage.receivedTime |
datetime | When the reported email was received |
reportedMessage.attackType |
string | Detected attack type (if malicious) |
Case Judgments
| Judgment | Description | Recommended Action |
|---|---|---|
| Malicious | Confirmed threat (BEC, phishing, malware) | Remediate across organization |
| Spam | Unsolicited bulk email, marketing | Dismiss or move to junk |
| Safe | Legitimate email, no threat detected | Dismiss, notify user it is safe |
| No Action Needed | Phishing simulation or already remediated | Dismiss |
MCP Tools
The cases domain is read-only. Two tools, both GETs. There is no tool that changes a case's state, assigns it to an analyst, dismisses it, or closes it. Case state changes happen in the Abnormal portal, not through this server — an agent can read and reason about a case, then it has to hand the actual disposition to a human in the UI.
| Tool | Description | Parameters |
|---|---|---|
abnormal_cases_list |
List cases | pageSize (default 100, max 100), pageNumber (1-indexed), filter (OData string) |
abnormal_cases_get |
Get one case by ID | caseId (required, number) |
There is no date-range parameter. Narrow by time through the OData
filter string: createdTime gt 2026-03-01T00:00:00Z.
ID vocabulary
caseId is a number — 12345, not "12345". The neighbouring
threatId used by abnormal_threats_get is a UUID string. Both are
called "the ID" in conversation and they are not interchangeable; a
threat UUID passed to abnormal_cases_get is a type error, not a lookup
miss.
The one action this server can take on the mail behind a case is
message remediation, and it is reached through the threat, not the case:
abnormal_remediation_manage needs a threatId and a messageId, and a
caseId is neither.
Tool Usage Examples
List cases from this month:
{
"tool": "abnormal_cases_list",
"parameters": {
"filter": "createdTime gt 2026-03-01T00:00:00Z",
"pageSize": 25
}
}
Get case details:
{
"tool": "abnormal_cases_get",
"parameters": {
"caseId": 12345
}
}
Triage Workflows
Standard Triage Workflow
- List open cases - Get all cases with
overallStatus eq 'Open' - Sort by severity - Address critical and high severity first
- Review AI judgment:
- If Malicious: verify and remediate across organization
- If Spam: dismiss or move to junk
- If Safe: dismiss and respond to reporter
- If No Action Needed: dismiss (likely phishing simulation)
- Decide - produce the disposition and the evidence for it
- Hand off - the case's own state (Open → Acknowledged → Done) can
only be changed in the Abnormal portal. If mail still needs pulling
from inboxes, that runs through the threat:
abnormal_messages_listthenabnormal_remediation_manageper message.
Bulk Triage Workflow
- Filter cases by judgment - Start with cases judged as Malicious
- Review Suspicious - Manually review cases without clear judgment
- Batch the read, not the write - paginate
abnormal_cases_listto build the full picture in one pass. There is no bulk case action to follow it with; dispositions are entered in the portal one at a time.
Escalation Criteria
Escalate a case when:
- Multiple users report the same email
- The reported email impersonates an executive
- The email contains active malware or ransomware
- Credentials may have been entered on a phishing page
- The sender is a known vendor or partner (supply chain risk)
Case Actions — where they actually happen
The dispositions below are portal actions. None of them is an MCP tool, and none can be driven from this server.
| Disposition | Effect | Where |
|---|---|---|
| Remediate | Remove the email from recipients' inboxes | Abnormal portal — or, per message, via abnormal_remediation_manage on the underlying threat |
| Mark not spam | Release email back to inbox | Abnormal portal only |
| Dismiss | Close case without action | Abnormal portal only |
The gap matters for automation design: an agent can fully triage the
queue from abnormal_cases_list and abnormal_cases_get, but the case
stays Open until a human touches the portal. Write the handoff into the
workflow rather than assuming the agent closed anything.
Error Handling
Common API Errors
| Code | Message | Resolution |
|---|---|---|
| 400 | Invalid filter | Check OData filter syntax |
| 401 | Unauthorized | Check API token |
| 403 | Insufficient permissions | Token needs abuse mailbox scope |
| 404 | Case not found | Verify the case ID — and that you passed a numeric caseId, not a threat UUID |
| 429 | Rate limited | Wait and retry |
Best Practices
- Triage daily - Review abuse mailbox cases at least once per day
- Trust the AI judgment - Abnormal's accuracy is high; use it to prioritize
- Remediate every message, not "the case" - remediation is per message on the underlying threat; loop
abnormal_remediation_manageand confirm each one, or you will leave the campaign half-pulled - Respond to reporters - Let users know their report was reviewed
- Track phishing simulation reports - Monitor security awareness training effectiveness
- Correlate with threats - Check if reported emails match known threat campaigns
- Monitor false positive rate - High FP rates may indicate policy tuning needed
Related Skills
- Abnormal Threats - Threat detection and analysis
- Abnormal Messages - Message analysis
- Abnormal API Patterns - API authentication and usage
Files (msp-claude-plugins)
-
SKILL.md 9.1 KB
--- name: "Abnormal Security Cases" description: > Abnormal Security abuse mailbox cases: user-reported email submissions, case statuses and judgments, the case lifecycle, bulk and remediation actions, and phishing simulation handling. when_to_use: >- When triaging or remediating user-reported suspicious emails in the Abnormal Security abuse mailbox. Use when: abnormal case, abuse mailbox, user reported email, reported phishing, case triage, case review, abnormal cases, abuse case management, phishing report, user submission, case remediation, or case judgment. --- # Abnormal Security Abuse Mailbox Cases ## Overview Abnormal Security's Abuse Mailbox automatically processes user-reported suspicious emails. When users forward or report emails to a designated abuse mailbox address, Abnormal analyzes the reported message and creates a case with an AI-generated judgment. This skill covers case lifecycle, triage workflows, remediation actions, and bulk operations. ## Anti-triggers - **A compromised mailbox rather than a reported email** — sign-in anomalies, new inbox rules, and session revocation have no surface on this server at all; investigate identity in the M365 tenant, use `cipp-users`. - **Threats Abnormal found on its own** — no user reported them, so no case exists; use `Abnormal Security Threats`. - **User-reported phishing in a different platform** — IRONSCALES runs its own report-to-incident loop from its Outlook and Gmail add-ins, with separate IDs and its own classification verbs; use `IRONSCALES Incidents`. - **A user who reported a simulated phish** — campaign reporting rates belong to the training platform; use `KnowBe4 Phishing`. ## Case Lifecycle ``` User Reports Email | v Case Created (status: Open) | v AI Analysis (judgment generated) | +---> Malicious ---> Auto-Remediate (if configured) | +---> Suspicious ---> Analyst Review Required | +---> Spam ---> Auto-Dismiss (if configured) | +---> Safe ---> Auto-Dismiss (if configured) | v Analyst Action | +---> Remediate (quarantine/delete across org) | +---> Mark Not Spam (release to inbox) | +---> Dismiss (close case, no action) | v Case Closed (status: Done) ``` ## Case Field Reference ### Core Fields | Field | Type | Description | |-------|------|-------------| | `caseId` | number | Unique case identifier — numeric, unlike `threatId` | | `severity` | string | Severity level of the case | | `affectedEmployee` | string | Email address of the user who reported | | `firstReported` | datetime | When the case was first reported | ### Judgment Fields | Field | Type | Description | |-------|------|-------------| | `overallStatus` | string | Case status: Open, Acknowledged, Done | | `judgmentStatus` | string | AI judgment: Malicious, Spam, Safe, No Action Needed | | `customerVisibleTime` | datetime | When the case became visible in portal | ### Reported Message Fields | Field | Type | Description | |-------|------|-------------| | `reportedMessage.subject` | string | Subject of the reported email | | `reportedMessage.senderAddress` | string | Sender of the reported email | | `reportedMessage.senderName` | string | Display name of the sender | | `reportedMessage.recipientAddress` | string | Recipient of the reported email | | `reportedMessage.receivedTime` | datetime | When the reported email was received | | `reportedMessage.attackType` | string | Detected attack type (if malicious) | ## Case Judgments | Judgment | Description | Recommended Action | |----------|-------------|-------------------| | **Malicious** | Confirmed threat (BEC, phishing, malware) | Remediate across organization | | **Spam** | Unsolicited bulk email, marketing | Dismiss or move to junk | | **Safe** | Legitimate email, no threat detected | Dismiss, notify user it is safe | | **No Action Needed** | Phishing simulation or already remediated | Dismiss | ## MCP Tools **The cases domain is read-only.** Two tools, both GETs. There is no tool that changes a case's state, assigns it to an analyst, dismisses it, or closes it. Case state changes happen in the Abnormal portal, not through this server — an agent can read and reason about a case, then it has to hand the actual disposition to a human in the UI. | Tool | Description | Parameters | |------|-------------|------------| | `abnormal_cases_list` | List cases | `pageSize` (default 100, max 100), `pageNumber` (1-indexed), `filter` (OData string) | | `abnormal_cases_get` | Get one case by ID | `caseId` (required, **number**) | There is no date-range parameter. Narrow by time through the OData `filter` string: `createdTime gt 2026-03-01T00:00:00Z`. ### ID vocabulary `caseId` is a **number** — `12345`, not `"12345"`. The neighbouring `threatId` used by `abnormal_threats_get` is a **UUID string**. Both are called "the ID" in conversation and they are not interchangeable; a threat UUID passed to `abnormal_cases_get` is a type error, not a lookup miss. The one action this server *can* take on the mail behind a case is message remediation, and it is reached through the threat, not the case: `abnormal_remediation_manage` needs a `threatId` and a `messageId`, and a `caseId` is neither. ### Tool Usage Examples **List cases from this month:** ```json { "tool": "abnormal_cases_list", "parameters": { "filter": "createdTime gt 2026-03-01T00:00:00Z", "pageSize": 25 } } ``` **Get case details:** ```json { "tool": "abnormal_cases_get", "parameters": { "caseId": 12345 } } ``` ## Triage Workflows ### Standard Triage Workflow 1. **List open cases** - Get all cases with `overallStatus eq 'Open'` 2. **Sort by severity** - Address critical and high severity first 3. **Review AI judgment:** - If Malicious: verify and remediate across organization - If Spam: dismiss or move to junk - If Safe: dismiss and respond to reporter - If No Action Needed: dismiss (likely phishing simulation) 4. **Decide** - produce the disposition and the evidence for it 5. **Hand off** - the case's own state (Open → Acknowledged → Done) can only be changed in the Abnormal portal. If mail still needs pulling from inboxes, that runs through the threat: `abnormal_messages_list` then `abnormal_remediation_manage` per message. ### Bulk Triage Workflow 1. **Filter cases by judgment** - Start with cases judged as Malicious 2. **Review Suspicious** - Manually review cases without clear judgment 3. **Batch the read, not the write** - paginate `abnormal_cases_list` to build the full picture in one pass. There is no bulk case action to follow it with; dispositions are entered in the portal one at a time. ### Escalation Criteria Escalate a case when: - Multiple users report the same email - The reported email impersonates an executive - The email contains active malware or ransomware - Credentials may have been entered on a phishing page - The sender is a known vendor or partner (supply chain risk) ## Case Actions — where they actually happen The dispositions below are portal actions. None of them is an MCP tool, and none can be driven from this server. | Disposition | Effect | Where | |-------------|--------|-------| | Remediate | Remove the email from recipients' inboxes | Abnormal portal — or, per message, via `abnormal_remediation_manage` on the underlying threat | | Mark not spam | Release email back to inbox | Abnormal portal only | | Dismiss | Close case without action | Abnormal portal only | The gap matters for automation design: an agent can fully triage the queue from `abnormal_cases_list` and `abnormal_cases_get`, but the case stays Open until a human touches the portal. Write the handoff into the workflow rather than assuming the agent closed anything. ## Error Handling ### Common API Errors | Code | Message | Resolution | |------|---------|------------| | 400 | Invalid filter | Check OData filter syntax | | 401 | Unauthorized | Check API token | | 403 | Insufficient permissions | Token needs abuse mailbox scope | | 404 | Case not found | Verify the case ID — and that you passed a numeric `caseId`, not a threat UUID | | 429 | Rate limited | Wait and retry | ## Best Practices 1. **Triage daily** - Review abuse mailbox cases at least once per day 2. **Trust the AI judgment** - Abnormal's accuracy is high; use it to prioritize 3. **Remediate every message, not "the case"** - remediation is per message on the underlying threat; loop `abnormal_remediation_manage` and confirm each one, or you will leave the campaign half-pulled 4. **Respond to reporters** - Let users know their report was reviewed 5. **Track phishing simulation reports** - Monitor security awareness training effectiveness 6. **Correlate with threats** - Check if reported emails match known threat campaigns 7. **Monitor false positive rate** - High FP rates may indicate policy tuning needed ## Related Skills - [Abnormal Threats](../threats/SKILL.md) - Threat detection and analysis - [Abnormal Messages](../messages/SKILL.md) - Message analysis - [Abnormal API Patterns](../api-patterns/SKILL.md) - API authentication and usage
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.