Rösti Threat Intel MCP
This official server enables AI assistants to perform read-only threat intelligence operations. It allows users to look up Indicators of Compromise (IOCs), search for threat reports, retrieve YARA rules, and explore MITRE ATT&CK techniques and CVEs directly within their chat interface.
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.
https://mcp.rosti.dev/mcpWhat its tools do
11 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to rosti.dev ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Check up to 1,000 IOCs at once against all reports
- Find reports by text, source, CVE, MITRE ATT&CK technique and date
- Show the YARA rules of the newest report that uses MITRE ATT&CK T1566
- Which other reports share infrastructure with this one?
Source and maintenance
Protocol and capabilities
- Server
- Rösti 0.2.1
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 11 advertised
- Resources
- 0 advertised
- Resource templates
- 0 advertised
- Prompts
- 0 advertised
{
"tools": {
"listChanged": true
},
"logging": {},
"prompts": {
"listChanged": true
},
"resources": {
"subscribe": false,
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
11 advertised
lookup_iocs — Look up IOCs
Check many IOCs (indicators of compromise) at once against Rösti's threat-intelligence reports. Defanged values (hxxps://evil[.]com, 1.2.3[.]4, user[at]evil[.]com) are refanged before the lookup; `refanged` shows which. Matching is exact, with a case-insensitive fallback. For each value that is found, returns the reports it appears in (newest first) with the IOC's type, category, tags, IDS flag, comment and false-positive risk. Values that are not found are listed in `not_found`. Every value is also checked against the Rösti False Positive Warninglist (popular domains, public DNS resolvers, ...): found values carry `false_positive_verdict`, not-found values appear in `false_positive_verdicts`; values without a verdict are left out. Use lookup_ioc for all matches of a single value.
{
"type": "object",
"required": [
"values"
],
"properties": {
"values": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 1000,
"minItems": 1,
"description": "IOC values such as IP addresses, domains, URLs, file hashes (MD5, SHA-1, SHA-256) or e-mail addresses, plain or defanged (e.g. hxxps://evil[.]com). Surrounding whitespace and duplicates are ignored. At most 1000 values."
},
"max_matches_per_value": {
"type": "integer",
"default": 3,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of reports listed per found value"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"summary",
"results",
"not_found"
],
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"required": [
"value",
"found",
"match_count",
"matches"
],
"properties": {
"found": {
"type": "boolean"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The value as given, when it was defanged and refanged before the lookup"
},
"value": {
"type": "string",
"description": "The looked-up value (trimmed, refanged)"
},
"matches": {
"type": "array",
"items": {
"type": "object",
"required": [
"ioc_id",
"value",
"false_positive_risk",
"report"
],
"properties": {
"ids": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Whether the IOC is suitable for intrusion detection systems"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Date associated with the IOC"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags such as c2 or phishing"
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC type, e.g. domain, ip-dst, md5, sha256, url"
},
"value": {
"type": "string",
"description": "IOC value as stored in Rösti"
},
"ioc_id": {
"type": "string"
},
"report": {
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "string",
"description": "Rösti report id"
},
"url": {
"type": "string",
"description": "URL of the original report"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Publication date of the report (YYYY-MM-DD)"
},
"title": {
"type": "string",
"description": "Report title (third-party text)"
},
"rosti_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The report on rosti.dev"
}
}
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Comment from the report (third-party text)"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC category, e.g. network_activity"
},
"entity_ref": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Links IOCs that belong together in the same report, e.g. hashes of one file"
},
"false_positive_risk": {
"type": "object",
"required": [
"level",
"meaning"
],
"properties": {
"level": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "False-positive risk level from -1 to 5; higher means more likely to cause false positives. null when Rösti has no indication of false-positive risk."
},
"meaning": {
"type": "string",
"description": "Meaning of the level (informational, small, moderate, medium, high, very high), or 'no indication' when Rösti has no indication of false-positive risk."
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Why the risk was assigned, e.g. 'Rank 4738 on Alexa'"
}
},
"description": "How likely the IOC is to cause false positives (e.g. a popular, mostly benign domain)."
}
}
},
"description": "Matches, newest report first"
},
"match_count": {
"type": "integer",
"description": "Number of reports the value appears in"
},
"matches_omitted": {
"type": "integer",
"default": 0,
"description": "Matches not included because of the max_matches limit"
},
"false_positive_verdict": {
"anyOf": [
{
"type": "object",
"required": [
"level",
"confidence",
"reason"
],
"properties": {
"level": {
"type": "integer",
"description": "Confidence that the value is a false positive, 1 (low) to 5 (certain)"
},
"reason": {
"type": "string",
"description": "Why, e.g. 'example.com has rank 168 in the Tranco dataset'"
},
"confidence": {
"type": "string",
"description": "low, moderate, medium, high or certain"
}
},
"description": "Verdict of the Rösti False Positive Warninglist that a value is likely benign,\nbased on sources such as top-domain rankings and public DNS resolvers."
},
{
"type": "null"
}
],
"default": null,
"description": "Verdict of the Rösti False Positive Warninglist; null when it has none"
}
}
},
"description": "Values that were found, in request order"
},
"summary": {
"type": "object",
"required": [
"searched",
"found",
"not_found",
"matches"
],
"properties": {
"found": {
"type": "integer",
"description": "Values found in at least one report"
},
"matches": {
"type": "integer",
"description": "Total matching IOCs across all reports"
},
"searched": {
"type": "integer",
"description": "Distinct values searched"
},
"not_found": {
"type": "integer",
"description": "Values not found"
}
}
},
"refanged": {
"type": "object",
"description": "Defanged inputs and the value searched for each, e.g. {'evil[.]com': 'evil.com'}",
"additionalProperties": {
"type": "string"
}
},
"not_found": {
"type": "array",
"items": {
"type": "string"
},
"description": "Values that were not found"
},
"false_positive_verdicts": {
"type": "object",
"description": "Rösti False Positive Warninglist verdicts for values in not_found, by value; values without a verdict are left out. Found values carry theirs in results.",
"additionalProperties": {
"type": "object",
"required": [
"level",
"confidence",
"reason"
],
"properties": {
"level": {
"type": "integer",
"description": "Confidence that the value is a false positive, 1 (low) to 5 (certain)"
},
"reason": {
"type": "string",
"description": "Why, e.g. 'example.com has rank 168 in the Tranco dataset'"
},
"confidence": {
"type": "string",
"description": "low, moderate, medium, high or certain"
}
},
"description": "Verdict of the Rösti False Positive Warninglist that a value is likely benign,\nbased on sources such as top-domain rankings and public DNS resolvers."
}
}
}
}{
"title": "Look up IOCs",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}lookup_ioc — Look up an IOC
Check whether one IOC (indicator of compromise) appears in Rösti's threat-intelligence reports. A defanged value (hxxps://evil[.]com, 1.2.3[.]4) is refanged before the lookup; `input` then shows the value as given. Matching is exact, with a case-insensitive fallback. Returns every report the value appears in (newest first, up to max_matches) with the IOC's type, category, tags, IDS flag, comment and false-positive risk. Also checks the value against the Rösti False Positive Warninglist (popular domains, public DNS resolvers, ...) and returns its verdict in `false_positive_verdict`, also when Rösti does not know the value; null when the warninglist has no verdict.
{
"type": "object",
"required": [
"value"
],
"properties": {
"value": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "One IOC value, e.g. an IP address, domain, URL, file hash or e-mail address, plain or defanged (e.g. hxxps://evil[.]com)"
},
"max_matches": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Maximum number of reports listed"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"value",
"found",
"match_count",
"matches"
],
"properties": {
"found": {
"type": "boolean"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The value as given, when it was defanged and refanged before the lookup"
},
"value": {
"type": "string",
"description": "The looked-up value (trimmed, refanged)"
},
"matches": {
"type": "array",
"items": {
"type": "object",
"required": [
"ioc_id",
"value",
"false_positive_risk",
"report"
],
"properties": {
"ids": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Whether the IOC is suitable for intrusion detection systems"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Date associated with the IOC"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags such as c2 or phishing"
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC type, e.g. domain, ip-dst, md5, sha256, url"
},
"value": {
"type": "string",
"description": "IOC value as stored in Rösti"
},
"ioc_id": {
"type": "string"
},
"report": {
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "string",
"description": "Rösti report id"
},
"url": {
"type": "string",
"description": "URL of the original report"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Publication date of the report (YYYY-MM-DD)"
},
"title": {
"type": "string",
"description": "Report title (third-party text)"
},
"rosti_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The report on rosti.dev"
}
}
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Comment from the report (third-party text)"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC category, e.g. network_activity"
},
"entity_ref": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Links IOCs that belong together in the same report, e.g. hashes of one file"
},
"false_positive_risk": {
"type": "object",
"required": [
"level",
"meaning"
],
"properties": {
"level": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "False-positive risk level from -1 to 5; higher means more likely to cause false positives. null when Rösti has no indication of false-positive risk."
},
"meaning": {
"type": "string",
"description": "Meaning of the level (informational, small, moderate, medium, high, very high), or 'no indication' when Rösti has no indication of false-positive risk."
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Why the risk was assigned, e.g. 'Rank 4738 on Alexa'"
}
},
"description": "How likely the IOC is to cause false positives (e.g. a popular, mostly benign domain)."
}
}
},
"description": "Matches, newest report first"
},
"match_count": {
"type": "integer",
"description": "Number of reports the value appears in"
},
"matches_omitted": {
"type": "integer",
"default": 0,
"description": "Matches not included because of the max_matches limit"
},
"false_positive_verdict": {
"anyOf": [
{
"type": "object",
"required": [
"level",
"confidence",
"reason"
],
"properties": {
"level": {
"type": "integer",
"description": "Confidence that the value is a false positive, 1 (low) to 5 (certain)"
},
"reason": {
"type": "string",
"description": "Why, e.g. 'example.com has rank 168 in the Tranco dataset'"
},
"confidence": {
"type": "string",
"description": "low, moderate, medium, high or certain"
}
},
"description": "Verdict of the Rösti False Positive Warninglist that a value is likely benign,\nbased on sources such as top-domain rankings and public DNS resolvers."
},
{
"type": "null"
}
],
"default": null,
"description": "Verdict of the Rösti False Positive Warninglist; null when it has none"
}
}
}{
"title": "Look up an IOC",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}search_iocs — Search IOCs
Search IOCs across all Rösti reports by text, type, tag, category and creation time. Without filters, lists IOCs from all reports. Each IOC carries its report id (use get_report for the report), type, category, tags, IDS flag, comment and false-positive risk. Use lookup_ioc or lookup_iocs to check whether specific values are known.
{
"type": "object",
"properties": {
"tags": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "IOC tags, e.g. c2, phishing (see describe_taxonomy)"
},
"exact": {
"type": "boolean",
"default": false,
"description": "Require the value or comment to equal the query instead of containing it"
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "IOCs per page"
},
"query": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"default": null,
"description": "Text to find in IOC values or comments, e.g. 'mcrosoft' or 'C2 server'. Defanged values are refanged."
},
"since": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2}))?$"
},
{
"type": "null"
}
],
"default": null,
"description": "Only IOCs created or updated after this date (YYYY-MM-DD) or timestamp (YYYY-MM-DDTHH:MM:SSZ)"
},
"types": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "IOC types, e.g. domain, ip-dst, sha256 (see describe_taxonomy)"
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"default": null,
"description": "next_cursor from a previous call, to get the next page"
},
"categories": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "IOC categories, e.g. network_activity (see describe_taxonomy)"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"iocs"
],
"properties": {
"iocs": {
"type": "array",
"items": {
"type": "object",
"required": [
"ioc_id",
"value",
"false_positive_risk",
"report_id"
],
"properties": {
"ids": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Whether the IOC is suitable for intrusion detection systems"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC type, e.g. domain, ip-dst, md5, sha256, url"
},
"value": {
"type": "string"
},
"ioc_id": {
"type": "string"
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Comment from the report (third-party text)"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC category, e.g. network_activity"
},
"report_id": {
"type": "string"
},
"timestamp": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "When the IOC was created or last updated"
},
"entity_ref": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOCs with the same entity_ref belong together, e.g. hashes of one file or a domain and its IP address"
},
"report_rosti_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"false_positive_risk": {
"type": "object",
"required": [
"level",
"meaning"
],
"properties": {
"level": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "False-positive risk level from -1 to 5; higher means more likely to cause false positives. null when Rösti has no indication of false-positive risk."
},
"meaning": {
"type": "string",
"description": "Meaning of the level (informational, small, moderate, medium, high, very high), or 'no indication' when Rösti has no indication of false-positive risk."
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Why the risk was assigned, e.g. 'Rank 4738 on Alexa'"
}
},
"description": "How likely the IOC is to cause false positives (e.g. a popular, mostly benign domain)."
}
},
"description": "An IOC as listed by search_iocs and list_report_iocs."
}
},
"total": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total number of matching IOCs"
},
"next_cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Pass as cursor to get the next page; null if there are no more"
}
}
}{
"title": "Search IOCs",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}search_reports — Search reports
Search Rösti's threat-intelligence reports by text, source, CVE, MITRE ATT&CK id and publication date. Returns report summaries: title, date, source, authors, tags, counts of IOCs, YARA rules and MITRE ids, and links to the original report and rosti.dev. Use get_report for the details of one report.
{
"type": "object",
"properties": {
"cves": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "Reports referencing any of these CVEs, e.g. CVE-2021-44228"
},
"sort": {
"enum": [
"newest",
"oldest",
"recently_updated",
"most_iocs",
"most_yara_rules",
"most_mitre_ids"
],
"type": "string",
"default": "newest",
"description": "Sort order"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Reports per page"
},
"query": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"default": null,
"description": "Text to find in report titles or authors, e.g. 'lumma'"
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"default": null,
"description": "next_cursor from a previous call, to get the next page"
},
"sources": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "Source ids, e.g. asec, crowdstrike (see list_sources)"
},
"mitre_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "Reports referencing any of these MITRE ATT&CK ids, e.g. T1566.001"
},
"published_after": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
{
"type": "null"
}
],
"default": null,
"description": "Reports published on or after this date (YYYY-MM-DD)"
},
"published_before": {
"anyOf": [
{
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
{
"type": "null"
}
],
"default": null,
"description": "Reports published on or before this date (YYYY-MM-DD)"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"reports"
],
"properties": {
"total": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total number of matching reports"
},
"reports": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "string",
"description": "Rösti report id"
},
"url": {
"type": "string",
"description": "URL of the original report"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Publication date (YYYY-MM-DD)"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"title": {
"type": "string",
"description": "Report title (third-party text)"
},
"authors": {
"type": "array",
"items": {
"type": "string"
}
},
"ioc_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"rosti_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The report on rosti.dev"
},
"source_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"source_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"last_updated": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "When Rösti last updated the report"
},
"mitre_id_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"yara_rule_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
}
}
}
},
"next_cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Pass as cursor to get the next page; null if there are no more"
}
}
}{
"title": "Search reports",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_report — Get a report
Get one Rösti report: metadata, MITRE ATT&CK ids, CVEs, available export formats, and how many of its IOCs there are per type and per tag. Use list_report_iocs for the IOCs themselves and get_yara_rules for its YARA rules.
{
"type": "object",
"required": [
"report_id"
],
"properties": {
"report_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Rösti report id, e.g. dq13KaQv"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "string",
"description": "Rösti report id"
},
"url": {
"type": "string",
"description": "URL of the original report"
},
"cves": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
}
},
"description": "CVEs referenced in the report"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Publication date (YYYY-MM-DD)"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"mitre": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"description"
],
"properties": {
"id": {
"type": "string",
"description": "MITRE ATT&CK id, e.g. T1003"
},
"description": {
"type": "string"
},
"object_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "techniques, tactics, groups, software, ..."
}
}
},
"description": "MITRE ATT&CK ids referenced in the report"
},
"title": {
"type": "string",
"description": "Report title (third-party text)"
},
"authors": {
"type": "array",
"items": {
"type": "string"
}
},
"ioc_tags": {
"type": "object",
"description": "Number of IOCs per tag",
"additionalProperties": {
"type": "integer"
}
},
"ioc_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"ioc_types": {
"type": "object",
"description": "Number of IOCs per IOC type",
"additionalProperties": {
"type": "integer"
}
},
"rosti_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The report on rosti.dev"
},
"source_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"source_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"last_updated": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "When Rösti last updated the report"
},
"export_formats": {
"type": "array",
"items": {
"type": "object",
"required": [
"format"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"size": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "File size in bytes"
},
"format": {
"type": "string",
"description": "Format id to pass to get_export_link, e.g. csv or misp"
}
}
},
"description": "Available downloads"
},
"mitre_id_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"yara_rule_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"yara_rules_hidden": {
"type": "boolean",
"default": false,
"description": "True if the report's YARA rules are hidden at the publisher's request"
},
"ioc_breakdown_complete": {
"type": "boolean",
"default": true,
"description": "False if ioc_types/ioc_tags were counted from the first 1000 IOCs only"
}
}
}{
"title": "Get a report",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_report_iocs — List a report's IOCs
List the IOCs of one Rösti report, optionally filtered by type, tag, category or text. IOCs with the same entity_ref belong together, e.g. the MD5, SHA-1 and SHA-256 of one file. Each IOC carries its IDS flag and false-positive risk.
{
"type": "object",
"required": [
"report_id"
],
"properties": {
"tags": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "IOC tags, e.g. c2, phishing"
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "IOCs per page"
},
"query": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"default": null,
"description": "Text to find in IOC values or comments"
},
"types": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "IOC types, e.g. domain, ip-dst, sha256"
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"default": null,
"description": "next_cursor from a previous call, to get the next page"
},
"report_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Rösti report id, e.g. dq13KaQv"
},
"categories": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"pattern": "^[^,]{1,100}$"
},
"maxItems": 50
},
{
"type": "null"
}
],
"default": null,
"description": "IOC categories, e.g. network_activity"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"iocs"
],
"properties": {
"iocs": {
"type": "array",
"items": {
"type": "object",
"required": [
"ioc_id",
"value",
"false_positive_risk",
"report_id"
],
"properties": {
"ids": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Whether the IOC is suitable for intrusion detection systems"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC type, e.g. domain, ip-dst, md5, sha256, url"
},
"value": {
"type": "string"
},
"ioc_id": {
"type": "string"
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Comment from the report (third-party text)"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOC category, e.g. network_activity"
},
"report_id": {
"type": "string"
},
"timestamp": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "When the IOC was created or last updated"
},
"entity_ref": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IOCs with the same entity_ref belong together, e.g. hashes of one file or a domain and its IP address"
},
"report_rosti_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"false_positive_risk": {
"type": "object",
"required": [
"level",
"meaning"
],
"properties": {
"level": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "False-positive risk level from -1 to 5; higher means more likely to cause false positives. null when Rösti has no indication of false-positive risk."
},
"meaning": {
"type": "string",
"description": "Meaning of the level (informational, small, moderate, medium, high, very high), or 'no indication' when Rösti has no indication of false-positive risk."
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Why the risk was assigned, e.g. 'Rank 4738 on Alexa'"
}
},
"description": "How likely the IOC is to cause false positives (e.g. a popular, mostly benign domain)."
}
},
"description": "An IOC as listed by search_iocs and list_report_iocs."
}
},
"total": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total number of matching IOCs"
},
"next_cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Pass as cursor to get the next page; null if there are no more"
}
}
}{
"title": "List a report's IOCs",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_yara_rules — Get YARA rules
Get the YARA rules published with one Rösti report, with their full source.
{
"type": "object",
"required": [
"report_id"
],
"properties": {
"report_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Rösti report id, e.g. dq13KaQv"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"report_id",
"rules"
],
"properties": {
"note": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"rule"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"rule": {
"type": "string",
"description": "Full YARA rule source"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"filename": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
}
}
},
"hidden": {
"type": "boolean",
"default": false,
"description": "True if the rules are hidden at the publisher's request"
},
"report_id": {
"type": "string"
}
}
}{
"title": "Get YARA rules",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}find_related_reports — Find related reports
Find other Rösti reports that share IOCs with one report, most shared IOCs first, with the shared values.
{
"type": "object",
"required": [
"report_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1,
"description": "Maximum number of related reports"
},
"report_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Rösti report id, e.g. dq13KaQv"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"report_id",
"related",
"related_total",
"complete"
],
"properties": {
"related": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"shared_ioc_count",
"shared_iocs"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "URL of the original report"
},
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Report title (third-party text)"
},
"rosti_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"shared_iocs": {
"type": "array",
"items": {
"type": "object",
"required": [
"value"
],
"properties": {
"type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"value": {
"type": "string"
}
}
},
"description": "Shared IOC values (at most 10 listed)"
},
"source_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"shared_ioc_count": {
"type": "integer"
}
}
},
"description": "Most shared IOCs first"
},
"complete": {
"type": "boolean",
"description": "False if the report has more than 1000 correlations and only the first 1000 were used"
},
"report_id": {
"type": "string"
},
"related_total": {
"type": "integer",
"description": "Number of related reports found"
}
}
}{
"title": "Find related reports",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_export_link — Get an export link
Get a download link for one report export, e.g. CSV or MISP. The link is signed and expires after 15 minutes; it is meant to be opened by the user, not downloaded here.
{
"type": "object",
"required": [
"report_id",
"format"
],
"properties": {
"format": {
"type": "string",
"pattern": "^[A-Za-z0-9_.-]{1,40}$",
"description": "Export format id, e.g. csv or misp; get_report lists the formats available for a report"
},
"report_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Rösti report id, e.g. dq13KaQv"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"report_id",
"format",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Signed download URL"
},
"format": {
"type": "string"
},
"report_id": {
"type": "string"
},
"expires_in_minutes": {
"type": "integer",
"default": 15
}
}
}{
"title": "Get an export link",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_sources — List sources
List the publishers whose reports Rösti collects (vendor blogs, CERTs, researchers), with report counts, the newest report date and whether the source is still active. Source ids work as the sources filter of search_reports.
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "Sources per page"
},
"query": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
],
"default": null,
"description": "Text to find in source names, e.g. 'crowdstrike'"
},
"cursor": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"default": null,
"description": "next_cursor from a previous call, to get the next page"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"sources"
],
"properties": {
"total": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"sources": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "Source id, usable as source filter in search_reports"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"name": {
"type": "string"
},
"active": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null
},
"report_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"most_recent_report": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Date of the newest report"
},
"deactivation_reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
}
}
},
"next_cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
}
}{
"title": "List sources",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}describe_taxonomy — Describe the taxonomy
List the values Rösti uses for IOC types, IOC tags (with descriptions), IOC categories and export formats, and explain the false-positive risk scale. Use these values for the filters of the search and list tools.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"required": [
"ioc_types",
"ioc_tags",
"categories",
"export_formats"
],
"properties": {
"ioc_tags": {
"type": "array",
"items": {
"type": "object",
"required": [
"tag"
],
"properties": {
"tag": {
"type": "string"
},
"subtags": {
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
}
},
"description": "Values for IOC tag filters"
},
"ioc_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Values for IOC type filters"
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "Values for IOC category filters"
},
"export_formats": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Format id, as used by get_export_link"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"extension": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
}
},
"description": "Export and feed file formats"
},
"false_positive_risk": {
"type": "string",
"default": "false_positive_risk rates how likely an IOC is to cause false positives, e.g. a popular domain that also serves benign traffic. level runs from -1 to 5 (higher means more likely to cause false positives) with meanings informational, small, moderate, medium, high and very high. 'no indication' means Rösti has no indication of false-positive risk for the IOC."
}
}
}{
"title": "Describe the taxonomy",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
0 advertised
Resources
0 advertised
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
- 1567 ms
- 95th percentile latency
- 1567 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1567 ms · metadata changed · 11 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http ro-sti-threat-intel-mcp https://mcp.rosti.dev/mcpCodex
codex mcp add ro-sti-threat-intel-mcp --url https://mcp.rosti.dev/mcpCursor
{
"mcpServers": {
"ro-sti-threat-intel-mcp": {
"url": "https://mcp.rosti.dev/mcp"
}
}
}Cline
{
"mcpServers": {
"ro-sti-threat-intel-mcp": {
"type": "streamableHttp",
"url": "https://mcp.rosti.dev/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"ro-sti-threat-intel-mcp": {
"type": "http",
"url": "https://mcp.rosti.dev/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http ro-sti-threat-intel-mcp https://mcp.rosti.dev/mcpClaude Desktop
https://mcp.rosti.dev/mcpWindsurf
{
"mcpServers": {
"ro-sti-threat-intel-mcp": {
"serverUrl": "https://mcp.rosti.dev/mcp"
}
}
}Let your agent find its tools
Find servers like Rösti Threat Intel MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other ai and machine learning servers
Do you run Rösti Threat Intel MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.