Example workflows¶
Prompts you can give an agent with mcp-shodan connected, and the tool calls they lead to. Use targets you are authorized to investigate.
Triage an IP from an alert¶
"What is exposed on 8.8.8.8? Summarize open ports, TLS certificates and anything that looks risky."
ip_lookupwith{"ip": "8.8.8.8"}.- For any product and version in the banners,
cves_by_productwith{"product": "<name>", "is_kev": true, "limit": 20}.
Size up a vulnerability¶
"Is CVE-2021-44228 being exploited, and how bad is it?"
cve_lookupwith{"cve": "CVE-2021-44228"}. The KEV flag, EPSS score and proposed action answer the question.
Find the riskiest CVEs for a product¶
"List the 10 log4j CVEs most likely to be exploited."
cpe_lookupwith{"product": "log4j", "limit": 20}to pick the right CPE, if the version matters.cves_by_productwith{"product": "log4j", "sort_by_epss": true, "limit": 10}, or withcpe23set to the chosen CPE.
Map a domain's footprint¶
"What subdomains and mail servers does example.com have, and what's exposed on them?"
domain_infowith{"domain": "example.com"}(1 query credit).domain_infowith{"domain": "example.com", "type": "MX"}if you only need mail servers.ip_lookupon the A records that look interesting.
Size a query before spending credits¶
"How many hosts are vulnerable to CVE-2021-44228, broken down by country and organization? Check my credits first."
api_infoto see remaining query credits.shodan_countwith{"query": "vuln:CVE-2021-44228", "facets": "country:10,org:10"}. Free, no results fetched.shodan_searchonly if you need the hosts themselves.
Map exposure for a query¶
"How many nginx servers in Germany expose port 443, and which countries host the most nginx overall?"
shodan_searchwith{"query": "product:nginx country:DE port:443", "max_results": 5}.shodan_countwith{"query": "product:nginx", "facets": "country:10"}. The breakdown covers all matches and costs no credits.
Filtered searches need a Shodan membership and use one query credit each.
Pivot between names and addresses¶
"Resolve these domains, then tell me what else is hosted on those IPs."
dns_lookupwith{"hostnames": ["example.com", "example.org"]}.reverse_dns_lookupwith the resulting IPs.ip_lookupon anything interesting.