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,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TTL-based In-Memory Cache.
|
|
4
|
+
*
|
|
5
|
+
* Simple but effective caching for domain availability and pricing.
|
|
6
|
+
* Reduces API calls and improves response times.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.tldCache = exports.pricingCache = exports.domainCache = exports.TtlCache = void 0;
|
|
10
|
+
exports.domainCacheKey = domainCacheKey;
|
|
11
|
+
exports.tldCacheKey = tldCacheKey;
|
|
12
|
+
exports.getOrCompute = getOrCompute;
|
|
13
|
+
const config_js_1 = require("../config.js");
|
|
14
|
+
const logger_js_1 = require("./logger.js");
|
|
15
|
+
/**
|
|
16
|
+
* Default maximum cache size to prevent memory exhaustion.
|
|
17
|
+
* With ~1KB per entry average, 10000 entries ≈ 10MB max.
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_MAX_CACHE_SIZE = 10000;
|
|
20
|
+
/**
|
|
21
|
+
* Generic TTL cache with automatic expiration and size limits.
|
|
22
|
+
*
|
|
23
|
+
* SECURITY: Implements max size to prevent memory DoS attacks.
|
|
24
|
+
* When at capacity, evicts least-recently-used (LRU) entries.
|
|
25
|
+
*/
|
|
26
|
+
class TtlCache {
|
|
27
|
+
cache = new Map();
|
|
28
|
+
defaultTtlMs;
|
|
29
|
+
maxSize;
|
|
30
|
+
cleanupInterval = null;
|
|
31
|
+
constructor(defaultTtlSeconds = 300, maxSize = DEFAULT_MAX_CACHE_SIZE) {
|
|
32
|
+
this.defaultTtlMs = defaultTtlSeconds * 1000;
|
|
33
|
+
this.maxSize = maxSize;
|
|
34
|
+
// Clean up expired entries every minute
|
|
35
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60000);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get a value from cache if it exists and hasn't expired.
|
|
39
|
+
* Updates lastAccessedAt for LRU tracking.
|
|
40
|
+
*/
|
|
41
|
+
get(key) {
|
|
42
|
+
const entry = this.cache.get(key);
|
|
43
|
+
if (!entry) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const now = Date.now();
|
|
47
|
+
// Check if expired
|
|
48
|
+
if (now > entry.expiresAt) {
|
|
49
|
+
this.cache.delete(key);
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
// Update last accessed time for LRU
|
|
53
|
+
entry.lastAccessedAt = now;
|
|
54
|
+
logger_js_1.logger.debug('Cache hit', { key, age_ms: now - entry.createdAt });
|
|
55
|
+
return entry.value;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Set a value in cache with optional custom TTL.
|
|
59
|
+
* Implements LRU eviction when cache is at capacity.
|
|
60
|
+
*/
|
|
61
|
+
set(key, value, ttlMs) {
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
const expiresAt = now + (ttlMs ?? this.defaultTtlMs);
|
|
64
|
+
// If key already exists, just update it
|
|
65
|
+
if (this.cache.has(key)) {
|
|
66
|
+
this.cache.set(key, {
|
|
67
|
+
value,
|
|
68
|
+
expiresAt,
|
|
69
|
+
createdAt: now,
|
|
70
|
+
lastAccessedAt: now,
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// If at capacity, evict least recently used entries
|
|
75
|
+
if (this.cache.size >= this.maxSize) {
|
|
76
|
+
this.evictLRU();
|
|
77
|
+
}
|
|
78
|
+
this.cache.set(key, {
|
|
79
|
+
value,
|
|
80
|
+
expiresAt,
|
|
81
|
+
createdAt: now,
|
|
82
|
+
lastAccessedAt: now,
|
|
83
|
+
});
|
|
84
|
+
logger_js_1.logger.debug('Cache set', {
|
|
85
|
+
key,
|
|
86
|
+
ttl_ms: expiresAt - now,
|
|
87
|
+
size: this.cache.size,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Evict least recently used entry.
|
|
92
|
+
* Called when cache is at capacity.
|
|
93
|
+
*/
|
|
94
|
+
evictLRU() {
|
|
95
|
+
let oldestKey = null;
|
|
96
|
+
let oldestTime = Infinity;
|
|
97
|
+
for (const [key, entry] of this.cache) {
|
|
98
|
+
if (entry.lastAccessedAt < oldestTime) {
|
|
99
|
+
oldestTime = entry.lastAccessedAt;
|
|
100
|
+
oldestKey = key;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (oldestKey) {
|
|
104
|
+
this.cache.delete(oldestKey);
|
|
105
|
+
logger_js_1.logger.debug('Cache LRU eviction', { evicted_key: oldestKey });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if a key exists and is not expired.
|
|
110
|
+
*/
|
|
111
|
+
has(key) {
|
|
112
|
+
const value = this.get(key);
|
|
113
|
+
return value !== undefined;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Delete a specific key.
|
|
117
|
+
*/
|
|
118
|
+
delete(key) {
|
|
119
|
+
return this.cache.delete(key);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Clear all cache entries.
|
|
123
|
+
*/
|
|
124
|
+
clear() {
|
|
125
|
+
this.cache.clear();
|
|
126
|
+
logger_js_1.logger.debug('Cache cleared');
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get the number of entries in cache.
|
|
130
|
+
*/
|
|
131
|
+
get size() {
|
|
132
|
+
return this.cache.size;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Remove expired entries.
|
|
136
|
+
*/
|
|
137
|
+
cleanup() {
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
let removed = 0;
|
|
140
|
+
for (const [key, entry] of this.cache) {
|
|
141
|
+
if (now > entry.expiresAt) {
|
|
142
|
+
this.cache.delete(key);
|
|
143
|
+
removed++;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (removed > 0) {
|
|
147
|
+
logger_js_1.logger.debug('Cache cleanup', { removed, remaining: this.cache.size });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Stop the cleanup interval (for testing/shutdown).
|
|
152
|
+
*/
|
|
153
|
+
destroy() {
|
|
154
|
+
if (this.cleanupInterval) {
|
|
155
|
+
clearInterval(this.cleanupInterval);
|
|
156
|
+
this.cleanupInterval = null;
|
|
157
|
+
}
|
|
158
|
+
this.cache.clear();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.TtlCache = TtlCache;
|
|
162
|
+
/**
|
|
163
|
+
* Generate a cache key for domain availability.
|
|
164
|
+
*/
|
|
165
|
+
function domainCacheKey(domain, source) {
|
|
166
|
+
return `domain:${domain.toLowerCase()}:${source}`;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Generate a cache key for TLD info.
|
|
170
|
+
*/
|
|
171
|
+
function tldCacheKey(tld) {
|
|
172
|
+
return `tld:${tld.toLowerCase()}`;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Global cache instances.
|
|
176
|
+
*/
|
|
177
|
+
exports.domainCache = new TtlCache(config_js_1.config.cache.availabilityTtl);
|
|
178
|
+
exports.pricingCache = new TtlCache(config_js_1.config.cache.pricingTtl);
|
|
179
|
+
exports.tldCache = new TtlCache(86400); // 24 hours for TLD info
|
|
180
|
+
/**
|
|
181
|
+
* Get or compute a domain result.
|
|
182
|
+
*/
|
|
183
|
+
async function getOrCompute(cache, key, compute, ttlMs) {
|
|
184
|
+
const cached = cache.get(key);
|
|
185
|
+
if (cached !== undefined) {
|
|
186
|
+
return { value: cached, fromCache: true };
|
|
187
|
+
}
|
|
188
|
+
const value = await compute();
|
|
189
|
+
cache.set(key, value, ttlMs);
|
|
190
|
+
return { value, fromCache: false };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Error Classes for Domain Search MCP.
|
|
3
|
+
*
|
|
4
|
+
* These errors are designed to be:
|
|
5
|
+
* 1. User-friendly (clear messages for non-developers)
|
|
6
|
+
* 2. Actionable (suggest what to do next)
|
|
7
|
+
* 3. Informative (include context for debugging)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Base error class for all domain search errors.
|
|
11
|
+
*/
|
|
12
|
+
export declare class DomainSearchError extends Error {
|
|
13
|
+
/** Machine-readable error code */
|
|
14
|
+
readonly code: string;
|
|
15
|
+
/** User-friendly message */
|
|
16
|
+
readonly userMessage: string;
|
|
17
|
+
/** Can this operation be retried? */
|
|
18
|
+
readonly retryable: boolean;
|
|
19
|
+
/** Suggested action for the user */
|
|
20
|
+
readonly suggestedAction?: string;
|
|
21
|
+
constructor(code: string, message: string, userMessage: string, options?: {
|
|
22
|
+
retryable?: boolean;
|
|
23
|
+
suggestedAction?: string;
|
|
24
|
+
cause?: Error;
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Convert to a plain object for JSON responses.
|
|
28
|
+
*/
|
|
29
|
+
toJSON(): object;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Error when a domain name is invalid.
|
|
33
|
+
*/
|
|
34
|
+
export declare class InvalidDomainError extends DomainSearchError {
|
|
35
|
+
constructor(domain: string, reason: string);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Error when a TLD is not supported.
|
|
39
|
+
*/
|
|
40
|
+
export declare class UnsupportedTldError extends DomainSearchError {
|
|
41
|
+
constructor(tld: string, availableTlds: string[]);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Error when an API rate limit is hit.
|
|
45
|
+
*/
|
|
46
|
+
export declare class RateLimitError extends DomainSearchError {
|
|
47
|
+
/** When to retry (Unix timestamp) */
|
|
48
|
+
readonly retryAfter?: number;
|
|
49
|
+
constructor(registrar: string, retryAfterSeconds?: number);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Error when a registrar API fails.
|
|
53
|
+
*/
|
|
54
|
+
export declare class RegistrarApiError extends DomainSearchError {
|
|
55
|
+
/** HTTP status code if available */
|
|
56
|
+
readonly statusCode?: number;
|
|
57
|
+
constructor(registrar: string, message: string, statusCode?: number, cause?: Error);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Error when API credentials are missing or invalid.
|
|
61
|
+
*/
|
|
62
|
+
export declare class AuthenticationError extends DomainSearchError {
|
|
63
|
+
constructor(registrar: string, reason?: string);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Error when no data source is available.
|
|
67
|
+
*/
|
|
68
|
+
export declare class NoSourceAvailableError extends DomainSearchError {
|
|
69
|
+
constructor(domain: string, triedSources: string[]);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Error when a network request times out.
|
|
73
|
+
*/
|
|
74
|
+
export declare class TimeoutError extends DomainSearchError {
|
|
75
|
+
constructor(operation: string, timeoutMs: number);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Error when a required configuration is missing.
|
|
79
|
+
*/
|
|
80
|
+
export declare class ConfigurationError extends DomainSearchError {
|
|
81
|
+
constructor(missing: string, howToFix: string);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Convert any error to a DomainSearchError.
|
|
85
|
+
*/
|
|
86
|
+
export declare function wrapError(error: unknown): DomainSearchError;
|
|
87
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,kCAAkC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;gBAGhC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf;IAaH;;OAEG;IACH,MAAM,IAAI,MAAM;CAQjB;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;gBAC3C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAa3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB;gBAC5C,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE;CAiBjD;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,iBAAiB;IACnD,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;CAiB1D;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,iBAAiB;IACtD,oCAAoC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAG3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,KAAK;CAqBhB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB;gBAC5C,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAY/C;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB;gBAC/C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE;CAanD;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,iBAAiB;gBACrC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAYjD;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB;gBAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAY9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CA2B3D"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Custom Error Classes for Domain Search MCP.
|
|
4
|
+
*
|
|
5
|
+
* These errors are designed to be:
|
|
6
|
+
* 1. User-friendly (clear messages for non-developers)
|
|
7
|
+
* 2. Actionable (suggest what to do next)
|
|
8
|
+
* 3. Informative (include context for debugging)
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.ConfigurationError = exports.TimeoutError = exports.NoSourceAvailableError = exports.AuthenticationError = exports.RegistrarApiError = exports.RateLimitError = exports.UnsupportedTldError = exports.InvalidDomainError = exports.DomainSearchError = void 0;
|
|
12
|
+
exports.wrapError = wrapError;
|
|
13
|
+
/**
|
|
14
|
+
* Base error class for all domain search errors.
|
|
15
|
+
*/
|
|
16
|
+
class DomainSearchError extends Error {
|
|
17
|
+
/** Machine-readable error code */
|
|
18
|
+
code;
|
|
19
|
+
/** User-friendly message */
|
|
20
|
+
userMessage;
|
|
21
|
+
/** Can this operation be retried? */
|
|
22
|
+
retryable;
|
|
23
|
+
/** Suggested action for the user */
|
|
24
|
+
suggestedAction;
|
|
25
|
+
constructor(code, message, userMessage, options) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'DomainSearchError';
|
|
28
|
+
this.code = code;
|
|
29
|
+
this.userMessage = userMessage;
|
|
30
|
+
this.retryable = options?.retryable ?? false;
|
|
31
|
+
this.suggestedAction = options?.suggestedAction;
|
|
32
|
+
if (options?.cause) {
|
|
33
|
+
this.cause = options.cause;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert to a plain object for JSON responses.
|
|
38
|
+
*/
|
|
39
|
+
toJSON() {
|
|
40
|
+
return {
|
|
41
|
+
code: this.code,
|
|
42
|
+
message: this.userMessage,
|
|
43
|
+
retryable: this.retryable,
|
|
44
|
+
suggestedAction: this.suggestedAction,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.DomainSearchError = DomainSearchError;
|
|
49
|
+
/**
|
|
50
|
+
* Error when a domain name is invalid.
|
|
51
|
+
*/
|
|
52
|
+
class InvalidDomainError extends DomainSearchError {
|
|
53
|
+
constructor(domain, reason) {
|
|
54
|
+
super('INVALID_DOMAIN', `Invalid domain: ${domain} - ${reason}`, `The domain "${domain}" is not valid: ${reason}`, {
|
|
55
|
+
retryable: false,
|
|
56
|
+
suggestedAction: 'Check the domain name for typos or invalid characters.',
|
|
57
|
+
});
|
|
58
|
+
this.name = 'InvalidDomainError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.InvalidDomainError = InvalidDomainError;
|
|
62
|
+
/**
|
|
63
|
+
* Error when a TLD is not supported.
|
|
64
|
+
*/
|
|
65
|
+
class UnsupportedTldError extends DomainSearchError {
|
|
66
|
+
constructor(tld, availableTlds) {
|
|
67
|
+
const suggestion = availableTlds.length > 0
|
|
68
|
+
? `Try one of these: ${availableTlds.slice(0, 5).join(', ')}`
|
|
69
|
+
: 'Contact support for TLD availability.';
|
|
70
|
+
super('UNSUPPORTED_TLD', `TLD not supported: .${tld}`, `The TLD ".${tld}" is not supported for searching.`, {
|
|
71
|
+
retryable: false,
|
|
72
|
+
suggestedAction: suggestion,
|
|
73
|
+
});
|
|
74
|
+
this.name = 'UnsupportedTldError';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.UnsupportedTldError = UnsupportedTldError;
|
|
78
|
+
/**
|
|
79
|
+
* Error when an API rate limit is hit.
|
|
80
|
+
*/
|
|
81
|
+
class RateLimitError extends DomainSearchError {
|
|
82
|
+
/** When to retry (Unix timestamp) */
|
|
83
|
+
retryAfter;
|
|
84
|
+
constructor(registrar, retryAfterSeconds) {
|
|
85
|
+
super('RATE_LIMIT', `Rate limit hit for ${registrar}`, `Too many requests to ${registrar}. Please slow down.`, {
|
|
86
|
+
retryable: true,
|
|
87
|
+
suggestedAction: retryAfterSeconds
|
|
88
|
+
? `Wait ${retryAfterSeconds} seconds before trying again.`
|
|
89
|
+
: 'Wait a moment and try again, or check fewer domains at once.',
|
|
90
|
+
});
|
|
91
|
+
this.name = 'RateLimitError';
|
|
92
|
+
if (retryAfterSeconds) {
|
|
93
|
+
this.retryAfter = Date.now() + retryAfterSeconds * 1000;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.RateLimitError = RateLimitError;
|
|
98
|
+
/**
|
|
99
|
+
* Error when a registrar API fails.
|
|
100
|
+
*/
|
|
101
|
+
class RegistrarApiError extends DomainSearchError {
|
|
102
|
+
/** HTTP status code if available */
|
|
103
|
+
statusCode;
|
|
104
|
+
constructor(registrar, message, statusCode, cause) {
|
|
105
|
+
const isServerError = statusCode !== undefined && statusCode >= 500;
|
|
106
|
+
super('REGISTRAR_API_ERROR', `${registrar} API error: ${message}`, isServerError
|
|
107
|
+
? `${registrar} is experiencing issues. We'll try another source.`
|
|
108
|
+
: `Could not check with ${registrar}: ${message}`, {
|
|
109
|
+
retryable: isServerError,
|
|
110
|
+
suggestedAction: isServerError
|
|
111
|
+
? 'The system will automatically try alternative sources.'
|
|
112
|
+
: `Check your ${registrar} API configuration.`,
|
|
113
|
+
cause,
|
|
114
|
+
});
|
|
115
|
+
this.name = 'RegistrarApiError';
|
|
116
|
+
this.statusCode = statusCode;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.RegistrarApiError = RegistrarApiError;
|
|
120
|
+
/**
|
|
121
|
+
* Error when API credentials are missing or invalid.
|
|
122
|
+
*/
|
|
123
|
+
class AuthenticationError extends DomainSearchError {
|
|
124
|
+
constructor(registrar, reason) {
|
|
125
|
+
super('AUTH_ERROR', `Authentication failed for ${registrar}: ${reason || 'Invalid credentials'}`, `Could not authenticate with ${registrar}.`, {
|
|
126
|
+
retryable: false,
|
|
127
|
+
suggestedAction: `Check your ${registrar.toUpperCase()}_API_KEY and ${registrar.toUpperCase()}_API_SECRET in your .env file.`,
|
|
128
|
+
});
|
|
129
|
+
this.name = 'AuthenticationError';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.AuthenticationError = AuthenticationError;
|
|
133
|
+
/**
|
|
134
|
+
* Error when no data source is available.
|
|
135
|
+
*/
|
|
136
|
+
class NoSourceAvailableError extends DomainSearchError {
|
|
137
|
+
constructor(domain, triedSources) {
|
|
138
|
+
super('NO_SOURCE_AVAILABLE', `No source available for ${domain}. Tried: ${triedSources.join(', ')}`, `Could not check availability for "${domain}". All sources failed.`, {
|
|
139
|
+
retryable: true,
|
|
140
|
+
suggestedAction: 'Try again in a few minutes, or check the domain manually at a registrar website.',
|
|
141
|
+
});
|
|
142
|
+
this.name = 'NoSourceAvailableError';
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.NoSourceAvailableError = NoSourceAvailableError;
|
|
146
|
+
/**
|
|
147
|
+
* Error when a network request times out.
|
|
148
|
+
*/
|
|
149
|
+
class TimeoutError extends DomainSearchError {
|
|
150
|
+
constructor(operation, timeoutMs) {
|
|
151
|
+
super('TIMEOUT', `Operation timed out: ${operation} (${timeoutMs}ms)`, `The request took too long to complete.`, {
|
|
152
|
+
retryable: true,
|
|
153
|
+
suggestedAction: 'Try again - this might be a temporary network issue.',
|
|
154
|
+
});
|
|
155
|
+
this.name = 'TimeoutError';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
exports.TimeoutError = TimeoutError;
|
|
159
|
+
/**
|
|
160
|
+
* Error when a required configuration is missing.
|
|
161
|
+
*/
|
|
162
|
+
class ConfigurationError extends DomainSearchError {
|
|
163
|
+
constructor(missing, howToFix) {
|
|
164
|
+
super('CONFIG_ERROR', `Missing configuration: ${missing}`, `Server configuration is incomplete.`, {
|
|
165
|
+
retryable: false,
|
|
166
|
+
suggestedAction: howToFix,
|
|
167
|
+
});
|
|
168
|
+
this.name = 'ConfigurationError';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.ConfigurationError = ConfigurationError;
|
|
172
|
+
/**
|
|
173
|
+
* Convert any error to a DomainSearchError.
|
|
174
|
+
*/
|
|
175
|
+
function wrapError(error) {
|
|
176
|
+
if (error instanceof DomainSearchError) {
|
|
177
|
+
return error;
|
|
178
|
+
}
|
|
179
|
+
if (error instanceof Error) {
|
|
180
|
+
return new DomainSearchError('UNKNOWN_ERROR', error.message, 'An unexpected error occurred.', {
|
|
181
|
+
retryable: true,
|
|
182
|
+
suggestedAction: 'Try again or contact support if the issue persists.',
|
|
183
|
+
cause: error,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return new DomainSearchError('UNKNOWN_ERROR', String(error), 'An unexpected error occurred.', {
|
|
187
|
+
retryable: true,
|
|
188
|
+
suggestedAction: 'Try again or contact support if the issue persists.',
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility Exports.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./logger.js"), exports);
|
|
21
|
+
__exportStar(require("./errors.js"), exports);
|
|
22
|
+
__exportStar(require("./cache.js"), exports);
|
|
23
|
+
__exportStar(require("./validators.js"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,8CAA4B;AAC5B,6CAA2B;AAC3B,kDAAgC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured JSON Logger with Secret Masking.
|
|
3
|
+
*
|
|
4
|
+
* - Outputs JSON for easy parsing
|
|
5
|
+
* - Masks API keys and secrets automatically
|
|
6
|
+
* - Includes request IDs for tracing
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Generate a unique request ID.
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateRequestId(): string;
|
|
12
|
+
export declare function setRequestId(id: string): void;
|
|
13
|
+
export declare function clearRequestId(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Logger instance with convenience methods.
|
|
16
|
+
*/
|
|
17
|
+
export declare const logger: {
|
|
18
|
+
debug: (message: string, data?: Record<string, unknown>) => void;
|
|
19
|
+
info: (message: string, data?: Record<string, unknown>) => void;
|
|
20
|
+
warn: (message: string, data?: Record<string, unknown>) => void;
|
|
21
|
+
error: (message: string, data?: Record<string, unknown>) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Log an error with stack trace.
|
|
24
|
+
*/
|
|
25
|
+
logError: (message: string, error: Error, data?: Record<string, unknown>) => void;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiFH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAOD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAgCD;;GAEG;AACH,eAAO,MAAM,MAAM;qBACA,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAEvC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBAEtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBAErC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAGvD;;OAEG;wBACiB,MAAM,SAAS,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQzE,CAAC"}
|