recon-mcp

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.

Category
访问服务器

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

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选