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,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const appTools: ToolDef[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,mBAAmB,CAAC;AA0qB9D,eAAO,MAAM,QAAQ,EAAE,OAAO,EA4B7B,CAAC"}
@@ -0,0 +1,614 @@
1
+ import { z } from "zod";
2
+ import { json } from "../types/index.js";
3
+ import { RateLimiter } from "../utils/rate-limiter.js";
4
+ import { TTLCache } from "../utils/cache.js";
5
+ import * as cheerio from "cheerio";
6
+ import { APP_SIGNATURES } from "../data/app-signatures.js";
7
+ // ─── Module-Level Setup ───
8
+ const limiter = new RateLimiter(300);
9
+ const cache = new TTLCache(300_000);
10
+ const REQUEST_TIMEOUT = 10_000;
11
+ const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
12
+ // ─── Helpers ───
13
+ async function safeFetch(url, options) {
14
+ try {
15
+ const res = await fetch(url, {
16
+ headers: { "User-Agent": USER_AGENT, ...(options?.headers ?? {}) },
17
+ redirect: "follow",
18
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT),
19
+ ...options,
20
+ });
21
+ const body = await res.text();
22
+ return { status: res.status, headers: res.headers, body };
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ function parseCookieNames(headers) {
29
+ const names = [];
30
+ const setCookie = headers.getSetCookie?.() ?? [];
31
+ for (const raw of setCookie) {
32
+ const name = raw.split("=")[0]?.trim();
33
+ if (name)
34
+ names.push(name);
35
+ }
36
+ return names;
37
+ }
38
+ function matchPatterns(text, patterns) {
39
+ const matched = [];
40
+ const details = [];
41
+ for (const pattern of patterns) {
42
+ const re = new RegExp(pattern, "i");
43
+ const m = text.match(re);
44
+ if (m) {
45
+ matched.push(pattern);
46
+ details.push(m[0]);
47
+ }
48
+ }
49
+ return { matched, details };
50
+ }
51
+ // ─── Tool 1: app_cms ───
52
+ async function appCms(args, _ctx) {
53
+ const url = args.url;
54
+ const cacheKey = `app_cms:${url}`;
55
+ const cached = cache.get(cacheKey);
56
+ if (cached)
57
+ return json(cached);
58
+ await limiter.acquire();
59
+ const response = await safeFetch(url);
60
+ if (!response) {
61
+ return json({ url, error: "Failed to fetch URL", detections: [] });
62
+ }
63
+ const { body, headers } = response;
64
+ const $ = cheerio.load(body);
65
+ const cmsSignatures = APP_SIGNATURES.filter((s) => s.category === "cms");
66
+ const detections = [];
67
+ for (const sig of cmsSignatures) {
68
+ const signals = [];
69
+ let totalChecks = 0;
70
+ let matchedChecks = 0;
71
+ // 1. Meta generator tag
72
+ if (sig.detection.meta && sig.detection.meta.length > 0) {
73
+ totalChecks++;
74
+ for (const pattern of sig.detection.meta) {
75
+ const re = new RegExp(pattern, "i");
76
+ if (re.test(body)) {
77
+ matchedChecks++;
78
+ signals.push(`Meta generator: ${pattern}`);
79
+ break;
80
+ }
81
+ }
82
+ }
83
+ // 2. Path patterns in HTML source
84
+ if (sig.detection.paths && sig.detection.paths.length > 0) {
85
+ totalChecks++;
86
+ const foundPaths = [];
87
+ for (const path of sig.detection.paths) {
88
+ if (body.includes(path)) {
89
+ foundPaths.push(path);
90
+ }
91
+ }
92
+ if (foundPaths.length > 0) {
93
+ matchedChecks++;
94
+ signals.push(`Paths found: ${foundPaths.join(", ")}`);
95
+ }
96
+ }
97
+ // 3. Script patterns
98
+ if (sig.detection.scripts && sig.detection.scripts.length > 0) {
99
+ totalChecks++;
100
+ const foundScripts = [];
101
+ for (const pattern of sig.detection.scripts) {
102
+ const re = new RegExp(pattern, "i");
103
+ if (re.test(body)) {
104
+ foundScripts.push(pattern);
105
+ }
106
+ }
107
+ if (foundScripts.length > 0) {
108
+ matchedChecks++;
109
+ signals.push(`Script patterns: ${foundScripts.join(", ")}`);
110
+ }
111
+ }
112
+ // 4. JS globals in HTML
113
+ if (sig.detection.globals && sig.detection.globals.length > 0) {
114
+ totalChecks++;
115
+ const foundGlobals = [];
116
+ for (const global of sig.detection.globals) {
117
+ if (body.includes(global)) {
118
+ foundGlobals.push(global);
119
+ }
120
+ }
121
+ if (foundGlobals.length > 0) {
122
+ matchedChecks++;
123
+ signals.push(`JS globals: ${foundGlobals.join(", ")}`);
124
+ }
125
+ }
126
+ // 5. Cookie names
127
+ if (sig.detection.cookies && sig.detection.cookies.length > 0) {
128
+ totalChecks++;
129
+ const cookieNames = parseCookieNames(headers);
130
+ const matchedCookies = [];
131
+ for (const pattern of sig.detection.cookies) {
132
+ const re = new RegExp(pattern, "i");
133
+ for (const name of cookieNames) {
134
+ if (re.test(name)) {
135
+ matchedCookies.push(name);
136
+ }
137
+ }
138
+ }
139
+ if (matchedCookies.length > 0) {
140
+ matchedChecks++;
141
+ signals.push(`Cookies: ${matchedCookies.join(", ")}`);
142
+ }
143
+ }
144
+ // 6. HTTP headers
145
+ if (sig.detection.headers && Object.keys(sig.detection.headers).length > 0) {
146
+ totalChecks++;
147
+ const matchedHeaders = [];
148
+ for (const [header, pattern] of Object.entries(sig.detection.headers)) {
149
+ const value = headers.get(header);
150
+ if (value) {
151
+ const re = new RegExp(pattern, "i");
152
+ if (re.test(value)) {
153
+ matchedHeaders.push(`${header}: ${value}`);
154
+ }
155
+ }
156
+ }
157
+ if (matchedHeaders.length > 0) {
158
+ matchedChecks++;
159
+ signals.push(`Headers: ${matchedHeaders.join(", ")}`);
160
+ }
161
+ }
162
+ // 7. Body content patterns
163
+ if (sig.detection.body && sig.detection.body.length > 0) {
164
+ totalChecks++;
165
+ const foundBody = [];
166
+ for (const pattern of sig.detection.body) {
167
+ const re = new RegExp(pattern, "i");
168
+ if (re.test(body)) {
169
+ foundBody.push(pattern);
170
+ }
171
+ }
172
+ if (foundBody.length > 0) {
173
+ matchedChecks++;
174
+ signals.push(`Body patterns: ${foundBody.join(", ")}`);
175
+ }
176
+ }
177
+ if (matchedChecks > 0 && totalChecks > 0) {
178
+ const confidence = Math.round((matchedChecks / totalChecks) * 100);
179
+ // Version detection
180
+ let version = null;
181
+ if (sig.versionDetection) {
182
+ const re = new RegExp(sig.versionDetection.pattern, "i");
183
+ const m = body.match(re);
184
+ if (m && m[1]) {
185
+ version = m[1];
186
+ }
187
+ }
188
+ detections.push({
189
+ name: sig.name,
190
+ confidence,
191
+ signals,
192
+ version,
193
+ });
194
+ }
195
+ }
196
+ // Also check admin path accessibility for top candidates
197
+ const adminPaths = {
198
+ WordPress: ["/wp-admin/", "/wp-login.php"],
199
+ Drupal: ["/user/login"],
200
+ Joomla: ["/administrator/"],
201
+ Ghost: ["/ghost/"],
202
+ };
203
+ const adminResults = {};
204
+ for (const detection of detections.slice(0, 3)) {
205
+ const paths = adminPaths[detection.name];
206
+ if (!paths)
207
+ continue;
208
+ const results = [];
209
+ for (const path of paths) {
210
+ try {
211
+ const baseUrl = new URL(url);
212
+ const adminUrl = `${baseUrl.origin}${path}`;
213
+ const res = await safeFetch(adminUrl, { method: "HEAD" });
214
+ if (res) {
215
+ results.push({ path, status: res.status });
216
+ }
217
+ }
218
+ catch {
219
+ // skip
220
+ }
221
+ }
222
+ if (results.length > 0) {
223
+ adminResults[detection.name] = results;
224
+ }
225
+ }
226
+ // Sort by confidence
227
+ detections.sort((a, b) => b.confidence - a.confidence);
228
+ const result = {
229
+ url,
230
+ detections,
231
+ adminPathChecks: Object.keys(adminResults).length > 0 ? adminResults : undefined,
232
+ bestMatch: detections.length > 0 ? detections[0] : null,
233
+ };
234
+ cache.set(cacheKey, result);
235
+ return json(result);
236
+ }
237
+ // ─── Tool 2: app_ecommerce ───
238
+ async function appEcommerce(args, _ctx) {
239
+ const url = args.url;
240
+ const cacheKey = `app_ecommerce:${url}`;
241
+ const cached = cache.get(cacheKey);
242
+ if (cached)
243
+ return json(cached);
244
+ await limiter.acquire();
245
+ const response = await safeFetch(url);
246
+ if (!response) {
247
+ return json({ url, error: "Failed to fetch URL", detections: [] });
248
+ }
249
+ const { body, headers } = response;
250
+ const $ = cheerio.load(body);
251
+ const ecomSignatures = APP_SIGNATURES.filter((s) => s.category === "ecommerce");
252
+ const detections = [];
253
+ for (const sig of ecomSignatures) {
254
+ const signals = [];
255
+ let totalChecks = 0;
256
+ let matchedChecks = 0;
257
+ // 1. Meta tags
258
+ if (sig.detection.meta && sig.detection.meta.length > 0) {
259
+ totalChecks++;
260
+ for (const pattern of sig.detection.meta) {
261
+ if (new RegExp(pattern, "i").test(body)) {
262
+ matchedChecks++;
263
+ signals.push(`Meta tag match: ${pattern}`);
264
+ break;
265
+ }
266
+ }
267
+ }
268
+ // 2. CDN / script patterns (definitive for some platforms)
269
+ if (sig.detection.scripts && sig.detection.scripts.length > 0) {
270
+ totalChecks++;
271
+ const found = [];
272
+ for (const pattern of sig.detection.scripts) {
273
+ if (new RegExp(pattern, "i").test(body)) {
274
+ found.push(pattern);
275
+ }
276
+ }
277
+ if (found.length > 0) {
278
+ matchedChecks++;
279
+ signals.push(`Script/CDN: ${found.join(", ")}`);
280
+ }
281
+ }
282
+ // 3. Path patterns
283
+ if (sig.detection.paths && sig.detection.paths.length > 0) {
284
+ totalChecks++;
285
+ const found = [];
286
+ for (const path of sig.detection.paths) {
287
+ if (body.includes(path)) {
288
+ found.push(path);
289
+ }
290
+ }
291
+ if (found.length > 0) {
292
+ matchedChecks++;
293
+ signals.push(`Path patterns: ${found.join(", ")}`);
294
+ }
295
+ }
296
+ // 4. JS globals
297
+ if (sig.detection.globals && sig.detection.globals.length > 0) {
298
+ totalChecks++;
299
+ const found = [];
300
+ for (const global of sig.detection.globals) {
301
+ if (body.includes(global)) {
302
+ found.push(global);
303
+ }
304
+ }
305
+ if (found.length > 0) {
306
+ matchedChecks++;
307
+ signals.push(`JS globals: ${found.join(", ")}`);
308
+ }
309
+ }
310
+ // 5. Cookies
311
+ if (sig.detection.cookies && sig.detection.cookies.length > 0) {
312
+ totalChecks++;
313
+ const cookieNames = parseCookieNames(headers);
314
+ const found = [];
315
+ for (const pattern of sig.detection.cookies) {
316
+ for (const name of cookieNames) {
317
+ if (new RegExp(pattern, "i").test(name)) {
318
+ found.push(name);
319
+ }
320
+ }
321
+ }
322
+ if (found.length > 0) {
323
+ matchedChecks++;
324
+ signals.push(`Cookies: ${found.join(", ")}`);
325
+ }
326
+ }
327
+ // 6. HTTP headers
328
+ if (sig.detection.headers && Object.keys(sig.detection.headers).length > 0) {
329
+ totalChecks++;
330
+ const found = [];
331
+ for (const [header, pattern] of Object.entries(sig.detection.headers)) {
332
+ const value = headers.get(header);
333
+ if (value && new RegExp(pattern, "i").test(value)) {
334
+ found.push(`${header}: ${value}`);
335
+ }
336
+ }
337
+ if (found.length > 0) {
338
+ matchedChecks++;
339
+ signals.push(`Headers: ${found.join(", ")}`);
340
+ }
341
+ }
342
+ // 7. Body content
343
+ if (sig.detection.body && sig.detection.body.length > 0) {
344
+ totalChecks++;
345
+ const found = [];
346
+ for (const pattern of sig.detection.body) {
347
+ if (new RegExp(pattern, "i").test(body)) {
348
+ found.push(pattern);
349
+ }
350
+ }
351
+ if (found.length > 0) {
352
+ matchedChecks++;
353
+ signals.push(`Body: ${found.join(", ")}`);
354
+ }
355
+ }
356
+ if (matchedChecks > 0 && totalChecks > 0) {
357
+ const confidence = Math.round((matchedChecks / totalChecks) * 100);
358
+ let version = null;
359
+ if (sig.versionDetection) {
360
+ const m = body.match(new RegExp(sig.versionDetection.pattern, "i"));
361
+ if (m && m[1])
362
+ version = m[1];
363
+ }
364
+ detections.push({ name: sig.name, confidence, signals, version });
365
+ }
366
+ }
367
+ // Payment provider detection (inline)
368
+ const paymentProviders = [];
369
+ const paymentChecks = [
370
+ [/js\.stripe\.com|Stripe\(/i, "Stripe"],
371
+ [/paypal\.com\/sdk|PayPal/i, "PayPal"],
372
+ [/square\.com|squareup\.com/i, "Square"],
373
+ [/braintree/i, "Braintree"],
374
+ [/klarna/i, "Klarna"],
375
+ [/afterpay|clearpay/i, "Afterpay/Clearpay"],
376
+ [/affirm/i, "Affirm"],
377
+ [/razorpay/i, "Razorpay"],
378
+ [/adyen/i, "Adyen"],
379
+ [/shopPay|shop-pay/i, "Shop Pay"],
380
+ [/apple-pay|ApplePaySession/i, "Apple Pay"],
381
+ [/google-pay|GooglePayButton/i, "Google Pay"],
382
+ ];
383
+ for (const [pattern, provider] of paymentChecks) {
384
+ const m = body.match(pattern);
385
+ if (m) {
386
+ paymentProviders.push({ provider, signal: m[0] });
387
+ }
388
+ }
389
+ detections.sort((a, b) => b.confidence - a.confidence);
390
+ const result = {
391
+ url,
392
+ detections,
393
+ paymentProviders: paymentProviders.length > 0 ? paymentProviders : undefined,
394
+ bestMatch: detections.length > 0 ? detections[0] : null,
395
+ };
396
+ cache.set(cacheKey, result);
397
+ return json(result);
398
+ }
399
+ // ─── Tool 3: app_framework ───
400
+ async function appFramework(args, _ctx) {
401
+ const url = args.url;
402
+ const cacheKey = `app_framework:${url}`;
403
+ const cached = cache.get(cacheKey);
404
+ if (cached)
405
+ return json(cached);
406
+ await limiter.acquire();
407
+ const baseUrl = new URL(url);
408
+ const frameworkSignatures = APP_SIGNATURES.filter((s) => s.category === "framework");
409
+ const detections = [];
410
+ // 1. Trigger error response on nonexistent path
411
+ const errorUrl = `${baseUrl.origin}/nonexistent-path-fp-${Date.now()}`;
412
+ const errorResponse = await safeFetch(errorUrl);
413
+ // 2. Fetch the main page for header/cookie analysis
414
+ const mainResponse = await safeFetch(url);
415
+ // 3. Trailing slash behavior test
416
+ let trailingSlashBehavior = null;
417
+ try {
418
+ const noSlashUrl = `${baseUrl.origin}/test-trailing-slash-fp`;
419
+ const withSlashUrl = `${baseUrl.origin}/test-trailing-slash-fp/`;
420
+ const [noSlash, withSlash] = await Promise.all([
421
+ safeFetch(noSlashUrl, { redirect: "manual" }),
422
+ safeFetch(withSlashUrl, { redirect: "manual" }),
423
+ ]);
424
+ if (noSlash && withSlash) {
425
+ if (noSlash.status === 301 || noSlash.status === 302) {
426
+ const location = noSlash.headers.get("location");
427
+ if (location && location.endsWith("/")) {
428
+ trailingSlashBehavior = "redirects_to_slash (Django/Rails-like)";
429
+ }
430
+ }
431
+ else if (noSlash.status !== withSlash.status) {
432
+ trailingSlashBehavior = `different_status: ${noSlash.status} vs ${withSlash.status}`;
433
+ }
434
+ else {
435
+ trailingSlashBehavior = "same_response";
436
+ }
437
+ }
438
+ }
439
+ catch {
440
+ // skip
441
+ }
442
+ // 4. Content negotiation test
443
+ let xmlNegotiation = null;
444
+ try {
445
+ const xmlResponse = await safeFetch(errorUrl, {
446
+ headers: { Accept: "application/xml", "User-Agent": USER_AGENT },
447
+ });
448
+ if (xmlResponse) {
449
+ const ct = xmlResponse.headers.get("content-type") ?? "";
450
+ if (ct.includes("xml")) {
451
+ xmlNegotiation = "supports_xml (Spring/ASP.NET-like)";
452
+ }
453
+ else if (ct.includes("json")) {
454
+ xmlNegotiation = "json_only";
455
+ }
456
+ else {
457
+ xmlNegotiation = `returns: ${ct}`;
458
+ }
459
+ }
460
+ }
461
+ catch {
462
+ // skip
463
+ }
464
+ for (const sig of frameworkSignatures) {
465
+ const signals = [];
466
+ let totalChecks = 0;
467
+ let matchedChecks = 0;
468
+ // Error response format matching
469
+ if (sig.detection.errorFormat && errorResponse) {
470
+ totalChecks++;
471
+ const re = new RegExp(sig.detection.errorFormat, "is");
472
+ if (re.test(errorResponse.body)) {
473
+ matchedChecks++;
474
+ signals.push(`Error format matches ${sig.name}`);
475
+ }
476
+ }
477
+ // Header patterns from error response
478
+ if (sig.detection.headers && Object.keys(sig.detection.headers).length > 0 && errorResponse) {
479
+ totalChecks++;
480
+ const found = [];
481
+ for (const [header, pattern] of Object.entries(sig.detection.headers)) {
482
+ const value = errorResponse.headers.get(header);
483
+ if (value && new RegExp(pattern, "i").test(value)) {
484
+ found.push(`${header}: ${value}`);
485
+ }
486
+ }
487
+ // Also check main response headers
488
+ if (mainResponse) {
489
+ for (const [header, pattern] of Object.entries(sig.detection.headers)) {
490
+ const value = mainResponse.headers.get(header);
491
+ if (value && new RegExp(pattern, "i").test(value)) {
492
+ const entry = `${header}: ${value}`;
493
+ if (!found.includes(entry))
494
+ found.push(entry);
495
+ }
496
+ }
497
+ }
498
+ if (found.length > 0) {
499
+ matchedChecks++;
500
+ signals.push(`Headers: ${found.join(", ")}`);
501
+ }
502
+ }
503
+ // Cookie patterns from main response
504
+ if (sig.detection.cookies && sig.detection.cookies.length > 0 && mainResponse) {
505
+ totalChecks++;
506
+ const cookieNames = parseCookieNames(mainResponse.headers);
507
+ const found = [];
508
+ for (const pattern of sig.detection.cookies) {
509
+ for (const name of cookieNames) {
510
+ if (new RegExp(pattern, "i").test(name)) {
511
+ found.push(name);
512
+ }
513
+ }
514
+ }
515
+ if (found.length > 0) {
516
+ matchedChecks++;
517
+ signals.push(`Cookies: ${found.join(", ")}`);
518
+ }
519
+ }
520
+ // Body content patterns from main response
521
+ if (sig.detection.body && sig.detection.body.length > 0 && mainResponse) {
522
+ totalChecks++;
523
+ const found = [];
524
+ for (const pattern of sig.detection.body) {
525
+ if (new RegExp(pattern, "i").test(mainResponse.body)) {
526
+ found.push(pattern);
527
+ }
528
+ }
529
+ if (found.length > 0) {
530
+ matchedChecks++;
531
+ signals.push(`Body patterns: ${found.join(", ")}`);
532
+ }
533
+ }
534
+ // Path-based detection: probe known framework paths
535
+ if (sig.detection.paths && sig.detection.paths.length > 0) {
536
+ totalChecks++;
537
+ const found = [];
538
+ // Check if body references these paths
539
+ for (const path of sig.detection.paths) {
540
+ if (mainResponse && mainResponse.body.includes(path)) {
541
+ found.push(`${path} (referenced)`);
542
+ }
543
+ }
544
+ // Probe up to 2 characteristic paths
545
+ for (const path of sig.detection.paths.slice(0, 2)) {
546
+ try {
547
+ const probeUrl = `${baseUrl.origin}${path}`;
548
+ const res = await safeFetch(probeUrl, { method: "HEAD" });
549
+ if (res && res.status >= 200 && res.status < 404) {
550
+ found.push(`${path} (status ${res.status})`);
551
+ }
552
+ }
553
+ catch {
554
+ // skip
555
+ }
556
+ }
557
+ if (found.length > 0) {
558
+ matchedChecks++;
559
+ signals.push(`Paths: ${found.join(", ")}`);
560
+ }
561
+ }
562
+ if (matchedChecks > 0 && totalChecks > 0) {
563
+ const confidence = Math.round((matchedChecks / totalChecks) * 100);
564
+ detections.push({ name: sig.name, confidence, signals });
565
+ }
566
+ }
567
+ detections.sort((a, b) => b.confidence - a.confidence);
568
+ const result = {
569
+ url,
570
+ detections,
571
+ errorResponse: errorResponse
572
+ ? {
573
+ status: errorResponse.status,
574
+ contentType: errorResponse.headers.get("content-type"),
575
+ bodySnippet: errorResponse.body.slice(0, 500),
576
+ server: errorResponse.headers.get("server"),
577
+ poweredBy: errorResponse.headers.get("x-powered-by"),
578
+ }
579
+ : null,
580
+ trailingSlashBehavior,
581
+ xmlNegotiation,
582
+ bestMatch: detections.length > 0 ? detections[0] : null,
583
+ };
584
+ cache.set(cacheKey, result);
585
+ return json(result);
586
+ }
587
+ // ─── Tool Definitions ───
588
+ export const appTools = [
589
+ {
590
+ name: "app_cms",
591
+ description: "CMS detection via multi-signal analysis. Checks meta generator tags, path patterns (wp-content, sites/default/files, etc.), JS globals, cookie names, HTTP headers, and body content to identify WordPress, Drupal, Joomla, Ghost, TYPO3, Hugo, Gatsby, Jekyll, Hexo, Webflow, Squarespace, Wix, and more. Returns confidence scores and optional version detection.",
592
+ schema: {
593
+ url: z.string().url().describe("URL to detect CMS"),
594
+ },
595
+ execute: appCms,
596
+ },
597
+ {
598
+ name: "app_ecommerce",
599
+ description: "E-commerce platform detection. Analyzes CDN patterns (cdn.shopify.com), script patterns, cookie names, URL paths, meta tags, HTTP headers, and payment provider integration to identify Shopify, WooCommerce, Magento, BigCommerce, PrestaShop, OpenCart, Squarespace, Wix, and more. Also detects payment providers (Stripe, PayPal, Square, etc.).",
600
+ schema: {
601
+ url: z.string().url().describe("URL to detect e-commerce platform"),
602
+ },
603
+ execute: appEcommerce,
604
+ },
605
+ {
606
+ name: "app_framework",
607
+ description: "Backend framework fingerprint via error response, path, and header analysis. Triggers errors by requesting nonexistent paths and analyzes the error format (RFC 7807 for Spring Boot, Whitelabel Error Page, Werkzeug debugger, Whoops for Laravel, 'Cannot GET' for Express, etc.). Also tests trailing slash redirect behavior, content negotiation, and header patterns. Covers Spring Boot, Django, FastAPI, Flask, Laravel, Rails, Express, Koa, Gin, Fiber, ASP.NET, and more.",
608
+ schema: {
609
+ url: z.string().url().describe("URL to fingerprint backend framework"),
610
+ },
611
+ execute: appFramework,
612
+ },
613
+ ];
614
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const analyzeTool: ToolDef;
3
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/composite/analyze.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAG1E,eAAO,MAAM,WAAW,EAAE,OA+DzB,CAAC"}