EasyHunt-AI
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| cordon_load_scopeB | Load and validate an engagement scope file, creating the workspace. Must succeed before any target-taking tool will run. |
| cordon_statusA | Current engagement: scope summary, assets, findings, budget, rate limits, approvals. |
| cordon_finishA | Close the engagement: flush findings and assets to disk and seal the audit log. |
| scope_checkA | Ask whether targets are in scope WITHOUT touching them. Use this before planning work against a newly discovered host. |
| approval_pendingB | List aggressive actions parked awaiting human approval. |
| approval_respondA | Relay a HUMAN decision on a parked approval. Do not call this on your own initiative — only when a person has told you their decision. |
| job_listC | List background scans and their states. |
| job_fetchA | Fetch a finished job's result. Prefer fetch_slice for large result sets — this returns everything and is capped. |
| job_cancelB | Stop a running scan. Kills the whole process tree. |
| fetch_sliceA | Pull one window of a job's result instead of the whole set. path=dotted path into the result, where=regex filter, fields=keys to keep. Use this rather than job_fetch whenever a scan produced many rows. |
| taskgraph_nextA | What to do next: pending tasks whose dependencies are met, highest priority first. Each carries the discovery that created it. Call this after every phase rather than re-deriving the plan from scratch. |
| taskgraph_updateA | Mark a task done, failed, blocked, or skipped after acting on it. |
| taskgraph_viewA | Render the task graph as Mermaid, showing how discoveries drove the work. |
| memory_recallA | Retrieve proof-of-concept techniques that worked on previous engagements for this vulnerability class. Check this before designing a PoC from scratch — the store holds methods only, never credentials or target data. |
| graph_recallA | What this engagement already knows about a host, URL, or asset, and how it connects to everything else. Ask this before re-running recon — the answer is free and a re-scan costs the target requests. |
| brain_recallA | What the neuron brain has LEARNED about testing this kind of target: which validators/techniques actually paid off on this vulnerability class with this observed technology stack and WAF, ranked by cross-engagement experience. Consult before choosing validators or designing a test plan — the brain remembers outcomes the static index cannot. Empty results mean no prior experience on this shape; proceed from the technique index. |
| brain_learnA | Teach the neuron brain an observed outcome: a validator HIT, a CLEAN pass, or a FALSE_POSITIVE (the scanner fired and was wrong). The brain uses these to rank future plans and to suppress known-FP tools on similar targets. Use after a validator run, or when triage drops a finding — teaching it the false positive is what stops the same noise being re-filed next engagement. Stores methods and outcomes only. |
| brain_stateA | What the neuron brain senses right now: the phase and tool currently running, the most recent tool calls, and the memory store's stats. The brain senses every tool call through the audit log, so this is a live pulse of the whole engagement, not a report. |
| brain_historyB | The brain's episodic memory: what happened before, in order — every sensed tool call across engagements, filterable by phase, tool, or outcome. This is the 'what failed, what succeeded, what was a false positive, what was a true finding' record the synapse weights cannot express on their own. |
| dashboard_stateA | The live engagement dashboard blob: which phase is running, each phase's outcome, the findings ledger with severity/status, discovered assets, and the brain's recent sensed activity. One JSON snapshot of the whole run — use it to answer 'where is the scan, what has it found' without reading workspace files directly. The CLI mirrors this as |
| rules_listA | List loaded detection rules and plugins, plus anything rejected at load time. A rejected rule is a detection you do not have — check this when a scan finds less than expected. |
| rules_reloadA | Re-scan the rule directories. Use after editing or adding a rule file. |
| rule_testA | Dry-run the loaded rule-packs against a sample observation (url/status/headers/body) without touching any host. Use this to check a rule before trusting it, and to understand why one did or did not fire. |
| cordon_capabilitiesC | List registered capabilities with their phase, mode, and origin. |
| audit_tailB | Recent audit records, including refusals. The engagement's evidence trail. |
| cloud_asset_discoveryA | [AGGRESSIVE — requires human approval] Discover public cloud storage by guessing names from a keyword. Runs cloud_enum and S3Scanner. Every discovered bucket is checked against the engagement scope and against ownership evidence before it counts — name similarity is not ownership. |
| cloud_attack_pathsA | [AGGRESSIVE — requires human approval] Build attack paths from cloud configuration (Prowler + Cartography graph). Turns a list of misconfigurations into reachability: which public entry points lead to which privileged roles, and in how many hops. That chain is what makes a cloud finding worth a severity rating. |
| cloud_auditA | [AGGRESSIVE — requires human approval] Audit cloud posture with Prowler and ingest failed checks as findings. |
| cloud_permissionsC | [AGGRESSIVE — requires human approval] Map principals, permissions, and privilege-escalation paths with CloudFox. Requires credentials the program gave you. Read-only enumeration. |
| k8s_postureA | [AGGRESSIVE — requires human approval] Assess Kubernetes posture with Kubescape. Kubescape ships its own MCP server. If you are doing significant Kubernetes work, connect that directly alongside Cordon rather than routing everything through this wrapper — but vet it first, like any third-party MCP server. |
| contract_static_scanB | Run Slither over a Solidity project and normalize the detector output.
Every result is a CANDIDATE. Slither's high-impact detectors fire on safe code often enough that a finding without a runnable PoC is not submittable on any platform that pays for smart-contract bugs. |
| contract_toolchainA | Report which smart-contract tools are present and correctly identified. Absence is reported per tool rather than as an overall failure, so a missing fuzzer never reads as "the contract is fine". |
| cdn_checkA | Identify which hosts sit behind a CDN, WAF, or cloud provider. Worth running before any port scan: scanning a CDN edge tells you about the CDN, wastes the program's rate limit, and occasionally violates the CDN's own terms rather than the target's. |
| dns_permuteA | [AGGRESSIVE — requires human approval] Generate subdomain permutations with alterx and resolve them with dnsx. Finds hosts that no passive source knows about. Requires approval: this is a brute-force pattern, just against DNS rather than HTTP. |
| dns_resolveA | Resolve hosts and return A/AAAA/CNAME/MX/NS/TXT records. Flags hosts whose CNAME resolves but which have no address record — the shape of a dangling delegation. Those are candidates for takeover_verify, never findings on their own. |
| content_discoveryA | [AGGRESSIVE — requires human approval] Brute-force paths with ffuf, at the engagement's rate limit.
There is no default. The size of the wordlist is the size of the impact on the target, and that should be a deliberate choice. |
| endpoint_discoveryA | Collect known URLs for a domain from public archives. Sources: gau (Wayback + Common Crawl + URLScan), waybackurls, waymore. These query archives, not the target, so they cost the program nothing. include_crawl adds a shallow katana crawl, which does touch the target — keep it off unless the archives came back thin. |
| fuzz_compareA | Diff responses against a baseline to find what a payload actually changed.
Read-only: GET requests through the engagement's rate limiter, nothing is sent beyond the URLs you name. |
| graphql_auditA | Audit a GraphQL endpoint: introspection, suggestions, GraphiQL, CSRF, trace mode. Passive. Every check that remains is a single well-formed query used to read
what the server discloses. graphql-cop's denial-of-service family (alias
overloading, batching, directive overloading, circular introspection) is
excluded unconditionally — those exist to make the server burn CPU, which is
out of bounds under If the URL has no path, graphql-cop tries |
| param_discoveryA | [AGGRESSIVE — requires human approval] Discover hidden request parameters on a URL with Arjun. Guessing costs requests. Mine endpoint_discovery's archive results for parameter names first — they are free and already known to exist. |
| payload_catalogA | List the payload wordlists available to content and parameter discovery. Names returned here are what Only tier A discovery wordlists appear. Tier B injection payloads belong to the approval-gated exploitation tools, and tier C is quarantined and has no name bound to it at all — see docs/PAYLOADS.md. |
| websocket_probeA | Open a WebSocket handshake and report whether the server validates Origin. Pass the Passive: one upgrade request, no frames sent, connection closed immediately.
A handshake that succeeds with a foreign |
| authz_compareA | [EXPLOIT — requires human approval] Fetch one URL as two identities and report whether the server told them apart. The core authorization test. If A can read A's resource and B can read it too, the server is not checking ownership — that is an IDOR. If B is refused, it is. Restricted to GET and HEAD on purpose. Proving broken access control never requires writing: reading another user's record is the proof, and writing to it modifies data that is not yours, which every program in this space forbids outright. Reports a CANDIDATE, never a confirmed finding. Two identical responses can also mean the resource is public, or that neither session is actually authenticated. The result says which checks would settle it. |
| browser_verifyA | [AGGRESSIVE — requires human approval] Verify a candidate in a real browser and capture evidence.
A finding is filed for raw reflection (MEDIUM), execution (HIGH), or a
host-changing redirect (LOW) — all |
| burp_sendA | [AGGRESSIVE — requires human approval] Send one HTTP request per target through the operator's Burp proxy.
Each request goes through the local Burp proxy ( This is a human-handoff primitive, not a scanner: one request per target, nothing automated, and the classes it serves (IDOR, business logic, race conditions, cache poisoning) are exactly the ones that end in a human reading a request. |
| cmdi_probeB | [EXPLOIT — requires human approval] Detect OS command injection with commix. Detection only, never a shell.
The techniques available here are classic, eval-based and time-based — the three that answer "does this execute" by observing output or delay. File-based is excluded: it proves the same thing by writing a file into the target's web root, which is a change to the target, not evidence. Read the tool-availability note if this returns UNTESTED. PyPI's
|
| exploit_chainA | [EXPLOIT — requires human approval] Run the exploit validators across discovered injection points.
Returns |
| exploit_promptA | The prompt pack for one vulnerability class.
The pack names the role, objective, scope (including what is not allowed), the success criteria a candidate must meet before it may be called a finding, and the evidence fields a reproducible PoC must fill. Use it before driving a live test or writing up a candidate: a finding that cannot fill the evidence fields is a lead, not a finding. |
| fingerprint_wafA | Identify the WAF vendor from response headers, body, and status code.
|
| forbidden_chainA | [AGGRESSIVE — requires human approval] Auto-chain 403 bypass across a list of URLs. Pre-checks up to Give it the estate's live URLs (the pipeline passes the asset store, which arrives as a comma/newline-joined string). The chain is what makes a 403 a tested access decision instead of a dead end an operator has to revisit by hand. |
| guided_validateA | [AGGRESSIVE — requires human approval] Run the validators the research playbook names for a class, on an asset.
Every dispatched validator goes through the control plane again (scope, rate, budget, approval) — guidance never becomes an unapproved action. Returns the playbook plus a per-validator outcome summary; validators that prove something file their own findings. |
| nosqli_probeA | [EXPLOIT — requires human approval] Detect NoSQL injection (MongoDB operator injection) with nosqli.
One pair, not a body, because Authentication bypass is the usual impact: |
| oob_listenerB | [AGGRESSIVE — requires human approval] Start an interactsh listener and return the callback URL for blind classes. Inject the returned URL into the suspected sink, wait, then check the polled interactions. A DNS or HTTP hit from the target's infrastructure is the proof. |
| poc_recordB | Record a proof-of-concept a human reproduced, and confirm the finding. For the classes no tool should prove on its own — IDOR, auth bypass, RCE, blind SSRF — this is how a finding becomes confirmed: a person reproduced it and wrote down exactly what they did and what happened. All three of reproduction, expected_result, and observed_result are required. A PoC missing the observed result is a hypothesis. |
| prompt_classesA | List the vulnerability classes that have an exploit/validation prompt pack. |
| smuggling_canary_probeA | [AGGRESSIVE — requires human approval] Test for HTTP request smuggling, proving hits by canary reflection.
Returns coverage alongside findings: payloads sent, detectors run, and detectors skipped. A smuggling scan that could not find an echo gadget, or could not confirm queue poisoning, has not tested those things — and this result says so rather than letting zero findings imply a clean front-end. |
| smuggling_probeA | [EXPLOIT — requires human approval] Detect HTTP request smuggling (CL.TE / TE.CL desync) with smuggler. Unlike everything else in this module, a hit here has collateral: a desync
poisons the connection for whoever uses it next. The probe is timing-based — smuggler measures whether the back-end waits for a body the front-end already terminated. Treat a hit as a strong lead and re-test manually against a target you control, or with the program's explicit agreement, before writing it up. |
| sqli_validateC | [EXPLOIT — requires human approval] Detect SQL injection with sqlmap. Detection only, never data extraction. There is no
|
| ssrf_probeA | [EXPLOIT — requires human approval] Test one URL parameter for server-side request forgery with SSRFmap.
This is deliberately the narrowest of SSRFmap's 24 modules. The ones that
make SSRF interesting — reading IMDS credentials, writing a Redis key,
proxying through the victim — are the ones a bug bounty program means when it
says do not exfiltrate and do not pivot, and they are not on the allowlist.
Confirm reachability here, then prove impact by hand with |
| ssti_probeA | [EXPLOIT — requires human approval] Detect server-side template injection with SSTImap.
A hit here is arithmetic evaluated in a template — |
| strix_deepA | [EXPLOIT — requires human approval] Delegate deep application exploitation to Strix, then ingest its results. Disabled by default. Requires exploitation to be permitted by the engagement and explicit human approval per call. |
| validate_findingsA | [EXPLOIT — requires human approval] Prove candidate findings with minimal PoCs. Validators run in parallel. Only a finding whose validator produced a reproducible PoC becomes 'confirmed'. Everything else is downgraded to 'needs manual review' with the reason recorded. This is the only automatic route to a confirmed finding. |
| waf_bypassA | Ordered WAF-bypass payloads for (vendor, vuln_class), basic → advanced.
Read-only: returns text payloads tagged with technique + level, nothing is sent. Payloads are the data the exploit chain feeds its validators when a base pass was clean; calling this tool does not fire anything at a target. |
| waf_vendorsA | List supported WAF vendors with the classes each has bypass payloads for. |
| web_injection_probeA | [EXPLOIT — requires human approval] Detect open redirect, CRLF, LFI, XXE or HPP in one parameter.
Every result is a CANDIDATE: the class signature must appear in the injected response and not in the baseline request. Nothing is confirmed here. |
| xss_validateA | [EXPLOIT — requires human approval] Confirm reflected XSS on a URL with dalfox.
|
| cors_auditA | Check a URL's CORS policy for origin reflection and trust-boundary bugs. Passive: a handful of GETs with different A permissive policy is only a vulnerability when the endpoint returns data
worth stealing and |
| http_probeA | Probe hosts for live HTTP services: status, title, tech, server, IP. One request per host per scheme, at the engagement's rate limit. Rule-packs
are evaluated against each response, so native detections surface here.
Content-length and content-type are reported per host — the two scalars
that separate a real application from a parked page or an error shell —
and |
| recon_reviewA | Rank live hosts by how worth they are of manual testing. Reads the asset store (probe results + scope focus URLs) and returns the
top |
| tls_auditA | Audit a host's TLS configuration: protocols, ciphers, certificate, headers. Passive. Every check run here is a standard TLS handshake plus one HTTP GET —
the same traffic any browser produces. testssl's vulnerability battery
( |
| waf_detectB | Identify the WAF or protection layer in front of a host. Knowing the WAF changes what is worth trying and what will simply be blocked.
The vendor names this reports are what the exploit chain's bypass pass
consumes: |
| job_statusA | Check, wait on, or list long-running scans. Tools that can outlast a single MCP call — nuclei_scan, bbot_scan,
osmedeus_flow — hand back Omit |
| js_analyzeA | Fetch JavaScript bundles and extract endpoints, secrets, and libraries. Fetches each URL once (a normal browser request), then runs native pattern
matching, jsluice (grammar-based URL extraction), linkfinder (regex-based
endpoint recovery over the saved files) and retire.js (known-vulnerable
library detection). Either external tool being absent is reported per-tool in
|
| llm_probe_catalogA | List the LLM probe families, what each tests, and how findings are graded. Read this before running llm_redteam. Choosing probes by impact rather than running everything is the difference between a report a program acts on and a list of jailbreak transcripts. |
| llm_redteamA | [AGGRESSIVE — requires human approval] Probe the target's AI feature with garak, one probe family at a time. family: indirect-injection (default), tool-abuse, context-leak, output-handling, or jailbreak. Run llm_probe_catalog first to choose. Results are candidates. An LLM probe failing is a behaviour, not yet an impact — see the note in the result for what a report needs. |
| llm_scan_configA | [AGGRESSIVE — requires human approval] Run a promptfoo or deepteam suite from a config inside the workspace. Use this when you have a target-specific test suite — application-aware probes almost always outperform generic ones, because they know what the feature is supposed to refuse. |
| account_registerA | [AGGRESSIVE — requires human approval] Create a test account and register the resulting session. This is the one action in the authenticated toolchain that creates state
rather than reading it, so it is refused unless the program said it may
happen:
The response is masked; the generated credentials are returned once so the operator can store them, and never logged. |
| auth_crawlA | [AGGRESSIVE — requires human approval] Crawl an application as a registered session and map what is behind the login.
Before crawling, the entry point is fetched with and without the session. If the two responses are identical the session authenticates nothing, and the crawl is refused — a list of public pages labelled "authenticated surface" would poison every conclusion drawn from it. When a page turns out to be a single-page-app shell, its same-origin script
bundles are fetched and mined for paths — API literals, request call sites,
and the route table. Those become crawl seeds under the same guards as a
link, and are counted separately in Returns the discovered URLs, the forms found (read-only ones submitted with
empty values, state-changing ones reported and never touched), and — the
useful part — the URLs carrying an object reference, which is what
|
| auth_surfaceA | Detect authentication functionality and rank hosts by account-worthiness.
Every request is a GET against a conventional path. Nothing is submitted,
no account is created, and no credential is sent. The output is a
recommendation to a human: register on these hosts, by hand, if the
program's rules permit it — then bring the sessions back with
|
| coverage_reportA | Report bug-class coverage: what Cordon finds, confirms, and bypasses. The completeness check a client asks for before a test. Every row grades a
bug class as
|
| engagement_attachA | Re-attach to an existing engagement workspace by path. Loads the workspace's scope, budget ledger, assets, findings, sessions and pipeline state so a new session continues exactly where the previous one left off — background jobs included, because they live in the server's event loop rather than in a dead shell process. |
| engagement_newB | Create (or re-open) an engagement and make it the active one. This is Returns the workspace path; every later tool call acts on this engagement
until another |
| hunt_planA | Propose concrete tests based on what recon actually observed. Sends no traffic. Reads the engagement's asset store and returns testable propositions, each citing the observation behind it.
Returns |
| pattern_scanA | Scan URLs (and optionally their response bodies) with vetted gf patterns. Classifies each URL by its query parameters and path segments, and — when
|
| pipeline_statusA | Where the pipeline is right now: per-phase state, next pending phase. Machine-readable version of the status.jsonl trail — branch on
|
| program_scope_fetchB | Fetch a bug bounty program's published scope into a scope.yaml scaffold.
The file is NOT a finished authorization: |
| research_guidanceA | Research a vulnerability class and produce an actionable testing playbook.
|
| run_phaseA | [AGGRESSIVE — requires human approval] Run a single phase against a target and record its state.
The phase result is persisted to |
| run_pipelineA | [AGGRESSIVE — requires human approval] Run the engagement pipeline, gated, resumable, in-process.
Each phase runs through its registered MCP tool — the full control-plane
chain applies per phase — and results land in |
| session_listA | List registered sessions. Values are masked. |
| session_registerC | Register an authenticated session for later phases to use.
Nothing here creates an account. Self-registration is a policy question: some programs invite it, others are silent, and silence is not permission. Read the program's rules, register by hand, then bring the session here. Values are masked in every result, log and audit entry. The store lives in the engagement workspace, which is gitignored, mode 0600. |
| technique_lookupA | Query the PayloadsAllTheThings technique index for how to test a bug class. The counterpart to Five ways in, most specific first:
|
| upload_surfaceA | Detect file-upload surfaces (multipart forms, file inputs, upload paths). Fetches the discovered pages read-only and reports which URLs carry a file input, a multipart form, or an upload-shaped action/parameter. Nothing is uploaded — this is detection only, and every entry is a lead for a human or an approved validator, not a finding. |
| wstg_lookupA | Query the OWASP Web Security Testing Guide for what to test next. Four ways in, most specific first:
Retrieval, not automation. A WSTG test says what to check and why; whether it applies to this target is a judgement no detector makes for you. Touches nothing and costs no budget. |
| port_scanA | [AGGRESSIVE — requires human approval] Discover open TCP ports with naabu. ports: "top-100", "top-1000", or an explicit list like "80,443,8080-8090". CDN ranges are excluded automatically. |
| service_scanA | [AGGRESSIVE — requires human approval] Fingerprint services on specific ports with nmap -sV plus safe NSE scripts. scripts is restricted to default/discovery/version/banner. Exploit, dos,
brute, malware, intrusive, and safe-as-a-category are refused: the
|
| asn_lookupA | Look up ASN and netblocks for a domain or organization. Netblocks are returned for context only — an ASN belonging to the target does not put its ranges in scope. Check anything you find with scope_check before touching it. |
| bbot_scanA | Map attack surface with BBOT. The primary recon entrypoint. Presets: subdomain-enum (default), cloud-enum, code-enum, email-enum, web-basic, baddns, fast. Aggressive presets (web-thorough, spider, paramminer, web-screenshots, baddns-thorough, kitchen-sink) are routed through bbot_scan_active instead, which requires approval. Returns inline if the scan finishes within wait_seconds; otherwise returns a job_id — poll it with job_status and read results with fetch_slice. |
| bbot_scan_activeA | [AGGRESSIVE — requires human approval] Actively probe with BBOT (web-thorough, spider, paramminer, screenshots). Requires human approval. Prefer bbot_scan first: active probing on an unmapped surface wastes the program's rate limit on hosts you have not yet established are interesting. |
| osmedeus_flowB | [AGGRESSIVE — requires human approval] Run a named Osmedeus flow from the reviewed flows directory. Only flows present in engines.osmedeus.flows_dir may be run — arbitrary flow paths are refused because an Osmedeus flow can execute shell commands. |
| security_txtC | Fetch /.well-known/security.txt and report the declared security contact. |
| subdomain_enumA | Enumerate subdomains from every installed passive source and merge them. Runs whichever of subfinder / assetfinder / findomain / amass / theHarvester are present, in parallel, and returns the deduplicated union filtered through the engagement scope. Installing more sources widens coverage with no code change — the tool set is discovered, not hardcoded.
thorough adds slower sources (theHarvester, amass with more providers). Prefer bbot_scan when BBOT is available: it covers more sources than all of these combined. |
| tls_infoA | Read TLS certificates and pull subject-alternative names. SANs frequently reveal internal hostnames and sibling domains. They are scope-filtered before being stored, since one certificate often covers hosts belonging to several organizations. tlsx opens TLS connections to the target, so its concurrency and inter- connection delay are pinned to the engagement. Its default concurrency is 300. |
| whois_lookupA | WHOIS registration data for a domain: registrar, org, dates, nameservers. Useful for confirming an asset actually belongs to the program before you spend requests on it. |
| finding_detailA | Full record for one finding, including evidence and PoC. |
| finding_noteC | Attach an analyst note to a finding. Notes appear in the report. |
| findings_listA | List findings, optionally filtered by status and severity. Returns a compact table by default. Set detail=True for full records — prefer the compact form while planning; it costs a fraction of the tokens. |
| report_generateA | Write Report.md, Report.csv, findings.json, and the task graph to reports/. Confirmed findings (those with a reproducible PoC) are reported separately from unproven leads. Pass partial_reason when a run stopped early so the report says so on its first page. |
| forbidden_bypassA | [AGGRESSIVE — requires human approval] Test a URL that returned 403 against twelve access-bypass techniques.
|
| forbidden_candidatesA | Pre-check a list of URLs and return the ones that actually return 403.
|
| jwt_inspectA | Decode a JWT and report its algorithm, claims, and timestamps. Fully offline: not one request leaves this machine, which is why it is
passive and costs zero requests. Every jwt_tool mode that forges a token ( |
| secret_scanA | Scan files in the engagement workspace for credentials. No validation. Runs Kingfisher (primary), Nosey Parker (git history + ML denoising), and gitleaks where installed. Sends no traffic anywhere — every hit is a candidate until secret_validate says otherwise. path is workspace-relative; paths outside the workspace are refused. |
| secret_validateA | [AGGRESSIVE — requires human approval] Validate candidate credentials with Kingfisher and map their blast radius. This is what makes a secrets report actionable: a live credential is critical, an unvalidated match is noise. It is gated because validation is use — the request goes to AWS/GitHub/Stripe authenticated as whoever owns the key. Validation traffic is paced at the engagement's |
| source_fetchA | Clone a public repository into the workspace so it can be scanned. Cloning is separated from scanning so the audit log always answers "what code did Cordon read". Only github/gitlab/bitbucket HTTPS URLs are accepted. Confirm the repository actually belongs to the program before scanning it — an organization name matching the target is not proof of ownership. |
| takeover_confirmA | [EXPLOIT — requires human approval] Verify a human-executed takeover PoC is live and attach it to the finding. Fetches the proof URL, checks the proof content is actually served from the target host, and only then promotes the finding to confirmed. This is the single place a takeover can become 'confirmed'. |
| takeover_detectA | [AGGRESSIVE — requires human approval] Screen hosts for takeover candidates with subzy and dnsReaper. Output is a candidate list, never findings. Run takeover_verify on each hit before treating any of them as real. |
| takeover_poc_planA | Produce the minimal, responsible PoC steps for a verified takeover. Cordon does not register resources at third-party providers on your behalf. This returns the exact steps, including a unique proof path tied to your researcher handle, so the proof is unambiguous and the impact stops at 'I could have'. |
| takeover_verifyA | Verify a takeover candidate: CNAME chain + live response + fingerprint. All three must agree before the host is recorded as a verified candidate. A verified candidate is filed as 'needs manual review' — confirming it requires actually claiming the resource, which is takeover_poc_plan followed by takeover_confirm. NS and MX delegations are graded higher: those hand over the zone or the mail. |
| triage_canary_previewA | Show the fabricated canary findings triage would mix into a batch. Useful for confirming the decoys look plausible enough to be a real test. They
always live on a |
| triage_findingsA | Run AI triage over candidate findings to cut false positives. Fabricated canary findings are mixed into the batch; a pass that "confirms" one has its verdicts weighted down, and the measurement is reported. Triage never confirms anything. Escalated findings go to validate_findings. |
| triage_taskflowsA | List available triage taskflows and their steps. |
| code_auditA | Run the white-box code audit over source in the engagement workspace. Scans
Semgrep hits are filed as CANDIDATE findings (reachability is a later question — static analysis finds sinks, not exploits). Gitleaks hits are redacted and kept in the deliverable only: unvalidated regex matches are not findings, and the secret-scanning phase owns that class. With no source in the workspace the phase reports |
| jaeles_scanA | [AGGRESSIVE — requires human approval] Run Jaeles YAML signatures (plugin class C) against in-scope targets. selector picks signatures by name or glob, e.g. 'cordon/' or 'cve/'. Signatures are loaded from rules/jaeles/ only. Returns inline if it finishes within wait_seconds, otherwise a job_id. |
| nikto_scanA | [AGGRESSIVE — requires human approval] Scan a web server with nikto for dangerous files and misconfiguration. Aggressive, and gated: nikto walks a database of several thousand paths, so it is loud, obvious in logs, and will trip a WAF. That is a decision for a human, not a default. Two bounds apply and neither is negotiable. Pacing comes from |
| nuclei_scanA | [AGGRESSIVE — requires human approval] Scan in-scope targets with Nuclei templates or a workflow. templates: template files/dirs/ids to run. Custom rules under rules/nuclei/ are always included. workflow: a workflow file for conditional chaining. tags: comma-separated template tags (dos/fuzz/intrusive are refused). Returns inline if it finishes within wait_seconds, otherwise a job_id. |
| semgrep_scanB | Run Semgrep (plugin class D) over source in the engagement workspace. Passive: reads files already fetched into the workspace and sends nothing to the target. Rules in rules/semgrep/ always participate; config may add a registry pack ('p/security-audit') or another workspace path. Use source_fetch first to bring a repository into the workspace. |
| wapiti_scanA | [AGGRESSIVE — requires human approval] Crawl and attack a web application with wapiti. Aggressive, and gated. Even Bounds, all enforced server-side: wapiti exposes no requests-per-second control — the closest it offers is
|
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 127 tools
Most tools are crisply differentiated, but several pairs genuinely overlap: code_audit and semgrep_scan both run Semgrep over workspace source, brain_recall / memory_recall / graph_recall are three near-synonymous 'recall knowledge' tools, and cordon_status vs dashboard_state both report engagement state. An agent would plausibly misselect among these. The pipeline families (takeover_detect/verify/confirm/poc_plan, forbidden_candidates/bypass, secret_scan/validate) are otherwise well-structured.
The dominant convention is snake_case verb_noun (subdomain_enum, whois_lookup, content_discovery, secret_scan) with a consistent toolname_scan sub-family (nikto_scan, nuclei_scan, wapiti_scan, semgrep_scan). Deviations exist — the cordon_* brand prefix, cmdi_probe's abbreviation, security_txt's nominal form, and fuzz_compare's verb_verb — but they are minor against the overall pattern.
With roughly 70 tools listed (127 claimed), this is an extreme count — an order of magnitude beyond the 3-15 well-scoped range and far past the 25+ threshold. Even granting the platform's broad domain (web, cloud, k8s, smart contracts, memory, reporting), no agent can navigate this surface efficiently, and the presentation overwhelms rather than assists.
The surface covers the entire offensive-security lifecycle: scope loading and checking, passive and active recon, web/cloud/k8s/smart-contract scanning, approval-gated exploitation, secrets, SAST, findings management, reporting, job control, rules management, knowledge lookup, memory, task-graph planning, audit, triage, and approvals. References to port_scan/http_probe/job_status suggest tools outside this list, but within the provided set there are no obvious dead ends.