domain-search-mcp 1.0.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 (151) hide show
  1. package/.env.example +52 -0
  2. package/Dockerfile +15 -0
  3. package/LICENSE +21 -0
  4. package/README.md +426 -0
  5. package/SECURITY.md +252 -0
  6. package/dist/config.d.ts +25 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +117 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/fallbacks/index.d.ts +6 -0
  11. package/dist/fallbacks/index.d.ts.map +1 -0
  12. package/dist/fallbacks/index.js +14 -0
  13. package/dist/fallbacks/index.js.map +1 -0
  14. package/dist/fallbacks/rdap.d.ts +18 -0
  15. package/dist/fallbacks/rdap.d.ts.map +1 -0
  16. package/dist/fallbacks/rdap.js +339 -0
  17. package/dist/fallbacks/rdap.js.map +1 -0
  18. package/dist/fallbacks/whois.d.ts +27 -0
  19. package/dist/fallbacks/whois.d.ts.map +1 -0
  20. package/dist/fallbacks/whois.js +219 -0
  21. package/dist/fallbacks/whois.js.map +1 -0
  22. package/dist/registrars/base.d.ts +89 -0
  23. package/dist/registrars/base.d.ts.map +1 -0
  24. package/dist/registrars/base.js +203 -0
  25. package/dist/registrars/base.js.map +1 -0
  26. package/dist/registrars/index.d.ts +7 -0
  27. package/dist/registrars/index.d.ts.map +1 -0
  28. package/dist/registrars/index.js +15 -0
  29. package/dist/registrars/index.js.map +1 -0
  30. package/dist/registrars/namecheap.d.ts +69 -0
  31. package/dist/registrars/namecheap.d.ts.map +1 -0
  32. package/dist/registrars/namecheap.js +307 -0
  33. package/dist/registrars/namecheap.js.map +1 -0
  34. package/dist/registrars/porkbun.d.ts +63 -0
  35. package/dist/registrars/porkbun.d.ts.map +1 -0
  36. package/dist/registrars/porkbun.js +299 -0
  37. package/dist/registrars/porkbun.js.map +1 -0
  38. package/dist/server.d.ts +19 -0
  39. package/dist/server.d.ts.map +1 -0
  40. package/dist/server.js +209 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/services/domain-search.d.ts +40 -0
  43. package/dist/services/domain-search.d.ts.map +1 -0
  44. package/dist/services/domain-search.js +438 -0
  45. package/dist/services/domain-search.js.map +1 -0
  46. package/dist/services/index.d.ts +5 -0
  47. package/dist/services/index.d.ts.map +1 -0
  48. package/dist/services/index.js +11 -0
  49. package/dist/services/index.js.map +1 -0
  50. package/dist/tools/bulk_search.d.ts +72 -0
  51. package/dist/tools/bulk_search.d.ts.map +1 -0
  52. package/dist/tools/bulk_search.js +108 -0
  53. package/dist/tools/bulk_search.js.map +1 -0
  54. package/dist/tools/check_socials.d.ts +71 -0
  55. package/dist/tools/check_socials.d.ts.map +1 -0
  56. package/dist/tools/check_socials.js +357 -0
  57. package/dist/tools/check_socials.js.map +1 -0
  58. package/dist/tools/compare_registrars.d.ts +80 -0
  59. package/dist/tools/compare_registrars.d.ts.map +1 -0
  60. package/dist/tools/compare_registrars.js +116 -0
  61. package/dist/tools/compare_registrars.js.map +1 -0
  62. package/dist/tools/index.d.ts +10 -0
  63. package/dist/tools/index.d.ts.map +1 -0
  64. package/dist/tools/index.js +31 -0
  65. package/dist/tools/index.js.map +1 -0
  66. package/dist/tools/search_domain.d.ts +61 -0
  67. package/dist/tools/search_domain.d.ts.map +1 -0
  68. package/dist/tools/search_domain.js +81 -0
  69. package/dist/tools/search_domain.js.map +1 -0
  70. package/dist/tools/suggest_domains.d.ts +82 -0
  71. package/dist/tools/suggest_domains.d.ts.map +1 -0
  72. package/dist/tools/suggest_domains.js +227 -0
  73. package/dist/tools/suggest_domains.js.map +1 -0
  74. package/dist/tools/tld_info.d.ts +56 -0
  75. package/dist/tools/tld_info.d.ts.map +1 -0
  76. package/dist/tools/tld_info.js +273 -0
  77. package/dist/tools/tld_info.js.map +1 -0
  78. package/dist/types.d.ts +193 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +9 -0
  81. package/dist/types.js.map +1 -0
  82. package/dist/utils/cache.d.ts +81 -0
  83. package/dist/utils/cache.d.ts.map +1 -0
  84. package/dist/utils/cache.js +192 -0
  85. package/dist/utils/cache.js.map +1 -0
  86. package/dist/utils/errors.d.ts +87 -0
  87. package/dist/utils/errors.d.ts.map +1 -0
  88. package/dist/utils/errors.js +191 -0
  89. package/dist/utils/errors.js.map +1 -0
  90. package/dist/utils/index.d.ts +8 -0
  91. package/dist/utils/index.d.ts.map +1 -0
  92. package/dist/utils/index.js +24 -0
  93. package/dist/utils/index.js.map +1 -0
  94. package/dist/utils/logger.d.ts +27 -0
  95. package/dist/utils/logger.d.ts.map +1 -0
  96. package/dist/utils/logger.js +132 -0
  97. package/dist/utils/logger.js.map +1 -0
  98. package/dist/utils/premium-analyzer.d.ts +33 -0
  99. package/dist/utils/premium-analyzer.d.ts.map +1 -0
  100. package/dist/utils/premium-analyzer.js +273 -0
  101. package/dist/utils/premium-analyzer.js.map +1 -0
  102. package/dist/utils/validators.d.ts +53 -0
  103. package/dist/utils/validators.d.ts.map +1 -0
  104. package/dist/utils/validators.js +159 -0
  105. package/dist/utils/validators.js.map +1 -0
  106. package/docs/marketing/devto-post.md +135 -0
  107. package/docs/marketing/hackernews.md +42 -0
  108. package/docs/marketing/producthunt.md +109 -0
  109. package/docs/marketing/reddit-post.md +59 -0
  110. package/docs/marketing/twitter-thread.md +105 -0
  111. package/examples/bulk-search-50-domains.ts +131 -0
  112. package/examples/cli-interactive.ts +280 -0
  113. package/examples/compare-registrars.ts +78 -0
  114. package/examples/search-single-domain.ts +54 -0
  115. package/examples/suggest-names.ts +110 -0
  116. package/glama.json +6 -0
  117. package/jest.config.js +35 -0
  118. package/package.json +62 -0
  119. package/smithery.yaml +36 -0
  120. package/src/config.ts +121 -0
  121. package/src/fallbacks/index.ts +6 -0
  122. package/src/fallbacks/rdap.ts +407 -0
  123. package/src/fallbacks/whois.ts +250 -0
  124. package/src/registrars/base.ts +264 -0
  125. package/src/registrars/index.ts +7 -0
  126. package/src/registrars/namecheap.ts +378 -0
  127. package/src/registrars/porkbun.ts +380 -0
  128. package/src/server.ts +276 -0
  129. package/src/services/domain-search.ts +567 -0
  130. package/src/services/index.ts +9 -0
  131. package/src/tools/bulk_search.ts +142 -0
  132. package/src/tools/check_socials.ts +467 -0
  133. package/src/tools/compare_registrars.ts +162 -0
  134. package/src/tools/index.ts +45 -0
  135. package/src/tools/search_domain.ts +93 -0
  136. package/src/tools/suggest_domains.ts +284 -0
  137. package/src/tools/tld_info.ts +294 -0
  138. package/src/types.ts +289 -0
  139. package/src/utils/cache.ts +238 -0
  140. package/src/utils/errors.ts +262 -0
  141. package/src/utils/index.ts +8 -0
  142. package/src/utils/logger.ts +162 -0
  143. package/src/utils/premium-analyzer.ts +303 -0
  144. package/src/utils/validators.ts +193 -0
  145. package/tests/premium-analyzer.test.ts +310 -0
  146. package/tests/unit/cache.test.ts +123 -0
  147. package/tests/unit/errors.test.ts +190 -0
  148. package/tests/unit/tld-info.test.ts +62 -0
  149. package/tests/unit/tools.test.ts +200 -0
  150. package/tests/unit/validators.test.ts +146 -0
  151. package/tsconfig.json +25 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk_search.js","sourceRoot":"","sources":["../../src/tools/bulk_search.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyFH,8CA+CC;AAtID,6BAAwB;AAExB,mEAAiE;AACjE,kDAA+C;AAE/C;;GAEG;AACU,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,OAAC;SACP,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;SACjB,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,CACP,gGAAgG,CACjG;IACH,GAAG,EAAE,OAAC;SACH,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,uEAAuE,CAAC;IACpF,SAAS,EAAE,OAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,wFAAwF,CACzF;CACJ,CAAC,CAAC;AAIH;;GAEG;AACU,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE;;;;;;;;;;;4DAW6C;IAC1D,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EACT,mEAAmE;aACtE;YACD,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gEAAgE;aAC9E;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sCAAsC;aACpD;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;CACF,CAAC;AAgBF;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACrC,KAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,wBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAElE,MAAM,OAAO,GAAG,MAAM,IAAA,oCAAiB,EAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAEjE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CACX,KAAK,SAAS,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,oBAAoB,CAC/D,CAAC;YAEF,MAAM,QAAQ,GAAG,SAAS;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,IAAI,CAAC;iBAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAiB,GAAG,CAAC,CAAC,gBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhE,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CACX,kBAAkB,QAAQ,CAAC,MAAM,QAAQ,QAAQ,CAAC,gBAAgB,OAAO,CAC1E,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;YAC3D,QAAQ,CAAC,IAAI,CACX,iDAAiD,CAClD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO;YACP,OAAO,EAAE;gBACP,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,SAAS,EAAE,SAAS,CAAC,MAAM;gBAC3B,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;aACxC;YACD,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAA,qBAAS,EAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * check_socials Tool - Social Handle Availability.
