Skip to main content

recon

CI PyPI Python License OpenSSF Scorecard

Point recon at a domain and get its public technology and identity footprint: email security posture, mail and identity providers, SaaS indicators, and certificate-transparency findings. It reads public DNS, certificate transparency, and unauthenticated Microsoft and Google identity discovery endpoints, and composes what it finds into typed, evidence-backed observations.

A domain is the query coordinate, not proof of one organization, owner, account, or deployed product. recon uses no credentials, no API keys, no paid feeds, and no active scanning. It ships as a local Python package with a CLI, versioned JSON output, and a stdio MCP server. It is not a scheduler, vulnerability scanner, company research tool, or firmographic database.

Defensive use only. Use recon for legitimate posture review, IT architecture review, vendor diligence, and defensive hardening. See docs/legal.md for the intended-use policy.

Quick Start

Install with uv or pipx:

uv tool install recon-tool
# or
pipx install recon-tool

Python 3.11 through 3.14, on Windows, macOS, or Linux. Later Python versions are not yet part of the compatibility claim.

Optional helpers at scripts/install.ps1 and scripts/install.sh drive an existing uv or pipx installation. Download a release-tag source archive, review the helper locally, then run it. Each helper installs the exact version represented by that tag, preserves a sole existing uv or pipx owner, and refuses ambiguous or unmanaged installations. Do not pipe mutable branch content into a shell. To verify the exact GitHub and PyPI artifacts, their signed evidence, and their byte parity before installing, follow the consumer verification recipe.

Verify the installed command offline:

recon --version

Then optionally test online connectivity to recon's public data sources:

recon doctor

recon doctor uses synthetic requests and never queries a user-supplied target. Its --fix, --mcp, and --client modes are local-only.

Before the first lookup, know what leaves your machine. recon makes DNS queries that recursive and authoritative DNS infrastructure may observe. Its only default request to a target-owned endpoint is the standards-defined MTA-STS policy fetch at https://mta-sts.<domain>/.well-known/mta-sts.txt. Google CSE and BIMI certificate probes run only when --direct-probes is explicitly enabled.

Run the first lookup:

recon example.com

Example output shape:

Synthetic Example Namespace
example.com

Provider     Microsoft 365 (MX delivery path) + Proofpoint gateway (MX delivery path)
Tenant       a1b2c3d4-e5f6-7890-abcd-ef1234567890
Auth         Federated
Confidence   High (4 sources)

Services
  Email       Microsoft 365, Proofpoint, DMARC, DKIM, SPF strict
  Identity    Okta, Entra ID
  Cloud       Cloudflare, AWS Route 53

Insights
  Federated identity observed; identity-vendor indicators: Okta
  Email security: observed controls: DMARC reject, DKIM, SPF strict, BIMI
  MX gateway observed: Proofpoint

Examples use IETF reserved namespaces. Tenant IDs, services, and domains in this rendered example are fabricated. No real organization is depicted as the evaluated target.

Install, update, uninstall, and first-run detail: docs/getting-started.md.

What recon Is Good For

Need Use recon for Use something else when
Fast external stack context Passive DNS, identity-endpoint, CT, SaaS, and posture indicators You need authenticated tenant inventory or asset-management truth
Defensive review or vendor diligence Hedged observations and evidence traces you can verify You need vulnerability scanning, exploit checks, or host-level facts
Automation-friendly output Stable JSON, batch mode, delta mode, and local MCP tools You need dashboards, scheduling, or report generation built in

recon reports observations, not verdicts. A missing DMARC record is a missing record. A Microsoft 365 tenant indicator is an observed indicator. The operator decides what those facts mean in context.

Common Commands

recon example.com                              # default panel
recon https://www.example.com/path             # normalize URL to apex
recon mail.example.com                         # reduce sub-host to apex
recon mail.example.com --exact                 # keep that literal host
recon example.com --explain                    # retained evidence and explanation
recon example.com --full                       # expanded evidence, domains, posture
recon example.com --plain                      # linear text for screen readers and grep
recon example.com --json                       # structured lookup record
recon batch domains.txt --json                 # batch JSON array
recon batch domains.txt --ndjson               # one record per line
recon delta example.com                        # diff against cached snapshot
recon cache show                               # bounded payload-free cache overview
recon fingerprints list                        # local catalog of public-record matchers
recon signals list                             # local catalog of derived observations
recon mcp install --client=cursor              # wire MCP into a client
recon mcp doctor                               # live MCP tools/resources check

