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.
- package/.env.example +52 -0
- package/Dockerfile +15 -0
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/SECURITY.md +252 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +117 -0
- package/dist/config.js.map +1 -0
- package/dist/fallbacks/index.d.ts +6 -0
- package/dist/fallbacks/index.d.ts.map +1 -0
- package/dist/fallbacks/index.js +14 -0
- package/dist/fallbacks/index.js.map +1 -0
- package/dist/fallbacks/rdap.d.ts +18 -0
- package/dist/fallbacks/rdap.d.ts.map +1 -0
- package/dist/fallbacks/rdap.js +339 -0
- package/dist/fallbacks/rdap.js.map +1 -0
- package/dist/fallbacks/whois.d.ts +27 -0
- package/dist/fallbacks/whois.d.ts.map +1 -0
- package/dist/fallbacks/whois.js +219 -0
- package/dist/fallbacks/whois.js.map +1 -0
- package/dist/registrars/base.d.ts +89 -0
- package/dist/registrars/base.d.ts.map +1 -0
- package/dist/registrars/base.js +203 -0
- package/dist/registrars/base.js.map +1 -0
- package/dist/registrars/index.d.ts +7 -0
- package/dist/registrars/index.d.ts.map +1 -0
- package/dist/registrars/index.js +15 -0
- package/dist/registrars/index.js.map +1 -0
- package/dist/registrars/namecheap.d.ts +69 -0
- package/dist/registrars/namecheap.d.ts.map +1 -0
- package/dist/registrars/namecheap.js +307 -0
- package/dist/registrars/namecheap.js.map +1 -0
- package/dist/registrars/porkbun.d.ts +63 -0
- package/dist/registrars/porkbun.d.ts.map +1 -0
- package/dist/registrars/porkbun.js +299 -0
- package/dist/registrars/porkbun.js.map +1 -0
- package/dist/server.d.ts +19 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +209 -0
- package/dist/server.js.map +1 -0
- package/dist/services/domain-search.d.ts +40 -0
- package/dist/services/domain-search.d.ts.map +1 -0
- package/dist/services/domain-search.js +438 -0
- package/dist/services/domain-search.js.map +1 -0
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +11 -0
- package/dist/services/index.js.map +1 -0
- package/dist/tools/bulk_search.d.ts +72 -0
- package/dist/tools/bulk_search.d.ts.map +1 -0
- package/dist/tools/bulk_search.js +108 -0
- package/dist/tools/bulk_search.js.map +1 -0
- package/dist/tools/check_socials.d.ts +71 -0
- package/dist/tools/check_socials.d.ts.map +1 -0
- package/dist/tools/check_socials.js +357 -0
- package/dist/tools/check_socials.js.map +1 -0
- package/dist/tools/compare_registrars.d.ts +80 -0
- package/dist/tools/compare_registrars.d.ts.map +1 -0
- package/dist/tools/compare_registrars.js +116 -0
- package/dist/tools/compare_registrars.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +31 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search_domain.d.ts +61 -0
- package/dist/tools/search_domain.d.ts.map +1 -0
- package/dist/tools/search_domain.js +81 -0
- package/dist/tools/search_domain.js.map +1 -0
- package/dist/tools/suggest_domains.d.ts +82 -0
- package/dist/tools/suggest_domains.d.ts.map +1 -0
- package/dist/tools/suggest_domains.js +227 -0
- package/dist/tools/suggest_domains.js.map +1 -0
- package/dist/tools/tld_info.d.ts +56 -0
- package/dist/tools/tld_info.d.ts.map +1 -0
- package/dist/tools/tld_info.js +273 -0
- package/dist/tools/tld_info.js.map +1 -0
- package/dist/types.d.ts +193 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cache.d.ts +81 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +192 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/errors.d.ts +87 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +191 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +24 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +132 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/premium-analyzer.d.ts +33 -0
- package/dist/utils/premium-analyzer.d.ts.map +1 -0
- package/dist/utils/premium-analyzer.js +273 -0
- package/dist/utils/premium-analyzer.js.map +1 -0
- package/dist/utils/validators.d.ts +53 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +159 -0
- package/dist/utils/validators.js.map +1 -0
- package/docs/marketing/devto-post.md +135 -0
- package/docs/marketing/hackernews.md +42 -0
- package/docs/marketing/producthunt.md +109 -0
- package/docs/marketing/reddit-post.md +59 -0
- package/docs/marketing/twitter-thread.md +105 -0
- package/examples/bulk-search-50-domains.ts +131 -0
- package/examples/cli-interactive.ts +280 -0
- package/examples/compare-registrars.ts +78 -0
- package/examples/search-single-domain.ts +54 -0
- package/examples/suggest-names.ts +110 -0
- package/glama.json +6 -0
- package/jest.config.js +35 -0
- package/package.json +62 -0
- package/smithery.yaml +36 -0
- package/src/config.ts +121 -0
- package/src/fallbacks/index.ts +6 -0
- package/src/fallbacks/rdap.ts +407 -0
- package/src/fallbacks/whois.ts +250 -0
- package/src/registrars/base.ts +264 -0
- package/src/registrars/index.ts +7 -0
- package/src/registrars/namecheap.ts +378 -0
- package/src/registrars/porkbun.ts +380 -0
- package/src/server.ts +276 -0
- package/src/services/domain-search.ts +567 -0
- package/src/services/index.ts +9 -0
- package/src/tools/bulk_search.ts +142 -0
- package/src/tools/check_socials.ts +467 -0
- package/src/tools/compare_registrars.ts +162 -0
- package/src/tools/index.ts +45 -0
- package/src/tools/search_domain.ts +93 -0
- package/src/tools/suggest_domains.ts +284 -0
- package/src/tools/tld_info.ts +294 -0
- package/src/types.ts +289 -0
- package/src/utils/cache.ts +238 -0
- package/src/utils/errors.ts +262 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/logger.ts +162 -0
- package/src/utils/premium-analyzer.ts +303 -0
- package/src/utils/validators.ts +193 -0
- package/tests/premium-analyzer.test.ts +310 -0
- package/tests/unit/cache.test.ts +123 -0
- package/tests/unit/errors.test.ts +190 -0
- package/tests/unit/tld-info.test.ts +62 -0
- package/tests/unit/tools.test.ts +200 -0
- package/tests/unit/validators.test.ts +146 -0
- package/tsconfig.json +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk_search.js","sourceRoot":"","sources":["../../src/tools/bulk_search.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|