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,299 @@
1
+ "use strict";
2
+ /**
3
+ * Porkbun Registrar Adapter.
4
+ *
5
+ * Porkbun offers competitive pricing and a JSON API.
6
+ * API Docs: https://porkbun.com/api/json/v3/documentation
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.porkbunAdapter = exports.PorkbunAdapter = void 0;
13
+ const axios_1 = __importDefault(require("axios"));
14
+ const zod_1 = require("zod");
15
+ const base_js_1 = require("./base.js");
16
+ const config_js_1 = require("../config.js");
17
+ const logger_js_1 = require("../utils/logger.js");
18
+ const errors_js_1 = require("../utils/errors.js");
19
+ const PORKBUN_API_BASE = 'https://api.porkbun.com/api/json/v3';
20
+ // ═══════════════════════════════════════════════════════════════════════════
21
+ // Zod Schemas for API Response Validation
22
+ // SECURITY: Validate all external API responses to prevent unexpected data
23
+ // ═══════════════════════════════════════════════════════════════════════════
24
+ /**
25
+ * Base response schema - all Porkbun responses have this structure.
26
+ */
27
+ const PorkbunBaseResponseSchema = zod_1.z.object({
28
+ status: zod_1.z.enum(['SUCCESS', 'ERROR']),
29
+ message: zod_1.z.string().optional(),
30
+ });
31
+ /**
32
+ * Domain availability check response schema.
33
+ */
34
+ const PorkbunCheckResponseSchema = PorkbunBaseResponseSchema.extend({
35
+ avail: zod_1.z.number().optional(), // 1 = available, 0 = taken
36
+ premium: zod_1.z.number().optional(), // 1 = premium
37
+ yourPrice: zod_1.z.string().optional(),
38
+ retailPrice: zod_1.z.string().optional(),
39
+ });
40
+ /**
41
+ * Pricing response schema for a single TLD.
42
+ */
43
+ const PorkbunTldPricingSchema = zod_1.z.object({
44
+ registration: zod_1.z.string(),
45
+ renewal: zod_1.z.string(),
46
+ transfer: zod_1.z.string(),
47
+ coupons: zod_1.z.object({
48
+ registration: zod_1.z.object({
49
+ code: zod_1.z.string(),
50
+ max_per_user: zod_1.z.number(),
51
+ first_year_only: zod_1.z.string(),
52
+ type: zod_1.z.string(),
53
+ amount: zod_1.z.number(),
54
+ }).optional(),
55
+ }).optional(),
56
+ });
57
+ /**
58
+ * Full pricing response schema.
59
+ */
60
+ const PorkbunPricingResponseSchema = PorkbunBaseResponseSchema.extend({
61
+ pricing: zod_1.z.record(zod_1.z.string(), PorkbunTldPricingSchema).optional(),
62
+ });
63
+ /**
64
+ * Porkbun adapter implementation.
65
+ */
66
+ class PorkbunAdapter extends base_js_1.RegistrarAdapter {
67
+ name = 'Porkbun';
68
+ id = 'porkbun';
69
+ client;
70
+ apiKey;
71
+ apiSecret;
72
+ pricingCache = {};
73
+ constructor() {
74
+ // Porkbun has generous rate limits, ~60/min is safe
75
+ super(60);
76
+ this.apiKey = config_js_1.config.porkbun.apiKey;
77
+ this.apiSecret = config_js_1.config.porkbun.apiSecret;
78
+ this.client = axios_1.default.create({
79
+ baseURL: PORKBUN_API_BASE,
80
+ timeout: this.timeoutMs,
81
+ headers: {
82
+ 'Content-Type': 'application/json',
83
+ },
84
+ });
85
+ }
86
+ /**
87
+ * Check if Porkbun API is enabled.
88
+ */
89
+ isEnabled() {
90
+ return config_js_1.config.porkbun.enabled;
91
+ }
92
+ /**
93
+ * Search for domain availability.
94
+ */
95
+ async search(domain, tld) {
96
+ if (!this.isEnabled()) {
97
+ throw new errors_js_1.AuthenticationError('porkbun', 'API credentials not configured');
98
+ }
99
+ const fullDomain = `${domain}.${tld}`;
100
+ logger_js_1.logger.debug('Porkbun search', { domain: fullDomain });
101
+ try {
102
+ // First, try to get pricing (this is cached)
103
+ const pricing = await this.getPricing(tld);
104
+ // Then check availability
105
+ const availability = await this.checkAvailability(domain, tld);
106
+ return this.createResult(domain, tld, {
107
+ available: availability.available,
108
+ premium: availability.premium,
109
+ price_first_year: availability.price ?? pricing?.registration ?? null,
110
+ price_renewal: pricing?.renewal ?? null,
111
+ transfer_price: pricing?.transfer ?? null,
112
+ privacy_included: true, // Porkbun includes WHOIS privacy
113
+ source: 'porkbun_api',
114
+ premium_reason: availability.premium ? 'Premium domain' : undefined,
115
+ });
116
+ }
117
+ catch (error) {
118
+ this.handleApiError(error, fullDomain);
119
+ throw error; // Re-throw if not handled
120
+ }
121
+ }
122
+ /**
123
+ * Check domain availability.
124
+ * SECURITY: Validates API response with Zod schema.
125
+ */
126
+ async checkAvailability(domain, tld) {
127
+ const result = await this.retryWithBackoff(async () => {
128
+ const response = await this.client.post('/domain/check', {
129
+ apikey: this.apiKey,
130
+ secretapikey: this.apiSecret,
131
+ domain: `${domain}.${tld}`,
132
+ });
133
+ // Validate response with Zod schema
134
+ const parseResult = PorkbunCheckResponseSchema.safeParse(response.data);
135
+ if (!parseResult.success) {
136
+ logger_js_1.logger.warn('Porkbun API response validation failed', {
137
+ domain: `${domain}.${tld}`,
138
+ errors: parseResult.error.errors,
139
+ });
140
+ throw new errors_js_1.RegistrarApiError(this.name, 'Invalid API response format');
141
+ }
142
+ const validated = parseResult.data;
143
+ if (validated.status !== 'SUCCESS') {
144
+ throw new errors_js_1.RegistrarApiError(this.name, validated.message || 'Unknown error');
145
+ }
146
+ return validated;
147
+ }, `check ${domain}.${tld}`);
148
+ return {
149
+ available: result.avail === 1,
150
+ premium: result.premium === 1,
151
+ price: result.yourPrice ? parseFloat(result.yourPrice) : undefined,
152
+ };
153
+ }
154
+ /**
155
+ * Get pricing for a TLD.
156
+ * SECURITY: Validates API response with Zod schema.
157
+ */
158
+ async getPricing(tld) {
159
+ // Check cache first
160
+ if (this.pricingCache[tld]) {
161
+ return this.pricingCache[tld];
162
+ }
163
+ try {
164
+ const result = await this.retryWithBackoff(async () => {
165
+ const response = await this.client.post('/pricing/get', {
166
+ apikey: this.apiKey,
167
+ secretapikey: this.apiSecret,
168
+ });
169
+ // Validate response with Zod schema
170
+ const parseResult = PorkbunPricingResponseSchema.safeParse(response.data);
171
+ if (!parseResult.success) {
172
+ logger_js_1.logger.warn('Porkbun pricing API response validation failed', {
173
+ errors: parseResult.error.errors,
174
+ });
175
+ throw new errors_js_1.RegistrarApiError(this.name, 'Invalid pricing API response format');
176
+ }
177
+ const validated = parseResult.data;
178
+ if (validated.status !== 'SUCCESS') {
179
+ throw new errors_js_1.RegistrarApiError(this.name, validated.message || 'Failed to get pricing');
180
+ }
181
+ return validated.pricing;
182
+ }, 'get pricing');
183
+ if (result) {
184
+ // Cache all TLD pricing
185
+ for (const [tldKey, prices] of Object.entries(result)) {
186
+ this.pricingCache[tldKey] = {
187
+ registration: parseFloat(prices.registration),
188
+ renewal: parseFloat(prices.renewal),
189
+ transfer: parseFloat(prices.transfer),
190
+ };
191
+ }
192
+ }
193
+ return this.pricingCache[tld] || null;
194
+ }
195
+ catch (error) {
196
+ logger_js_1.logger.warn('Failed to get Porkbun pricing', {
197
+ tld,
198
+ error: error instanceof Error ? error.message : String(error),
199
+ });
200
+ return null;
201
+ }
202
+ }
203
+ /**
204
+ * Get TLD information.
205
+ */
206
+ async getTldInfo(tld) {
207
+ const pricing = await this.getPricing(tld);
208
+ if (!pricing)
209
+ return null;
210
+ return {
211
+ tld,
212
+ description: `${tld.toUpperCase()} domain`,
213
+ typical_use: this.getTldUseCase(tld),
214
+ price_range: {
215
+ min: pricing.registration,
216
+ max: pricing.registration,
217
+ currency: 'USD',
218
+ },
219
+ renewal_price_typical: pricing.renewal,
220
+ restrictions: [],
221
+ popularity: this.getTldPopularity(tld),
222
+ category: this.getTldCategory(tld),
223
+ };
224
+ }
225
+ /**
226
+ * Handle API errors with user-friendly messages.
227
+ */
228
+ handleApiError(error, domain) {
229
+ if (axios_1.default.isAxiosError(error)) {
230
+ const axiosError = error;
231
+ if (axiosError.response) {
232
+ const status = axiosError.response.status;
233
+ const message = axiosError.response.data?.message || axiosError.message;
234
+ if (status === 401 || status === 403) {
235
+ throw new errors_js_1.AuthenticationError('porkbun', message);
236
+ }
237
+ if (status === 429) {
238
+ const retryAfter = axiosError.response.headers['retry-after'];
239
+ throw new errors_js_1.RateLimitError('porkbun', retryAfter ? parseInt(retryAfter, 10) : undefined);
240
+ }
241
+ throw new errors_js_1.RegistrarApiError(this.name, message, status, error);
242
+ }
243
+ if (axiosError.code === 'ECONNABORTED') {
244
+ throw new errors_js_1.RegistrarApiError(this.name, `Request timed out for ${domain}`, undefined, error);
245
+ }
246
+ }
247
+ throw new errors_js_1.RegistrarApiError(this.name, error instanceof Error ? error.message : 'Unknown error', undefined, error instanceof Error ? error : undefined);
248
+ }
249
+ /**
250
+ * Get typical use case for a TLD.
251
+ */
252
+ getTldUseCase(tld) {
253
+ const useCases = {
254
+ com: 'General commercial websites',
255
+ io: 'Tech startups and SaaS products',
256
+ dev: 'Developer tools and portfolios',
257
+ app: 'Mobile and web applications',
258
+ co: 'Companies and startups',
259
+ net: 'Network services and utilities',
260
+ org: 'Non-profit organizations',
261
+ ai: 'AI and machine learning projects',
262
+ xyz: 'Creative and unconventional projects',
263
+ };
264
+ return useCases[tld] || 'General purpose';
265
+ }
266
+ /**
267
+ * Get TLD popularity rating.
268
+ */
269
+ getTldPopularity(tld) {
270
+ const highPopularity = ['com', 'net', 'org', 'io', 'co'];
271
+ const mediumPopularity = ['dev', 'app', 'ai', 'me'];
272
+ if (highPopularity.includes(tld))
273
+ return 'high';
274
+ if (mediumPopularity.includes(tld))
275
+ return 'medium';
276
+ return 'low';
277
+ }
278
+ /**
279
+ * Get TLD category.
280
+ */
281
+ getTldCategory(tld) {
282
+ const countryTlds = ['uk', 'de', 'fr', 'jp', 'cn', 'au', 'ca', 'us'];
283
+ const sponsoredTlds = ['edu', 'gov', 'mil'];
284
+ const newTlds = ['io', 'dev', 'app', 'ai', 'xyz', 'tech', 'cloud'];
285
+ if (countryTlds.includes(tld))
286
+ return 'country';
287
+ if (sponsoredTlds.includes(tld))
288
+ return 'sponsored';
289
+ if (newTlds.includes(tld))
290
+ return 'new';
291
+ return 'generic';
292
+ }
293
+ }
294
+ exports.PorkbunAdapter = PorkbunAdapter;
295
+ /**
296
+ * Singleton instance.
297
+ */
298
+ exports.porkbunAdapter = new PorkbunAdapter();
299
+ //# sourceMappingURL=porkbun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"porkbun.js","sourceRoot":"","sources":["../../src/registrars/porkbun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Domain Search MCP Server.
4
+ *
5
+ * Model Context Protocol server for domain availability search.
6
+ * Supports Porkbun, Namecheap, RDAP, and WHOIS as data sources.
7
+ *
8
+ * Features:
9
+ * - search_domain: Check availability across multiple TLDs
10
+ * - bulk_search: Check many domains at once
11
+ * - compare_registrars: Compare pricing across registrars
12
+ * - suggest_domains: Generate available name variations
13
+ * - tld_info: Get TLD information and recommendations
14
+ * - check_socials: Check social handle availability
15
+ *
16
+ * @see https://github.com/yourusername/domain-search-mcp
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
package/dist/server.js ADDED
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Domain Search MCP Server.
5
+ *
6
+ * Model Context Protocol server for domain availability search.
7
+ * Supports Porkbun, Namecheap, RDAP, and WHOIS as data sources.
8
+ *
9
+ * Features:
10
+ * - search_domain: Check availability across multiple TLDs
11
+ * - bulk_search: Check many domains at once
12
+ * - compare_registrars: Compare pricing across registrars
13
+ * - suggest_domains: Generate available name variations
14
+ * - tld_info: Get TLD information and recommendations
15
+ * - check_socials: Check social handle availability
16
+ *
17
+ * @see https://github.com/yourusername/domain-search-mcp
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
21
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
22
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
23
+ const config_js_1 = require("./config.js");
24
+ const logger_js_1 = require("./utils/logger.js");
25
+ const errors_js_1 = require("./utils/errors.js");
26
+ const index_js_2 = require("./tools/index.js");
27
+ // ═══════════════════════════════════════════════════════════════════════════
28
+ // Server Configuration
29
+ // ═══════════════════════════════════════════════════════════════════════════
30
+ const SERVER_NAME = 'domain-search-mcp';
31
+ const SERVER_VERSION = '1.0.0';
32
+ /**
33
+ * All available tools.
34
+ */
35
+ const TOOLS = [
36
+ index_js_2.searchDomainTool,
37
+ index_js_2.bulkSearchTool,
38
+ index_js_2.compareRegistrarsTool,
39
+ index_js_2.suggestDomainsTool,
40
+ index_js_2.tldInfoTool,
41
+ index_js_2.checkSocialsTool,
42
+ ];
43
+ // ═══════════════════════════════════════════════════════════════════════════
44
+ // Server Implementation
45
+ // ═══════════════════════════════════════════════════════════════════════════
46
+ /**
47
+ * Create and configure the MCP server.
48
+ */
49
+ function createServer() {
50
+ const server = new index_js_1.Server({
51
+ name: SERVER_NAME,
52
+ version: SERVER_VERSION,
53
+ }, {
54
+ capabilities: {
55
+ tools: {},
56
+ },
57
+ });
58
+ // Register tool listing handler
59
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
60
+ return { tools: TOOLS };
61
+ });
62
+ // Register tool call handler
63
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
64
+ const { name, arguments: args } = request.params;
65
+ const requestId = (0, logger_js_1.generateRequestId)();
66
+ try {
67
+ (0, logger_js_1.setRequestId)(requestId);
68
+ logger_js_1.logger.info('Tool call started', { tool: name, request_id: requestId });
69
+ const result = await executeToolCall(name, args || {});
70
+ logger_js_1.logger.info('Tool call completed', {
71
+ tool: name,
72
+ request_id: requestId,
73
+ });
74
+ return {
75
+ content: [
76
+ {
77
+ type: 'text',
78
+ text: JSON.stringify(result, null, 2),
79
+ },
80
+ ],
81
+ };
82
+ }
83
+ catch (error) {
84
+ const wrapped = (0, errors_js_1.wrapError)(error);
85
+ logger_js_1.logger.error('Tool call failed', {
86
+ tool: name,
87
+ request_id: requestId,
88
+ error: wrapped.message,
89
+ code: wrapped.code,
90
+ });
91
+ // Return error as content (MCP pattern)
92
+ return {
93
+ content: [
94
+ {
95
+ type: 'text',
96
+ text: JSON.stringify({
97
+ error: true,
98
+ code: wrapped.code,
99
+ message: wrapped.userMessage,
100
+ retryable: wrapped.retryable,
101
+ suggestedAction: wrapped.suggestedAction,
102
+ }, null, 2),
103
+ },
104
+ ],
105
+ isError: true,
106
+ };
107
+ }
108
+ finally {
109
+ (0, logger_js_1.clearRequestId)();
110
+ }
111
+ });
112
+ return server;
113
+ }
114
+ /**
115
+ * Execute a tool call by name.
116
+ */
117
+ async function executeToolCall(name, args) {
118
+ switch (name) {
119
+ case 'search_domain':
120
+ return (0, index_js_2.executeSearchDomain)({
121
+ domain_name: args.domain_name,
122
+ tlds: args.tlds,
123
+ registrars: args.registrars,
124
+ });
125
+ case 'bulk_search':
126
+ return (0, index_js_2.executeBulkSearch)({
127
+ domains: args.domains,
128
+ tld: args.tld || 'com',
129
+ registrar: args.registrar,
130
+ });
131
+ case 'compare_registrars':
132
+ return (0, index_js_2.executeCompareRegistrars)({
133
+ domain: args.domain,
134
+ tld: args.tld,
135
+ registrars: args.registrars,
136
+ });
137
+ case 'suggest_domains':
138
+ return (0, index_js_2.executeSuggestDomains)({
139
+ base_name: args.base_name,
140
+ tld: args.tld || 'com',
141
+ variants: args.variants,
142
+ max_suggestions: args.max_suggestions || 10,
143
+ });
144
+ case 'tld_info':
145
+ return (0, index_js_2.executeTldInfo)({
146
+ tld: args.tld,
147
+ detailed: args.detailed || false,
148
+ });
149
+ case 'check_socials':
150
+ return (0, index_js_2.executeCheckSocials)({
151
+ name: args.name,
152
+ platforms: args.platforms,
153
+ });
154
+ default:
155
+ throw new errors_js_1.DomainSearchError('UNKNOWN_TOOL', `Unknown tool: ${name}`, `The tool "${name}" is not available.`, {
156
+ retryable: false,
157
+ suggestedAction: `Available tools: ${TOOLS.map((t) => t.name).join(', ')}`,
158
+ });
159
+ }
160
+ }
161
+ // ═══════════════════════════════════════════════════════════════════════════
162
+ // Startup
163
+ // ═══════════════════════════════════════════════════════════════════════════
164
+ /**
165
+ * Main entry point.
166
+ */
167
+ async function main() {
168
+ // Log startup info
169
+ logger_js_1.logger.info('Domain Search MCP starting', {
170
+ version: SERVER_VERSION,
171
+ node_version: process.version,
172
+ sources: (0, config_js_1.getAvailableSources)(),
173
+ has_registrar_api: (0, config_js_1.hasRegistrarApi)(),
174
+ dry_run: config_js_1.config.dryRun,
175
+ });
176
+ // Warn if no API keys configured
177
+ if (!(0, config_js_1.hasRegistrarApi)()) {
178
+ logger_js_1.logger.warn('No registrar API keys configured. Falling back to RDAP/WHOIS only.');
179
+ logger_js_1.logger.warn('For pricing info, add PORKBUN_API_KEY and PORKBUN_API_SECRET to your .env file.');
180
+ }
181
+ // Create and start server
182
+ const server = createServer();
183
+ const transport = new stdio_js_1.StdioServerTransport();
184
+ await server.connect(transport);
185
+ logger_js_1.logger.info('Domain Search MCP ready', {
186
+ tools: TOOLS.length,
187
+ transport: 'stdio',
188
+ });
189
+ // Handle graceful shutdown
190
+ process.on('SIGINT', async () => {
191
+ logger_js_1.logger.info('Shutting down...');
192
+ await server.close();
193
+ process.exit(0);
194
+ });
195
+ process.on('SIGTERM', async () => {
196
+ logger_js_1.logger.info('Shutting down...');
197
+ await server.close();
198
+ process.exit(0);
199
+ });
200
+ }
201
+ // Run the server
202
+ main().catch((error) => {
203
+ logger_js_1.logger.error('Failed to start server', {
204
+ error: error instanceof Error ? error.message : String(error),
205
+ stack: error instanceof Error ? error.stack : undefined,
206
+ });
207
+ process.exit(1);
208
+ });
209
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Domain Search Service.
3
+ *
4
+ * Orchestrates domain availability checks across multiple sources:
5
+ * 1. Porkbun (primary, if configured)
6
+ * 2. Namecheap (secondary, if configured)
7
+ * 3. RDAP (fallback, always available)
8
+ * 4. WHOIS (last resort, always available)
9
+ *
10
+ * Handles:
11
+ * - Smart source selection based on availability and configuration
12
+ * - Graceful fallback on failures
13
+ * - Caching for performance
14
+ * - Insights generation for vibecoding UX
15
+ */
16
+ import type { DomainResult, SearchResponse } from '../types.js';
17
+ /**
18
+ * Search for domain availability across multiple TLDs.
19
+ */
20
+ export declare function searchDomain(domainName: string, tlds?: string[], preferredRegistrars?: string[]): Promise<SearchResponse>;
21
+ /**
22
+ * Bulk search for multiple domains.
23
+ */
24
+ export declare function bulkSearchDomains(domains: string[], tld?: string, registrar?: string, maxConcurrent?: number): Promise<DomainResult[]>;
25
+ /**
26
+ * Compare pricing across registrars.
27
+ */
28
+ export declare function compareRegistrars(domain: string, tld: string, registrars?: string[]): Promise<{
29
+ comparisons: DomainResult[];
30
+ best_first_year: {
31
+ registrar: string;
32
+ price: number;
33
+ } | null;
34
+ best_renewal: {
35
+ registrar: string;
36
+ price: number;
37
+ } | null;
38
+ recommendation: string;
39
+ }>;
40
+ //# sourceMappingURL=domain-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-search.d.ts","sourceRoot":"","sources":["../../src/services/domain-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;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;AAuUD;;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"}