@dominusnode/mcp-server 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/LICENSE +21 -0
- package/README.md +303 -0
- package/dist/src/config.d.ts +15 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +111 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/http-client.d.ts +23 -0
- package/dist/src/http-client.d.ts.map +1 -0
- package/dist/src/http-client.js +241 -0
- package/dist/src/http-client.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +160 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/proxy-fetch.d.ts +23 -0
- package/dist/src/proxy-fetch.d.ts.map +1 -0
- package/dist/src/proxy-fetch.js +549 -0
- package/dist/src/proxy-fetch.js.map +1 -0
- package/dist/src/token-manager.d.ts +18 -0
- package/dist/src/token-manager.d.ts.map +1 -0
- package/dist/src/token-manager.js +192 -0
- package/dist/src/token-manager.js.map +1 -0
- package/dist/src/tools/account.d.ts +6 -0
- package/dist/src/tools/account.d.ts.map +1 -0
- package/dist/src/tools/account.js +329 -0
- package/dist/src/tools/account.js.map +1 -0
- package/dist/src/tools/agent-wallet.d.ts +5 -0
- package/dist/src/tools/agent-wallet.d.ts.map +1 -0
- package/dist/src/tools/agent-wallet.js +355 -0
- package/dist/src/tools/agent-wallet.js.map +1 -0
- package/dist/src/tools/crypto.d.ts +4 -0
- package/dist/src/tools/crypto.d.ts.map +1 -0
- package/dist/src/tools/crypto.js +102 -0
- package/dist/src/tools/crypto.js.map +1 -0
- package/dist/src/tools/fetch.d.ts +4 -0
- package/dist/src/tools/fetch.d.ts.map +1 -0
- package/dist/src/tools/fetch.js +73 -0
- package/dist/src/tools/fetch.js.map +1 -0
- package/dist/src/tools/keys.d.ts +4 -0
- package/dist/src/tools/keys.d.ts.map +1 -0
- package/dist/src/tools/keys.js +88 -0
- package/dist/src/tools/keys.js.map +1 -0
- package/dist/src/tools/paypal.d.ts +4 -0
- package/dist/src/tools/paypal.d.ts.map +1 -0
- package/dist/src/tools/paypal.js +50 -0
- package/dist/src/tools/paypal.js.map +1 -0
- package/dist/src/tools/plans.d.ts +4 -0
- package/dist/src/tools/plans.d.ts.map +1 -0
- package/dist/src/tools/plans.js +48 -0
- package/dist/src/tools/plans.js.map +1 -0
- package/dist/src/tools/proxy.d.ts +4 -0
- package/dist/src/tools/proxy.d.ts.map +1 -0
- package/dist/src/tools/proxy.js +51 -0
- package/dist/src/tools/proxy.js.map +1 -0
- package/dist/src/tools/sessions.d.ts +4 -0
- package/dist/src/tools/sessions.d.ts.map +1 -0
- package/dist/src/tools/sessions.js +21 -0
- package/dist/src/tools/sessions.js.map +1 -0
- package/dist/src/tools/slots.d.ts +4 -0
- package/dist/src/tools/slots.d.ts.map +1 -0
- package/dist/src/tools/slots.js +61 -0
- package/dist/src/tools/slots.js.map +1 -0
- package/dist/src/tools/teams.d.ts +4 -0
- package/dist/src/tools/teams.d.ts.map +1 -0
- package/dist/src/tools/teams.js +520 -0
- package/dist/src/tools/teams.js.map +1 -0
- package/dist/src/tools/usage.d.ts +4 -0
- package/dist/src/tools/usage.d.ts.map +1 -0
- package/dist/src/tools/usage.js +79 -0
- package/dist/src/tools/usage.js.map +1 -0
- package/dist/src/tools/wallet-auth.d.ts +6 -0
- package/dist/src/tools/wallet-auth.d.ts.map +1 -0
- package/dist/src/tools/wallet-auth.js +158 -0
- package/dist/src/tools/wallet-auth.js.map +1 -0
- package/dist/src/tools/wallet.d.ts +4 -0
- package/dist/src/tools/wallet.d.ts.map +1 -0
- package/dist/src/tools/wallet.js +57 -0
- package/dist/src/tools/wallet.js.map +1 -0
- package/dist/src/types.d.ts +142 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
const USER_AGENT = "dominusnode-mcp-server/1.0.0";
|
|
2
|
+
// Scrub credential patterns from error messages before returning to MCP client
|
|
3
|
+
const CREDENTIAL_PATTERNS = [
|
|
4
|
+
/dn_live_[A-Za-z0-9_-]+/g,
|
|
5
|
+
/dn_test_[A-Za-z0-9_-]+/g,
|
|
6
|
+
/eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/g,
|
|
7
|
+
/Bearer\s+[A-Za-z0-9._-]+/gi,
|
|
8
|
+
];
|
|
9
|
+
function scrubCredentials(msg) {
|
|
10
|
+
let result = msg;
|
|
11
|
+
for (const pattern of CREDENTIAL_PATTERNS) {
|
|
12
|
+
result = result.replace(pattern, "[REDACTED]");
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
17
|
+
// Depth limit prevents stack overflow on deeply nested JSON
|
|
18
|
+
function stripDangerousKeys(obj, depth = 0) {
|
|
19
|
+
if (depth > 50 || !obj || typeof obj !== "object")
|
|
20
|
+
return;
|
|
21
|
+
if (Array.isArray(obj)) {
|
|
22
|
+
for (const item of obj)
|
|
23
|
+
stripDangerousKeys(item, depth + 1);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const record = obj;
|
|
27
|
+
for (const key of Object.keys(record)) {
|
|
28
|
+
if (DANGEROUS_KEYS.has(key)) {
|
|
29
|
+
delete record[key];
|
|
30
|
+
}
|
|
31
|
+
else if (record[key] && typeof record[key] === "object") {
|
|
32
|
+
stripDangerousKeys(record[key], depth + 1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function safeJsonParse(text) {
|
|
37
|
+
const parsed = JSON.parse(text);
|
|
38
|
+
stripDangerousKeys(parsed);
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
41
|
+
function addJitter(ms) {
|
|
42
|
+
const jitter = ms * 0.2 * (Math.random() - 0.5);
|
|
43
|
+
return Math.max(100, Math.round(ms + jitter));
|
|
44
|
+
}
|
|
45
|
+
// ─── MCP Tool Rate Limiter ────────────────────────────────────────
|
|
46
|
+
// Prevents MCP clients from spamming API requests.
|
|
47
|
+
// Token bucket: MAX_REQUESTS_PER_MINUTE refill rate, burst up to BUCKET_SIZE.
|
|
48
|
+
const MCP_RATE_LIMIT_PER_MINUTE = 120; // 2 req/sec sustained
|
|
49
|
+
const MCP_BUCKET_SIZE = 20; // Allow bursts up to 20
|
|
50
|
+
class TokenBucket {
|
|
51
|
+
maxTokens;
|
|
52
|
+
refillRate;
|
|
53
|
+
tokens;
|
|
54
|
+
lastRefill;
|
|
55
|
+
constructor(maxTokens, refillRate) {
|
|
56
|
+
this.maxTokens = maxTokens;
|
|
57
|
+
this.refillRate = refillRate;
|
|
58
|
+
this.tokens = maxTokens;
|
|
59
|
+
this.lastRefill = Date.now();
|
|
60
|
+
}
|
|
61
|
+
tryConsume() {
|
|
62
|
+
this.refill();
|
|
63
|
+
if (this.tokens >= 1) {
|
|
64
|
+
this.tokens -= 1;
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
refill() {
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const elapsed = now - this.lastRefill;
|
|
72
|
+
this.tokens = Math.min(this.maxTokens, this.tokens + elapsed * this.refillRate);
|
|
73
|
+
this.lastRefill = now;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Maximum response body size for API calls (10MB)
|
|
77
|
+
const MAX_API_RESPONSE_BYTES = 10 * 1024 * 1024;
|
|
78
|
+
export class HttpClient {
|
|
79
|
+
baseUrl;
|
|
80
|
+
tokenManager;
|
|
81
|
+
rateLimiter;
|
|
82
|
+
mcpAgentSecret;
|
|
83
|
+
constructor(baseUrl, tokenManager, mcpAgentSecret = "") {
|
|
84
|
+
this.baseUrl = baseUrl;
|
|
85
|
+
this.tokenManager = tokenManager;
|
|
86
|
+
this.mcpAgentSecret = mcpAgentSecret;
|
|
87
|
+
this.rateLimiter = new TokenBucket(MCP_BUCKET_SIZE, MCP_RATE_LIMIT_PER_MINUTE / 60_000);
|
|
88
|
+
}
|
|
89
|
+
async request(opts) {
|
|
90
|
+
// Token bucket rate limiting: prevents MCP clients from spamming API
|
|
91
|
+
if (!this.rateLimiter.tryConsume()) {
|
|
92
|
+
throw new Error("MCP rate limit exceeded — too many requests. Please slow down.");
|
|
93
|
+
}
|
|
94
|
+
// Protect base headers from user override
|
|
95
|
+
const PROTECTED_HEADERS = new Set(["user-agent", "content-type", "authorization", "host", "connection", "content-length", "x-dominusnode-agent", "x-dominusnode-agent-secret"]);
|
|
96
|
+
const headers = {
|
|
97
|
+
"User-Agent": USER_AGENT,
|
|
98
|
+
"Content-Type": "application/json",
|
|
99
|
+
"X-DominusNode-Agent": "mcp",
|
|
100
|
+
};
|
|
101
|
+
// Send shared secret for auto-verification (if configured)
|
|
102
|
+
if (this.mcpAgentSecret) {
|
|
103
|
+
headers["X-DominusNode-Agent-Secret"] = this.mcpAgentSecret;
|
|
104
|
+
}
|
|
105
|
+
if (opts.headers) {
|
|
106
|
+
for (const [key, value] of Object.entries(opts.headers)) {
|
|
107
|
+
if (!PROTECTED_HEADERS.has(key.toLowerCase())) {
|
|
108
|
+
headers[key] = value;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (opts.requiresAuth !== false) {
|
|
113
|
+
const token = await this.tokenManager.getValidToken();
|
|
114
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
115
|
+
}
|
|
116
|
+
const url = `${this.baseUrl}${opts.path}`;
|
|
117
|
+
const timeoutMs = 30_000;
|
|
118
|
+
let response;
|
|
119
|
+
try {
|
|
120
|
+
response = await fetch(url, {
|
|
121
|
+
method: opts.method,
|
|
122
|
+
headers,
|
|
123
|
+
body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
|
|
124
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
125
|
+
redirect: "error", // Reject redirects — prevents HTTPS→HTTP credential leakage
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
throw new Error(scrubCredentials(`Network error: ${err instanceof Error ? err.message : "request failed"}`));
|
|
130
|
+
}
|
|
131
|
+
// 429 retry with jitter, cap 10s
|
|
132
|
+
// NOTE: Safe for POST/PATCH/DELETE because a 429 response means the backend
|
|
133
|
+
// rate limiter rejected the request BEFORE processing — no mutation occurred.
|
|
134
|
+
if (response.status === 429) {
|
|
135
|
+
const retryAfterRaw = parseInt(response.headers.get("retry-after") ?? "5", 10);
|
|
136
|
+
const retryAfter = isNaN(retryAfterRaw) ? 5 : retryAfterRaw;
|
|
137
|
+
// Cancel body instead of buffering — prevents OOM from oversized 429 response
|
|
138
|
+
await response.body?.cancel();
|
|
139
|
+
await new Promise((resolve) => setTimeout(resolve, addJitter(Math.min(retryAfter * 1000, 10_000))));
|
|
140
|
+
if (opts.requiresAuth !== false) {
|
|
141
|
+
const freshToken = await this.tokenManager.getValidToken();
|
|
142
|
+
headers["Authorization"] = `Bearer ${freshToken}`;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
response = await fetch(url, {
|
|
146
|
+
method: opts.method,
|
|
147
|
+
headers,
|
|
148
|
+
body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
|
|
149
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
150
|
+
redirect: "error",
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
throw new Error(scrubCredentials(`Network error on retry: ${err instanceof Error ? err.message : "request failed"}`));
|
|
155
|
+
}
|
|
156
|
+
// Prevent fall-through to 401 handler after 429 retry
|
|
157
|
+
if (response.ok) {
|
|
158
|
+
const responseText = await response.text();
|
|
159
|
+
if (responseText.length > MAX_API_RESPONSE_BYTES) {
|
|
160
|
+
throw new Error("Response too large");
|
|
161
|
+
}
|
|
162
|
+
return responseText ? safeJsonParse(responseText) : {};
|
|
163
|
+
}
|
|
164
|
+
// If retry still failed (non-2xx, non-401), throw immediately
|
|
165
|
+
// Cancel body instead of buffering — prevents OOM from oversized error response
|
|
166
|
+
if (response.status !== 401) {
|
|
167
|
+
await response.body?.cancel();
|
|
168
|
+
throw new Error(`API error ${response.status} after rate-limit retry`);
|
|
169
|
+
}
|
|
170
|
+
// Only fall through to 401 handler if retry returned 401
|
|
171
|
+
}
|
|
172
|
+
// 401 retry with force refresh
|
|
173
|
+
// NOTE: Safe for POST/PATCH/DELETE because a 401 means auth rejected BEFORE
|
|
174
|
+
// processing — no mutation occurred. Retrying with a fresh token is the first actual attempt.
|
|
175
|
+
if (response.status === 401 && opts.requiresAuth !== false) {
|
|
176
|
+
// Cancel unconsumed 401 response body to free connection + memory
|
|
177
|
+
await response.body?.cancel();
|
|
178
|
+
const newToken = await this.tokenManager.forceRefresh();
|
|
179
|
+
headers["Authorization"] = `Bearer ${newToken}`;
|
|
180
|
+
const retry = await fetch(url, {
|
|
181
|
+
method: opts.method,
|
|
182
|
+
headers,
|
|
183
|
+
body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
|
|
184
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
185
|
+
redirect: "error",
|
|
186
|
+
});
|
|
187
|
+
if (retry.ok) {
|
|
188
|
+
const text = await retry.text();
|
|
189
|
+
if (text.length > MAX_API_RESPONSE_BYTES)
|
|
190
|
+
throw new Error("API response exceeded maximum allowed size");
|
|
191
|
+
return text ? safeJsonParse(text) : {};
|
|
192
|
+
}
|
|
193
|
+
// Read limited error body to prevent OOM on oversized response
|
|
194
|
+
const retryBody = await retry.text();
|
|
195
|
+
if (retryBody.length > MAX_API_RESPONSE_BYTES) {
|
|
196
|
+
throw new Error("API error response exceeded maximum allowed size");
|
|
197
|
+
}
|
|
198
|
+
let retryMessage = retryBody.slice(0, 500);
|
|
199
|
+
try {
|
|
200
|
+
// Use safeJsonParse to prevent prototype pollution on error paths
|
|
201
|
+
const parsed = safeJsonParse(retryBody);
|
|
202
|
+
retryMessage = parsed.error ?? parsed.message ?? retryBody.slice(0, 500);
|
|
203
|
+
}
|
|
204
|
+
catch { /* use raw text */ }
|
|
205
|
+
throw new Error(scrubCredentials(`API error ${retry.status}: ${retryMessage}`));
|
|
206
|
+
}
|
|
207
|
+
const responseText = await response.text();
|
|
208
|
+
// Prevent OOM from oversized API response
|
|
209
|
+
if (responseText.length > MAX_API_RESPONSE_BYTES) {
|
|
210
|
+
throw new Error("API response exceeded maximum allowed size");
|
|
211
|
+
}
|
|
212
|
+
if (!response.ok) {
|
|
213
|
+
let message = responseText.slice(0, 500);
|
|
214
|
+
try {
|
|
215
|
+
// Use safeJsonParse to prevent prototype pollution on error paths
|
|
216
|
+
const parsed = safeJsonParse(responseText);
|
|
217
|
+
message = parsed.error ?? parsed.message ?? responseText.slice(0, 500);
|
|
218
|
+
}
|
|
219
|
+
catch { /* use raw text */ }
|
|
220
|
+
throw new Error(scrubCredentials(`API error ${response.status}: ${message}`));
|
|
221
|
+
}
|
|
222
|
+
return responseText ? safeJsonParse(responseText) : {};
|
|
223
|
+
}
|
|
224
|
+
/** Store tokens from an external auth flow (e.g., registration in bootstrap mode) */
|
|
225
|
+
storeTokens(accessToken, refreshToken) {
|
|
226
|
+
this.tokenManager.setTokens(accessToken, refreshToken);
|
|
227
|
+
}
|
|
228
|
+
async get(path, requiresAuth = true) {
|
|
229
|
+
return this.request({ method: "GET", path, requiresAuth });
|
|
230
|
+
}
|
|
231
|
+
async post(path, body, requiresAuth = true) {
|
|
232
|
+
return this.request({ method: "POST", path, body, requiresAuth });
|
|
233
|
+
}
|
|
234
|
+
async patch(path, body) {
|
|
235
|
+
return this.request({ method: "PATCH", path, body });
|
|
236
|
+
}
|
|
237
|
+
async delete(path) {
|
|
238
|
+
return this.request({ method: "DELETE", path });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { parseConfig, ConfigError } from "./config.js";
|
|
5
|
+
import { TokenManager } from "./token-manager.js";
|
|
6
|
+
import { HttpClient } from "./http-client.js";
|
|
7
|
+
import { registerFetchTools } from "./tools/fetch.js";
|
|
8
|
+
import { registerProxyTools } from "./tools/proxy.js";
|
|
9
|
+
import { registerWalletTools } from "./tools/wallet.js";
|
|
10
|
+
import { registerUsageTools } from "./tools/usage.js";
|
|
11
|
+
import { registerKeysTools } from "./tools/keys.js";
|
|
12
|
+
import { registerPlansTools } from "./tools/plans.js";
|
|
13
|
+
import { registerSessionsTools } from "./tools/sessions.js";
|
|
14
|
+
import { registerAccountTools } from "./tools/account.js";
|
|
15
|
+
import { registerCryptoTools } from "./tools/crypto.js";
|
|
16
|
+
import { registerPaypalTools } from "./tools/paypal.js";
|
|
17
|
+
import { registerAgentWalletTools } from "./tools/agent-wallet.js";
|
|
18
|
+
import { registerWalletAuthTools } from "./tools/wallet-auth.js";
|
|
19
|
+
import { registerSlotsTools } from "./tools/slots.js";
|
|
20
|
+
import { registerTeamsTools } from "./tools/teams.js";
|
|
21
|
+
async function main() {
|
|
22
|
+
let config;
|
|
23
|
+
try {
|
|
24
|
+
config = parseConfig();
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (err instanceof ConfigError) {
|
|
28
|
+
process.stderr.write(`Configuration error: ${err.message}\n`);
|
|
29
|
+
process.stderr.write(`\nOptional environment variables:\n`);
|
|
30
|
+
process.stderr.write(` DOMINUSNODE_API_KEY — Your Dominus Node API key (starts with dn_live_)\n`);
|
|
31
|
+
process.stderr.write(` Omit to start in bootstrap mode\n`);
|
|
32
|
+
process.stderr.write(` DOMINUSNODE_API_URL — API base URL (default: https://api.dominusnode.com)\n`);
|
|
33
|
+
process.stderr.write(` DOMINUSNODE_PROXY_HOST — Proxy host (default: proxy.dominusnode.com)\n`);
|
|
34
|
+
process.stderr.write(` DOMINUSNODE_HTTP_PROXY_PORT — HTTP proxy port (default: 8080)\n`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
const tokenManager = new TokenManager(config.apiUrl);
|
|
40
|
+
const httpClient = new HttpClient(config.apiUrl, tokenManager, config.mcpAgentSecret);
|
|
41
|
+
// Clear credentials on process shutdown to minimize in-memory exposure time
|
|
42
|
+
function cleanupCredentials() {
|
|
43
|
+
tokenManager.clear();
|
|
44
|
+
}
|
|
45
|
+
process.on("SIGINT", () => { cleanupCredentials(); process.exit(0); });
|
|
46
|
+
process.on("SIGTERM", () => { cleanupCredentials(); process.exit(0); });
|
|
47
|
+
process.on("exit", cleanupCredentials);
|
|
48
|
+
const server = new McpServer({
|
|
49
|
+
name: "dominusnode",
|
|
50
|
+
version: "1.0.0",
|
|
51
|
+
});
|
|
52
|
+
const bootstrapMode = config.apiKey === null;
|
|
53
|
+
if (bootstrapMode) {
|
|
54
|
+
// ── Bootstrap Mode ──────────────────────────────────────────────
|
|
55
|
+
// No API key provided. Start with account/auth tools only.
|
|
56
|
+
// Agent can register, login, or setup — then use all tools.
|
|
57
|
+
process.stderr.write("Dominus Node MCP Server starting in BOOTSTRAP mode...\n");
|
|
58
|
+
process.stderr.write("No API key detected. Only account tools are available.\n");
|
|
59
|
+
process.stderr.write("Use dominusnode_setup to create an account and get an API key.\n\n");
|
|
60
|
+
registerAccountTools(server, httpClient);
|
|
61
|
+
registerCryptoTools(server, httpClient);
|
|
62
|
+
registerPaypalTools(server, httpClient);
|
|
63
|
+
// Do NOT register agent-wallet tools in bootstrap mode —
|
|
64
|
+
// they require authentication and should only be available in authenticated mode.
|
|
65
|
+
registerWalletAuthTools(server, httpClient);
|
|
66
|
+
registerSlotsTools(server, httpClient);
|
|
67
|
+
// Register a helper tool that tells the agent what to do
|
|
68
|
+
registerBootstrapHelper(server);
|
|
69
|
+
const transport = new StdioServerTransport();
|
|
70
|
+
await server.connect(transport);
|
|
71
|
+
process.stderr.write("Dominus Node MCP Server ready — bootstrap mode (15 tools + bootstrap helper)\n");
|
|
72
|
+
process.stderr.write("Run dominusnode_setup or dominusnode_wallet_setup to create an account and unlock all 57 tools.\n");
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// ── Authenticated Mode ──────────────────────────────────────────
|
|
76
|
+
process.stderr.write("Dominus Node MCP Server starting...\n");
|
|
77
|
+
try {
|
|
78
|
+
await tokenManager.initialize(config.apiKey);
|
|
79
|
+
process.stderr.write("Authenticated with Dominus Node API\n");
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
process.stderr.write(`Authentication failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
83
|
+
process.stderr.write("Verify your DOMINUSNODE_API_KEY is valid and DOMINUSNODE_API_URL is reachable.\n");
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
// Register all tool groups
|
|
87
|
+
registerFetchTools(server, config);
|
|
88
|
+
registerProxyTools(server, httpClient);
|
|
89
|
+
registerWalletTools(server, httpClient);
|
|
90
|
+
registerUsageTools(server, httpClient);
|
|
91
|
+
registerKeysTools(server, httpClient);
|
|
92
|
+
registerPlansTools(server, httpClient);
|
|
93
|
+
registerSessionsTools(server, httpClient);
|
|
94
|
+
registerAccountTools(server, httpClient);
|
|
95
|
+
registerCryptoTools(server, httpClient);
|
|
96
|
+
registerPaypalTools(server, httpClient);
|
|
97
|
+
registerAgentWalletTools(server, httpClient, config);
|
|
98
|
+
registerWalletAuthTools(server, httpClient);
|
|
99
|
+
registerSlotsTools(server, httpClient);
|
|
100
|
+
registerTeamsTools(server, httpClient);
|
|
101
|
+
const transport = new StdioServerTransport();
|
|
102
|
+
await server.connect(transport);
|
|
103
|
+
process.stderr.write("Dominus Node MCP Server ready — 57 tools available\n");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function registerBootstrapHelper(server) {
|
|
107
|
+
server.tool("dominusnode_bootstrap_help", "Shows how to get started with Dominus Node. Use this if you're running in bootstrap mode without an API key.", {}, async () => {
|
|
108
|
+
const text = [
|
|
109
|
+
`Dominus Node Bootstrap Mode`,
|
|
110
|
+
``,
|
|
111
|
+
`You're running without an API key. Here's how to get started:`,
|
|
112
|
+
``,
|
|
113
|
+
`Step 0: Check slot availability`,
|
|
114
|
+
` Use dominusnode_check_slots to see if registration slots are open.`,
|
|
115
|
+
` Alpha is limited to 250 users. If slots are full, use`,
|
|
116
|
+
` dominusnode_join_waitlist to get notified when one opens.`,
|
|
117
|
+
``,
|
|
118
|
+
`Option 1: One-shot setup (recommended)`,
|
|
119
|
+
` Use dominusnode_setup with an email and password.`,
|
|
120
|
+
` This creates an account + API key in one step.`,
|
|
121
|
+
``,
|
|
122
|
+
`Option 2: Wallet auth (no email/password needed)`,
|
|
123
|
+
` 1. dominusnode_wallet_challenge — Get a message to sign`,
|
|
124
|
+
` 2. dominusnode_wallet_setup — Submit signature + get API key`,
|
|
125
|
+
``,
|
|
126
|
+
`Option 3: Step by step (email/password)`,
|
|
127
|
+
` 1. dominusnode_register — Create an account`,
|
|
128
|
+
` 2. dominusnode_login — Log in if you already have an account`,
|
|
129
|
+
` Note: To create API keys, use dominusnode_setup (one-shot) or`,
|
|
130
|
+
` set DOMINUSNODE_API_KEY and restart to unlock dominusnode_create_key.`,
|
|
131
|
+
``,
|
|
132
|
+
`Option 4: Top up with crypto or PayPal`,
|
|
133
|
+
` After registering, use dominusnode_pay_crypto to add funds.`,
|
|
134
|
+
` Supports BTC, ETH, LTC, XMR, ZEC, USDC, SOL, USDT, DAI, BNB, LINK.`,
|
|
135
|
+
` Or use dominusnode_pay_paypal for PayPal top-up (min $5).`,
|
|
136
|
+
` Check your balance with dominusnode_get_balance to confirm funds arrived.`,
|
|
137
|
+
``,
|
|
138
|
+
`Option 5: Multi-agent teams (manage multiple AI agents)`,
|
|
139
|
+
` Lead agent sets up account + payment, then:`,
|
|
140
|
+
` 1. dominusnode_create_team — Create a team for your agents`,
|
|
141
|
+
` 2. dominusnode_team_fund — Fund team wallet from personal wallet`,
|
|
142
|
+
` 3. Sub-agents register via dominusnode_setup (auto-verified)`,
|
|
143
|
+
` 4. dominusnode_team_add_member — Add sub-agents by email`,
|
|
144
|
+
` 5. dominusnode_team_create_key — Create shared team API keys`,
|
|
145
|
+
` All traffic bills to team wallet. Only lead needs payment.`,
|
|
146
|
+
``,
|
|
147
|
+
`After setup, set DOMINUSNODE_API_KEY in your environment`,
|
|
148
|
+
`to unlock all 57 tools on next startup.`,
|
|
149
|
+
``,
|
|
150
|
+
`Email auto-verified for MCP agents — crypto payments enabled (11 currencies).`,
|
|
151
|
+
`Free tier: 10 connections, 1GB bandwidth — no payment required.`,
|
|
152
|
+
].join("\n");
|
|
153
|
+
return { content: [{ type: "text", text }] };
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
main().catch((err) => {
|
|
157
|
+
process.stderr.write(`Fatal error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { McpConfig } from "./config.js";
|
|
2
|
+
export interface ProxyFetchOptions {
|
|
3
|
+
url: string;
|
|
4
|
+
method?: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
body?: string;
|
|
7
|
+
country?: string;
|
|
8
|
+
state?: string;
|
|
9
|
+
city?: string;
|
|
10
|
+
poolType?: "dc" | "residential" | "auto";
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ProxyFetchResult {
|
|
14
|
+
status: number;
|
|
15
|
+
statusText: string;
|
|
16
|
+
headers: Record<string, string>;
|
|
17
|
+
body: string;
|
|
18
|
+
bodyTruncated: boolean;
|
|
19
|
+
byteCount: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function validateUrl(url: string): URL;
|
|
22
|
+
export declare function proxyFetch(config: McpConfig, opts: ProxyFetchOptions): Promise<ProxyFetchResult>;
|
|
23
|
+
//# sourceMappingURL=proxy-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-fetch.d.ts","sourceRoot":"","sources":["../../src/proxy-fetch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,IAAI,GAAG,aAAa,GAAG,MAAM,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAsLD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAyC5C;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA+B3B"}
|