fingerprint-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/LICENSE +663 -0
  2. package/README.ar.md +767 -0
  3. package/README.bn.md +767 -0
  4. package/README.bs.md +767 -0
  5. package/README.da.md +767 -0
  6. package/README.de.md +770 -0
  7. package/README.el.md +767 -0
  8. package/README.es.md +769 -0
  9. package/README.fr.md +769 -0
  10. package/README.hi.md +767 -0
  11. package/README.it.md +767 -0
  12. package/README.ja.md +767 -0
  13. package/README.ko.md +772 -0
  14. package/README.md +767 -0
  15. package/README.no.md +767 -0
  16. package/README.pl.md +767 -0
  17. package/README.pt-BR.md +767 -0
  18. package/README.ru.md +767 -0
  19. package/README.th.md +767 -0
  20. package/README.tr.md +767 -0
  21. package/README.uk.md +767 -0
  22. package/README.vi.md +767 -0
  23. package/README.zh-TW.md +768 -0
  24. package/README.zh.md +768 -0
  25. package/dist/app/index.d.ts +3 -0
  26. package/dist/app/index.d.ts.map +1 -0
  27. package/dist/app/index.js +614 -0
  28. package/dist/app/index.js.map +1 -0
  29. package/dist/composite/analyze.d.ts +3 -0
  30. package/dist/composite/analyze.d.ts.map +1 -0
  31. package/dist/composite/analyze.js +59 -0
  32. package/dist/composite/analyze.js.map +1 -0
  33. package/dist/composite/correlate.d.ts +3 -0
  34. package/dist/composite/correlate.d.ts.map +1 -0
  35. package/dist/composite/correlate.js +184 -0
  36. package/dist/composite/correlate.js.map +1 -0
  37. package/dist/composite/enumerate.d.ts +3 -0
  38. package/dist/composite/enumerate.d.ts.map +1 -0
  39. package/dist/composite/enumerate.js +94 -0
  40. package/dist/composite/enumerate.js.map +1 -0
  41. package/dist/composite/helpers.d.ts +22 -0
  42. package/dist/composite/helpers.d.ts.map +1 -0
  43. package/dist/composite/helpers.js +111 -0
  44. package/dist/composite/helpers.js.map +1 -0
  45. package/dist/composite/index.d.ts +3 -0
  46. package/dist/composite/index.d.ts.map +1 -0
  47. package/dist/composite/index.js +29 -0
  48. package/dist/composite/index.js.map +1 -0
  49. package/dist/composite/meta.d.ts +3 -0
  50. package/dist/composite/meta.d.ts.map +1 -0
  51. package/dist/composite/meta.js +23 -0
  52. package/dist/composite/meta.js.map +1 -0
  53. package/dist/composite/osint.d.ts +3 -0
  54. package/dist/composite/osint.d.ts.map +1 -0
  55. package/dist/composite/osint.js +40 -0
  56. package/dist/composite/osint.js.map +1 -0
  57. package/dist/composite/recon.d.ts +3 -0
  58. package/dist/composite/recon.d.ts.map +1 -0
  59. package/dist/composite/recon.js +131 -0
  60. package/dist/composite/recon.js.map +1 -0
  61. package/dist/composite/scan-dns.d.ts +3 -0
  62. package/dist/composite/scan-dns.d.ts.map +1 -0
  63. package/dist/composite/scan-dns.js +44 -0
  64. package/dist/composite/scan-dns.js.map +1 -0
  65. package/dist/composite/scan-http.d.ts +3 -0
  66. package/dist/composite/scan-http.d.ts.map +1 -0
  67. package/dist/composite/scan-http.js +68 -0
  68. package/dist/composite/scan-http.js.map +1 -0
  69. package/dist/composite/scan-paths.d.ts +3 -0
  70. package/dist/composite/scan-paths.d.ts.map +1 -0
  71. package/dist/composite/scan-paths.js +32 -0
  72. package/dist/composite/scan-paths.js.map +1 -0
  73. package/dist/composite/scan-ports.d.ts +3 -0
  74. package/dist/composite/scan-ports.d.ts.map +1 -0
  75. package/dist/composite/scan-ports.js +79 -0
  76. package/dist/composite/scan-ports.js.map +1 -0
  77. package/dist/composite/scan-services.d.ts +3 -0
  78. package/dist/composite/scan-services.d.ts.map +1 -0
  79. package/dist/composite/scan-services.js +111 -0
  80. package/dist/composite/scan-services.js.map +1 -0
  81. package/dist/composite/scan-tls.d.ts +3 -0
  82. package/dist/composite/scan-tls.d.ts.map +1 -0
  83. package/dist/composite/scan-tls.js +32 -0
  84. package/dist/composite/scan-tls.js.map +1 -0
  85. package/dist/composite/scan-waf.d.ts +3 -0
  86. package/dist/composite/scan-waf.d.ts.map +1 -0
  87. package/dist/composite/scan-waf.js +35 -0
  88. package/dist/composite/scan-waf.js.map +1 -0
  89. package/dist/correlation/index.d.ts +3 -0
  90. package/dist/correlation/index.d.ts.map +1 -0
  91. package/dist/correlation/index.js +1044 -0
  92. package/dist/correlation/index.js.map +1 -0
  93. package/dist/data/analytics-patterns.d.ts +21 -0
  94. package/dist/data/analytics-patterns.d.ts.map +1 -0
  95. package/dist/data/analytics-patterns.js +449 -0
  96. package/dist/data/analytics-patterns.js.map +1 -0
  97. package/dist/data/app-signatures.d.ts +52 -0
  98. package/dist/data/app-signatures.d.ts.map +1 -0
  99. package/dist/data/app-signatures.js +1143 -0
  100. package/dist/data/app-signatures.js.map +1 -0
  101. package/dist/data/c2-signatures.d.ts +54 -0
  102. package/dist/data/c2-signatures.d.ts.map +1 -0
  103. package/dist/data/c2-signatures.js +256 -0
  104. package/dist/data/c2-signatures.js.map +1 -0
  105. package/dist/data/cloud-ranges.d.ts +34 -0
  106. package/dist/data/cloud-ranges.d.ts.map +1 -0
  107. package/dist/data/cloud-ranges.js +628 -0
  108. package/dist/data/cloud-ranges.js.map +1 -0
  109. package/dist/data/cookie-patterns.d.ts +28 -0
  110. package/dist/data/cookie-patterns.d.ts.map +1 -0
  111. package/dist/data/cookie-patterns.js +225 -0
  112. package/dist/data/cookie-patterns.js.map +1 -0
  113. package/dist/data/error-signatures.d.ts +19 -0
  114. package/dist/data/error-signatures.d.ts.map +1 -0
  115. package/dist/data/error-signatures.js +321 -0
  116. package/dist/data/error-signatures.js.map +1 -0
  117. package/dist/data/favicon-hashes.d.ts +25 -0
  118. package/dist/data/favicon-hashes.d.ts.map +1 -0
  119. package/dist/data/favicon-hashes.js +249 -0
  120. package/dist/data/favicon-hashes.js.map +1 -0
  121. package/dist/data/h2-signatures.d.ts +50 -0
  122. package/dist/data/h2-signatures.d.ts.map +1 -0
  123. package/dist/data/h2-signatures.js +211 -0
  124. package/dist/data/h2-signatures.js.map +1 -0
  125. package/dist/data/header-order.d.ts +38 -0
  126. package/dist/data/header-order.d.ts.map +1 -0
  127. package/dist/data/header-order.js +185 -0
  128. package/dist/data/header-order.js.map +1 -0
  129. package/dist/data/jarm-signatures.d.ts +25 -0
  130. package/dist/data/jarm-signatures.d.ts.map +1 -0
  131. package/dist/data/jarm-signatures.js +213 -0
  132. package/dist/data/jarm-signatures.js.map +1 -0
  133. package/dist/data/saas-patterns.d.ts +23 -0
  134. package/dist/data/saas-patterns.d.ts.map +1 -0
  135. package/dist/data/saas-patterns.js +139 -0
  136. package/dist/data/saas-patterns.js.map +1 -0
  137. package/dist/data/sensitive-paths.d.ts +12 -0
  138. package/dist/data/sensitive-paths.d.ts.map +1 -0
  139. package/dist/data/sensitive-paths.js +1539 -0
  140. package/dist/data/sensitive-paths.js.map +1 -0
  141. package/dist/data/service-banners.d.ts +59 -0
  142. package/dist/data/service-banners.d.ts.map +1 -0
  143. package/dist/data/service-banners.js +323 -0
  144. package/dist/data/service-banners.js.map +1 -0
  145. package/dist/data/smtp-signatures.d.ts +12 -0
  146. package/dist/data/smtp-signatures.d.ts.map +1 -0
  147. package/dist/data/smtp-signatures.js +350 -0
  148. package/dist/data/smtp-signatures.js.map +1 -0
  149. package/dist/data/takeover-patterns.d.ts +37 -0
  150. package/dist/data/takeover-patterns.d.ts.map +1 -0
  151. package/dist/data/takeover-patterns.js +249 -0
  152. package/dist/data/takeover-patterns.js.map +1 -0
  153. package/dist/data/tech-patterns.d.ts +44 -0
  154. package/dist/data/tech-patterns.d.ts.map +1 -0
  155. package/dist/data/tech-patterns.js +690 -0
  156. package/dist/data/tech-patterns.js.map +1 -0
  157. package/dist/data/waf-signatures.d.ts +21 -0
  158. package/dist/data/waf-signatures.d.ts.map +1 -0
  159. package/dist/data/waf-signatures.js +318 -0
  160. package/dist/data/waf-signatures.js.map +1 -0
  161. package/dist/dns/index.d.ts +3 -0
  162. package/dist/dns/index.d.ts.map +1 -0
  163. package/dist/dns/index.js +1067 -0
  164. package/dist/dns/index.js.map +1 -0
  165. package/dist/enum/index.d.ts +3 -0
  166. package/dist/enum/index.d.ts.map +1 -0
  167. package/dist/enum/index.js +818 -0
  168. package/dist/enum/index.js.map +1 -0
  169. package/dist/h2/index.d.ts +3 -0
  170. package/dist/h2/index.d.ts.map +1 -0
  171. package/dist/h2/index.js +414 -0
  172. package/dist/h2/index.js.map +1 -0
  173. package/dist/http/index.d.ts +3 -0
  174. package/dist/http/index.d.ts.map +1 -0
  175. package/dist/http/index.js +2444 -0
  176. package/dist/http/index.js.map +1 -0
  177. package/dist/identify/index.d.ts +3 -0
  178. package/dist/identify/index.d.ts.map +1 -0
  179. package/dist/identify/index.js +447 -0
  180. package/dist/identify/index.js.map +1 -0
  181. package/dist/index.d.ts +3 -0
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/index.js +165 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/infra/index.d.ts +3 -0
  186. package/dist/infra/index.d.ts.map +1 -0
  187. package/dist/infra/index.js +989 -0
  188. package/dist/infra/index.js.map +1 -0
  189. package/dist/iot/index.d.ts +3 -0
  190. package/dist/iot/index.d.ts.map +1 -0
  191. package/dist/iot/index.js +610 -0
  192. package/dist/iot/index.js.map +1 -0
  193. package/dist/meta/index.d.ts +3 -0
  194. package/dist/meta/index.d.ts.map +1 -0
  195. package/dist/meta/index.js +442 -0
  196. package/dist/meta/index.js.map +1 -0
  197. package/dist/osint/index.d.ts +3 -0
  198. package/dist/osint/index.d.ts.map +1 -0
  199. package/dist/osint/index.js +687 -0
  200. package/dist/osint/index.js.map +1 -0
  201. package/dist/passive/index.d.ts +3 -0
  202. package/dist/passive/index.d.ts.map +1 -0
  203. package/dist/passive/index.js +944 -0
  204. package/dist/passive/index.js.map +1 -0
  205. package/dist/path/index.d.ts +3 -0
  206. package/dist/path/index.d.ts.map +1 -0
  207. package/dist/path/index.js +878 -0
  208. package/dist/path/index.js.map +1 -0
  209. package/dist/protocol/mcp-server.d.ts +4 -0
  210. package/dist/protocol/mcp-server.d.ts.map +1 -0
  211. package/dist/protocol/mcp-server.js +32 -0
  212. package/dist/protocol/mcp-server.js.map +1 -0
  213. package/dist/protocol/tools.d.ts +3 -0
  214. package/dist/protocol/tools.d.ts.map +1 -0
  215. package/dist/protocol/tools.js +5 -0
  216. package/dist/protocol/tools.js.map +1 -0
  217. package/dist/service/index.d.ts +3 -0
  218. package/dist/service/index.d.ts.map +1 -0
  219. package/dist/service/index.js +1053 -0
  220. package/dist/service/index.js.map +1 -0
  221. package/dist/smtp/index.d.ts +3 -0
  222. package/dist/smtp/index.d.ts.map +1 -0
  223. package/dist/smtp/index.js +437 -0
  224. package/dist/smtp/index.js.map +1 -0
  225. package/dist/ssh/index.d.ts +3 -0
  226. package/dist/ssh/index.d.ts.map +1 -0
  227. package/dist/ssh/index.js +676 -0
  228. package/dist/ssh/index.js.map +1 -0
  229. package/dist/tcp/index.d.ts +3 -0
  230. package/dist/tcp/index.d.ts.map +1 -0
  231. package/dist/tcp/index.js +369 -0
  232. package/dist/tcp/index.js.map +1 -0
  233. package/dist/timing/index.d.ts +3 -0
  234. package/dist/timing/index.d.ts.map +1 -0
  235. package/dist/timing/index.js +425 -0
  236. package/dist/timing/index.js.map +1 -0
  237. package/dist/tls/index.d.ts +3 -0
  238. package/dist/tls/index.d.ts.map +1 -0
  239. package/dist/tls/index.js +1332 -0
  240. package/dist/tls/index.js.map +1 -0
  241. package/dist/types/index.d.ts +26 -0
  242. package/dist/types/index.d.ts.map +1 -0
  243. package/dist/types/index.js +8 -0
  244. package/dist/types/index.js.map +1 -0
  245. package/dist/utils/cache.d.ts +11 -0
  246. package/dist/utils/cache.d.ts.map +1 -0
  247. package/dist/utils/cache.js +35 -0
  248. package/dist/utils/cache.js.map +1 -0
  249. package/dist/utils/murmurhash3.d.ts +3 -0
  250. package/dist/utils/murmurhash3.d.ts.map +1 -0
  251. package/dist/utils/murmurhash3.js +57 -0
  252. package/dist/utils/murmurhash3.js.map +1 -0
  253. package/dist/utils/rate-limiter.d.ts +10 -0
  254. package/dist/utils/rate-limiter.d.ts.map +1 -0
  255. package/dist/utils/rate-limiter.js +35 -0
  256. package/dist/utils/rate-limiter.js.map +1 -0
  257. package/dist/utils/require-key.d.ts +2 -0
  258. package/dist/utils/require-key.d.ts.map +1 -0
  259. package/dist/utils/require-key.js +8 -0
  260. package/dist/utils/require-key.js.map +1 -0
  261. package/dist/waf/index.d.ts +3 -0
  262. package/dist/waf/index.d.ts.map +1 -0
  263. package/dist/waf/index.js +767 -0
  264. package/dist/waf/index.js.map +1 -0
  265. package/dist/web/index.d.ts +3 -0
  266. package/dist/web/index.d.ts.map +1 -0
  267. package/dist/web/index.js +1366 -0
  268. package/dist/web/index.js.map +1 -0
  269. package/package.json +66 -0
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import { callToolsParallel, buildCompositeResponse } from "./helpers.js";
3
+ export const osintTool = {
4
+ name: "osint",
5
+ description: "OSINT enrichment: Shodan host lookup, Censys search, reverse IP lookup, WHOIS information, Wayback Machine historical snapshots, and VirusTotal intelligence. Supports both IP and domain targets with auto-detection. 6 techniques in a single call.",
6
+ schema: {
7
+ target: z.string().describe("IP address or domain for OSINT lookup"),
8
+ type: z
9
+ .enum(["ip", "domain"])
10
+ .optional()
11
+ .describe("Target type (auto-detected if omitted)"),
12
+ },
13
+ async execute(args, ctx) {
14
+ const target = args.target;
15
+ const type = args.type ??
16
+ (/^\d+\.\d+\.\d+\.\d+$/.test(target) ? "ip" : "domain");
17
+ let calls;
18
+ if (type === "ip") {
19
+ calls = [
20
+ { name: "osint_shodan", args: { ip: target } },
21
+ { name: "osint_censys", args: { ip: target } },
22
+ { name: "osint_reverse_ip", args: { ip: target } },
23
+ { name: "osint_whois", args: { target } },
24
+ { name: "osint_virustotal", args: { target, type: "ip" } },
25
+ ];
26
+ }
27
+ else {
28
+ calls = [
29
+ { name: "osint_shodan", args: { query: "hostname:" + target } },
30
+ { name: "osint_censys", args: { query: target } },
31
+ { name: "osint_whois", args: { target } },
32
+ { name: "osint_web_archive", args: { url: "https://" + target } },
33
+ { name: "osint_virustotal", args: { target, type: "domain" } },
34
+ ];
35
+ }
36
+ const results = await callToolsParallel(calls, ctx);
37
+ return buildCompositeResponse("osint", results);
38
+ },
39
+ };
40
+ //# sourceMappingURL=osint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osint.js","sourceRoot":"","sources":["../../src/composite/osint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEzE,MAAM,CAAC,MAAM,SAAS,GAAY;IAChC,IAAI,EAAE,OAAO;IACb,WAAW,EACT,uPAAuP;IACzP,MAAM,EAAE;QACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACpE,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;aACtB,QAAQ,EAAE;aACV,QAAQ,CAAC,wCAAwC,CAAC;KACtD;IAED,KAAK,CAAC,OAAO,CACX,IAA6B,EAC7B,GAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAC;QACrC,MAAM,IAAI,GACP,IAAI,CAAC,IAAoC;YAC1C,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAE1D,IAAI,KAA6D,CAAC;QAElE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,KAAK,GAAG;gBACN,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;gBAC9C,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;gBAC9C,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;gBAClD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;gBACzC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;aAC3D,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,GAAG;gBACN,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,EAAE;gBAC/D,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACjD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;gBACzC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,EAAE;gBACjE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;aAC/D,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEpD,OAAO,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const reconTool: ToolDef;
3
+ //# sourceMappingURL=recon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recon.d.ts","sourceRoot":"","sources":["../../src/composite/recon.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAoH1E,eAAO,MAAM,SAAS,EAAE,OAmEvB,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { z } from "zod";
2
+ import { callToolsParallel, buildCompositeResponse, parseTarget, } from "./helpers.js";
3
+ // ─── Quick Techniques (5) ───
4
+ const QUICK_CALLS = (url, host, domain, port) => [
5
+ { name: "http_headers", args: { url } },
6
+ { name: "dns_records", args: { domain } },
7
+ { name: "tls_cert", args: { host, port } },
8
+ { name: "web_tech", args: { url } },
9
+ { name: "infra_cloud_detect", args: { target: host } },
10
+ ];
11
+ // ─── Standard Techniques (+15) ───
12
+ const STANDARD_CALLS = (url, host, domain, port) => [
13
+ { name: "http_favicon", args: { url } },
14
+ { name: "http_cookies", args: { url } },
15
+ { name: "http_etag", args: { url } },
16
+ { name: "http_errors", args: { url } },
17
+ { name: "http_security", args: { url } },
18
+ { name: "tls_probe", args: { host, port } },
19
+ { name: "tls_jarm", args: { host, port } },
20
+ { name: "waf_detect", args: { url } },
21
+ { name: "waf_cdn_detect", args: { url } },
22
+ { name: "app_cms", args: { url } },
23
+ { name: "app_framework", args: { url } },
24
+ { name: "web_analytics", args: { url } },
25
+ { name: "dns_email", args: { domain } },
26
+ { name: "dns_saas", args: { domain } },
27
+ { name: "path_robots", args: { url } },
28
+ ];
29
+ // ─── Deep Batch 1 (~15) ───
30
+ const DEEP_BATCH_1 = (url, host, port) => [
31
+ { name: "http_multi_fingerprint", args: { url } },
32
+ { name: "http_methods", args: { url } },
33
+ { name: "http_cors", args: { url } },
34
+ { name: "http_compression", args: { url } },
35
+ { name: "http_cache", args: { url } },
36
+ { name: "http_timing", args: { url } },
37
+ { name: "http_redirect", args: { url } },
38
+ { name: "http_keepalive", args: { url } },
39
+ { name: "http_resource_hints", args: { url } },
40
+ { name: "http_server_timing", args: { url } },
41
+ { name: "http_nel", args: { url } },
42
+ { name: "tls_ja4x", args: { host, port } },
43
+ { name: "tls_ciphers", args: { host, port } },
44
+ { name: "tls_sni", args: { host, port } },
45
+ { name: "tls_cert_cross_ref", args: { host, port } },
46
+ ];
47
+ // ─── Deep Batch 2 (~15) ───
48
+ const DEEP_BATCH_2 = (url, host, domain, port) => [
49
+ { name: "tls_ct_subdomains", args: { domain } },
50
+ { name: "dns_server_fp", args: { domain } },
51
+ { name: "dns_mta_sts", args: { domain } },
52
+ { name: "dns_takeover", args: { domain } },
53
+ { name: "web_sourcemaps", args: { url } },
54
+ { name: "web_api_discovery", args: { url } },
55
+ { name: "web_websocket", args: { url } },
56
+ { name: "web_sri", args: { url } },
57
+ { name: "app_ecommerce", args: { url } },
58
+ { name: "path_sensitive", args: { url } },
59
+ { name: "path_git_leak", args: { url } },
60
+ { name: "path_debug", args: { url } },
61
+ { name: "path_api_version", args: { url } },
62
+ { name: "timing_baseline", args: { url } },
63
+ { name: "h2_detect", args: { host, port } },
64
+ ];
65
+ // ─── Deep Batch 3 (~7) ───
66
+ const DEEP_BATCH_3 = (url, host, domain, port) => [
67
+ { name: "h2_server_fp", args: { host, port } },
68
+ { name: "waf_fingerprint", args: { url } },
69
+ { name: "infra_asn_lookup", args: { ip: host } },
70
+ { name: "infra_cdn_identify", args: { url } },
71
+ { name: "infra_reverse_proxy_detect", args: { url } },
72
+ { name: "infra_lb_detect", args: { url } },
73
+ { name: "waf_origin", args: { domain } },
74
+ ];
75
+ // ─── Recon Composite Tool ───
76
+ export const reconTool = {
77
+ name: "recon",
78
+ description: "Full target reconnaissance. Runs HTTP headers, TLS certificate, DNS records, web technology detection, WAF/CDN, and infrastructure analysis in a single call. Use depth parameter to control scope: quick (~5 techniques, fast overview), standard (~20 techniques, balanced), deep (~50+ techniques, comprehensive).",
79
+ schema: {
80
+ url: z
81
+ .string()
82
+ .describe("Target URL (e.g., https://example.com)"),
83
+ depth: z
84
+ .enum(["quick", "standard", "deep"])
85
+ .optional()
86
+ .describe("Scan depth: quick (~5 techniques), standard (~20), deep (50+). Default: quick"),
87
+ },
88
+ async execute(args, ctx) {
89
+ let url = args.url;
90
+ if (!url.startsWith("http"))
91
+ url = `https://${url}`;
92
+ const depth = args.depth ?? "quick";
93
+ const { host, domain, port } = parseTarget(url);
94
+ const allResults = [];
95
+ const called = new Set();
96
+ const runBatch = async (calls) => {
97
+ const filtered = calls.filter((c) => !called.has(c.name));
98
+ for (const c of filtered)
99
+ called.add(c.name);
100
+ if (filtered.length === 0)
101
+ return;
102
+ const results = await callToolsParallel(filtered, ctx);
103
+ allResults.push(...results);
104
+ };
105
+ // ── Quick (~5 techniques) ──
106
+ await runBatch(QUICK_CALLS(url, host, domain, port));
107
+ if (depth === "quick") {
108
+ return buildCompositeResponse("recon", allResults, {
109
+ depth,
110
+ target: url,
111
+ });
112
+ }
113
+ // ── Standard (~20 techniques) ──
114
+ await runBatch(STANDARD_CALLS(url, host, domain, port));
115
+ if (depth === "standard") {
116
+ return buildCompositeResponse("recon", allResults, {
117
+ depth,
118
+ target: url,
119
+ });
120
+ }
121
+ // ── Deep (~50+ techniques, 3 sequential batches) ──
122
+ await runBatch(DEEP_BATCH_1(url, host, port));
123
+ await runBatch(DEEP_BATCH_2(url, host, domain, port));
124
+ await runBatch(DEEP_BATCH_3(url, host, domain, port));
125
+ return buildCompositeResponse("recon", allResults, {
126
+ depth,
127
+ target: url,
128
+ });
129
+ },
130
+ };
131
+ //# sourceMappingURL=recon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recon.js","sourceRoot":"","sources":["../../src/composite/recon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const scanDnsTool: ToolDef;
3
+ //# sourceMappingURL=scan-dns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-dns.d.ts","sourceRoot":"","sources":["../../src/composite/scan-dns.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAG1E,eAAO,MAAM,WAAW,EAAE,OAuDzB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ import { callTool, callToolsParallel, buildCompositeResponse } from "./helpers.js";
3
+ export const scanDnsTool = {
4
+ name: "scan_dns",
5
+ description: "Comprehensive DNS intelligence: full record enumeration, email infrastructure (MX/SPF/DKIM/DMARC), SaaS inventory from TXT records, nameserver fingerprinting, MTA-STS/DANE analysis, subdomain takeover detection, and reverse DNS. 7 techniques in a single call.",
6
+ schema: {
7
+ domain: z
8
+ .string()
9
+ .describe("Target domain"),
10
+ },
11
+ async execute(args, ctx) {
12
+ const domain = args.domain;
13
+ // Phase 1: Run 6 DNS tools in parallel
14
+ const phase1Results = await callToolsParallel([
15
+ { name: "dns_records", args: { domain } },
16
+ { name: "dns_email", args: { domain } },
17
+ { name: "dns_saas", args: { domain } },
18
+ { name: "dns_server_fp", args: { domain } },
19
+ { name: "dns_mta_sts", args: { domain } },
20
+ { name: "dns_takeover", args: { domain } },
21
+ ], ctx);
22
+ // Phase 2: Extract A record IP from dns_records result, then do reverse DNS
23
+ const allResults = [...phase1Results];
24
+ const dnsRecordsResult = phase1Results.find((r) => r.tool === "dns_records");
25
+ if (dnsRecordsResult?.ok && dnsRecordsResult.data) {
26
+ const data = dnsRecordsResult.data;
27
+ // Try to extract an IP address from the A records
28
+ let ip;
29
+ // Common shapes: data.A could be an array of strings or objects with address field
30
+ const records = data.records;
31
+ const aRecords = data.A ?? data.a ?? records?.A;
32
+ if (Array.isArray(aRecords) && aRecords.length > 0) {
33
+ const first = aRecords[0];
34
+ ip = typeof first === "string" ? first : first?.address ?? first?.ip ?? first?.value;
35
+ }
36
+ if (ip) {
37
+ const reverseResult = await callTool("dns_reverse", { ip }, ctx);
38
+ allResults.push(reverseResult);
39
+ }
40
+ }
41
+ return buildCompositeResponse("scan_dns", allResults);
42
+ },
43
+ };
44
+ //# sourceMappingURL=scan-dns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-dns.js","sourceRoot":"","sources":["../../src/composite/scan-dns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEnF,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,qQAAqQ;IACvQ,MAAM,EAAE;QACN,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CAAC,eAAe,CAAC;KAC7B;IAED,KAAK,CAAC,OAAO,CACX,IAA6B,EAC7B,GAAgB;QAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAC;QAErC,uCAAuC;QACvC,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAC3C;YACE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;YACzC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;YACvC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;YACtC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;YAC3C,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;YACzC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;SAC3C,EACD,GAAG,CACJ,CAAC;QAEF,4EAA4E;QAC5E,MAAM,UAAU,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;QAEtC,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QAC7E,IAAI,gBAAgB,EAAE,EAAE,IAAI,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAA+B,CAAC;YAE9D,kDAAkD;YAClD,IAAI,EAAsB,CAAC;YAE3B,mFAAmF;YACnF,MAAM,OAAO,GAAG,IAAI,CAAC,OAA8C,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC1B,EAAE,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,EAAE,KAAK,CAAC;YACvF,CAAC;YAED,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBACjE,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,sBAAsB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const scanHttpTool: ToolDef;
3
+ //# sourceMappingURL=scan-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-http.d.ts","sourceRoot":"","sources":["../../src/composite/scan-http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAG1E,eAAO,MAAM,YAAY,EAAE,OAiF1B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ import { callTool, callToolsParallel, buildCompositeResponse, parseTarget } from "./helpers.js";
3
+ export const scanHttpTool = {
4
+ name: "scan_http",
5
+ description: "Comprehensive HTTP and web fingerprinting: header ordering, favicon hash, ETag analysis, error pages, cookies, HTTP methods, CORS, compression, caching, security headers, timing, redirect chains, web technology detection, analytics, source maps, API discovery, CMS/framework/ecommerce detection, and HTTP/2 analysis. ~29 techniques with smart skipping.",
6
+ schema: {
7
+ url: z.string().describe("Target URL for HTTP fingerprinting"),
8
+ },
9
+ async execute(args, ctx) {
10
+ const url = args.url;
11
+ const { host, port } = parseTarget(url);
12
+ // ── Phase 1: baseline headers ──
13
+ const phase1 = await callTool("http_headers", { url }, ctx);
14
+ // ── Phase 2: determine conditional tools based on phase 1 headers ──
15
+ const phase2Calls = [
16
+ // Always-include HTTP tools
17
+ { name: "http_multi_fingerprint", args: { url } },
18
+ { name: "http_favicon", args: { url } },
19
+ { name: "http_etag", args: { url } },
20
+ { name: "http_errors", args: { url } },
21
+ { name: "http_cookies", args: { url } },
22
+ { name: "http_methods", args: { url } },
23
+ { name: "http_cors", args: { url } },
24
+ { name: "http_compression", args: { url } },
25
+ { name: "http_cache", args: { url } },
26
+ { name: "http_security", args: { url } },
27
+ { name: "http_timing", args: { url } },
28
+ { name: "http_redirect", args: { url } },
29
+ { name: "http_keepalive", args: { url } },
30
+ { name: "http_resource_hints", args: { url } },
31
+ // Web fingerprinting tools
32
+ { name: "web_tech", args: { url } },
33
+ { name: "web_analytics", args: { url } },
34
+ { name: "web_sourcemaps", args: { url } },
35
+ { name: "web_api_discovery", args: { url } },
36
+ { name: "web_sri", args: { url } },
37
+ { name: "web_websocket", args: { url } },
38
+ { name: "web_graphql", args: { url } },
39
+ // App detection tools
40
+ { name: "app_cms", args: { url } },
41
+ { name: "app_framework", args: { url } },
42
+ { name: "app_ecommerce", args: { url } },
43
+ // HTTP/2 tools
44
+ { name: "h2_detect", args: { url } },
45
+ { name: "h2_server_fp", args: { host, port } },
46
+ // Timing baseline
47
+ { name: "timing_baseline", args: { url } },
48
+ ];
49
+ // Conditionally include server-timing and NEL tools based on phase 1 headers
50
+ if (phase1.ok && phase1.data && typeof phase1.data === "object") {
51
+ const data = phase1.data;
52
+ // Check for server-timing header (may be nested under a "headers" key or at top level)
53
+ const headers = (data.headers ?? data);
54
+ const headerKeys = Object.keys(headers).map((k) => k.toLowerCase());
55
+ if (headerKeys.includes("server-timing")) {
56
+ phase2Calls.push({ name: "http_server_timing", args: { url } });
57
+ }
58
+ if (headerKeys.includes("nel") || headerKeys.includes("report-to")) {
59
+ phase2Calls.push({ name: "http_nel", args: { url } });
60
+ }
61
+ }
62
+ // ── Phase 2: run all tools in parallel ──
63
+ const phase2Results = await callToolsParallel(phase2Calls, ctx);
64
+ // ── Combine all results ──
65
+ return buildCompositeResponse("scan_http", [phase1, ...phase2Results]);
66
+ },
67
+ };
68
+ //# sourceMappingURL=scan-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-http.js","sourceRoot":"","sources":["../../src/composite/scan-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhG,MAAM,CAAC,MAAM,YAAY,GAAY;IACnC,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,kWAAkW;IACpW,MAAM,EAAE;QACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAC/D;IAED,KAAK,CAAC,OAAO,CACX,IAA6B,EAC7B,GAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAExC,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAE5D,sEAAsE;QACtE,MAAM,WAAW,GAA2D;YAC1E,4BAA4B;YAC5B,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACjD,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACvC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACpC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACtC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACvC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACvC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACpC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YAC3C,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACrC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACtC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACzC,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YAE9C,2BAA2B;YAC3B,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACnC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACzC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YAClC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YAEtC,sBAAsB;YACtB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YAClC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YAExC,eAAe;YACf,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACpC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAE9C,kBAAkB;YAClB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;SAC3C,CAAC;QAEF,6EAA6E;QAC7E,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;YAEpD,uFAAuF;YACvF,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAA4B,CAAC;YAClE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAEpE,IAAI,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACzC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAEhE,4BAA4B;QAC5B,OAAO,sBAAsB,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC;IACzE,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const scanPathsTool: ToolDef;
3
+ //# sourceMappingURL=scan-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-paths.d.ts","sourceRoot":"","sources":["../../src/composite/scan-paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAG1E,eAAO,MAAM,aAAa,EAAE,OAuC3B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { z } from "zod";
2
+ import { callToolsParallel, buildCompositeResponse } from "./helpers.js";
3
+ export const scanPathsTool = {
4
+ name: "scan_paths",
5
+ description: "Path intelligence: sensitive file/directory probing (200+ paths across 11 categories), robots.txt/sitemap/security.txt parsing, version control and secret exposure detection, debug endpoint discovery with severity ratings, and API version probing. 5 techniques in a single call.",
6
+ schema: {
7
+ url: z
8
+ .string()
9
+ .describe("Base URL for path probing"),
10
+ categories: z
11
+ .array(z.string())
12
+ .optional()
13
+ .describe("path_sensitive categories to probe (default: all 11 categories)"),
14
+ },
15
+ async execute(args, ctx) {
16
+ const url = args.url;
17
+ const categories = args.categories;
18
+ const sensitiveArgs = { url };
19
+ if (categories !== undefined) {
20
+ sensitiveArgs.categories = categories;
21
+ }
22
+ const results = await callToolsParallel([
23
+ { name: "path_sensitive", args: sensitiveArgs },
24
+ { name: "path_robots", args: { url } },
25
+ { name: "path_git_leak", args: { url } },
26
+ { name: "path_debug", args: { url } },
27
+ { name: "path_api_version", args: { url } },
28
+ ], ctx);
29
+ return buildCompositeResponse("scan_paths", results);
30
+ },
31
+ };
32
+ //# sourceMappingURL=scan-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-paths.js","sourceRoot":"","sources":["../../src/composite/scan-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEzE,MAAM,CAAC,MAAM,aAAa,GAAY;IACpC,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,wRAAwR;IAC1R,MAAM,EAAE;QACN,GAAG,EAAE,CAAC;aACH,MAAM,EAAE;aACR,QAAQ,CAAC,2BAA2B,CAAC;QACxC,UAAU,EAAE,CAAC;aACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,iEAAiE,CAAC;KAC/E;IAED,KAAK,CAAC,OAAO,CACX,IAA6B,EAC7B,GAAgB;QAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAkC,CAAC;QAE3D,MAAM,aAAa,GAA4B,EAAE,GAAG,EAAE,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC;QACxC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,iBAAiB,CACrC;YACE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE;YAC/C,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACtC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACxC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;YACrC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;SAC5C,EACD,GAAG,CACJ,CAAC;QAEF,OAAO,sBAAsB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const scanPortsTool: ToolDef;
3
+ //# sourceMappingURL=scan-ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-ports.d.ts","sourceRoot":"","sources":["../../src/composite/scan-ports.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAK1E,eAAO,MAAM,aAAa,EAAE,OAkG3B,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+ import { callTool, callToolsParallel, buildCompositeResponse } from "./helpers.js";
3
+ const DEFAULT_PORTS = [21, 22, 25, 80, 443, 3306, 3389, 5432, 5900, 6379, 8080, 8443];
4
+ export const scanPortsTool = {
5
+ name: "scan_ports",
6
+ description: "TCP port scanning with banner grabbing and automatic service detection. Probes specified ports, reads initial banners, detects protocols (SSH, MySQL, Redis, FTP, SMTP, HTTP, PostgreSQL, VNC, RDP), and runs targeted service fingerprinting on detected services.",
7
+ schema: {
8
+ host: z.string().describe("Target host"),
9
+ ports: z
10
+ .array(z.number())
11
+ .optional()
12
+ .describe("Ports to scan (default: common service ports)"),
13
+ },
14
+ async execute(args, ctx) {
15
+ const host = args.host;
16
+ const ports = args.ports ?? DEFAULT_PORTS;
17
+ // ── Step 1: TCP probe with banner grab ──
18
+ const probeResult = await callTool("tcp_probe", { host, ports }, ctx);
19
+ // ── Step 2: Detect services from banners and dispatch probes ──
20
+ const serviceCalls = [];
21
+ if (probeResult.ok && probeResult.data && typeof probeResult.data === "object") {
22
+ const data = probeResult.data;
23
+ const probes = (data.probes ?? []);
24
+ for (const probe of probes) {
25
+ if (!probe.open)
26
+ continue;
27
+ const banner = probe.banner ?? "";
28
+ const port = probe.port;
29
+ // SSH detection
30
+ if (banner.startsWith("SSH-")) {
31
+ serviceCalls.push({ name: "ssh_probe", args: { host, port } });
32
+ continue;
33
+ }
34
+ // SMTP detection
35
+ if (/^220[\s-]/.test(banner) && /smtp|mail/i.test(banner)) {
36
+ serviceCalls.push({ name: "smtp_probe", args: { host, port } });
37
+ continue;
38
+ }
39
+ // FTP detection
40
+ if (/^220[\s-]/.test(banner) && /ftp/i.test(banner)) {
41
+ serviceCalls.push({ name: "svc_ftp_probe", args: { host, port } });
42
+ continue;
43
+ }
44
+ // MySQL detection
45
+ if (port === 3306) {
46
+ serviceCalls.push({ name: "svc_mysql_probe", args: { host, port } });
47
+ continue;
48
+ }
49
+ // PostgreSQL detection
50
+ if (port === 5432) {
51
+ serviceCalls.push({ name: "svc_postgres_probe", args: { host, port } });
52
+ continue;
53
+ }
54
+ // Redis detection
55
+ if (port === 6379 || /\+PONG|-NOAUTH/.test(banner)) {
56
+ serviceCalls.push({ name: "svc_redis_probe", args: { host, port } });
57
+ continue;
58
+ }
59
+ // RDP detection
60
+ if (port === 3389) {
61
+ serviceCalls.push({ name: "svc_vnc_rdp_detect", args: { host, ports: [port] } });
62
+ continue;
63
+ }
64
+ // VNC detection
65
+ if (port === 5900 || port === 5901 || banner.startsWith("RFB")) {
66
+ serviceCalls.push({ name: "svc_vnc_rdp_detect", args: { host, ports: [port] } });
67
+ continue;
68
+ }
69
+ }
70
+ }
71
+ // ── Step 3: Run all service probes in parallel ──
72
+ const serviceResults = serviceCalls.length > 0
73
+ ? await callToolsParallel(serviceCalls, ctx)
74
+ : [];
75
+ // ── Combine results ──
76
+ return buildCompositeResponse("scan_ports", [probeResult, ...serviceResults]);
77
+ },
78
+ };
79
+ //# sourceMappingURL=scan-ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-ports.js","sourceRoot":"","sources":["../../src/composite/scan-ports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const scanServicesTool: ToolDef;
3
+ //# sourceMappingURL=scan-services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-services.d.ts","sourceRoot":"","sources":["../../src/composite/scan-services.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AA4E1E,eAAO,MAAM,gBAAgB,EAAE,OA0D9B,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { z } from "zod";
2
+ import { callToolsParallel, buildCompositeResponse } from "./helpers.js";
3
+ const PORT_SERVICE_MAP = {
4
+ 3306: "mysql",
5
+ 5432: "postgres",
6
+ 6379: "redis",
7
+ 21: "ftp",
8
+ 22: "ssh",
9
+ 25: "smtp",
10
+ 587: "smtp",
11
+ 3389: "vnc_rdp",
12
+ 5900: "vnc_rdp",
13
+ 5901: "vnc_rdp",
14
+ };
15
+ function buildServiceCalls(service, host, ports) {
16
+ switch (service) {
17
+ case "mysql":
18
+ return [{ name: "svc_mysql_probe", args: { host, port: ports?.[0] ?? 3306 } }];
19
+ case "postgres":
20
+ return [{ name: "svc_postgres_probe", args: { host, port: ports?.[0] ?? 5432 } }];
21
+ case "redis":
22
+ return [{ name: "svc_redis_probe", args: { host, port: ports?.[0] ?? 6379 } }];
23
+ case "ftp":
24
+ return [{ name: "svc_ftp_probe", args: { host, port: ports?.[0] ?? 21 } }];
25
+ case "vnc_rdp":
26
+ return [{ name: "svc_vnc_rdp_detect", args: { host, ports: ports ?? [3389, 5900, 5901] } }];
27
+ case "ssh": {
28
+ const sshPort = ports?.[0] ?? 22;
29
+ return [
30
+ { name: "ssh_probe", args: { host, port: sshPort } },
31
+ { name: "ssh_audit", args: { host, port: sshPort } },
32
+ { name: "ssh_hostkey_lookup", args: { host, port: sshPort } },
33
+ ];
34
+ }
35
+ case "smtp": {
36
+ const smtpPort = ports?.[0] ?? 25;
37
+ return [
38
+ { name: "smtp_probe", args: { host, port: smtpPort } },
39
+ { name: "smtp_tls", args: { host, port: smtpPort } },
40
+ ];
41
+ }
42
+ case "iot":
43
+ return [{ name: "iot_probe", args: { host, ports: ports ?? [80, 443, 8080, 8443, 23, 161, 1883] } }];
44
+ case "all":
45
+ return [
46
+ ...buildServiceCalls("mysql", host, ports),
47
+ ...buildServiceCalls("postgres", host, ports),
48
+ ...buildServiceCalls("redis", host, ports),
49
+ ...buildServiceCalls("ftp", host, ports),
50
+ ...buildServiceCalls("vnc_rdp", host, ports),
51
+ ...buildServiceCalls("ssh", host, ports),
52
+ ...buildServiceCalls("smtp", host, ports),
53
+ ...buildServiceCalls("iot", host, ports),
54
+ ];
55
+ default:
56
+ return [];
57
+ }
58
+ }
59
+ export const scanServicesTool = {
60
+ name: "scan_services",
61
+ description: "Service-level fingerprinting for databases, caches, remote desktop, SSH, SMTP, and IoT. Supports auto-detection from port numbers or explicit service selection. Probes: MySQL, PostgreSQL, Redis, FTP, VNC/RDP, SSH (with full audit), SMTP (with TLS check), and IoT device detection.",
62
+ schema: {
63
+ host: z.string().describe("Target host"),
64
+ ports: z
65
+ .array(z.number())
66
+ .optional()
67
+ .describe("Specific ports to probe"),
68
+ service: z
69
+ .enum(["mysql", "postgres", "redis", "ftp", "vnc_rdp", "ssh", "smtp", "iot", "all"])
70
+ .optional()
71
+ .describe("Service to probe (default: auto-detect from ports, or 'all')"),
72
+ },
73
+ async execute(args, ctx) {
74
+ const host = args.host;
75
+ const ports = args.ports;
76
+ const service = args.service;
77
+ let calls;
78
+ if (service) {
79
+ // Explicit service selection
80
+ calls = buildServiceCalls(service, host, ports);
81
+ }
82
+ else if (ports && ports.length > 0) {
83
+ // Auto-detect services from port numbers
84
+ const detectedServices = new Set();
85
+ for (const port of ports) {
86
+ const svc = PORT_SERVICE_MAP[port];
87
+ if (svc)
88
+ detectedServices.add(svc);
89
+ }
90
+ if (detectedServices.size === 0) {
91
+ // No recognized ports — default to all
92
+ calls = buildServiceCalls("all", host, ports);
93
+ }
94
+ else {
95
+ calls = [];
96
+ for (const svc of detectedServices) {
97
+ // Filter ports relevant to this service
98
+ const relevantPorts = ports.filter((p) => PORT_SERVICE_MAP[p] === svc);
99
+ calls.push(...buildServiceCalls(svc, host, relevantPorts.length > 0 ? relevantPorts : undefined));
100
+ }
101
+ }
102
+ }
103
+ else {
104
+ // Neither service nor ports given — default to "all"
105
+ calls = buildServiceCalls("all", host, ports);
106
+ }
107
+ const results = await callToolsParallel(calls, ctx);
108
+ return buildCompositeResponse("scan_services", results);
109
+ },
110
+ };
111
+ //# sourceMappingURL=scan-services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-services.js","sourceRoot":"","sources":["../../src/composite/scan-services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const scanTlsTool: ToolDef;
3
+ //# sourceMappingURL=scan-tls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-tls.d.ts","sourceRoot":"","sources":["../../src/composite/scan-tls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAG1E,eAAO,MAAM,WAAW,EAAE,OAsCzB,CAAC"}