Domain intelligence CLI and MCP server — tech stack, email security, and signal intelligence from DNS.
Project description
recon
Passive domain intelligence from public DNS and Microsoft/Google endpoints.
recon northwindtraders.com
╭──────────────────────── Northwind Traders ───────────────────────╮
│ │
│ Company: Northwind Traders │
│ Domain: northwindtraders.onmicrosoft.com │
│ Provider: Microsoft 365 │
│ Tenant ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890 │
│ Region: NA │
│ Auth: Federated │
│ Confidence: ●●● High (3 sources) │
│ Services: Anthropic (Claude), Atlassian (Jira/Confluence), │
│ DocuSign, Exchange Autodiscover, Figma, │
│ Intune / MDM, KnowBe4, Microsoft 365, │
│ Microsoft Teams, Miro, Salesforce, Slack, Zendesk │
│ │
│ Insights: Federated identity indicators observed (likely Okta)│
│ Email security 4/5 strong (DMARC reject, DKIM, │
│ SPF strict) │
│ Email gateway: Proofpoint in front of Exchange │
│ M365 E3/E5 indicators (Intune + federated auth) │
│ Security stack: KnowBe4 (training), Okta (identity) │
│ AI Adoption: anthropic │
│ Modern Collaboration: slack, miro, atlassian, figma │
│ │
│ Related: northwind-internal.com │
│ │
╰──────────────────────────────────────────────────────────────────╯
The example above is fictional. All tenant IDs, domains, and service lists are fabricated for illustration.
Give it a domain. It queries public endpoints and DNS records — no credentials, no API keys — and returns what it can find: tenant details, email security posture, SaaS fingerprints, derived signals, certificate intelligence, and neutral posture observations.
Works for Microsoft 365, Google Workspace, or any provider. Useful for anyone who needs domain intelligence — architects, MSPs, security professionals, red teamers, defenders, sales engineers, researchers. Also runs as an MCP server for AI tools.
Why recon?
| recon | dig / nslookup | whatweb | dnsrecon | cloud_enum | Paid tools | |
|---|---|---|---|---|---|---|
| Zero credentials | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| M365 tenant detection | ✓ | ✗ | ✗ | ✗ | partial | varies |
| Google Workspace detection | ✓ | ✗ | ✗ | ✗ | ✗ | varies |
| Email security scoring | ✓ | ✗ | ✗ | ✗ | ✗ | varies |
| SaaS fingerprinting (187) | ✓ | ✗ | partial | ✗ | ✗ | ✓ |
| Signal intelligence | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Certificate intelligence | ✓ | ✗ | ✗ | ✗ | ✗ | varies |
| Posture analysis | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Delta / change detection | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Recursive domain chaining | ✓ | ✗ | ✗ | partial | ✗ | varies |
| MCP server for AI agents | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Extensible (custom YAML) | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
recon reads the organizational metadata layer — DNS records, identity endpoints, and certificate transparency logs that companies publish to make their email, SaaS, and security infrastructure work. It doesn't scrape websites, probe servers, or analyze page content. It turns infrastructure signals into business intelligence.
Install
Requires Python 3.10+.
pip install recon-tool # from PyPI (when published)
pip install -e . # or from source
recon doctor # verify connectivity
Usage
recon northwindtraders.com # default panel output
recon northwindtraders.com --json # structured JSON
recon northwindtraders.com --md # markdown report
recon northwindtraders.com --html # self-contained HTML report
recon northwindtraders.com --full # everything (services + domains + posture)
recon northwindtraders.com --services # M365 vs GWS vs tech stack split
recon northwindtraders.com --posture # neutral posture observations
recon northwindtraders.com --compare prev.json # delta: what changed since last run
recon northwindtraders.com --chain --depth 2 # recursive domain discovery
recon northwindtraders.com --no-cache # bypass disk cache
recon batch domains.txt --json # batch mode (default 5 concurrent)
recon batch domains.txt --csv # batch CSV for spreadsheets
recon batch domains.txt --json -c 10 # batch with 10 concurrent
recon doctor # connectivity check
recon doctor --fix # scaffold custom config templates
recon mcp # start MCP server (stdio)
Input is normalized automatically — URLs, schemes, www. prefixes, paths, and whitespace are all stripped.
What You Get
| Signal | Source |
|---|---|
| Company name, tenant ID, auth type | Microsoft OIDC + GetUserRealm |
| Google Workspace auth type, modules, corporate identity | Google login flow + CNAME probing + BIMI VMC |
| Email provider | MX records |
| Email security score (0–5) | DMARC + DKIM + SPF + MTA-STS + BIMI |
| 187 SaaS services | TXT, SPF, MX, CNAME, NS, CAA, SRV, DKIM selectors |
| Email gateway / SASE / security stack | DNS fingerprints |
| Signal intelligence (29 signals) | Metadata-aware YAML rules with cross-reference conditions |
| Certificate intelligence | crt.sh metadata: issuance velocity, issuer diversity, cert age |
| Posture observations | Neutral factual analysis across email, identity, infrastructure |
| Related domains | CNAME breadcrumbs + certificate transparency (crt.sh) |
| Delta / change detection | Compare current vs. previous JSON export |
| Evidence traceability | Per-detection source records with dual confidence scoring |
All from public sources. Zero authentication. Results vary by domain.
MCP Server
recon runs as an MCP server for Claude, Cursor, VS Code, Kiro, ChatGPT, or any MCP client:
{
"mcpServers": {
"recon": {
"command": "python",
"args": ["-m", "recon_tool.server"],
"autoApprove": ["lookup_tenant", "analyze_posture"]
}
}
}
Then ask your AI: "Run a recon lookup on northwindtraders.com and analyze the posture."
Available MCP tools: lookup_tenant, analyze_posture, chain_lookup, reload_data.
See docs/mcp.md for setup details, available tools, and config file locations per client.
Documentation
| Doc | Contents |
|---|---|
| Fingerprints | Detection types, custom fingerprints, email security scoring, related domain enrichment |
| Signals | 4-layer signal intelligence, 29 signal rules, metadata conditions, custom signals |
| MCP Server | AI agent integration setup, tools, config locations |
| Roadmap | What's planned, what's not, and why |
| Legal | Disclaimer, accuracy, fictional examples, third-party notice |
| Contributing | How to add fingerprints, signals, and code |
| Changelog | Version history |
Development
pip install -e ".[dev]"
pytest tests/ # 597 tests
ruff check recon_tool/ # lint
pyright recon_tool/ # type check
License
MIT — see LICENSE for details.
This tool queries only public DNS records and unauthenticated endpoints. See docs/legal.md for full disclaimer.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file recon_tool-0.4.1.tar.gz.
File metadata
- Download URL: recon_tool-0.4.1.tar.gz
- Upload date:
- Size: 147.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d70bfeee7bd10309e2140504d6d15964c265ae68b145cb4f7b8c7020b2a70a9f
|
|
| MD5 |
a69f1a6bb07731c7c4d570ff6619aaf3
|
|
| BLAKE2b-256 |
fe9e71b18b1d94563f53288cac05a8a5eabd7b3cc9b8ad6516d417cfd5d4a7dd
|
Provenance
The following attestation bundles were made for recon_tool-0.4.1.tar.gz:
Publisher:
release.yml on blisspixel/recon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
recon_tool-0.4.1.tar.gz -
Subject digest:
d70bfeee7bd10309e2140504d6d15964c265ae68b145cb4f7b8c7020b2a70a9f - Sigstore transparency entry: 1280250841
- Sigstore integration time:
-
Permalink:
blisspixel/recon@f4dc4efc6005f7ec763855075f1f17338897cc86 -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/blisspixel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f4dc4efc6005f7ec763855075f1f17338897cc86 -
Trigger Event:
push
-
Statement type:
File details
Details for the file recon_tool-0.4.1-py3-none-any.whl.
File metadata
- Download URL: recon_tool-0.4.1-py3-none-any.whl
- Upload date:
- Size: 105.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e8b3f944cfb6be223b12bc200ae1bcda04bfb96d7dec5036d6e7f2b5bd46411
|
|
| MD5 |
902ff935157e020fa31e5d69f6701feb
|
|
| BLAKE2b-256 |
1123831a9b20f59ef4298b80ed31f871f762226ae43b9ad80d0f6e646680c2ab
|
Provenance
The following attestation bundles were made for recon_tool-0.4.1-py3-none-any.whl:
Publisher:
release.yml on blisspixel/recon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
recon_tool-0.4.1-py3-none-any.whl -
Subject digest:
1e8b3f944cfb6be223b12bc200ae1bcda04bfb96d7dec5036d6e7f2b5bd46411 - Sigstore transparency entry: 1280250842
- Sigstore integration time:
-
Permalink:
blisspixel/recon@f4dc4efc6005f7ec763855075f1f17338897cc86 -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/blisspixel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f4dc4efc6005f7ec763855075f1f17338897cc86 -
Trigger Event:
push
-
Statement type: