recon-mcp
An MCP server providing 15 OSINT tools over free, public sources for AI agents, enabling domain reconnaissance, subdomain discovery, DNS lookups, host profiling, CVE search, and more without API keys.
README
recon-mcp
An MCP server that gives an AI agent 15 OSINT tools over free, public sources. No API keys, no accounts, no signup — every source here answers unauthenticated.
It is also a worked example of what changes when an MCP server has to survive real use rather than a demo: response shaping, context budgeting, per-endpoint retry policy, and composite tools that collapse a predictable ten-call sequence into one.
"Map the attack surface of github.com"
→ recon_domain("github.com") one call
→ 139 subdomains from Certificate Transparency
→ 6 of them still resolve, checked in parallel
→ 12 addresses profiled for open ports and known CVEs
That is a real run, not an illustration. It took ~2 minutes, nearly all of it waiting on crt.sh — certificate transparency is the slow leg on any busy domain. The win here is call count, not latency: the same picture assembled tool-by-tool costs twenty-plus round trips with the model deciding the obvious next step between each one.
Install
git clone https://github.com/<you>/recon-mcp && cd recon-mcp
python -m venv .venv && . .venv/bin/activate
pip install -e .
Register it with any MCP client. For Claude Desktop / Claude Code:
{
"mcpServers": {
"recon": {
"command": "/absolute/path/to/recon-mcp/.venv/bin/recon-mcp"
}
}
}
That is the whole setup. There is no configuration file and nothing to authenticate.
Tools
| Tool | Answers |
|---|---|
recon_domain |
Full first pass: CT → DNS → host exposure, one call |
crt_subdomains |
Subdomains from Certificate Transparency logs |
crt_certificates |
Raw CT entries — issuer, validity, SANs |
dns_records |
A/AAAA/CNAME/MX/NS/TXT/SOA in one parallel call |
dns_lookup |
One specific record type |
dns_reverse |
PTR for an IPv4 address |
host_profile |
Shodan InternetDB: ports, hostnames, tags, CVEs |
host_ports |
Just the open ports |
host_vulns |
Just the CVEs, with a false-positive warning |
cve_lookup |
One CVE: CVSS score, vector, description |
cve_search |
CVEs by keyword, newest first |
rdap_domain |
Registration data: dates, registrar, nameservers |
rdap_ip |
Netblock owner, range, country |
wayback_urls |
Historical URLs archived under a domain |
wayback_snapshots |
Snapshots of one URL over time, with digests |
Sources: crt.sh, Cloudflare & Google DNS-over-HTTPS, Shodan InternetDB, NVD, RDAP, Wayback Machine.
Design notes
The parts that took iteration, and why they ended up this way.
One envelope, including on failure
Every tool returns the same shape:
{
"ok": true,
"status": 200,
"data": {},
"pivots": {"hosts": [], "ips": [], "emails": [], "urls": []},
"truncated": false,
"hint": "..."
}
Tools that each invent their own result format make the model rediscover structure on every call. Errors keep the shape too — a tool that returns a bare string on failure forces the agent to branch on type before it can read anything.
hint carries what a status code cannot: that a 404 from Shodan means "never
crawled, probably nothing exposed" rather than "broken", or that CVE lists
from banner matching produce false positives when patches are backported.
Compaction is the default, full is opt-in
Recon endpoints answer big. A CT query on an active domain returns tens of
thousands of rows; handing that to a model ends the session. Lists are cut to
25 items and strings to 6000 characters, recursively, with truncated set so
nothing silently disappears. Any tool takes full: true when the caller
genuinely wants everything.
The budget is deliberately tight. An agent can always ask for more — it cannot un-blow its context window.
pivots — the next hop without a parse step
Every response harvests hostnames, IPs, emails and URLs out of the payload. The identifiers worth querying next live in unpredictable places: a hostname appears in a certificate subject, a redirect target and a PTR record, none of which share a key name. Harvesting them centrally means the agent chains lookups instead of parsing prose to find something to look up.
Retry budgets per endpoint
One retry policy for every source is wrong in both directions. crt.sh is slow and gateway-errors under load: long timeout, few retries, patience. NVD rate-limits unauthenticated callers to roughly five requests per 30 seconds: back off hard, cache for an hour. DNS is fast and cheap: short timeout, retry immediately against the spare resolver.
Retrying a known-broken endpoint four times turns one bad call into forty seconds of an agent sitting still — which the user experiences as the tool being broken.
Composite tools
An opening pass over a domain is always the same sequence, and the model's
"reasoning" between the steps adds nothing while the latency is real.
recon_domain runs it in-process with the fan-out parallelised: ~15 calls
become 1. The per-source tools stay available for drilling into whatever the
overview surfaces.
Its host_limit cap is the important part. Some domains have thousands of
subdomains; resolving all of them would mean thousands of DNS queries and a
result nobody can read. The tool takes the most promising ones, says how many
it skipped, and lets the caller go deeper deliberately.
Failures stay inside the tool
An unhandled exception in a handler propagates as a protocol error and, depending on the client, kills the connection or leaves the agent with no idea what happened. Everything is caught at the boundary and returned as a normal failure envelope: a broken tool costs one turn, not the session.
Logging goes to stderr, never stdout — stdout carries the MCP protocol, and a stray log line there corrupts the stream in a way that is unpleasant to debug from the client side.
Scope and use
This queries public databases about internet-facing infrastructure. It sends no traffic to the targets themselves: certificate logs, passive DNS, archived crawls and an existing scan index. That makes it safe for attack-surface mapping, asset inventory and pre-engagement research.
It is not a scanner and does not confirm anything. CVEs from Shodan are inferred from banners and go stale; archived URLs may be long gone. Everything here is a lead to verify, not a finding to report.
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。