| name | openosint-ai-osint-framework |
| description | AI-powered OSINT agent with interactive REPL, MCP server, and CLI for email/username/domain/IP/phone investigation using 11 integrated tools |
| triggers | ["investigate an email address for social accounts","search for username across social platforms","check if email has been in data breaches","enumerate subdomains for a domain","lookup IP geolocation and ASN information","run OSINT investigation on a target","search shodan for exposed services","generate google dorks for OSINT research"] |
OpenOSINT AI OSINT Framework
Skill by ara.so — Security Skills collection.
OpenOSINT is an AI-powered Open Source Intelligence framework that combines 11 OSINT tools into a unified interface. It operates as an interactive REPL with natural language investigation, a direct CLI for scripting, and an MCP server for AI client integration. The AI agent intelligently chains tools based on findings and compiles structured reports. All tools run as async subprocess wrappers with hard timeout enforcement.
Installation
git clone https://github.com/OpenOSINT/OpenOSINT.git
cd OpenOSINT
pip install -e .
export ANTHROPIC_API_KEY=sk-ant-your-key-here
pip install holehe sherlock-project sublist3r
Optional Dependencies
pip install ollama
ollama pull llama3.2
pip install shodan
export SHODAN_API_KEY=your-shodan-key
pip install reportlab
export HIBP_API_KEY=your-hibp-key
export IPINFO_TOKEN=your-ipinfo-token
export VIRUSTOTAL_API_KEY=your-vt-key
Usage Modes
Interactive REPL (AI-Powered)
openosint
openosint shell
openosint --provider ollama
In REPL, type natural language queries:
openosint ❯ investigate user@example.com
openosint ❯ find accounts for johndoe99
openosint ❯ check breaches for admin@company.com
openosint ❯ enumerate subdomains of example.com
REPL commands:
<target> - Investigate email/username/domain/IP/phone
clear - Reset conversation memory
save - Save last report to reports/
tools - List available tools and status
config - Show current configuration
help - Show all commands
exit / Ctrl-D - Exit
Direct CLI (No AI)
openosint email target@example.com
openosint email target@example.com -t 60
openosint username johndoe99
openosint username johndoe99 -t 120
openosint shodan 8.8.8.8
openosint shodan "apache port:80 country:DE"
openosint virustotal example.com
openosint virustotal 192.168.1.1
openosint multi "user@example.com johndoe99 example.com"
openosint --parallel email user@example.com
openosint --parallel username johndoe99
openosint --json email user@example.com
Python API Usage
Direct Tool Usage
import asyncio
from openosint.tools.email import search_email
from openosint.tools.username import search_username
from openosint.tools.breach import search_breach
from openosint.tools.whois import search_whois
from openosint.tools.ip import search_ip
from openosint.tools.domain import search_domain
from openosint.tools.dorks import generate_dorks
from openosint.tools.paste import search_paste
from openosint.tools.phone import search_phone
from openosint.tools.shodan import search_shodan
from openosint.tools.virustotal import search_virustotal
async def investigate_email(email: str):
"""Investigate an email address."""
accounts = await search_email(email, timeout=60)
print(f"Social accounts: {accounts}")
breaches = await search_breach(email)
print(f"Breaches: {breaches}")
pastes = await search_paste(email)
print(f"Paste dumps: {pastes}")
dorks = generate_dorks(email)
()
():
platforms = search_username(username, timeout=)
()
():
whois = search_whois(domain)
()
subdomains = search_domain(domain)
()
vt_result = search_virustotal(domain)
()
():
ip_info = search_ip(ip)
()
shodan_data = search_shodan(ip)
()
():
phone_info = search_phone(phone)
()
asyncio.run(investigate_email())
asyncio.run(investigate_username())
asyncio.run(investigate_domain())
asyncio.run(investigate_ip())
asyncio.run(investigate_phone())
AI Agent Usage
import asyncio
from openosint.agent import OpenOSINTAgent
async def ai_investigation():
"""Run AI-powered investigation."""
agent = OpenOSINTAgent(
api_key=None,
provider="anthropic",
model="claude-3-5-sonnet-20241022"
)
response = await agent.investigate("investigate user@example.com")
print(response)
response = await agent.investigate(
"find all accounts for johndoe99 and check for breaches"
)
print(response)
history = agent.get_history()
agent.clear_history()
asyncio.run(ai_investigation())
Parallel Execution
import asyncio
from openosint.tools.email import search_email
from openosint.tools.breach import search_breach
from openosint.tools.paste import search_paste
async def parallel_email_investigation(email: str):
"""Run multiple tools in parallel."""
results = await asyncio.gather(
search_email(email, timeout=60),
search_breach(email),
search_paste(email),
return_exceptions=True
)
accounts, breaches, pastes = results
report = {
"email": email,
"accounts": accounts if not isinstance(accounts, Exception) else str(accounts),
"breaches": breaches if not isinstance(breaches, Exception) else str(breaches),
"pastes": pastes if not isinstance(pastes, Exception) else str(pastes)
}
return report
result = asyncio.run(parallel_email_investigation("target@example.com"))
print(result)
Tool-Specific Examples
Email Investigation
async def comprehensive_email_scan(email: str):
"""Complete email OSINT scan."""
from openosint.tools.email import search_email
from openosint.tools.breach import search_breach
from openosint.tools.paste import search_paste
from openosint.tools.dorks import generate_dorks
print(f"[*] Investigating {email}")
print("[*] Searching social accounts...")
accounts = await search_email(email)
print("[*] Checking data breaches...")
breaches = await search_breach(email)
print("[*] Searching paste sites...")
pastes = await search_paste(email)
print("[*] Generating Google dorks...")
dorks = await generate_dorks(email)
return {
"accounts": accounts,
"breaches": breaches,
"pastes": pastes,
"dorks": dorks
}
Username Investigation
async def comprehensive_username_scan(username: str):
"""Complete username OSINT scan."""
from openosint.tools.username import search_username
from openosint.tools.paste import search_paste
from openosint.tools.dorks import generate_dorks
print(f"[*] Investigating {username}")
print("[*] Searching platforms (this may take 2+ minutes)...")
platforms = await search_username(username, timeout=180)
print("[*] Searching paste sites...")
pastes = await search_paste(username)
print("[*] Generating Google dorks...")
dorks = await generate_dorks(username)
return {
"platforms": platforms,
"pastes": pastes,
"dorks": dorks
}
Domain Investigation
async def comprehensive_domain_scan(domain: str):
"""Complete domain OSINT scan."""
from openosint.tools.whois import search_whois
from openosint.tools.domain import search_domain
from openosint.tools.virustotal import search_virustotal
from openosint.tools.dorks import generate_dorks
print(f"[*] Investigating {domain}")
print("[*] Running WHOIS...")
whois = await search_whois(domain)
print("[*] Enumerating subdomains...")
subdomains = await search_domain(domain)
print("[*] Checking VirusTotal...")
vt_result = await search_virustotal(domain)
print("[*] Generating Google dorks...")
dorks = await generate_dorks(domain)
return {
"whois": whois,
"subdomains": subdomains,
"virustotal": vt_result,
"dorks": dorks
}
IP Investigation
async def comprehensive_ip_scan(ip: str):
"""Complete IP OSINT scan."""
from openosint.tools.ip import search_ip
from openosint.tools.shodan import search_shodan
from openosint.tools.virustotal import search_virustotal
print(f"[*] Investigating {ip}")
print("[*] Geolocating IP...")
ip_info = await search_ip(ip)
print("[*] Querying Shodan...")
shodan_data = await search_shodan(ip)
print("[*] Checking VirusTotal...")
vt_result = await search_virustotal(ip)
return {
"ip_info": ip_info,
"shodan": shodan_data,
"virustotal": vt_result
}
Shodan Advanced Queries
async def shodan_queries():
"""Advanced Shodan search examples."""
from openosint.tools.shodan import search_shodan
host = await search_shodan("8.8.8.8")
apache = await search_shodan("apache port:80")
german_servers = await search_shodan("apache port:80 country:DE")
heartbleed = await search_shodan("vuln:CVE-2014-0160")
scada = await search_shodan("port:502")
cameras = await search_shodan("Server: SQ-WEBCAM")
return {
"host": host,
"apache": apache,
"german_servers": german_servers,
"heartbleed": heartbleed,
"scada": scada,
"cameras": cameras
}
MCP Server Integration
OpenOSINT can run as an MCP server for Claude Desktop or other MCP clients:
{
"mcpServers": {
"openosint": {
"command": "python",
"args": ["-m", "openosint.mcp_server"],
"env": {
"ANTHROPIC_API_KEY": "your-key",
"HIBP_API_KEY": "your-key",
"SHODAN_API_KEY": "your-key",
"VIRUSTOTAL_API_KEY": "your-key",
"IPINFO_TOKEN": "your-token"
}
}
}
}
Then in Claude Desktop, you can use natural language:
"Investigate user@example.com for social accounts and data breaches"
"Find all platforms where johndoe99 has accounts"
"Enumerate subdomains for example.com"
Configuration
Environment Variables
export ANTHROPIC_API_KEY=sk-ant-your-key
export HIBP_API_KEY=your-hibp-key
export SHODAN_API_KEY=your-shodan-key
export VIRUSTOTAL_API_KEY=your-vt-key
export IPINFO_TOKEN=your-ipinfo-token
export OLLAMA_HOST=http://localhost:11434
Timeouts
All tools accept a timeout parameter (seconds):
await search_email(email, timeout=60)
await search_username(username, timeout=120)
await search_domain(domain, timeout=90)
await search_phone(phone, timeout=30)
await search_shodan(query, timeout=30)
await search_email(email, timeout=180)
Common Patterns
Batch Email Investigation
async def batch_email_investigation(emails: list[str]):
"""Investigate multiple emails in parallel."""
from openosint.tools.email import search_email
from openosint.tools.breach import search_breach
async def investigate_one(email: str):
accounts = await search_email(email)
breaches = await search_breach(email)
return {
"email": email,
"accounts": accounts,
"breaches": breaches
}
results = await asyncio.gather(
*[investigate_one(email) for email in emails],
return_exceptions=True
)
return [r for r in results if not isinstance(r, Exception)]
emails = ["user1@example.com", "user2@example.com", "user3@example.com"]
results = asyncio.run(batch_email_investigation(emails))
Export Report
async def investigate_and_export(target: str, output_path: str):
"""Run investigation and save report."""
from openosint.agent import OpenOSINTAgent
import json
agent = OpenOSINTAgent()
response = await agent.investigate(f"investigate {target}")
with open(output_path, "w") as f:
json.dump({
"target": target,
"findings": response,
"timestamp": datetime.now().isoformat()
}, f, indent=2)
return response
asyncio.run(investigate_and_export(
"user@example.com",
"reports/investigation.json"
))
Error Handling
async def safe_investigation(email: str):
"""Investigate with proper error handling."""
from openosint.tools.email import search_email
from openosint.tools.breach import search_breach
results = {}
try:
results["accounts"] = await search_email(email, timeout=60)
except asyncio.TimeoutError:
results["accounts"] = "ERROR: Timeout after 60 seconds"
except Exception as e:
results["accounts"] = f"ERROR: {str(e)}"
try:
results["breaches"] = await search_breach(email)
except Exception as e:
results["breaches"] = f"ERROR: {str(e)}"
return results
Troubleshooting
holehe Not Found
pip install holehe
which holehe
holehe --help
sherlock Not Found
pip install sherlock-project
which sherlock
sherlock --help
phoneinfoga Not Found
wget https://github.com/sundowndev/phoneinfoga/releases/download/v2.11.0/phoneinfoga_Linux_x86_64.tar.gz
tar -xzf phoneinfoga_Linux_x86_64.tar.gz
sudo mv phoneinfoga /usr/local/bin/
chmod +x /usr/local/bin/phoneinfoga
phoneinfoga version
HIBP API Returns 401
export HIBP_API_KEY=your-actual-key
Shodan API Returns 401
export SHODAN_API_KEY=your-actual-key
python -c "import shodan; api=shodan.Shodan('$SHODAN_API_KEY'); print(api.info())"
VirusTotal API Returns 403
export VIRUSTOTAL_API_KEY=your-actual-key
Ollama Connection Error
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2
curl http://localhost:11434/api/tags
openosint --provider ollama
Subprocess Timeout
await search_username(username, timeout=300)
Rate Limiting
import asyncio
async def rate_limited_batch(emails: list[str], delay: float = 2.0):
"""Investigate emails with rate limiting."""
results = []
for email in emails:
result = await search_email(email)
results.append(result)
await asyncio.sleep(delay)
return results
Memory Issues with Large Results
async def stream_investigation(emails: list[str]):
"""Process results one at a time."""
for email in emails:
result = await search_email(email)
print(f"Results for {email}: {result}")
del result
Tool Status Check
async def check_tool_status():
"""Verify which tools are available."""
from openosint.tools.email import search_email
from openosint.tools.username import search_username
from openosint.tools.phone import search_phone
import shutil
import os
status = {
"holehe": shutil.which("holehe") is not None,
"sherlock": shutil.which("sherlock") is not None,
"sublist3r": shutil.which("sublist3r") is not None,
"phoneinfoga": shutil.which("phoneinfoga") is not None,
"hibp_api_key": os.getenv("HIBP_API_KEY") is not None,
"shodan_api_key": os.getenv("SHODAN_API_KEY") is not None,
"virustotal_api_key": os.getenv("VIRUSTOTAL_API_KEY") is not None,
"ipinfo_token": os.getenv("IPINFO_TOKEN") is ,
}
tool, available status.items():
symbol = available
()
status
asyncio.run(check_tool_status())