domain-search-mcp 1.1.1 → 1.1.4
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/README.md +57 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/registrars/godaddy-mcp.d.ts +67 -0
- package/dist/registrars/godaddy-mcp.d.ts.map +1 -0
- package/dist/registrars/godaddy-mcp.js +301 -0
- package/dist/registrars/godaddy-mcp.js.map +1 -0
- package/dist/registrars/index.d.ts +1 -0
- package/dist/registrars/index.d.ts.map +1 -1
- package/dist/registrars/index.js +4 -1
- package/dist/registrars/index.js.map +1 -1
- package/dist/services/domain-search.d.ts +5 -4
- package/dist/services/domain-search.d.ts.map +1 -1
- package/dist/services/domain-search.js +24 -8
- package/dist/services/domain-search.js.map +1 -1
- package/dist/tools/check_socials.d.ts.map +1 -1
- package/dist/tools/check_socials.js +48 -2
- package/dist/tools/check_socials.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +2 -0
- package/dist/utils/cache.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +1 -0
- package/src/registrars/godaddy-mcp.ts +380 -0
- package/src/registrars/index.ts +1 -0
- package/src/services/domain-search.ts +25 -9
- package/src/tools/check_socials.ts +57 -2
- package/src/types.ts +2 -0
- package/src/utils/cache.ts +2 -0
package/README.md
CHANGED
|
@@ -67,6 +67,7 @@ vibecoding.dev - Available - $10.18/year (Porkbun)
|
|
|
67
67
|
| **bulk_search** | Check up to 100 domains at once |
|
|
68
68
|
| **compare_registrars** | Find the best price across registrars |
|
|
69
69
|
| **suggest_domains** | Get available variations when your name is taken |
|
|
70
|
+
| **suggest_domains_smart** | AI-powered suggestions from keywords or descriptions |
|
|
70
71
|
| **tld_info** | Learn about TLDs, restrictions, and typical pricing |
|
|
71
72
|
| **check_socials** | Verify if usernames are available on GitHub, Twitter, Instagram |
|
|
72
73
|
|
|
@@ -209,6 +210,59 @@ Get variations when your preferred name is taken:
|
|
|
209
210
|
}
|
|
210
211
|
```
|
|
211
212
|
|
|
213
|
+
### suggest_domains_smart
|
|
214
|
+
|
|
215
|
+
AI-powered domain suggestions using semantic analysis:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// Input - natural language query
|
|
219
|
+
{
|
|
220
|
+
"query": "ai customer service chatbot",
|
|
221
|
+
"tld": "io",
|
|
222
|
+
"industry": "tech", // optional - auto-detected
|
|
223
|
+
"style": "brandable", // brandable, descriptive, short, creative
|
|
224
|
+
"max_suggestions": 10
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Output
|
|
228
|
+
{
|
|
229
|
+
"query": "ai customer service chatbot",
|
|
230
|
+
"detected_words": ["ai", "customer", "service", "chat", "bot"],
|
|
231
|
+
"detected_industry": "tech",
|
|
232
|
+
"results": {
|
|
233
|
+
"available": [
|
|
234
|
+
{
|
|
235
|
+
"domain": "servicebotai.io",
|
|
236
|
+
"price_first_year": 32.98,
|
|
237
|
+
"premium": false,
|
|
238
|
+
"score": 72
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"domain": "chatservicehub.io",
|
|
242
|
+
"price_first_year": 32.98,
|
|
243
|
+
"premium": false,
|
|
244
|
+
"score": 68
|
|
245
|
+
}
|
|
246
|
+
],
|
|
247
|
+
"premium": [],
|
|
248
|
+
"unavailable_count": 15
|
|
249
|
+
},
|
|
250
|
+
"insights": [
|
|
251
|
+
"🎯 Detected industry: tech",
|
|
252
|
+
"✅ Found 8 available domains",
|
|
253
|
+
"⭐ Top pick: servicebotai.io ($32.98/yr)"
|
|
254
|
+
],
|
|
255
|
+
"related_terms": ["neural", "cognitive", "assist", "connect"]
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Features:**
|
|
260
|
+
- Understands natural language queries ("coffee shop in seattle")
|
|
261
|
+
- Auto-detects industry for contextual suggestions
|
|
262
|
+
- Generates portmanteau/blended names
|
|
263
|
+
- Multiple style modes (brandable, short, creative)
|
|
264
|
+
- Premium domain detection
|
|
265
|
+
|
|
212
266
|
### tld_info
|
|
213
267
|
|
|
214
268
|
Learn about a TLD:
|
|
@@ -344,6 +398,7 @@ domain-search-mcp/
|
|
|
344
398
|
│ │ ├── bulk_search.ts
|
|
345
399
|
│ │ ├── compare_registrars.ts
|
|
346
400
|
│ │ ├── suggest_domains.ts
|
|
401
|
+
│ │ ├── suggest_domains_smart.ts # AI-powered suggestions
|
|
347
402
|
│ │ ├── tld_info.ts
|
|
348
403
|
│ │ └── check_socials.ts
|
|
349
404
|
│ ├── registrars/ # Registrar adapters
|
|
@@ -359,7 +414,8 @@ domain-search-mcp/
|
|
|
359
414
|
│ ├── logger.ts
|
|
360
415
|
│ ├── cache.ts
|
|
361
416
|
│ ├── errors.ts
|
|
362
|
-
│
|
|
417
|
+
│ ├── validators.ts
|
|
418
|
+
│ └── semantic-engine.ts # Word segmentation & suggestions
|
|
363
419
|
├── tests/
|
|
364
420
|
│ ├── unit/
|
|
365
421
|
│ └── integration/
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAoCzC;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAiDnC;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAoCzC;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAiDnC;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAO9C"}
|
package/dist/config.js
CHANGED
|
@@ -111,6 +111,7 @@ function getAvailableSources() {
|
|
|
111
111
|
sources.push('porkbun');
|
|
112
112
|
if (exports.config.namecheap.enabled)
|
|
113
113
|
sources.push('namecheap');
|
|
114
|
+
sources.push('godaddy'); // GoDaddy MCP - always available (no auth needed)
|
|
114
115
|
sources.push('rdap', 'whois'); // Always available as fallbacks
|
|
115
116
|
return sources;
|
|
116
117
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA0CH,gCAiDC;AAWD,0CAEC;AAKD,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GoDaddy MCP Adapter.
|
|
3
|
+
*
|
|
4
|
+
* Uses GoDaddy's public MCP endpoint for domain availability checks.
|
|
5
|
+
* No API key or reseller account required!
|
|
6
|
+
*
|
|
7
|
+
* Endpoint: https://api.godaddy.com/v1/domains/mcp
|
|
8
|
+
* Protocol: JSON-RPC 2.0 over HTTP (Streamable HTTP transport)
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Free availability checking (no auth)
|
|
12
|
+
* - Bulk checking up to 1000 domains
|
|
13
|
+
* - Premium/auction domain detection
|
|
14
|
+
*
|
|
15
|
+
* Limitations:
|
|
16
|
+
* - No pricing information
|
|
17
|
+
* - Rate limits not documented (be conservative)
|
|
18
|
+
*/
|
|
19
|
+
import { RegistrarAdapter } from './base.js';
|
|
20
|
+
import type { DomainResult, TLDInfo } from '../types.js';
|
|
21
|
+
/**
|
|
22
|
+
* Parse availability from GoDaddy MCP text response.
|
|
23
|
+
* The response is markdown-formatted text with different formats for single vs bulk queries.
|
|
24
|
+
*/
|
|
25
|
+
interface ParsedAvailability {
|
|
26
|
+
available: boolean;
|
|
27
|
+
premium: boolean;
|
|
28
|
+
auction: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* GoDaddy MCP Adapter.
|
|
32
|
+
*
|
|
33
|
+
* Uses GoDaddy's public MCP endpoint - no authentication required!
|
|
34
|
+
*/
|
|
35
|
+
export declare class GodaddyMcpAdapter extends RegistrarAdapter {
|
|
36
|
+
readonly name = "GoDaddy";
|
|
37
|
+
readonly id = "godaddy";
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Check if GoDaddy MCP is enabled.
|
|
41
|
+
* Always enabled since no API key needed!
|
|
42
|
+
*/
|
|
43
|
+
isEnabled(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Search for domain availability using GoDaddy MCP.
|
|
46
|
+
*/
|
|
47
|
+
search(domain: string, tld: string): Promise<DomainResult>;
|
|
48
|
+
/**
|
|
49
|
+
* Bulk check multiple domains at once.
|
|
50
|
+
* GoDaddy MCP supports up to 1000 domains per request!
|
|
51
|
+
*/
|
|
52
|
+
bulkSearch(domains: string[]): Promise<Map<string, ParsedAvailability>>;
|
|
53
|
+
/**
|
|
54
|
+
* Get TLD info - not supported by GoDaddy MCP.
|
|
55
|
+
*/
|
|
56
|
+
getTldInfo(_tld: string): Promise<TLDInfo | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Call a GoDaddy MCP tool via JSON-RPC.
|
|
59
|
+
*/
|
|
60
|
+
private callMcpTool;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Singleton instance.
|
|
64
|
+
*/
|
|
65
|
+
export declare const godaddyMcpAdapter: GodaddyMcpAdapter;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=godaddy-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"godaddy-mcp.d.ts","sourceRoot":"","sources":["../../src/registrars/godaddy-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,gBAAgB,EAAe,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAiCzD;;;GAGG;AACH,UAAU,kBAAkB;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AA0HD;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,EAAE,aAAa;;IAQxB;;;OAGG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA0BhE;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAmB7E;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAIvD;;OAEG;YACW,WAAW;CAyG1B;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GoDaddy MCP Adapter.
|
|
4
|
+
*
|
|
5
|
+
* Uses GoDaddy's public MCP endpoint for domain availability checks.
|
|
6
|
+
* No API key or reseller account required!
|
|
7
|
+
*
|
|
8
|
+
* Endpoint: https://api.godaddy.com/v1/domains/mcp
|
|
9
|
+
* Protocol: JSON-RPC 2.0 over HTTP (Streamable HTTP transport)
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Free availability checking (no auth)
|
|
13
|
+
* - Bulk checking up to 1000 domains
|
|
14
|
+
* - Premium/auction domain detection
|
|
15
|
+
*
|
|
16
|
+
* Limitations:
|
|
17
|
+
* - No pricing information
|
|
18
|
+
* - Rate limits not documented (be conservative)
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.godaddyMcpAdapter = exports.GodaddyMcpAdapter = void 0;
|
|
22
|
+
const zod_1 = require("zod");
|
|
23
|
+
const base_js_1 = require("./base.js");
|
|
24
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
25
|
+
const errors_js_1 = require("../utils/errors.js");
|
|
26
|
+
/**
|
|
27
|
+
* GoDaddy MCP endpoint.
|
|
28
|
+
*/
|
|
29
|
+
const GODADDY_MCP_ENDPOINT = 'https://api.godaddy.com/v1/domains/mcp';
|
|
30
|
+
/**
|
|
31
|
+
* JSON-RPC request ID counter.
|
|
32
|
+
*/
|
|
33
|
+
let jsonRpcId = 1;
|
|
34
|
+
/**
|
|
35
|
+
* Response schema for MCP tool call.
|
|
36
|
+
*/
|
|
37
|
+
const McpResponseSchema = zod_1.z.object({
|
|
38
|
+
jsonrpc: zod_1.z.literal('2.0'),
|
|
39
|
+
id: zod_1.z.number(),
|
|
40
|
+
result: zod_1.z.object({
|
|
41
|
+
content: zod_1.z.array(zod_1.z.object({
|
|
42
|
+
type: zod_1.z.string(),
|
|
43
|
+
text: zod_1.z.string(),
|
|
44
|
+
})),
|
|
45
|
+
isError: zod_1.z.boolean().optional(),
|
|
46
|
+
}).optional(),
|
|
47
|
+
error: zod_1.z.object({
|
|
48
|
+
code: zod_1.z.number(),
|
|
49
|
+
message: zod_1.z.string(),
|
|
50
|
+
}).optional(),
|
|
51
|
+
});
|
|
52
|
+
function parseAvailabilityResponse(text, domain) {
|
|
53
|
+
const normalizedDomain = domain.toLowerCase();
|
|
54
|
+
const normalizedText = text.toLowerCase();
|
|
55
|
+
// Default: unavailable
|
|
56
|
+
const result = {
|
|
57
|
+
available: false,
|
|
58
|
+
premium: false,
|
|
59
|
+
auction: false,
|
|
60
|
+
};
|
|
61
|
+
// ==== SINGLE DOMAIN FORMAT ====
|
|
62
|
+
// Format: "STATUS: ✅ AVAILABLE" or "AVAILABILITY: Standard registration available"
|
|
63
|
+
if (normalizedText.includes('status:') || normalizedText.includes('availability:')) {
|
|
64
|
+
// Check for explicit availability indicators
|
|
65
|
+
if (normalizedText.includes('status: ✅ available') ||
|
|
66
|
+
normalizedText.includes('✅ available') ||
|
|
67
|
+
normalizedText.includes('standard registration available') ||
|
|
68
|
+
normalizedText.includes('purchasable: yes')) {
|
|
69
|
+
result.available = true;
|
|
70
|
+
// Check if premium
|
|
71
|
+
if (normalizedText.includes('type: premium') || normalizedText.includes('premium domain')) {
|
|
72
|
+
result.premium = true;
|
|
73
|
+
}
|
|
74
|
+
// Check if auction
|
|
75
|
+
if (normalizedText.includes('type: auction') || normalizedText.includes('auction domain')) {
|
|
76
|
+
result.auction = true;
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
// Explicit unavailable
|
|
81
|
+
if (normalizedText.includes('status: ❌') ||
|
|
82
|
+
normalizedText.includes('not available') ||
|
|
83
|
+
normalizedText.includes('already registered') ||
|
|
84
|
+
normalizedText.includes('purchasable: no')) {
|
|
85
|
+
result.available = false;
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ==== BULK DOMAIN FORMAT ====
|
|
90
|
+
// Check if domain appears in available section
|
|
91
|
+
// GoDaddy formats: "✅ **AVAILABLE DOMAINS" or "✅ **STANDARD SUGGESTIONS"
|
|
92
|
+
const availableMatch = text.match(/✅\s*\*\*(?:AVAILABLE|STANDARD)[^]*?(?=(?:💎|⚠️|❌|\*\*[A-Z])|$)/i);
|
|
93
|
+
if (availableMatch && availableMatch[0].toLowerCase().includes(normalizedDomain)) {
|
|
94
|
+
result.available = true;
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
// Check premium section
|
|
98
|
+
// GoDaddy format: "💎 **PREMIUM DOMAINS"
|
|
99
|
+
const premiumMatch = text.match(/💎\s*\*\*PREMIUM[^]*?(?=(?:⚠️|❌|\*\*[A-Z])|$)/i);
|
|
100
|
+
if (premiumMatch && premiumMatch[0].toLowerCase().includes(normalizedDomain)) {
|
|
101
|
+
result.available = true;
|
|
102
|
+
result.premium = true;
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
// Check auction section
|
|
106
|
+
// GoDaddy format: "🔨 **AUCTION DOMAINS" or similar
|
|
107
|
+
const auctionMatch = text.match(/🔨\s*\*\*AUCTION[^]*?(?=(?:💎|⚠️|❌|\*\*[A-Z])|$)/i);
|
|
108
|
+
if (auctionMatch && auctionMatch[0].toLowerCase().includes(normalizedDomain)) {
|
|
109
|
+
result.available = true;
|
|
110
|
+
result.auction = true;
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
// Check unavailable section
|
|
114
|
+
// GoDaddy format: "❌ **UNAVAILABLE DOMAINS"
|
|
115
|
+
const unavailableMatch = text.match(/❌\s*\*\*UNAVAILABLE[^]*?(?=(?:💎|⚠️|\*\*[A-Z])|$)/i);
|
|
116
|
+
if (unavailableMatch && unavailableMatch[0].toLowerCase().includes(normalizedDomain)) {
|
|
117
|
+
result.available = false;
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
// ==== FALLBACK: LINE-BY-LINE ANALYSIS ====
|
|
121
|
+
const lines = text.split('\n');
|
|
122
|
+
for (const line of lines) {
|
|
123
|
+
const lowerLine = line.toLowerCase();
|
|
124
|
+
// Check for domain-specific lines or general status
|
|
125
|
+
if (lowerLine.includes(normalizedDomain) || lowerLine.includes('status') || lowerLine.includes('available')) {
|
|
126
|
+
// Premium indicators
|
|
127
|
+
if (lowerLine.includes('premium')) {
|
|
128
|
+
result.available = true;
|
|
129
|
+
result.premium = true;
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
// Auction indicators
|
|
133
|
+
if (lowerLine.includes('auction')) {
|
|
134
|
+
result.available = true;
|
|
135
|
+
result.auction = true;
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
// Available indicators (must check before unavailable since "unavailable" contains "available")
|
|
139
|
+
if ((lowerLine.includes('✅') && lowerLine.includes('available')) ||
|
|
140
|
+
lowerLine.includes('register at') ||
|
|
141
|
+
lowerLine.includes('can be registered')) {
|
|
142
|
+
result.available = true;
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
// Unavailable indicators
|
|
146
|
+
if (lowerLine.includes('❌') || lowerLine.includes('unavailable') || lowerLine.includes('not available')) {
|
|
147
|
+
result.available = false;
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* GoDaddy MCP Adapter.
|
|
156
|
+
*
|
|
157
|
+
* Uses GoDaddy's public MCP endpoint - no authentication required!
|
|
158
|
+
*/
|
|
159
|
+
class GodaddyMcpAdapter extends base_js_1.RegistrarAdapter {
|
|
160
|
+
name = 'GoDaddy';
|
|
161
|
+
id = 'godaddy';
|
|
162
|
+
constructor() {
|
|
163
|
+
// Conservative rate limit - GoDaddy doesn't document their limits
|
|
164
|
+
// Using 30/min to be safe (they say "excessive requests may be throttled")
|
|
165
|
+
super(30);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Check if GoDaddy MCP is enabled.
|
|
169
|
+
* Always enabled since no API key needed!
|
|
170
|
+
*/
|
|
171
|
+
isEnabled() {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Search for domain availability using GoDaddy MCP.
|
|
176
|
+
*/
|
|
177
|
+
async search(domain, tld) {
|
|
178
|
+
const fullDomain = `${domain}.${tld}`;
|
|
179
|
+
return this.retryWithBackoff(async () => {
|
|
180
|
+
const text = await this.callMcpTool('domains_check_availability', {
|
|
181
|
+
domains: fullDomain,
|
|
182
|
+
});
|
|
183
|
+
const parsed = parseAvailabilityResponse(text, fullDomain);
|
|
184
|
+
return this.createResult(domain, tld, {
|
|
185
|
+
available: parsed.available,
|
|
186
|
+
premium: parsed.premium,
|
|
187
|
+
price_first_year: null, // GoDaddy MCP doesn't provide pricing
|
|
188
|
+
price_renewal: null,
|
|
189
|
+
privacy_included: false, // Unknown
|
|
190
|
+
source: 'godaddy_api',
|
|
191
|
+
premium_reason: parsed.premium
|
|
192
|
+
? 'Premium domain (GoDaddy)'
|
|
193
|
+
: parsed.auction
|
|
194
|
+
? 'Auction domain (GoDaddy)'
|
|
195
|
+
: undefined,
|
|
196
|
+
});
|
|
197
|
+
}, `check ${fullDomain}`);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Bulk check multiple domains at once.
|
|
201
|
+
* GoDaddy MCP supports up to 1000 domains per request!
|
|
202
|
+
*/
|
|
203
|
+
async bulkSearch(domains) {
|
|
204
|
+
const results = new Map();
|
|
205
|
+
// GoDaddy accepts comma-separated domains
|
|
206
|
+
const domainList = domains.join(', ');
|
|
207
|
+
const text = await this.callMcpTool('domains_check_availability', {
|
|
208
|
+
domains: domainList,
|
|
209
|
+
});
|
|
210
|
+
// Parse results for each domain
|
|
211
|
+
for (const domain of domains) {
|
|
212
|
+
const parsed = parseAvailabilityResponse(text, domain);
|
|
213
|
+
results.set(domain.toLowerCase(), parsed);
|
|
214
|
+
}
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get TLD info - not supported by GoDaddy MCP.
|
|
219
|
+
*/
|
|
220
|
+
async getTldInfo(_tld) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Call a GoDaddy MCP tool via JSON-RPC.
|
|
225
|
+
*/
|
|
226
|
+
async callMcpTool(toolName, args) {
|
|
227
|
+
const requestId = jsonRpcId++;
|
|
228
|
+
const payload = {
|
|
229
|
+
jsonrpc: '2.0',
|
|
230
|
+
method: 'tools/call',
|
|
231
|
+
params: {
|
|
232
|
+
name: toolName,
|
|
233
|
+
arguments: args,
|
|
234
|
+
},
|
|
235
|
+
id: requestId,
|
|
236
|
+
};
|
|
237
|
+
logger_js_1.logger.debug('GoDaddy MCP request', {
|
|
238
|
+
tool: toolName,
|
|
239
|
+
args,
|
|
240
|
+
request_id: requestId,
|
|
241
|
+
});
|
|
242
|
+
try {
|
|
243
|
+
const response = await this.withTimeout(fetch(GODADDY_MCP_ENDPOINT, {
|
|
244
|
+
method: 'POST',
|
|
245
|
+
headers: {
|
|
246
|
+
'Content-Type': 'application/json',
|
|
247
|
+
'Accept': 'application/json, text/event-stream',
|
|
248
|
+
},
|
|
249
|
+
body: JSON.stringify(payload),
|
|
250
|
+
}), `GoDaddy MCP ${toolName}`, 15000);
|
|
251
|
+
if (!response.ok) {
|
|
252
|
+
throw new errors_js_1.RegistrarApiError('GoDaddy MCP', `HTTP ${response.status}: ${response.statusText}`);
|
|
253
|
+
}
|
|
254
|
+
// Response is SSE format: "event: message\ndata: {...}"
|
|
255
|
+
const rawText = await response.text();
|
|
256
|
+
// Extract JSON from SSE format
|
|
257
|
+
const dataMatch = rawText.match(/data:\s*(\{.*\})/s);
|
|
258
|
+
if (!dataMatch) {
|
|
259
|
+
throw new errors_js_1.RegistrarApiError('GoDaddy MCP', 'Invalid response format - expected SSE');
|
|
260
|
+
}
|
|
261
|
+
const jsonStr = dataMatch[1];
|
|
262
|
+
const parsed = JSON.parse(jsonStr);
|
|
263
|
+
// Validate response
|
|
264
|
+
const validated = McpResponseSchema.parse(parsed);
|
|
265
|
+
if (validated.error) {
|
|
266
|
+
throw new errors_js_1.RegistrarApiError('GoDaddy MCP', `RPC Error ${validated.error.code}: ${validated.error.message}`);
|
|
267
|
+
}
|
|
268
|
+
if (!validated.result || validated.result.isError) {
|
|
269
|
+
throw new errors_js_1.RegistrarApiError('GoDaddy MCP', 'Tool call returned error');
|
|
270
|
+
}
|
|
271
|
+
// Extract text content
|
|
272
|
+
const textContent = validated.result.content.find(c => c.type === 'text');
|
|
273
|
+
if (!textContent) {
|
|
274
|
+
throw new errors_js_1.RegistrarApiError('GoDaddy MCP', 'No text content in response');
|
|
275
|
+
}
|
|
276
|
+
logger_js_1.logger.debug('GoDaddy MCP response', {
|
|
277
|
+
request_id: requestId,
|
|
278
|
+
text_length: textContent.text.length,
|
|
279
|
+
});
|
|
280
|
+
return textContent.text;
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
if (error instanceof errors_js_1.RegistrarApiError) {
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
286
|
+
if (error instanceof Error) {
|
|
287
|
+
if (error.name === 'AbortError' || error.message.includes('timeout')) {
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
throw new errors_js_1.RegistrarApiError('GoDaddy MCP', error.message);
|
|
291
|
+
}
|
|
292
|
+
throw new errors_js_1.RegistrarApiError('GoDaddy MCP', 'Unknown network error');
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
exports.GodaddyMcpAdapter = GodaddyMcpAdapter;
|
|
297
|
+
/**
|
|
298
|
+
* Singleton instance.
|
|
299
|
+
*/
|
|
300
|
+
exports.godaddyMcpAdapter = new GodaddyMcpAdapter();
|
|
301
|
+
//# sourceMappingURL=godaddy-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"godaddy-mcp.js","sourceRoot":"","sources":["../../src/registrars/godaddy-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,5 @@
|
|
|
4
4
|
export { RegistrarAdapter } from './base.js';
|
|
5
5
|
export { PorkbunAdapter, porkbunAdapter } from './porkbun.js';
|
|
6
6
|
export { NamecheapAdapter, namecheapAdapter } from './namecheap.js';
|
|
7
|
+
export { GodaddyMcpAdapter, godaddyMcpAdapter } from './godaddy-mcp.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registrars/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registrars/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/registrars/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Registrar Exports.
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.namecheapAdapter = exports.NamecheapAdapter = exports.porkbunAdapter = exports.PorkbunAdapter = exports.RegistrarAdapter = void 0;
|
|
6
|
+
exports.godaddyMcpAdapter = exports.GodaddyMcpAdapter = exports.namecheapAdapter = exports.NamecheapAdapter = exports.porkbunAdapter = exports.PorkbunAdapter = exports.RegistrarAdapter = void 0;
|
|
7
7
|
var base_js_1 = require("./base.js");
|
|
8
8
|
Object.defineProperty(exports, "RegistrarAdapter", { enumerable: true, get: function () { return base_js_1.RegistrarAdapter; } });
|
|
9
9
|
var porkbun_js_1 = require("./porkbun.js");
|
|
@@ -12,4 +12,7 @@ Object.defineProperty(exports, "porkbunAdapter", { enumerable: true, get: functi
|
|
|
12
12
|
var namecheap_js_1 = require("./namecheap.js");
|
|
13
13
|
Object.defineProperty(exports, "NamecheapAdapter", { enumerable: true, get: function () { return namecheap_js_1.NamecheapAdapter; } });
|
|
14
14
|
Object.defineProperty(exports, "namecheapAdapter", { enumerable: true, get: function () { return namecheap_js_1.namecheapAdapter; } });
|
|
15
|
+
var godaddy_mcp_js_1 = require("./godaddy-mcp.js");
|
|
16
|
+
Object.defineProperty(exports, "GodaddyMcpAdapter", { enumerable: true, get: function () { return godaddy_mcp_js_1.GodaddyMcpAdapter; } });
|
|
17
|
+
Object.defineProperty(exports, "godaddyMcpAdapter", { enumerable: true, get: function () { return godaddy_mcp_js_1.godaddyMcpAdapter; } });
|
|
15
18
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registrars/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA;AACzB,2CAA8D;AAArD,4GAAA,cAAc,OAAA;AAAE,4GAAA,cAAc,OAAA;AACvC,+CAAoE;AAA3D,gHAAA,gBAAgB,OAAA;AAAE,gHAAA,gBAAgB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registrars/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA;AACzB,2CAA8D;AAArD,4GAAA,cAAc,OAAA;AAAE,4GAAA,cAAc,OAAA;AACvC,+CAAoE;AAA3D,gHAAA,gBAAgB,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAC3C,mDAAwE;AAA/D,mHAAA,iBAAiB,OAAA;AAAE,mHAAA,iBAAiB,OAAA"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Domain Search Service.
|
|
3
3
|
*
|
|
4
4
|
* Orchestrates domain availability checks across multiple sources:
|
|
5
|
-
* 1. Porkbun (primary, if configured)
|
|
6
|
-
* 2. Namecheap (secondary, if configured)
|
|
7
|
-
* 3.
|
|
8
|
-
* 4.
|
|
5
|
+
* 1. Porkbun (primary, if configured - has pricing)
|
|
6
|
+
* 2. Namecheap (secondary, if configured - has pricing)
|
|
7
|
+
* 3. GoDaddy MCP (always available - no auth, no pricing, great availability data)
|
|
8
|
+
* 4. RDAP (fallback, always available)
|
|
9
|
+
* 5. WHOIS (last resort, always available)
|
|
9
10
|
*
|
|
10
11
|
* Handles:
|
|
11
12
|
* - Smart source selection based on availability and configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-search.d.ts","sourceRoot":"","sources":["../../src/services/domain-search.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"domain-search.d.ts","sourceRoot":"","sources":["../../src/services/domain-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAyB5E;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAM,EAAyB,EACrC,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,cAAc,CAAC,CAiEzB;AAsVD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,GAAE,MAAc,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,GAAE,MAAU,GACxB,OAAO,CAAC,YAAY,EAAE,CAAC,CA4CzB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,MAAM,EAA6B,GAC9C,OAAO,CAAC;IACT,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,eAAe,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,YAAY,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC,CA4DD"}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
* Domain Search Service.
|
|
4
4
|
*
|
|
5
5
|
* Orchestrates domain availability checks across multiple sources:
|
|
6
|
-
* 1. Porkbun (primary, if configured)
|
|
7
|
-
* 2. Namecheap (secondary, if configured)
|
|
8
|
-
* 3.
|
|
9
|
-
* 4.
|
|
6
|
+
* 1. Porkbun (primary, if configured - has pricing)
|
|
7
|
+
* 2. Namecheap (secondary, if configured - has pricing)
|
|
8
|
+
* 3. GoDaddy MCP (always available - no auth, no pricing, great availability data)
|
|
9
|
+
* 4. RDAP (fallback, always available)
|
|
10
|
+
* 5. WHOIS (last resort, always available)
|
|
10
11
|
*
|
|
11
12
|
* Handles:
|
|
12
13
|
* - Smart source selection based on availability and configuration
|
|
@@ -94,7 +95,7 @@ async function searchSingleDomain(domain, tld, preferredRegistrars) {
|
|
|
94
95
|
const fullDomain = (0, validators_js_1.buildDomain)(domain, tld);
|
|
95
96
|
const triedSources = [];
|
|
96
97
|
// Check cache first
|
|
97
|
-
for (const source of ['porkbun', 'namecheap', 'rdap', 'whois']) {
|
|
98
|
+
for (const source of ['porkbun', 'namecheap', 'godaddy', 'rdap', 'whois']) {
|
|
98
99
|
const cacheKey = (0, cache_js_1.domainCacheKey)(fullDomain, source);
|
|
99
100
|
const cached = cache_js_1.domainCache.get(cacheKey);
|
|
100
101
|
if (cached) {
|
|
@@ -144,6 +145,14 @@ async function searchSingleDomain(domain, tld, preferredRegistrars) {
|
|
|
144
145
|
}
|
|
145
146
|
/**
|
|
146
147
|
* Build the priority list of sources to try.
|
|
148
|
+
*
|
|
149
|
+
* Priority order:
|
|
150
|
+
* 1. Preferred registrars (if specified)
|
|
151
|
+
* 2. Porkbun (has pricing, best API)
|
|
152
|
+
* 3. Namecheap (has pricing)
|
|
153
|
+
* 4. GoDaddy MCP (free, no pricing but good availability data)
|
|
154
|
+
* 5. RDAP (free, no pricing)
|
|
155
|
+
* 6. WHOIS (slowest fallback)
|
|
147
156
|
*/
|
|
148
157
|
function buildSourcePriority(tld, preferredRegistrars) {
|
|
149
158
|
const sources = [];
|
|
@@ -156,23 +165,28 @@ function buildSourcePriority(tld, preferredRegistrars) {
|
|
|
156
165
|
else if (registrar === 'namecheap' && config_js_1.config.namecheap.enabled) {
|
|
157
166
|
sources.push('namecheap');
|
|
158
167
|
}
|
|
168
|
+
else if (registrar === 'godaddy') {
|
|
169
|
+
sources.push('godaddy');
|
|
170
|
+
}
|
|
159
171
|
}
|
|
160
172
|
}
|
|
161
173
|
else {
|
|
162
|
-
// Default priority: Porkbun first (
|
|
174
|
+
// Default priority: Porkbun first (best API with pricing), then Namecheap, then GoDaddy
|
|
163
175
|
if (config_js_1.config.porkbun.enabled)
|
|
164
176
|
sources.push('porkbun');
|
|
165
177
|
if (config_js_1.config.namecheap.enabled)
|
|
166
178
|
sources.push('namecheap');
|
|
179
|
+
// GoDaddy MCP is always available (no auth needed)
|
|
180
|
+
sources.push('godaddy');
|
|
167
181
|
}
|
|
168
182
|
// Always add fallbacks
|
|
169
183
|
if ((0, rdap_js_1.isRdapAvailable)(tld))
|
|
170
184
|
sources.push('rdap');
|
|
171
185
|
if ((0, whois_js_1.isWhoisAvailable)(tld))
|
|
172
186
|
sources.push('whois');
|
|
173
|
-
// If no registrar APIs, RDAP should be first
|
|
187
|
+
// If no registrar APIs, GoDaddy MCP and RDAP should be first
|
|
174
188
|
if (sources.length === 0) {
|
|
175
|
-
sources.push('rdap', 'whois');
|
|
189
|
+
sources.push('godaddy', 'rdap', 'whois');
|
|
176
190
|
}
|
|
177
191
|
return sources;
|
|
178
192
|
}
|
|
@@ -185,6 +199,8 @@ async function trySource(domain, tld, source) {
|
|
|
185
199
|
return index_js_1.porkbunAdapter.search(domain, tld);
|
|
186
200
|
case 'namecheap':
|
|
187
201
|
return index_js_1.namecheapAdapter.search(domain, tld);
|
|
202
|
+
case 'godaddy':
|
|
203
|
+
return index_js_1.godaddyMcpAdapter.search(domain, tld);
|
|
188
204
|
case 'rdap':
|
|
189
205
|
return (0, rdap_js_1.checkRdap)(domain, tld);
|
|
190
206
|
case 'whois':
|