Pathfinder
Pathfinder MCP server lets an LLM agent run passive and active reconnaissance against a target and chain tool outputs via session tokens.
Enumerate subdomains passively (CertSpotter, HackerTarget, OTX, urlscan, subfinder).
Resolve DNS records (A, AAAA, MX, TXT, NS, CNAME).
Probe hosts for live HTTP(S) services.
Fingerprint web technologies and detect WAF/CDN.
Check for WAF origin bypass exposure.
Discover historical URLs from Wayback Machine.
Scan top-N ports with nmap.
Fuzz common paths with ffuf using built-in or custom wordlists.
Run nuclei templates with severity/template filters.
Chain results across tools using scan_token/from_token; sessions are in-memory per process.
Gracefully report MISSING_TOOL if wrapped CLIs are absent.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Pathfinderenumerate subdomains for example.com and probe which are live"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pathfinder-mcp
MCP server exposing offensive recon tooling to LLM agents — Claude Code, OpenCode, Codex, Hermes, any MCP client.
Pathfinder wraps the recon CLI tools security researchers already use (subfinder, httpx, nmap, ffuf, nuclei) into a single MCP server, so an LLM agent can plan and execute reconnaissance itself — not just tell you which commands to run.
Phase 1: passive subdomain enum, DNS, WAF detection, tech fingerprint, wayback discovery
Phase 2: active port scan, origin-bypass checks, nuclei templates
Phase 3: session state — the agent chains outputs across tools (
scan_resulttokens) instead of re-parsing raw textPhase 4: HTML/JSON report export, target diffing (today vs. yesterday)
Quick start
One command, no clone, no venv (needs uv):
uvx --from "git+https://github.com/dewhush/pathfinder-mcp" pathfinderOr the classic way:
git clone https://github.com/dewhush/pathfinder-mcp.git
cd pathfinder-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -e .Related MCP server: Bug Bounty Assistant MCP
Requirements
Pathfinder wraps these CLIs. It degrades gracefully — a tool that can't find its binary reports MISSING_TOOL rather than crashing. Install the ones you want:
Tool | Used by | Install |
subfinder |
|
|
httpx |
|
|
nmap |
|
|
ffuf |
|
|
nuclei |
|
|
No external API keys required. Everything is local or free public APIs (CertSpotter, HackerTarget, AlienVault OTX, urlscan.io, Wayback).
Connect to your agent
Claude Code (local Python):
claude mcp add pathfinder -- python -m pathfinder.serverClaude Code (uvx — no local Python, no clone):
claude mcp add pathfinder -- uvx --from "git+https://github.com/dewhush/pathfinder-mcp" pathfinderClaude Code (Docker — no local Python needed):
# pull the release tarball and load it (no registry auth needed)
curl -L -o /tmp/pathfinder.tar.gz \
https://github.com/dewhush/pathfinder-mcp/releases/download/v0.1.0/pathfinder.tar.gz
gunzip /tmp/pathfinder.tar.gz
docker load -i /tmp/pathfinder.tar
claude mcp add pathfinder -- docker run --rm -i ghcr.io/dewhush/pathfinder-mcp:0.1.0Any MCP client (Docker, manual command): docker run --rm -i ghcr.io/dewhush/pathfinder-mcp:0.1.0
The Docker image bundles subfinder, httpx, nmap, ffuf and nuclei — the full
toolset works with zero local installs. Local Python still needs those CLIs on
PATH; anything missing degrades to MISSING_TOOL instead of crashing.
Hermes:
hermes mcp add pathfinder --command "python -m pathfinder.server"OpenCode / Codex / other MCP clients: add to your config:
{
"mcpServers": {
"pathfinder": {
"command": "python",
"args": ["-m", "pathfinder.server"]
}
}
}Scope: Pathfinder is a tool-wrapper. You are responsible for running it only against infrastructure you own or are authorized to test.
Tools
Passive
subdomain_enum — passive subdomain enumeration (CertSpotter + HackerTarget + OTX + urlscan + subfinder if present).
subdomain_enum(domain="example.com", source="all")
subdomain_enum(domain="example.com", source="otx")dns_resolve — A / AAAA / MX / TXT / NS / CNAME records for a host.
dns_resolve(host="example.com", record_type="A")tech_detect — web technology fingerprint via httpx.
tech_detect(url="https://example.com")wayback_discover — historical URLs from the Wayback Machine for a host.
wayback_discover(host="example.com", limit=500)Active
http_probe — probe a list of hosts for live HTTP(S) services.
http_probe(hosts=["sub.example.com", "api.example.com"])port_scan — nmap top-N ports on a host.
port_scan(host="example.com", top_ports=1000)waf_detect — WAF/CDN identification from response headers, TLS cert, and WAF fingerprints (Cloudflare, Akamai, AWS, Sucuri, Imperva, Cloudfront).
waf_detect(url="https://example.com")origin_bypass_check — check whether a WAF-protected host resolves directly to its origin IP, bypassing the WAF. Resolves the host, compares the IP against known WAF/CDN ranges, and reports ORIGIN_EXPOSED / WAF_PROTECTED / UNKNOWN.
origin_bypass_check(host="example.com")This is the technique documented in WAF origin bypass via direct IP access. If a host reports ORIGIN_EXPOSED, the origin IP can be reached directly with a spoofed Host header:
curl -H "Host: example.com" https://<origin-ip>/endpoint_discover — fuzz common paths with ffuf.
endpoint_discover(url="https://example.com", wordlist="raft-small")Built-in wordlists: raft-small (default), raft-medium, raft-big, common, seclists (expects /usr/share/seclists). Use wordlist="/abs/path" for a custom file.
nuclei_scan — run nuclei templates against a target.
nuclei_scan(target="https://example.com", templates=["cves", "exposures"])
nuclei_scan(target="https://example.com", severity=["high", "critical"])Session chaining
Every tool returns structured JSON plus a scan_token. Pass it back into any other tool as from_token — Pathfinder resolves the token to the relevant hosts/URLs from the current session, so the agent chains steps without you re-typing targets:
1. subdomain_enum(domain="example.com") → scan_token=abc123, 42 hosts
2. http_probe(from_token="abc123") → scan_token=def456, 7 live
3. waf_detect(from_token="def456") → 1 origin exposed
4. origin_bypass_check(from_token="def456") → origin IP confirmedSessions are per-process and in-memory — nothing leaves the machine.
Development
pip install -e ".[dev]"
pytest # unit tests, no network, all tools mocked
ruff check src tests
ruff format src testsLicense
MIT — 0xDew. Authorized use only.
Available Tools
10 toolsdns_resolveDns ResolveC
Resolve DNS records for a host.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Hostname, e.g. "example.com". | |
| from_token | No | Optional scan_token from an earlier call. | |
| record_type | No | A, AAAA, MX, TXT, NS, CNAME, or ALL. | A |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Resolve' implies a read-only lookup, but the description says nothing about rate limits, error behavior on NXDOMAIN, or how from_token chaining affects the call. With no annotations this is a significant gap for a tool whose behavior is only partly self-evident.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is appropriately sized, though almost too terse to be maximally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, with three parameters, no annotations, and many overlapping sibling tools, the description omits the usage context and behavioral hints an agent would need to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents host, from_token, and record_type (including the A/AAAA/MX/TXT/NS/CNAME/ALL set and the default of A). The description adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Resolve DNS records for a host'), so an agent knows exactly what the tool does. It does not distinguish itself from siblings like subdomain_enum or http_probe, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as subdomain_enum (which also involves DNS enumeration) or when not to use it. The agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endpoint_discoverEndpoint DiscoverC
Fuzz common paths on a URL with ffuf.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Base URL, e.g. "https://example.com". | |
| wordlist | No | Named list (raft-small, raft-medium, raft-big, common, seclists) or an absolute path to a wordlist file. | raft-small |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing beyond naming ffuf. It omits that this is an active, noisy, authorization-requiring scan, and says nothing about resumption via from_token or rate/impact considerations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, correctly placing the action and target first. It is arguably too terse for the tool's complexity, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but the definition still leaves major gaps: no usage routing against wayback_discover, no disclosure that this is an active fuzzing scan, and no behavioral context for a tool with zero annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so url, wordlist, and from_token are already fully documented in the schema (including the raft-* list names and the resume semantics of from_token). The description adds no parameter detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fuzz) and resource (common paths on a URL) and names the underlying engine (ffuf), so the agent knows this is path/endpoint brute-forcing. It does not differentiate from the sibling wayback_discover, which also surfaces endpoints, leaving some overlap unresolved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use context: nothing about when to prefer this over wayback_discover or http_probe, no prerequisites, and no mention of authorization or scan-noise expectations. The agent must infer usage entirely from the name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
http_probeHttp ProbeC
Probe hosts for live HTTP(S) services.
| Name | Required | Description | Default |
|---|---|---|---|
| hosts | No | List of hostnames/URLs. Required unless from_token is given. | |
| from_token | No | Reuse hosts discovered by an earlier call (e.g. subdomain_enum). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and provides almost nothing: no note on network traffic generation, rate limits, whether the probe is non-destructive, timeouts, or concurrency. For an active network-probing tool, that is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though brevity here edges toward under-specification rather than crisp conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need not be explained, and both parameters are documented. What is missing is the when-to-use context and any behavioral notes for a tool that generates live network traffic.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema and the baseline of 3 applies. The description adds no extra syntax or semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Probe) and resource (hosts for live HTTP(S) services), so the agent knows it is an HTTP liveness check. However, it does not distinguish itself from siblings like port_scan or tech_detect, which also touch live services.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus port_scan, tech_detect, or dns_resolve. The presence of a from_token parameter chaining from subdomain_enum is a usage hint, but it lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nuclei_scanNuclei ScanC
Run nuclei templates against a target.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | URL or host, e.g. "https://example.com". | |
| severity | No | Filter by severity, e.g. ["high", "critical"]. | |
| templates | No | Template dirs or IDs, e.g. ["cves", "exposures"]. | |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the action but omits key behavioral traits: whether the scan is read-only, whether it sends network requests, authorization requirements, rate limits, or potential impact on the target. This is a significant gap for a security scanning tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with zero wasted words. However, its extreme brevity leaves important context unaddressed, which is captured under other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. Yet with no annotations, the description should at least hint at usage context or behavioral traits. It does not, leaving the agent with insufficient information to confidently select or invoke this tool among many security scanning siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters thoroughly. The description only implicitly references target and templates. Baseline 3 applies when the schema does the heavy lifting with no added meaning from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Run') and resource ('nuclei templates against a target'), making the core action clear. It does not differentiate the tool from sibling scanning tools like port_scan or http_probe, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is provided. The description does not mention alternatives, prerequisites, or when this tool should be chosen over siblings such as tech_detect or waf_detect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
origin_bypass_checkOrigin Bypass CheckA
Check whether a WAF-protected host resolves directly to its origin IP.
If the A record lands outside known WAF/CDN ranges, the origin is exposed and the WAF can be bypassed by hitting that IP with a spoofed Host header.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Hostname, e.g. "example.com". | |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it does disclose the semantics of the outcome: an A record landing outside known WAF/CDN ranges means the origin is exposed and bypassable. It does not state that this is a non-mutating remote lookup, nor mention rate limits or any auth/scope constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core action front-loaded in the first sentence and the interpretive payoff in the second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description usefully explains how to interpret a positive result. It is nearly complete, though it omits prerequisites (e.g., that discovery should precede it) and any note on the read-only nature of the check given the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both 'host' and the optional 'from_token'. The description adds no parameter-level detail such as format, chaining behavior of the token, or what the tool does when the token is omitted, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check whether a WAF-protected host resolves directly to its origin IP') and even explains the mechanism that makes the result meaningful. It does not explicitly distinguish itself from overlapping siblings like dns_resolve or waf_detect, so an agent must infer the difference from the security framing alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by describing the precondition ('WAF-protected host') and what a positive finding means (WAF can be bypassed via spoofed Host header). However, it never states when to reach for this tool versus dns_resolve or waf_detect, nor any ordering or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
port_scanPort ScanC
nmap top-N port scan of a host.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Hostname or IP. | |
| top_ports | No | How many common ports to scan (default 1000). | |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it says nothing about the intrusive nature of an active scan, authorization requirements, expected runtime, or rate limiting. The presence of a from_token parameter strongly implies a resumable/long-running scan, but the description never explains that behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded fragment with zero filler, which is efficient. It is arguably under-specified rather than bloated, so it scores well on size but is not a model of helpful structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the schema fully documents parameters. What is missing is the behavioral and routing context an agent needs: when this scan is appropriate, its intrusive character, and the resumption semantics implied by from_token.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so host, top_ports, and from_token are already documented in the schema. The description's 'top-N' phrasing loosely echoes top_ports but adds no format, range, or usage nuance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('port scan of a host') and adds the scanner family ('nmap top-N'), which is more than a restatement of the name. However, it does nothing to distinguish itself from the other scanning siblings such as nuclei_scan or http_probe, which an agent must disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to run a port scan versus nuclei_scan, http_probe, or waf_detect, and no prerequisites or ordering guidance (e.g. after dns_resolve or subdomain_enum). Usage is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subdomain_enumSubdomain EnumC
Passive subdomain enumeration for a domain.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Root domain, e.g. "example.com". | |
| source | No | Which source(s) to query. Default "all" merges everything: certspotter (CT log), hackertarget (hostsearch), otx (AlienVault passive DNS), urlscan (scan archive), plus the local "subfinder" binary if installed. Any single name can be passed to use one source only. | all |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses only that enumeration is 'passive' (no direct target contact), but says nothing about external source dependencies, rate limits, or whether results are merged/deduplicated. For a 3-param recon tool with zero annotation coverage, this is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste, but for a tool with three parameters and no annotations it crosses from concise into under-specified. Efficiency here reflects absence of content rather than disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Schema is fully documented and an output schema exists, so return values need not be explained. However, for a recon tool with no annotations, the description omits any behavioral context (passive-source guarantees, environment/binary dependencies) that an agent would need to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the source parameter's schema text already documents the merge behavior and each source name in detail. The description adds no parameter meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Passive subdomain enumeration for a domain' tells an agent exactly what the tool returns. The 'passive' qualifier distinguishes it from active siblings like dns_resolve or port_scan, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no routing to alternatives such as endpoint_discover or dns_resolve. The agent must infer context from the tool name and siblings alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tech_detectTech DetectC
Fingerprint web technology behind a URL (httpx tech-detect).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL, e.g. "https://example.com". | |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it adds almost nothing: it does not state that it actively connects to and fetches the target URL, does not confirm it is read-only/non-destructive, and gives no hints about rate limits, timeouts, or failure modes. The output schema covers return values, but the operational profile is undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste and the core capability stated immediately. It is perhaps too terse for the tool's role, but there is no padding or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the structured data does much of the work, so the description is minimally viable. Still, for a network-touching tool with no annotations and three closely related sibling scanners, the absence of usage and behavioral guidance leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `url` and `from_token` are already explained in the schema, including that `from_token` is an optional scan_token from an earlier call. The description adds no extra parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Fingerprint web technology behind a URL' names a concrete verb (fingerprint) and resource (web tech stack at a URL), and the parenthetical '(httpx tech-detect)' anchors it to a known capability. However, it never distinguishes itself from siblings like http_probe or waf_detect, which an agent must disambiguate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternative routing guidance at all. An agent facing http_probe, waf_detect, and tech_detect has nothing in the description to decide between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
waf_detectWaf DetectC
Detect a WAF/CDN in front of a URL from headers and response body.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Target URL, e.g. "https://example.com". | |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the detection method but says nothing about whether the call performs live network requests, whether it is read-only or safe to repeat, or how the optional from_token affects behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with no wasted words, and the key information (target and method) is front-loaded. It could have used the space to add usage context instead of stopping so early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for a detection tool with no annotations, the description omits the when-to-use context and any behavioral notes about live probing, leaving it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the example URL format and the from_token's origin. The description adds no additional parameter meaning beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Detect') and resource ('WAF/CDN in front of a URL') plus the method used (headers and response body). It is clearly distinguishable from siblings like tech_detect or http_probe by naming the detection target, though it does not explicitly contrast itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus tech_detect, http_probe, or origin_bypass_check, and no mention of prerequisites such as needing the target to be reachable. The agent must infer the use case from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wayback_discoverWayback DiscoverB
Pull historical URLs for a host from the Wayback Machine.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Hostname, e.g. "example.com". | |
| limit | No | Max URLs to return (default 500). | |
| from_token | No | Optional scan_token from an earlier call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read-only external lookup but does not disclose rate limits, authentication needs, whether results are deduplicated, how pagination works, or what side effects exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. It states the core operation and source immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need not be explained, and the input schema is fully documented. However, with no annotations, the description still omits enough behavioral and usage context that an agent lacks guidance on when to choose this over sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the input schema. The description adds no parameter meaning beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Pull'), resource ('historical URLs'), target ('for a host'), and source ('from the Wayback Machine'). It clearly distinguishes itself from the sibling recon tools by naming the archive source, but it does not explicitly contrast itself with tools like endpoint_discover or subdomain_enum.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no exclusions, and no alternatives. It implies the tool is for gathering historical URLs, but it does not tell an agent when this is preferable to endpoint_discover, subdomain_enum, or other siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
subdomain_enum1 field changed- changed
Input schema / properties / source / descriptionPrevious value: -"\"crtsh\" (certificate transparency, no deps),\n \"subfinder\" (needs the subfinder binary),\n or \"all\" (default — merge both)."New value: +"Which source(s) to query. Default \"all\" merges everything:\n certspotter (CT log), hackertarget (hostsearch),\n otx (AlienVault passive DNS), urlscan (scan archive),\n plus the local \"subfinder\" binary if installed.\n Any single name can be passed to use one source only."
10 tool updates
v0.1.0- First observed
dns_resolve - First observed
endpoint_discover - First observed
http_probe - First observed
nuclei_scan - First observed
origin_bypass_check - First observed
port_scan - First observed
subdomain_enum - First observed
tech_detect - First observed
waf_detect - First observed
wayback_discover
TDQS
Scored across 10 tools
Most tools target distinct phases of reconnaissance (enumeration, probing, detection, scanning). Slight overlap exists between tech_detect and waf_detect, both analyzing URL response characteristics, and between http_probe and port_scan in service discovery, but descriptions clarify boundaries.
All tool names follow a consistent snake_case noun_verb pattern (tech_detect, port_scan, dns_resolve, etc.), making the set highly predictable and readable.
10 tools is well-scoped for a reconnaissance toolkit, covering the essential discovery, fingerprinting, and scanning operations without redundancy or bloat.
The set covers subdomain enumeration, DNS resolution, port scanning, HTTP probing, technology/WAF detection, origin bypass checks, historical URL discovery, endpoint fuzzing, and vulnerability scanning. Minor gaps include whois/ASN lookups or SSL/TLS inspection, but core recon workflows are well supported.
Maintenance
Related MCP Connectors
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
Security scanner for MCP servers. Detect vulnerabilities, prompt injection, and tool poisoning.
MEOK MCP Hardening MCP — automated security red-team for any MCP server. Maps OWASP LLM Top 10
Hyperion — MCP tool marketplace for AI agents: web, OSINT, security, research via one key.
Related MCP Servers
- AlicenseAqualityBmaintenanceA scope-aware bug-bounty & reconnaissance MCP server that works out of the box on the Python standard library and augments itself with your favourite CLI tools when they're present.22MIT
- AlicenseAqualityBmaintenanceAn MCP server that provides passive and low-impact active reconnaissance tools for authorized bug bounty and security assessments, enabling LLMs to perform structured recon and generate reports.11Apache 2.0
- AlicenseAqualityBmaintenanceMCP server providing safe, structured network and security reconnaissance tools for AI agents, with graded JSON results.1384 PyPI1MIT
- AlicenseNot gradedqualityCmaintenanceAn 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.MIT