The catalog and cache commands are local and make no network requests. Built-in posture profiles are fintech, healthcare, saas-b2b, high-value-target, public-sector, and higher-ed; custom profiles live in ~/.recon/profiles/*.yaml.

Bounded cache inspection, catalog search semantics, corpus testing, and the narrow-terminal layout rules are covered in docs/getting-started.md. The generated command and flag reference is docs/cli-surface.md.

How recon Works

recon reads:

  • DNS records: MX, TXT, SPF, DMARC, DKIM, BIMI, CNAME, NS, SRV, and CAA.
  • Certificate transparency: SAN names, issuers, issuance timing, and bounded related-domain hints.
  • Identity discovery: unauthenticated Microsoft and Google endpoints.

It then maps those observables to fingerprint slugs, derived signals, typed topology, provenance paths, and per-slug evidence strength. Sparse public evidence stays sparse: the result lowers confidence or stays unresolved instead of inventing a clean answer, and a source failure remains unavailable rather than becoming a negative observation. Reported confidence is model-relative rather than a calibrated probability.

Long-form explanation: docs/how-it-works.md. Formal model and robustness research program: docs/correlation.md.

JSON and Automation

recon example.com --json
recon batch domains.txt --json
recon batch domains.txt --ndjson
recon delta example.com --json

Single-domain, batch, and delta modes emit different shapes, so route by mode or by record_type. Batch processing is record-oriented: a valid run keeps exit code 0 when individual domains fail, so consumers must inspect record_type and error_kind per record rather than the process exit status. --ndjson releases completed records as they finish and is the lowest-memory choice for large inputs.

Read these before building an integration:

docs/surface-inventory.json, docs/cli-surface.md, and recon://surface-inventory are generated discovery context and drift guards, not stable runtime API contracts. ADR-0007 records the promotion gate for any future stable subset.

MCP Server

The default install includes a local stdio MCP server for MCP-compatible tools. Start with manual approvals, and treat connected agents as untrusted input. Approval syntax is client-specific, and some current client schemas do not define autoApprove.

recon mcp install --client=claude-desktop
recon doctor --mcp
recon mcp doctor
recon doctor --client=claude-desktop

Those checks cover three different boundaries in order: the static server registry, live local stdio discovery with canonical tool and JSON resource reads, and the named client's saved configuration. The installer writes the correct per-client config shape and preserves sibling MCP servers. Full setup, tool list, read-only versus stateful guidance, and troubleshooting live in docs/mcp.md; per-client scaffolds live in agents/.

Optional Cloud Access

Local execution is the default, and the project does not operate a hosted service. For teams that want shared remote access, the repository includes a draft authenticated container and Cloud Run Terraform starting point. It is intended to be directionally useful, not a validated production deployment. Operators own deployment, identity, data handling, cost, and operations.

Limitations

The public channel has a ceiling:

  • Internal-only workloads are invisible.
  • SaaS products without DNS verification records may not appear.
  • Email gateways can hide the downstream mailbox provider.
  • CT logs can be stale, partial, rate-limited, or absent.
  • Fingerprints are rule-based indicators, not proof of active use.

Read docs/limitations.md before using recon output for a high-stakes decision, and docs/data-handling-policy.md before committing any validation artifact.

Security

Report a vulnerability through the process in SECURITY.md. The threat model, trust boundaries, and hostile-input handling are described in docs/security.md.

Documentation

Roadmap Focus

recon has a stable baseline, but product quality work remains. The top three priorities are:

  1. Make every default claim traceable to evidence, and remove product-use, cloud-type, or security-maturity conclusions that public metadata cannot support.
  2. Keep the exact MCP v1.28.1 and v2.0.0 compatibility matrix green. Changing the production dependency remains a separate, deliberate release decision.
  3. Establish an aggregate-safe quality baseline for claim precision, abstention, provenance, catalog coverage, degradation, latency, CT value, and agent context cost before expanding inference or graph machinery.

A fourth, explicitly lower-priority track covers the optional cloud framework. Broad catalog growth stays blocked behind independent rank, regional, vendor-seed, and drift rounds; real target names never enter this repository.

Dependency order, acceptance evidence, and stop rules live in docs/roadmap.md, with the current step-back review in docs/strategic-gap-audit.md.

Research publication, OpenSSF process, outside replication, and archive work are separate maintainer tracks that do not displace product truthfulness. The paper and artifact package is unfrozen after subsequent product and release changes, so maintainers must rerun docs/submission-freeze-checklist.md before any external submission; the most recent completed local proof is validation/2026-06-30-submission-freeze-local-proof.md. Its public-label decision keeps public lists as robustness checks rather than population rates, and its M365 tenancy decision keeps that evidence as corroboration rather than independent calibration.

Development

uv sync
uv run pre-commit install
uv run python scripts/release_readiness.py --allow-dirty
uv run python scripts/check.py

uv run python scripts/check.py is the canonical local gate: lint, type checks, coverage-gated tests, generated-artifact and catalog checks, text and link hygiene, interface and claim checks, and size and complexity ratchets. Green locally means green in CI. Do not push on --fast alone.

Project hygiene: keep examples reserved and synthetic, keep validation artifacts aggregate-only, and avoid dead code or placeholders. The gate rejects a retired target-example vocabulary across public text while preserving provider definitions and ACME protocol terms. Contributor details: CONTRIBUTING.md.

License

Apache 2.0. Free to use, build on, fork, and share. See LICENSE for the full terms.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

recon_tool-2.8.0.tar.gz (2.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

recon_tool-2.8.0-py3-none-any.whl (702.0 kB view details)

Uploaded Python 3

File details

Details for the file recon_tool-2.8.0.tar.gz.

File metadata

  • Download URL: recon_tool-2.8.0.tar.gz
  • Upload date:
  • Size: 2.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for recon_tool-2.8.0.tar.gz
Algorithm Hash digest
SHA256 65daa03cbb61b37a2a7165c86b8c460fa179c2b1b3b536c7928a4495c327b196
MD5 ecac1db177f90f589dc7f2361493de08
BLAKE2b-256 d4ca1b07d56668f3f01539f157f20ffa2b24932f8e88740517a62eece151239c

See more details on using hashes here.

Provenance

The following attestation bundles were made for recon_tool-2.8.0.tar.gz:

Publisher: release.yml on blisspixel/recon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file recon_tool-2.8.0-py3-none-any.whl.

File metadata

  • Download URL: recon_tool-2.8.0-py3-none-any.whl
  • Upload date:
  • Size: 702.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for recon_tool-2.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c9a88f6429fa3cd7c7e4bb8a497107cb3aa6aef28a976841ab71d150a2ce0b8f
MD5 b7e74ca0784b497ef72286443598956d
BLAKE2b-256 d46d4fb07b233eafcbb1976bb290c0624233e2b973c62d562e12ebf057e47175

See more details on using hashes here.

Provenance

The following attestation bundles were made for recon_tool-2.8.0-py3-none-any.whl:

Publisher: release.yml on blisspixel/recon

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

2.18.4

2 files

2.18.3

2 files

2.18.2

2 files

2.18.1

2 files

2.18.0

2 files

2.17.13

2 files

2.17.12

2 files

2.17.11

2 files

2.17.10

2 files

2.17.9

2 files

2.17.8

2 files

2.17.7

2 files

2.17.6

2 files

2.17.5

2 files

2.17.4

2 files

2.17.3

2 files

2.17.2

2 files

2.17.1

2 files

2.17.0

2 files

2.16.1

2 files

2.16.0

2 files

2.15.1

2 files

2.15.0

2 files

2.14.1

2 files

2.14.0

2 files

2.13.0

2 files

2.12.0

2 files

2.10.4

2 files

2.10.3

2 files

2.10.2

2 files

2.10.1

2 files

2.10.0

2 files

2.9.0

2 files

This release

2.8.0 This release

2 files

2.7.0

2 files

2.6.14

2 files

2.6.13

2 files

2.6.12

2 files

2.6.11

2 files

2.6.10

2 files

2.6.9

2 files

2.6.7

2 files

2.6.6

2 files

2.6.5

2 files

2.6.4

2 files

2.6.3

2 files

2.6.2

2 files

2.6.1

2 files

2.6.0

2 files

2.5.8

2 files

2.5.7

2 files

2.5.6

2 files

2.5.5

2 files

2.5.3

2 files

2.5.2

2 files

2.5.1

2 files

2.5.0

2 files

2.4.0

2 files

2.3.9

2 files

2.3.8

2 files

2.3.7

2 files

2.3.6

2 files

2.3.5

2 files

2.3.4

2 files

2.3.3

2 files

2.3.2

2 files

2.3.1

2 files

2.3.0

2 files

2.2.19

2 files

2.2.18

2 files

2.2.17

2 files

2.2.16

2 files

2.2.15

2 files

2.2.14

2 files

2.2.13

2 files

2.2.12

2 files

2.2.11

2 files

2.2.10

2 files

2.2.9

2 files

2.2.8

2 files

2.2.7

2 files

2.2.6

2 files

2.2.5

2 files

2.2.4

2 files

2.2.3

2 files

2.2.2

2 files

2.2.1

2 files

2.2.0

2 files

2.1.18

2 files

2.1.17

2 files

2.1.16

2 files

2.1.15

2 files

2.1.14

2 files

2.1.13

2 files

2.1.12

2 files

2.1.11

2 files

2.1.10

2 files

2.1.9

2 files

2.1.8

2 files

2.1.7

2 files

2.1.6

2 files

2.1.5

2 files

2.1.4

2 files

2.1.3

2 files

2.1.2

2 files

2.1.1

2 files

2.1.0

2 files

2.0.1

2 files

2.0.0

2 files

1.9.99

2 files

1.9.98

2 files

1.9.97

2 files

1.9.96

2 files

1.9.95

2 files

1.9.94

2 files

1.9.93

2 files

1.9.92

2 files

1.9.91

2 files

1.9.90

2 files

1.9.89

2 files

1.9.88

2 files

1.9.87

2 files

1.9.86

2 files

1.9.85

2 files

1.9.84

2 files

1.9.83

2 files

1.9.82

2 files

1.9.81

2 files

1.9.80

2 files

1.9.79

2 files

1.9.78

2 files

1.9.77

2 files

1.9.76

2 files

1.9.75

2 files

1.9.74

2 files

1.9.73

2 files

1.9.72

2 files

1.9.71

2 files

1.9.70

2 files

1.9.69

2 files

1.9.54

2 files

1.9.53

2 files

1.9.52

2 files

1.9.51

2 files

1.9.50

2 files

1.9.49

2 files

1.9.48

2 files

1.9.47

2 files

1.9.46

2 files

1.9.45

2 files

1.9.44

2 files

1.9.43

2 files

1.9.42

2 files

1.9.41

2 files

1.9.40

2 files

1.9.39

2 files

1.9.38

2 files

1.9.37

2 files

1.9.36

2 files

1.9.35

2 files

1.9.34

2 files

1.9.33

2 files

1.9.32

2 files

1.9.31

2 files

1.9.30

2 files

1.9.29

2 files

1.9.28

2 files

1.9.27

2 files

1.9.26

2 files

1.9.25

2 files

1.9.24

2 files

1.9.23

2 files

1.9.22

2 files

1.9.21

2 files

1.9.20

2 files

1.9.18

2 files

1.9.14

2 files

1.9.13

2 files

1.9.12

2 files

1.9.11

2 files

1.9.10.1

2 files

1.9.10

2 files

1.9.9

2 files

1.9.8

2 files

1.9.7

2 files

1.9.6

2 files

1.9.5

2 files

1.9.4

2 files

1.9.3.10

2 files

1.9.3.9

2 files

1.9.3.8

2 files

1.9.3.7

2 files

1.9.3.6

2 files

1.9.3.5

2 files

1.9.3.4

2 files

1.9.3.3

2 files

1.9.3.2

2 files

1.9.3.1

2 files

1.9.3

2 files

1.9.2.2

2 files

1.9.2

2 files

1.9.1

2 files

1.9.0

2 files

1.8.1

2 files

1.8.0

2 files

1.7.0

2 files

1.6.1

2 files

1.6.0

2 files

1.5.2

2 files

1.5.1

2 files

1.5.0

2 files

1.4.8

2 files

1.4.7

2 files

1.4.6

2 files

1.4.5

2 files

1.4.4

2 files

1.4.3

2 files

1.4.2

2 files

1.4.1

2 files

1.4.0

2 files

1.3.1

2 files

1.3.0

2 files

1.2.1

2 files

1.2.0

2 files

1.1.0

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

0.11.0

2 files

0.10.3

2 files

0.10.2

2 files

0.10.1

2 files

0.10.0

2 files

0.9.3

2 files

0.9.2

2 files

0.9.1

2 files

0.9.0

2 files

0.8.1

2 files

0.8.0

2 files

0.7.3

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.1

2 files

0.6.0

2 files

0.5.1

2 files

0.5.0

2 files

0.4.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page