Reputation + security findings (threatcrush.com)
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
CrushAV file reputation, no key needed: look up up to 100 SHA-256 file hashes. For each hash something is known about, returns `knownMalicious` (the source listing it as malware), `malwareName`, `trust` (0-100: how sure CIRCL hashlookup is that this is a published, known-good file from NSRL or a major OS/package repo) and a `fileName` it was seen as. Unknown hashes are omitted. Send hashes only, never file contents.
Lower-case hex SHA-256 hashes (max 100)
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http threatcrush https://threatcrush.com/api/mcp
CrushAV file reputation, no key needed: look up up to 100 SHA-256 file hashes. For each hash something is known about, returns `knownMalicious` (the source listing it as malware), `malwareName`, `trust` (0-100: how sure CIRCL hashlookup is that this is a published, known-good file from NSRL or a major OS/package repo) and a `fileName` it was seen as. Unknown hashes are omitted. Send hashes only, never file contents.
| Argument | Type | Description |
|---|---|---|
| hashes* | array | Lower-case hex SHA-256 hashes (max 100) |
{
"type": "object",
"required": [
"hashes"
],
"properties": {
"hashes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Lower-case hex SHA-256 hashes (max 100)"
}
}
}Create one invite link (each account has 3, single use, 30 days). When a new account joins on it and confirms its email, both get bonus credits. Session token only.
| Argument | Type | Description |
|---|---|---|
| note | string | Who it is for (only you see it) |
{
"type": "object",
"properties": {
"note": {
"type": "string",
"description": "Who it is for (only you see it)"
}
}
}One tracked finding with its details (code snippet, remediation, evidence), property and history.
| Argument | Type | Description |
|---|---|---|
| id* | string | Finding id |
| org_id | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Finding id"
},
"org_id": {
"type": "string"
}
}
}Your org's tracked findings from threatcrush scan, pentest and ai-scan (deduped across runs, with a triage status). Default: open + acknowledged. Session token or tc_agent_ key.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max 500, default 100 |
| org_id | string | Organization id (default: the key's org, or your first org) |
| source | string | Comma list of scan, pentest, ai-scan |
| status | string | Comma list of open, acknowledged, fixed, false_positive, ignored, or all |
| severity | string | Comma list of critical, high, medium, low, info |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max 500, default 100"
},
"org_id": {
"type": "string",
"description": "Organization id (default: the key's org, or your first org)"
},
"source": {
"type": "string",
"description": "Comma list of scan, pentest, ai-scan"
},
"status": {
"type": "string",
"description": "Comma list of open, acknowledged, fixed, false_positive, ignored, or all"
},
"severity": {
"type": "string",
"description": "Comma list of critical, high, medium, low, info"
}
}
}Set the status and/or note of up to 500 findings: acknowledged, fixed, false_positive, ignored or open. fixed is reopened by a later run that still sees it; false_positive and ignored never are. Needs write.
| Argument | Type | Description |
|---|---|---|
| ids* | array | |
| note | string | Why (shown everywhere the finding is) |
| org_id | string | |
| status | string |
{
"type": "object",
"required": [
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
}
},
"note": {
"type": "string",
"description": "Why (shown everywhere the finding is)"
},
"org_id": {
"type": "string"
},
"status": {
"enum": [
"open",
"acknowledged",
"fixed",
"false_positive",
"ignored"
],
"type": "string"
}
}
}One incident: linked forensic evidence, recent events from the same observed source IP on its server, block history for that IP, saved AI assessment, multi-person assignees, fix and test progress, work history, recorded resolution/operator, findings, timeline, notes and who was paged.
| Argument | Type | Description |
|---|---|---|
| id* | string | Incident id |
| org_id | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Incident id"
},
"org_id": {
"type": "string"
}
}
}Your org's incidents: what `threatcrush investigate --raise`, the daemon (critical detections) and people raised to humans. Filter by host and explicit since timestamp; only teams you can see. Session token or tc_agent_ key.
| Argument | Type | Description |
|---|---|---|
| host | string | Filter incidents whose recorded host contains this value (for example dev2) |
| limit | number | Max 500, default 100 |
| since | string | Only incidents last seen at or after this timestamp; pass an explicit timezone when interpreting phrases such as last night |
| org_id | string | Organization id (default: the key's org, or your first org) |
| status | string | Comma list of open, acknowledged, resolved, or all (default all) |
| team_id | string |
{
"type": "object",
"properties": {
"host": {
"type": "string",
"description": "Filter incidents whose recorded host contains this value (for example dev2)"
},
"limit": {
"type": "number",
"description": "Max 500, default 100"
},
"since": {
"type": "string",
"format": "date-time",
"description": "Only incidents last seen at or after this timestamp; pass an explicit timezone when interpreting phrases such as last night"
},
"org_id": {
"type": "string",
"description": "Organization id (default: the key's org, or your first org)"
},
"status": {
"type": "string",
"description": "Comma list of open, acknowledged, resolved, or all (default all)"
},
"team_id": {
"type": "string"
}
}
}Raise an incident report (report_version 1: title, severity, source, dedupe_key, summary, verdict, findings, timeline, recommendations, optional team_id/server_id). The same dedupe_key while open updates it; a new incident pages the team by SMS and email once. Reports that contain anything shaped like a private key or mnemonic are refused. Needs write.
| Argument | Type | Description |
|---|---|---|
| org_id | string | |
| report* | object | The report body, as POST /api/orgs/{id}/incidents takes it |
{
"type": "object",
"required": [
"report"
],
"properties": {
"org_id": {
"type": "string"
},
"report": {
"type": "object",
"description": "The report body, as POST /api/orgs/{id}/incidents takes it"
}
}
}Update fix work performed by your assigned agent or human: set multiple assignees, fix status, PR URL, test status and evidence, verification or blocker, and/or add a note. ThreatCrush catalogs the incident and does not execute remediation. Closing requires status fixed with passing tests and verification, or false_positive with a reason and verification, plus resolution.reason/action/verification. Needs write.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| note | string | |
| org_id | string | |
| status | string | |
| fix_work | object | |
| resolution | object | |
| assignee_id | string | null | |
| assignee_ids | array | Replace the assignee list with these active org/team member user IDs; [] clears it. An assignee receives write access to this incident. Use incidents_get to find member IDs and emails. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"note": {
"type": "string"
},
"org_id": {
"type": "string"
},
"status": {
"enum": [
"open",
"acknowledged",
"resolved"
],
"type": "string"
},
"fix_work": {
"type": "object",
"properties": {
"pr_url": {
"type": [
"string",
"null"
],
"format": "uri",
"description": "HTTPS URL to the remediation PR"
},
"status": {
"enum": [
"unassigned",
"assigned",
"in_progress",
"blocked",
"pr_open",
"testing",
"tested",
"fixed",
"false_positive"
],
"type": "string"
},
"test_url": {
"type": [
"string",
"null"
],
"format": "uri",
"description": "HTTPS URL to the CI run or test report"
},
"test_status": {
"enum": [
"not_run",
"running",
"passed",
"failed",
"skipped"
],
"type": "string"
},
"test_summary": {
"type": [
"string",
"null"
],
"maxLength": 4000
},
"verification": {
"type": [
"string",
"null"
],
"maxLength": 2000
},
"blocked_reason": {
"type": [
"string",
"null"
],
"maxLength": 2000
}
},
"additionalProperties": false
},
"resolution": {
"type": "object",
"required": [
"reason",
"action",
"verification"
],
"properties": {
"action": {
"type": "string",
"maxLength": 2000,
"minLength": 1
},
"reason": {
"type": "string",
"maxLength": 2000,
"minLength": 1
},
"verification": {
"type": "string",
"maxLength": 2000,
"minLength": 1
}
},
"additionalProperties": false
},
"assignee_id": {
"type": [
"string",
"null"
]
},
"assignee_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 50,
"description": "Replace the assignee list with these active org/team member user IDs; [] clears it. An assignee receives write access to this incident. Use incidents_get to find member IDs and emails."
}
}
}The signed-in account's invites: how many are left of 3, who joined, and whether the bonus credits were paid. Session token only.
No arguments.
{
"type": "object",
"properties": {}
}Redeem a ThreatCrush credit code (CR-XXXX-XXXX-XXXX-XXXX) into the signed-in account's credit balance (1 credit = $1.00). Needs the account's session token (`threatcrush login`), not a tc_agent_ key: agent keys belong to a team, not a person.
| Argument | Type | Description |
|---|---|---|
| code* | string | The credit code |
{
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"description": "The credit code"
}
}
}Look up many IPs or domains at once (up to 100 with a free key, 1,000 with Reputation Pro). Results come back in request order; each counts against the daily allowance.
| Argument | Type | Description |
|---|---|---|
| indicators* | array |
{
"type": "object",
"required": [
"indicators"
],
"properties": {
"indicators": {
"type": "array",
"items": {
"type": "string"
}
}
}
}Look up an IP address or a domain against the ThreatCrush community threat database (what every linked ThreatCrush daemon blocked). Returns `listed` (the corroboration bar: independent reporters agree), a 0-100 `score`, severity, reports, reporters, rules and country; a domain is answered from its A/AAAA addresses plus nichedb.dev's public answer (abuse.ch, SURBL). With Reputation Pro: 90 days of history, the /24 neighbourhood, the network owner (ASN) and how much of it is listed, city and the reasons behind the score. Registered servers, allowlisted addresses and anyone who logged in are never reported.
| Argument | Type | Description |
|---|---|---|
| indicator* | string | An IP address or a domain |
{
"type": "object",
"required": [
"indicator"
],
"properties": {
"indicator": {
"type": "string",
"description": "An IP address or a domain"
}
}
}Add a webhook endpoint (public https URL). Returns the endpoint and its signing secret (whsec_…), shown once.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| events | array | Event patterns: *, detection.created, findings.*, ... (default *) |
| org_id | string | |
| description | string |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string"
},
"events": {
"type": "array",
"items": {
"type": "string"
},
"description": "Event patterns: *, detection.created, findings.*, ... (default *)"
},
"org_id": {
"type": "string"
},
"description": {
"type": "string"
}
}
}Remove a webhook endpoint and its delivery log.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| org_id | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"org_id": {
"type": "string"
}
}
}Recent webhook deliveries (status, attempts, last HTTP status/error, payload), for one endpoint or all.
| Argument | Type | Description |
|---|---|---|
| id | string | Endpoint id (optional) |
| limit | number | |
| org_id | string |
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Endpoint id (optional)"
},
"limit": {
"type": "number"
},
"org_id": {
"type": "string"
}
}
}Your org's webhook endpoints (signed Standard Webhooks deliveries, retried for about three days) and the events ThreatCrush emits: detection.created, findings.raised, reputation.changed. Endpoints behind a Webhook alert destination follow your alert rules; the others get every event they subscribe to. Org owner/admin session token or an admin tc_agent_ key.
| Argument | Type | Description |
|---|---|---|
| org_id | string |
{
"type": "object",
"properties": {
"org_id": {
"type": "string"
}
}
}Replace an endpoint's signing secret; the old one stops working at once. Returns the new secret.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| org_id | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"org_id": {
"type": "string"
}
}
}Send a signed webhook.test event to one endpoint now and say how it went.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| org_id | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"org_id": {
"type": "string"
}
}
}Change a webhook endpoint's url, events, description, or switch it on/off (on again clears its failure count).
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| url | string | |
| events | array | |
| org_id | string | |
| enabled | boolean | |
| description | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"events": {
"type": "array",
"items": {
"type": "string"
}
},
"org_id": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"description": {
"type": "string"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 11, 2026.