3
+ *
4
+ * Check if a username is available across social platforms.
5
+ * Uses Sherlock-style detection for accurate results.
6
+ *
7
+ * Detection methods:
8
+ * - status_code: 404 = available, 200 = taken
9
+ * - message: Check response body for error indicators
10
+ * - api: Use platform's public API
11
+ */
12
+ import { z } from 'zod';
13
+ import type { SocialHandleResult } from '../types.js';
14
+ /**
15
+ * Input schema for check_socials.
16
+ */
17
+ export declare const checkSocialsSchema: z.ZodObject<{
18
+ name: z.ZodString;
19
+ platforms: z.ZodOptional<z.ZodArray<z.ZodEnum<["github", "twitter", "instagram", "linkedin", "tiktok", "reddit", "youtube", "npm", "pypi", "producthunt"]>, "many">>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ name: string;
22
+ platforms?: ("github" | "twitter" | "instagram" | "linkedin" | "tiktok" | "reddit" | "youtube" | "npm" | "pypi" | "producthunt")[] | undefined;
23
+ }, {
24
+ name: string;
25
+ platforms?: ("github" | "twitter" | "instagram" | "linkedin" | "tiktok" | "reddit" | "youtube" | "npm" | "pypi" | "producthunt")[] | undefined;
26
+ }>;
27
+ export type CheckSocialsInput = z.infer<typeof checkSocialsSchema>;
28
+ /**
29
+ * Tool definition for MCP.
30
+ */
31
+ export declare const checkSocialsTool: {
32
+ name: string;
33
+ description: string;
34
+ inputSchema: {
35
+ type: string;
36
+ properties: {
37
+ name: {
38
+ type: string;
39
+ description: string;
40
+ };
41
+ platforms: {
42
+ type: string;
43
+ items: {
44
+ type: string;
45
+ enum: readonly ["github", "twitter", "instagram", "linkedin", "tiktok", "reddit", "youtube", "npm", "pypi", "producthunt"];
46
+ };
47
+ description: string;
48
+ };
49
+ };
50
+ required: string[];
51
+ };
52
+ };
53
+ /**
54
+ * Response format for social checks.
55
+ */
56
+ interface CheckSocialsResponse {
57
+ name: string;
58
+ results: SocialHandleResult[];
59
+ summary: {
60
+ available: number;
61
+ taken: number;
62
+ uncertain: number;
63
+ };
64
+ insights: string[];
65
+ }
66
+ /**
67
+ * Execute the check_socials tool.
68
+ */
69
+ export declare function executeCheckSocials(input: CheckSocialsInput): Promise<CheckSocialsResponse>;
70
+ export {};
71
+ //# sourceMappingURL=check_socials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check_socials.d.ts","sourceRoot":"","sources":["../../src/tools/check_socials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA2LtE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;EAY7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;CAiC5B,CAAC;AAgGF;;GAEG;AACH,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA2F/B"}
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ /**
3
+ * check_socials Tool - Social Handle Availability.
4
+ *
5
+ * Check if a username is available across social platforms.
6
+ * Uses Sherlock-style detection for accurate results.
7
+ *
8
+ * Detection methods:
9
+ * - status_code: 404 = available, 200 = taken
10
+ * - message: Check response body for error indicators
11
+ * - api: Use platform's public API
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.checkSocialsTool = exports.checkSocialsSchema = void 0;
18
+ exports.executeCheckSocials = executeCheckSocials;
19
+ const zod_1 = require("zod");
20
+ const axios_1 = __importDefault(require("axios"));
21
+ const errors_js_1 = require("../utils/errors.js");
22
+ const logger_js_1 = require("../utils/logger.js");
23
+ /**
24
+ * Platform configurations using Sherlock-style detection.
25
+ * HIGH confidence = public API or reliable status codes
26
+ * MEDIUM confidence = status codes but may have edge cases
27
+ * LOW confidence = platforms that block automated checks
28
+ */
29
+ const PLATFORM_CONFIGS = {
30
+ // ─────────────────────────────────────────────────────────────────────────
31
+ // HIGH CONFIDENCE (Public APIs)
32
+ // ─────────────────────────────────────────────────────────────────────────
33
+ github: {
34
+ url: 'https://api.github.com/users/{}',
35
+ profileUrl: 'https://github.com/{}',
36
+ errorType: 'status_code',
37
+ errorCode: 404,
38
+ confidence: 'high',
39
+ method: 'GET',
40
+ headers: {
41
+ 'Accept': 'application/vnd.github.v3+json',
42
+ 'User-Agent': 'Domain-Search-MCP/1.0',
43
+ },
44
+ regexCheck: /^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}$/i,
45
+ },
46
+ npm: {
47
+ url: 'https://registry.npmjs.org/{}',
48
+ profileUrl: 'https://www.npmjs.com/~{}',
49
+ errorType: 'status_code',
50
+ errorCode: 404,
51
+ confidence: 'high',
52
+ method: 'GET',
53
+ headers: {
54
+ 'Accept': 'application/json',
55
+ },
56
+ regexCheck: /^[a-z0-9][a-z0-9._-]*$/i,
57
+ },
58
+ pypi: {
59
+ url: 'https://pypi.org/user/{}/',
60
+ profileUrl: 'https://pypi.org/user/{}/',
61
+ errorType: 'status_code',
62
+ errorCode: 404,
63
+ confidence: 'high',
64
+ method: 'GET',
65
+ },
66
+ reddit: {
67
+ url: 'https://www.reddit.com/user/{}/about.json',
68
+ profileUrl: 'https://reddit.com/user/{}',
69
+ errorType: 'message',
70
+ errorMsg: ['"error": 404'],
71
+ confidence: 'high',
72
+ method: 'GET',
73
+ headers: {
74
+ 'User-Agent': 'Domain-Search-MCP/1.0 (checking username availability)',
75
+ },
76
+ regexCheck: /^[A-Za-z0-9_-]{3,20}$/,
77
+ },
78
+ // ─────────────────────────────────────────────────────────────────────────
79
+ // MEDIUM CONFIDENCE (Status codes, some edge cases)
80
+ // ─────────────────────────────────────────────────────────────────────────
81
+ twitter: {
82
+ url: 'https://twitter.com/{}',
83
+ profileUrl: 'https://twitter.com/{}',
84
+ errorType: 'status_code',
85
+ errorCode: 404,
86
+ confidence: 'medium',
87
+ method: 'HEAD',
88
+ headers: {
89
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
90
+ },
91
+ regexCheck: /^[A-Za-z0-9_]{1,15}$/,
92
+ },
93
+ youtube: {
94
+ url: 'https://www.youtube.com/@{}',
95
+ profileUrl: 'https://youtube.com/@{}',
96
+ errorType: 'status_code',
97
+ errorCode: 404,
98
+ confidence: 'medium',
99
+ method: 'HEAD',
100
+ headers: {
101
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
102
+ },
103
+ },
104
+ producthunt: {
105
+ url: 'https://www.producthunt.com/@{}',
106
+ profileUrl: 'https://producthunt.com/@{}',
107
+ errorType: 'status_code',
108
+ errorCode: 404,
109
+ confidence: 'medium',
110
+ method: 'HEAD',
111
+ headers: {
112
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
113
+ },
114
+ },
115
+ // ─────────────────────────────────────────────────────────────────────────
116
+ // LOW CONFIDENCE (Aggressive bot protection)
117
+ // ─────────────────────────────────────────────────────────────────────────
118
+ instagram: {
119
+ url: 'https://www.instagram.com/{}/',
120
+ profileUrl: 'https://instagram.com/{}',
121
+ errorType: 'status_code',
122
+ errorCode: 404,
123
+ confidence: 'low', // Instagram aggressively blocks automated checks
124
+ method: 'HEAD',
125
+ headers: {
126
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
127
+ },
128
+ regexCheck: /^[a-zA-Z0-9_.]{1,30}$/,
129
+ },
130
+ linkedin: {
131
+ url: 'https://www.linkedin.com/in/{}',
132
+ profileUrl: 'https://linkedin.com/in/{}',
133
+ errorType: 'status_code',
134
+ errorCode: 404,
135
+ confidence: 'low', // LinkedIn requires auth
136
+ method: 'HEAD',
137
+ headers: {
138
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
139
+ },
140
+ },
141
+ tiktok: {
142
+ url: 'https://www.tiktok.com/@{}',
143
+ profileUrl: 'https://tiktok.com/@{}',
144
+ errorType: 'status_code',
145
+ errorCode: 404,
146
+ confidence: 'low', // TikTok blocks automated checks
147
+ method: 'HEAD',
148
+ headers: {
149
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
150
+ },
151
+ regexCheck: /^[a-zA-Z0-9_.]{2,24}$/,
152
+ },
153
+ };
154
+ // ═══════════════════════════════════════════════════════════════════════════
155
+ // Zod Schema
156
+ // ═══════════════════════════════════════════════════════════════════════════
157
+ const ALL_PLATFORMS = [
158
+ 'github', 'twitter', 'instagram', 'linkedin', 'tiktok',
159
+ 'reddit', 'youtube', 'npm', 'pypi', 'producthunt',
160
+ ];
161
+ /**
162
+ * Input schema for check_socials.
163
+ */
164
+ exports.checkSocialsSchema = zod_1.z.object({
165
+ name: zod_1.z
166
+ .string()
167
+ .min(1)
168
+ .max(30)
169
+ .describe("The username/handle to check (e.g., 'vibecoding')."),
170
+ platforms: zod_1.z
171
+ .array(zod_1.z.enum(ALL_PLATFORMS))
172
+ .optional()
173
+ .describe("Platforms to check. Defaults to ['github', 'twitter', 'reddit', 'npm']."),
174
+ });
175
+ /**
176
+ * Tool definition for MCP.
177
+ */
178
+ exports.checkSocialsTool = {
179
+ name: 'check_socials',
180
+ description: `Check if a username is available on social media and developer platforms.
181
+
182
+ Supports 10 platforms with varying confidence levels:
183
+ - HIGH: GitHub, npm, PyPI, Reddit (reliable public APIs)
184
+ - MEDIUM: Twitter/X, YouTube, ProductHunt (status code based)
185
+ - LOW: Instagram, LinkedIn, TikTok (block automated checks - verify manually)
186
+
187
+ Returns availability status with confidence indicator.
188
+
189
+ Example:
190
+ - check_socials("vibecoding") → checks GitHub, Twitter, Reddit, npm
191
+ - check_socials("myapp", ["github", "npm", "pypi"]) → developer platforms only`,
192
+ inputSchema: {
193
+ type: 'object',
194
+ properties: {
195
+ name: {
196
+ type: 'string',
197
+ description: "The username/handle to check.",
198
+ },
199
+ platforms: {
200
+ type: 'array',
201
+ items: {
202
+ type: 'string',
203
+ enum: ALL_PLATFORMS,
204
+ },
205
+ description: "Platforms to check. Defaults to ['github', 'twitter', 'reddit', 'npm'].",
206
+ },
207
+ },
208
+ required: ['name'],
209
+ },
210
+ };
211
+ // ═══════════════════════════════════════════════════════════════════════════
212
+ // Platform Checking Logic
213
+ // ═══════════════════════════════════════════════════════════════════════════
214
+ /**
215
+ * Check a single platform using Sherlock-style detection.
216
+ */
217
+ async function checkPlatform(username, platform) {
218
+ const config = PLATFORM_CONFIGS[platform];
219
+ const url = config.url.replace('{}', username);
220
+ const profileUrl = config.profileUrl.replace('{}', username);
221
+ // Validate username format if regex provided
222
+ if (config.regexCheck && !config.regexCheck.test(username)) {
223
+ return {
224
+ platform,
225
+ handle: username,
226
+ available: false,
227
+ url: profileUrl,
228
+ checked_at: new Date().toISOString(),
229
+ confidence: 'high', // High confidence it's invalid
230
+ };
231
+ }
232
+ try {
233
+ const response = await (0, axios_1.default)({
234
+ method: config.method,
235
+ url,
236
+ timeout: 8000,
237
+ validateStatus: () => true, // Don't throw on any status
238
+ headers: {
239
+ ...config.headers,
240
+ },
241
+ maxRedirects: 0,
242
+ });
243
+ let available = false;
244
+ // Determine availability based on errorType
245
+ switch (config.errorType) {
246
+ case 'status_code':
247
+ available = response.status === (config.errorCode ?? 404);
248
+ break;
249
+ case 'message':
250
+ if (config.errorMsg && typeof response.data === 'string') {
251
+ available = config.errorMsg.some((msg) => response.data.includes(msg));
252
+ }
253
+ else if (config.errorMsg && typeof response.data === 'object') {
254
+ const dataStr = JSON.stringify(response.data);
255
+ available = config.errorMsg.some((msg) => dataStr.includes(msg));
256
+ }
257
+ break;
258
+ case 'api':
259
+ // API-specific logic would go here
260
+ available = response.status === 404;
261
+ break;
262
+ }
263
+ return {
264
+ platform,
265
+ handle: username,
266
+ available,
267
+ url: profileUrl,
268
+ checked_at: new Date().toISOString(),
269
+ confidence: config.confidence,
270
+ };
271
+ }
272
+ catch (error) {
273
+ logger_js_1.logger.debug(`Failed to check ${platform}`, {
274
+ username,
275
+ error: error instanceof Error ? error.message : String(error),
276
+ });
277
+ // Return uncertain result on error
278
+ return {
279
+ platform,
280
+ handle: username,
281
+ available: false, // Assume taken if we can't check
282
+ url: profileUrl,
283
+ checked_at: new Date().toISOString(),
284
+ confidence: 'low',
285
+ };
286
+ }
287
+ }
288
+ // ═══════════════════════════════════════════════════════════════════════════
289
+ // Main Execution
290
+ // ═══════════════════════════════════════════════════════════════════════════
291
+ /**
292
+ * Execute the check_socials tool.
293
+ */
294
+ async function executeCheckSocials(input) {
295
+ try {
296
+ const { name, platforms } = exports.checkSocialsSchema.parse(input);
297
+ // Default platforms: mix of social and developer platforms
298
+ const platformsToCheck = platforms || [
299
+ 'github',
300
+ 'twitter',
301
+ 'reddit',
302
+ 'npm',
303
+ ];
304
+ // Normalize username (lowercase, remove special chars)
305
+ const normalizedName = name.toLowerCase().replace(/[^a-z0-9_-]/g, '');
306
+ // Check all platforms in parallel (max 5 concurrent)
307
+ const results = await Promise.all(platformsToCheck.map((p) => checkPlatform(normalizedName, p)));
308
+ // Categorize results by confidence
309
+ const highConfidence = results.filter((r) => r.confidence === 'high');
310
+ const available = results.filter((r) => r.available && r.confidence !== 'low');
311
+ const taken = results.filter((r) => !r.available && r.confidence !== 'low');
312
+ const uncertain = results.filter((r) => r.confidence === 'low');
313
+ // Generate insights
314
+ const insights = [];
315
+ if (available.length > 0) {
316
+ insights.push(`✅ "${normalizedName}" is available on: ${available.map((r) => r.platform).join(', ')}`);
317
+ }
318
+ if (taken.length > 0) {
319
+ insights.push(`❌ "${normalizedName}" is taken on: ${taken.map((r) => r.platform).join(', ')}`);
320
+ }
321
+ if (uncertain.length > 0) {
322
+ insights.push(`⚠️ Could not reliably check: ${uncertain.map((r) => r.platform).join(', ')} (verify manually)`);
323
+ }
324
+ // Developer-focused insight
325
+ const devPlatforms = results.filter((r) => ['github', 'npm', 'pypi'].includes(r.platform));
326
+ const allDevAvailable = devPlatforms.every((r) => r.available);
327
+ if (devPlatforms.length > 0 && allDevAvailable) {
328
+ insights.push(`🛠️ Great for developers! "${normalizedName}" is available on all dev platforms`);
329
+ }
330
+ // Branding consistency advice
331
+ const allAvailable = results.every((r) => r.available);
332
+ const allTaken = results.every((r) => !r.available);
333
+ if (allAvailable) {
334
+ insights.push(`🎉 Perfect! "${normalizedName}" is available everywhere - grab it now!`);
335
+ }
336
+ else if (allTaken) {
337
+ insights.push(`💡 Try variations: ${normalizedName}hq, ${normalizedName}app, get${normalizedName}, ${normalizedName}io`);
338
+ }
339
+ else if (available.length > 0 && taken.length > 0) {
340
+ insights.push('💡 For consistent branding, consider a name available on all platforms');
341
+ }
342
+ return {
343
+ name: normalizedName,
344
+ results,
345
+ summary: {
346
+ available: available.length,
347
+ taken: taken.length,
348
+ uncertain: uncertain.length,
349
+ },
350
+ insights,
351
+ };
352
+ }
353
+ catch (error) {
354
+ throw (0, errors_js_1.wrapError)(error);
355
+ }
356
+ }
357
+ //# sourceMappingURL=check_socials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check_socials.js","sourceRoot":"","sources":["../../src/tools/check_socials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * compare_registrars Tool - Price Comparison.
3
+ *
4
+ * Compare pricing across multiple registrars for a specific domain.
5
+ * Helps find the best deal.
6
+ */
7
+ import { z } from 'zod';
8
+ import type { DomainResult } from '../types.js';
9
+ /**
10
+ * Input schema for compare_registrars.
11
+ */
12
+ export declare const compareRegistrarsSchema: z.ZodObject<{
13
+ domain: z.ZodString;
14
+ tld: z.ZodString;
15
+ registrars: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ domain: string;
18
+ tld: string;
19
+ registrars?: string[] | undefined;
20
+ }, {
21
+ domain: string;
22
+ tld: string;
23
+ registrars?: string[] | undefined;
24
+ }>;
25
+ export type CompareRegistrarsInput = z.infer<typeof compareRegistrarsSchema>;
26
+ /**
27
+ * Tool definition for MCP.
28
+ */
29
+ export declare const compareRegistrarsTool: {
30
+ name: string;
31
+ description: string;
32
+ inputSchema: {
33
+ type: string;
34
+ properties: {
35
+ domain: {
36
+ type: string;
37
+ description: string;
38
+ };
39
+ tld: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ registrars: {
44
+ type: string;
45
+ items: {
46
+ type: string;
47
+ };
48
+ description: string;
49
+ };
50
+ };
51
+ required: string[];
52
+ };
53
+ };
54
+ /**
55
+ * Response format for registrar comparison.
56
+ */
57
+ interface CompareRegistrarsResponse {
58
+ domain: string;
59
+ what_happened: string;
60
+ comparison_count: number;
61
+ comparisons: DomainResult[];
62
+ best_first_year: {
63
+ registrar: string;
64
+ price: number;
65
+ currency: string;
66
+ } | null;
67
+ best_renewal: {
68
+ registrar: string;
69
+ price: number;
70
+ currency: string;
71
+ } | null;
72
+ recommendation: string;
73
+ insights: string[];
74
+ }
75
+ /**
76
+ * Execute the compare_registrars tool.
77
+ */
78
+ export declare function executeCompareRegistrars(input: CompareRegistrarsInput): Promise<CompareRegistrarsResponse>;
79
+ export {};
80
+ //# sourceMappingURL=compare_registrars.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare_registrars.d.ts","sourceRoot":"","sources":["../../src/tools/compare_registrars.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;EAclC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;CAiCjC,CAAC;AAEF;;GAEG;AACH,UAAU,yBAAyB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,eAAe,EAAE;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,YAAY,EAAE;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,yBAAyB,CAAC,CA8DpC"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * compare_registrars Tool - Price Comparison.
4
+ *
5
+ * Compare pricing across multiple registrars for a specific domain.
6
+ * Helps find the best deal.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.compareRegistrarsTool = exports.compareRegistrarsSchema = void 0;
10
+ exports.executeCompareRegistrars = executeCompareRegistrars;
11
+ const zod_1 = require("zod");
12
+ const domain_search_js_1 = require("../services/domain-search.js");
13
+ const validators_js_1 = require("../utils/validators.js");
14
+ const errors_js_1 = require("../utils/errors.js");
15
+ /**
16
+ * Input schema for compare_registrars.
17
+ */
18
+ exports.compareRegistrarsSchema = zod_1.z.object({
19
+ domain: zod_1.z
20
+ .string()
21
+ .min(1)
22
+ .describe("The domain name to compare (e.g., 'vibecoding')."),
23
+ tld: zod_1.z
24
+ .string()
25
+ .describe("The TLD extension (e.g., 'com', 'io')."),
26
+ registrars: zod_1.z
27
+ .array(zod_1.z.string())
28
+ .optional()
29
+ .describe("Registrars to compare (e.g., ['porkbun', 'namecheap']). Defaults to all available."),
30
+ });
31
+ /**
32
+ * Tool definition for MCP.
33
+ */
34
+ exports.compareRegistrarsTool = {
35
+ name: 'compare_registrars',
36
+ description: `Compare domain pricing across multiple registrars.
37
+
38
+ Checks the same domain at different registrars to find:
39
+ - Best first year price
40
+ - Best renewal price
41
+ - Overall recommendation
42
+
43
+ Returns pricing comparison and a recommendation.
44
+
45
+ Example:
46
+ - compare_registrars("vibecoding", "com") → compares Porkbun vs Namecheap`,
47
+ inputSchema: {
48
+ type: 'object',
49
+ properties: {
50
+ domain: {
51
+ type: 'string',
52
+ description: "The domain name to compare (without extension).",
53
+ },
54
+ tld: {
55
+ type: 'string',
56
+ description: "The TLD extension (e.g., 'com', 'io').",
57
+ },
58
+ registrars: {
59
+ type: 'array',
60
+ items: { type: 'string' },
61
+ description: "Registrars to compare. Defaults to ['porkbun', 'namecheap'].",
62
+ },
63
+ },
64
+ required: ['domain', 'tld'],
65
+ },
66
+ };
67
+ /**
68
+ * Execute the compare_registrars tool.
69
+ */
70
+ async function executeCompareRegistrars(input) {
71
+ try {
72
+ const { domain, tld, registrars } = exports.compareRegistrarsSchema.parse(input);
73
+ const normalizedDomain = (0, validators_js_1.validateDomainName)(domain);
74
+ const normalizedTld = (0, validators_js_1.validateTld)(tld);
75
+ const fullDomain = `${normalizedDomain}.${normalizedTld}`;
76
+ const result = await (0, domain_search_js_1.compareRegistrars)(normalizedDomain, normalizedTld, registrars);
77
+ const insights = [];
78
+ // Generate insights
79
+ if (result.best_first_year && result.best_renewal) {
80
+ if (result.best_first_year.registrar === result.best_renewal.registrar) {
81
+ insights.push(`✅ ${result.best_first_year.registrar} wins on both first year and renewal`);
82
+ }
83
+ else {
84
+ insights.push(`💡 Split strategy: ${result.best_first_year.registrar} for year 1, consider transfer to ${result.best_renewal.registrar} later`);
85
+ }
86
+ }
87
+ // Check for privacy inclusion
88
+ const withPrivacy = result.comparisons.filter((r) => r.privacy_included);
89
+ if (withPrivacy.length > 0) {
90
+ insights.push(`🔒 ${withPrivacy.map((r) => r.registrar).join(', ')} include free WHOIS privacy`);
91
+ }
92
+ // Premium warning
93
+ const premiums = result.comparisons.filter((r) => r.premium);
94
+ if (premiums.length > 0) {
95
+ insights.push(`⚠️ This is a premium domain at: ${premiums.map((r) => r.registrar).join(', ')}`);
96
+ }
97
+ return {
98
+ domain: fullDomain,
99
+ what_happened: `Compared pricing across ${result.comparisons.length} registrars`,
100
+ comparison_count: result.comparisons.length,
101
+ comparisons: result.comparisons,
102
+ best_first_year: result.best_first_year
103
+ ? { ...result.best_first_year, currency: 'USD' }
104
+ : null,
105
+ best_renewal: result.best_renewal
106
+ ? { ...result.best_renewal, currency: 'USD' }
107
+ : null,
108
+ recommendation: result.recommendation,
109
+ insights,
110
+ };
111
+ }
112
+ catch (error) {
113
+ throw (0, errors_js_1.wrapError)(error);
114
+ }
115
+ }
116
+ //# sourceMappingURL=compare_registrars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare_registrars.js","sourceRoot":"","sources":["../../src/tools/compare_registrars.ts"],"names":[],"mappings":"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"}