@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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +303 -0
  3. package/dist/src/config.d.ts +15 -0
  4. package/dist/src/config.d.ts.map +1 -0
  5. package/dist/src/config.js +111 -0
  6. package/dist/src/config.js.map +1 -0
  7. package/dist/src/http-client.d.ts +23 -0
  8. package/dist/src/http-client.d.ts.map +1 -0
  9. package/dist/src/http-client.js +241 -0
  10. package/dist/src/http-client.js.map +1 -0
  11. package/dist/src/index.d.ts +3 -0
  12. package/dist/src/index.d.ts.map +1 -0
  13. package/dist/src/index.js +160 -0
  14. package/dist/src/index.js.map +1 -0
  15. package/dist/src/proxy-fetch.d.ts +23 -0
  16. package/dist/src/proxy-fetch.d.ts.map +1 -0
  17. package/dist/src/proxy-fetch.js +549 -0
  18. package/dist/src/proxy-fetch.js.map +1 -0
  19. package/dist/src/token-manager.d.ts +18 -0
  20. package/dist/src/token-manager.d.ts.map +1 -0
  21. package/dist/src/token-manager.js +192 -0
  22. package/dist/src/token-manager.js.map +1 -0
  23. package/dist/src/tools/account.d.ts +6 -0
  24. package/dist/src/tools/account.d.ts.map +1 -0
  25. package/dist/src/tools/account.js +329 -0
  26. package/dist/src/tools/account.js.map +1 -0
  27. package/dist/src/tools/agent-wallet.d.ts +5 -0
  28. package/dist/src/tools/agent-wallet.d.ts.map +1 -0
  29. package/dist/src/tools/agent-wallet.js +355 -0
  30. package/dist/src/tools/agent-wallet.js.map +1 -0
  31. package/dist/src/tools/crypto.d.ts +4 -0
  32. package/dist/src/tools/crypto.d.ts.map +1 -0
  33. package/dist/src/tools/crypto.js +102 -0
  34. package/dist/src/tools/crypto.js.map +1 -0
  35. package/dist/src/tools/fetch.d.ts +4 -0
  36. package/dist/src/tools/fetch.d.ts.map +1 -0
  37. package/dist/src/tools/fetch.js +73 -0
  38. package/dist/src/tools/fetch.js.map +1 -0
  39. package/dist/src/tools/keys.d.ts +4 -0
  40. package/dist/src/tools/keys.d.ts.map +1 -0
  41. package/dist/src/tools/keys.js +88 -0
  42. package/dist/src/tools/keys.js.map +1 -0
  43. package/dist/src/tools/paypal.d.ts +4 -0
  44. package/dist/src/tools/paypal.d.ts.map +1 -0
  45. package/dist/src/tools/paypal.js +50 -0
  46. package/dist/src/tools/paypal.js.map +1 -0
  47. package/dist/src/tools/plans.d.ts +4 -0
  48. package/dist/src/tools/plans.d.ts.map +1 -0
  49. package/dist/src/tools/plans.js +48 -0
  50. package/dist/src/tools/plans.js.map +1 -0
  51. package/dist/src/tools/proxy.d.ts +4 -0
  52. package/dist/src/tools/proxy.d.ts.map +1 -0
  53. package/dist/src/tools/proxy.js +51 -0
  54. package/dist/src/tools/proxy.js.map +1 -0
  55. package/dist/src/tools/sessions.d.ts +4 -0
  56. package/dist/src/tools/sessions.d.ts.map +1 -0
  57. package/dist/src/tools/sessions.js +21 -0
  58. package/dist/src/tools/sessions.js.map +1 -0
  59. package/dist/src/tools/slots.d.ts +4 -0
  60. package/dist/src/tools/slots.d.ts.map +1 -0
  61. package/dist/src/tools/slots.js +61 -0
  62. package/dist/src/tools/slots.js.map +1 -0
  63. package/dist/src/tools/teams.d.ts +4 -0
  64. package/dist/src/tools/teams.d.ts.map +1 -0
  65. package/dist/src/tools/teams.js +520 -0
  66. package/dist/src/tools/teams.js.map +1 -0
  67. package/dist/src/tools/usage.d.ts +4 -0
  68. package/dist/src/tools/usage.d.ts.map +1 -0
  69. package/dist/src/tools/usage.js +79 -0
  70. package/dist/src/tools/usage.js.map +1 -0
  71. package/dist/src/tools/wallet-auth.d.ts +6 -0
  72. package/dist/src/tools/wallet-auth.d.ts.map +1 -0
  73. package/dist/src/tools/wallet-auth.js +158 -0
  74. package/dist/src/tools/wallet-auth.js.map +1 -0
  75. package/dist/src/tools/wallet.d.ts +4 -0
  76. package/dist/src/tools/wallet.d.ts.map +1 -0
  77. package/dist/src/tools/wallet.js +57 -0
  78. package/dist/src/tools/wallet.js.map +1 -0
  79. package/dist/src/types.d.ts +142 -0
  80. package/dist/src/types.d.ts.map +1 -0
  81. package/dist/src/types.js +2 -0
  82. package/dist/src/types.js.map +1 -0
  83. package/package.json +33 -0
@@ -0,0 +1,192 @@
1
+ const TOKEN_REFRESH_BUFFER_MS = 60_000;
2
+ // Maximum response body size for token endpoint responses (1MB)
3
+ const MAX_TOKEN_RESPONSE_BYTES = 1_048_576;
4
+ export class TokenManager {
5
+ accessToken = null;
6
+ refreshTokenValue = null;
7
+ refreshPromise = null;
8
+ apiUrl;
9
+ apiKey = null;
10
+ constructor(apiUrl) {
11
+ this.apiUrl = apiUrl;
12
+ }
13
+ async initialize(apiKey) {
14
+ this.apiKey = apiKey;
15
+ const res = await fetch(`${this.apiUrl}/api/auth/verify-key`, {
16
+ method: "POST",
17
+ headers: {
18
+ "Content-Type": "application/json",
19
+ "User-Agent": "dominusnode-mcp-server/1.0.0",
20
+ "X-DominusNode-Agent": "mcp", // MCP identification
21
+ },
22
+ body: JSON.stringify({ apiKey }),
23
+ signal: AbortSignal.timeout(30_000),
24
+ redirect: "error", // Reject redirects — prevents credential leakage
25
+ });
26
+ if (!res.ok) {
27
+ // Cancel body instead of buffering — prevents OOM from oversized error response
28
+ await res.body?.cancel();
29
+ throw new Error(`Failed to verify API key (HTTP ${res.status})`);
30
+ }
31
+ // Response size limit to prevent OOM
32
+ const verifyText = await res.text();
33
+ if (verifyText.length > MAX_TOKEN_RESPONSE_BYTES) {
34
+ throw new Error("Token verification response too large");
35
+ }
36
+ // Backend returns { token, refreshToken } — accept both field names
37
+ const data = safeJsonParse(verifyText);
38
+ const accessToken = data.accessToken ?? data.token;
39
+ if (!accessToken) {
40
+ throw new Error("No access token in verify-key response");
41
+ }
42
+ // Route through setTokens to enforce type+length validation
43
+ this.setTokens(accessToken, data.refreshToken);
44
+ }
45
+ isExpired(token) {
46
+ try {
47
+ const parts = token.split(".");
48
+ if (parts.length !== 3)
49
+ return true;
50
+ const payload = JSON.parse(Buffer.from(parts[1].replace(/-/g, "+").replace(/_/g, "/"), "base64").toString());
51
+ // Strip prototype pollution keys from JWT payload
52
+ if (payload && typeof payload === "object") {
53
+ for (const key of ["__proto__", "constructor", "prototype"]) {
54
+ delete payload[key];
55
+ }
56
+ }
57
+ // Validate exp is a finite number — undefined/NaN comparison always returns false
58
+ if (typeof payload.exp !== "number" || !Number.isFinite(payload.exp))
59
+ return true;
60
+ return payload.exp * 1000 < Date.now() + TOKEN_REFRESH_BUFFER_MS;
61
+ }
62
+ catch {
63
+ return true;
64
+ }
65
+ }
66
+ async getValidToken() {
67
+ if (this.accessToken && !this.isExpired(this.accessToken)) {
68
+ return this.accessToken;
69
+ }
70
+ return this.forceRefresh();
71
+ }
72
+ // Rate limit forceRefresh to prevent self-inflicted DDoS
73
+ lastRefreshAttempt = 0;
74
+ static MIN_REFRESH_INTERVAL_MS = 5_000; // 5 seconds between refreshes
75
+ async forceRefresh() {
76
+ if (!this.refreshTokenValue && !this.apiKey) {
77
+ throw new Error("No refresh token or API key available — cannot recover");
78
+ }
79
+ // Prevent refresh amplification — min 5s between attempts
80
+ const now = Date.now();
81
+ if (now - this.lastRefreshAttempt < TokenManager.MIN_REFRESH_INTERVAL_MS) {
82
+ if (this.accessToken)
83
+ return this.accessToken;
84
+ throw new Error("Token refresh rate limited — try again shortly");
85
+ }
86
+ this.lastRefreshAttempt = now;
87
+ if (this.refreshPromise)
88
+ return this.refreshPromise;
89
+ this.refreshPromise = (async () => {
90
+ try {
91
+ // Try refresh token first if available
92
+ if (this.refreshTokenValue) {
93
+ const res = await fetch(`${this.apiUrl}/api/auth/refresh`, {
94
+ method: "POST",
95
+ headers: {
96
+ "Content-Type": "application/json",
97
+ "User-Agent": "dominusnode-mcp-server/1.0.0",
98
+ "X-DominusNode-Agent": "mcp", // MCP identification
99
+ },
100
+ body: JSON.stringify({ refreshToken: this.refreshTokenValue }),
101
+ signal: AbortSignal.timeout(30_000),
102
+ redirect: "error", // Reject redirects
103
+ });
104
+ if (res.ok) {
105
+ const refreshText = await res.text();
106
+ if (refreshText.length > MAX_TOKEN_RESPONSE_BYTES) {
107
+ throw new Error("Token refresh response too large");
108
+ }
109
+ // Backend returns { token, refreshToken } — accept both field names
110
+ const data = safeJsonParse(refreshText);
111
+ const accessToken = data.accessToken ?? data.token;
112
+ if (!accessToken) {
113
+ throw new Error("No access token in refresh response");
114
+ }
115
+ // Route through setTokens to enforce type+length validation
116
+ this.setTokens(accessToken, data.refreshToken ?? this.refreshTokenValue);
117
+ return this.accessToken;
118
+ }
119
+ // Cancel body instead of buffering — prevents OOM from oversized error response
120
+ await res.body?.cancel();
121
+ }
122
+ // Fallback: re-initialize with stored API key
123
+ if (this.apiKey) {
124
+ await this.initialize(this.apiKey);
125
+ return this.accessToken;
126
+ }
127
+ throw new Error("Token refresh failed and no API key available for re-initialization");
128
+ }
129
+ catch (err) {
130
+ // Only null tokens, NOT apiKey — allows future recovery
131
+ this.accessToken = null;
132
+ this.refreshTokenValue = null;
133
+ throw err;
134
+ }
135
+ finally {
136
+ this.refreshPromise = null;
137
+ }
138
+ })();
139
+ return this.refreshPromise;
140
+ }
141
+ /** Store tokens from external auth flow (e.g., registration, wallet auth in bootstrap mode) */
142
+ setTokens(accessToken, refreshToken) {
143
+ // Validate token type and length before storage
144
+ if (typeof accessToken !== "string" || typeof refreshToken !== "string") {
145
+ throw new Error("Tokens must be strings");
146
+ }
147
+ if (!accessToken || !refreshToken) {
148
+ throw new Error("Tokens cannot be empty");
149
+ }
150
+ if (accessToken.length > 10_000 || refreshToken.length > 10_000) {
151
+ throw new Error("Token exceeds maximum length");
152
+ }
153
+ this.accessToken = accessToken;
154
+ this.refreshTokenValue = refreshToken;
155
+ }
156
+ clear() {
157
+ // Best-effort credential clearing. JavaScript strings are immutable and
158
+ // garbage-collected — old values persist in memory until GC reclaims them.
159
+ // True memory zeroing is not possible in Node.js. This is a known limitation.
160
+ // For maximum security, keep token lifetimes short (15min access, 7d refresh).
161
+ this.accessToken = null;
162
+ this.refreshTokenValue = null;
163
+ this.refreshPromise = null;
164
+ this.apiKey = null;
165
+ }
166
+ }
167
+ const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
168
+ // Depth limit prevents stack overflow on deeply nested JSON
169
+ function stripDangerousKeys(obj, depth = 0) {
170
+ if (depth > 50 || !obj || typeof obj !== "object")
171
+ return;
172
+ if (Array.isArray(obj)) {
173
+ for (const item of obj)
174
+ stripDangerousKeys(item, depth + 1);
175
+ return;
176
+ }
177
+ const record = obj;
178
+ for (const key of Object.keys(record)) {
179
+ if (DANGEROUS_KEYS.has(key)) {
180
+ delete record[key];
181
+ }
182
+ else if (record[key] && typeof record[key] === "object") {
183
+ stripDangerousKeys(record[key], depth + 1);
184
+ }
185
+ }
186
+ }
187
+ function safeJsonParse(text) {
188
+ const parsed = JSON.parse(text);
189
+ stripDangerousKeys(parsed);
190
+ return parsed;
191
+ }
192
+ //# sourceMappingURL=token-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/token-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { HttpClient } from "../http-client.js";
3
+ /** @internal Exported for testing only — clears rate limit state */
4
+ export declare function _resetBootstrapSignupLimits(): void;
5
+ export declare function registerAccountTools(server: McpServer, httpClient: HttpClient): void;
6
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/tools/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAUpD,oEAAoE;AACpE,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD;AA+BD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAgVpF"}
@@ -0,0 +1,329 @@
1
+ import { z } from "zod";
2
+ // Stricter rate limit for account creation in bootstrap mode.
3
+ // The backend has per-IP limits (3 accounts/hour) but the MCP server should
4
+ // also limit to prevent a compromised MCP client from spamming registration.
5
+ const BOOTSTRAP_SIGNUP_MAX = 5;
6
+ const BOOTSTRAP_SIGNUP_WINDOW_MS = 3600_000; // 1 hour
7
+ const signupTimestamps = [];
8
+ /** @internal Exported for testing only — clears rate limit state */
9
+ export function _resetBootstrapSignupLimits() {
10
+ signupTimestamps.length = 0;
11
+ loginTimestamps.length = 0;
12
+ }
13
+ // Rate limit login attempts to prevent brute-force via MCP client
14
+ const LOGIN_MAX = 10;
15
+ const LOGIN_WINDOW_MS = 900_000; // 15 minutes
16
+ const loginTimestamps = [];
17
+ function checkLoginLimit() {
18
+ const now = Date.now();
19
+ while (loginTimestamps.length > 0 && now - loginTimestamps[0] > LOGIN_WINDOW_MS) {
20
+ loginTimestamps.shift();
21
+ }
22
+ if (loginTimestamps.length > 100)
23
+ loginTimestamps.length = 100;
24
+ if (loginTimestamps.length >= LOGIN_MAX)
25
+ return false;
26
+ loginTimestamps.push(now);
27
+ return true;
28
+ }
29
+ function checkBootstrapSignupLimit() {
30
+ const now = Date.now();
31
+ // Remove expired entries
32
+ while (signupTimestamps.length > 0 && now - signupTimestamps[0] > BOOTSTRAP_SIGNUP_WINDOW_MS) {
33
+ signupTimestamps.shift();
34
+ }
35
+ // Hard cap prevents unbounded growth under pathological clock skew
36
+ if (signupTimestamps.length > 100)
37
+ signupTimestamps.length = 100;
38
+ if (signupTimestamps.length >= BOOTSTRAP_SIGNUP_MAX)
39
+ return false;
40
+ signupTimestamps.push(now);
41
+ return true;
42
+ }
43
+ export function registerAccountTools(server, httpClient) {
44
+ server.tool("dominusnode_get_account_info", "Get account details including email, admin status, and email verification.", {}, async () => {
45
+ try {
46
+ const info = await httpClient.get("/api/auth/me");
47
+ const user = info.user;
48
+ const text = [
49
+ `User ID: ${user.id}`,
50
+ `Email: ${user.email}`,
51
+ `Email Verified: ${user.email_verified ? "yes" : "no"}`,
52
+ `Admin: ${user.is_admin ? "yes" : "no"}`,
53
+ user.wallet_address ? `Wallet: ${user.wallet_address}` : null,
54
+ ].filter(Boolean).join("\n");
55
+ return { content: [{ type: "text", text }] };
56
+ }
57
+ catch (err) {
58
+ return {
59
+ isError: true,
60
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
61
+ };
62
+ }
63
+ });
64
+ server.tool("dominusnode_register", "Register a new Dominus Node account. Returns access token for immediate use. Use this when the AI agent needs to create its own proxy account. The free tier includes 10 connections and 1GB bandwidth — no payment required.", {
65
+ email: z.string().email().describe("Email address for the new account"),
66
+ password: z.string().min(8).max(128).describe("Password (min 8 characters)"),
67
+ }, async (args) => {
68
+ try {
69
+ if (!checkBootstrapSignupLimit()) {
70
+ return { isError: true, content: [{ type: "text", text: "Account creation rate limit exceeded (max 5 per hour). Please try again later." }] };
71
+ }
72
+ const data = await httpClient.post("/api/auth/register", { email: args.email, password: args.password }, false);
73
+ // Store tokens so subsequent authenticated calls work (bootstrap mode)
74
+ if (data.token && data.refreshToken) {
75
+ httpClient.storeTokens(data.token, data.refreshToken);
76
+ }
77
+ // Email is auto-verified server-side for MCP agents (X-DominusNode-Agent header).
78
+ // Payments (crypto) are immediately available. Stripe requires browser checkout.
79
+ const text = [
80
+ `Account created successfully!`,
81
+ `Email: ${data.user.email}`,
82
+ `User ID: ${data.user.id}`,
83
+ `Email: auto-verified (MCP agent)`,
84
+ ``,
85
+ `You are now authenticated. Crypto payments enabled (11 currencies).`,
86
+ `Next steps:`,
87
+ `1. Use dominusnode_setup to create an account + API key in one step (recommended)`,
88
+ ` Or set DOMINUSNODE_API_KEY and restart to unlock dominusnode_create_key`,
89
+ `2. Free tier: 10 connections, 1GB bandwidth — no payment needed`,
90
+ `3. Use dominusnode_pay_crypto to add funds for premium bandwidth`,
91
+ ].join("\n");
92
+ return { content: [{ type: "text", text }] };
93
+ }
94
+ catch (err) {
95
+ const msg = err instanceof Error ? err.message : String(err);
96
+ // Handle 403 "slots full" — suggest waitlist
97
+ if (msg.includes("403") || msg.toLowerCase().includes("slot") || msg.toLowerCase().includes("capacity")) {
98
+ return {
99
+ isError: true,
100
+ content: [{ type: "text", text: `All alpha registration slots are full.\n\nUse dominusnode_check_slots to see availability, or dominusnode_join_waitlist to get notified when a slot opens.` }],
101
+ };
102
+ }
103
+ return {
104
+ isError: true,
105
+ content: [{ type: "text", text: `Registration error: ${msg}` }],
106
+ };
107
+ }
108
+ });
109
+ server.tool("dominusnode_login", "Login to an existing Dominus Node account with email and password.", {
110
+ email: z.string().email().describe("Account email"),
111
+ password: z.string().min(1).max(128).describe("Account password"),
112
+ }, async (args) => {
113
+ // Rate limit login attempts to prevent brute-force via MCP client
114
+ if (!checkLoginLimit()) {
115
+ return {
116
+ isError: true,
117
+ content: [{ type: "text", text: "Login rate limit exceeded. Try again in 15 minutes." }],
118
+ };
119
+ }
120
+ try {
121
+ const data = await httpClient.post("/api/auth/login", { email: args.email, password: args.password }, false);
122
+ // Store tokens so subsequent authenticated calls work (bootstrap mode)
123
+ if (data.token && data.refreshToken) {
124
+ httpClient.storeTokens(data.token, data.refreshToken);
125
+ }
126
+ const text = [
127
+ `Logged in successfully!`,
128
+ `Email: ${data.user.email}`,
129
+ `User ID: ${data.user.id}`,
130
+ ].join("\n");
131
+ return { content: [{ type: "text", text }] };
132
+ }
133
+ catch (err) {
134
+ return {
135
+ isError: true,
136
+ content: [{ type: "text", text: `Login error: ${err instanceof Error ? err.message : String(err)}` }],
137
+ };
138
+ }
139
+ });
140
+ server.tool("dominusnode_setup", "One-shot setup: register a new account, create an API key, and return proxy config. Perfect for AI agents that need to bootstrap proxy access from scratch.", {
141
+ email: z.string().email().describe("Email address for the new account"),
142
+ password: z.string().min(8).max(128).describe("Password (min 8 characters)"),
143
+ key_label: z.string().min(1).max(100).default("ai-agent").describe("Label for the API key"),
144
+ }, async (args) => {
145
+ try {
146
+ if (!checkBootstrapSignupLimit()) {
147
+ return { isError: true, content: [{ type: "text", text: "Account creation rate limit exceeded (max 5 per hour). Please try again later." }] };
148
+ }
149
+ // Step 1: Register
150
+ // Email is auto-verified server-side for MCP agents (X-DominusNode-Agent header)
151
+ const reg = await httpClient.post("/api/auth/register", { email: args.email, password: args.password }, false);
152
+ // Store tokens from registration so subsequent authenticated calls work (bootstrap mode)
153
+ if (reg.token && reg.refreshToken) {
154
+ httpClient.storeTokens(reg.token, reg.refreshToken);
155
+ }
156
+ // Step 2: Create API key (using the newly acquired auth)
157
+ let keyData;
158
+ try {
159
+ keyData = await httpClient.post("/api/keys", { label: args.key_label });
160
+ }
161
+ catch (keyErr) {
162
+ // Account was created but key creation failed — tell the agent clearly
163
+ const text = [
164
+ `Account created but API key creation failed.`,
165
+ ``,
166
+ `Account:`,
167
+ ` Email: ${reg.user.email}`,
168
+ ` User ID: ${reg.user.id}`,
169
+ ``,
170
+ `You are authenticated. To create an API key:`,
171
+ ` 1. Set DOMINUSNODE_API_KEY env var and restart to unlock dominusnode_create_key`,
172
+ ` 2. Or use dominusnode_login to re-authenticate and retry`,
173
+ ``,
174
+ `Error: ${keyErr instanceof Error ? keyErr.message : String(keyErr)}`,
175
+ ].join("\n");
176
+ return { isError: true, content: [{ type: "text", text }] };
177
+ }
178
+ const text = [
179
+ `Dominus Node account setup complete!`,
180
+ ``,
181
+ `Account:`,
182
+ ` Email: ${reg.user.email}`,
183
+ ` User ID: ${reg.user.id}`,
184
+ ` Email: auto-verified (MCP agent)`,
185
+ ``,
186
+ `API Key (save now — shown only once):`,
187
+ ` Key: ${keyData.key}`,
188
+ ` Label: ${keyData.label}`,
189
+ ``,
190
+ `Proxy Usage:`,
191
+ ` curl -x http://auto:<YOUR_API_KEY>@proxy.dominusnode.com:8080 https://httpbin.org/ip`,
192
+ ``,
193
+ `Free tier: 10 connections, 1GB bandwidth.`,
194
+ `Payments: use dominusnode_pay_crypto to add funds (10 crypto currencies).`,
195
+ `Set DOMINUSNODE_API_KEY=<your key above> and restart to unlock all 56 tools.`,
196
+ ].join("\n");
197
+ return { content: [{ type: "text", text }] };
198
+ }
199
+ catch (err) {
200
+ const msg = err instanceof Error ? err.message : String(err);
201
+ // Handle 403 "slots full" — suggest waitlist
202
+ if (msg.includes("403") || msg.toLowerCase().includes("slot") || msg.toLowerCase().includes("capacity")) {
203
+ return {
204
+ isError: true,
205
+ content: [{ type: "text", text: `All alpha registration slots are full.\n\nUse dominusnode_check_slots to see availability, or dominusnode_join_waitlist to get notified when a slot opens.` }],
206
+ };
207
+ }
208
+ return {
209
+ isError: true,
210
+ content: [{ type: "text", text: `Setup error: ${msg}` }],
211
+ };
212
+ }
213
+ });
214
+ // ─── Password change ──────────────────────────────────────────────
215
+ const PASSWORD_CHANGE_MAX = 5;
216
+ const PASSWORD_CHANGE_WINDOW_MS = 3600_000; // 1 hour
217
+ const passwordChangeTimestamps = [];
218
+ function checkPasswordChangeLimit() {
219
+ const now = Date.now();
220
+ while (passwordChangeTimestamps.length > 0 && now - passwordChangeTimestamps[0] > PASSWORD_CHANGE_WINDOW_MS) {
221
+ passwordChangeTimestamps.shift();
222
+ }
223
+ if (passwordChangeTimestamps.length > 100)
224
+ passwordChangeTimestamps.length = 100;
225
+ if (passwordChangeTimestamps.length >= PASSWORD_CHANGE_MAX)
226
+ return false;
227
+ passwordChangeTimestamps.push(now);
228
+ return true;
229
+ }
230
+ server.tool("dominusnode_update_password", "Change the account password. Requires the current password for verification. Wallet-only accounts cannot use this. All existing API keys and refresh tokens are revoked on success.", {
231
+ current_password: z.string().min(1).max(128).describe("Current account password"),
232
+ new_password: z.string().min(8).max(128).describe("New password (min 8 characters)"),
233
+ }, async (args) => {
234
+ if (!checkPasswordChangeLimit()) {
235
+ return {
236
+ isError: true,
237
+ content: [{ type: "text", text: "Password change rate limit exceeded (max 5 per hour). Please try again later." }],
238
+ };
239
+ }
240
+ try {
241
+ await httpClient.post("/api/auth/change-password", {
242
+ currentPassword: args.current_password,
243
+ newPassword: args.new_password,
244
+ });
245
+ const text = [
246
+ `Password changed successfully.`,
247
+ ``,
248
+ `All existing API keys and refresh tokens have been revoked for security.`,
249
+ `You will need to create new API keys and re-authenticate.`,
250
+ ].join("\n");
251
+ return { content: [{ type: "text", text }] };
252
+ }
253
+ catch (err) {
254
+ return {
255
+ isError: true,
256
+ content: [{ type: "text", text: `Error changing password: ${err instanceof Error ? err.message : String(err)}` }],
257
+ };
258
+ }
259
+ });
260
+ // Rate limit verify_email to prevent brute-force enumeration
261
+ const VERIFY_EMAIL_MAX = 10;
262
+ const VERIFY_EMAIL_WINDOW_MS = 900_000; // 15 minutes
263
+ const verifyEmailTimestamps = [];
264
+ function checkVerifyEmailLimit() {
265
+ const now = Date.now();
266
+ while (verifyEmailTimestamps.length > 0 && now - verifyEmailTimestamps[0] > VERIFY_EMAIL_WINDOW_MS) {
267
+ verifyEmailTimestamps.shift();
268
+ }
269
+ if (verifyEmailTimestamps.length > 100)
270
+ verifyEmailTimestamps.length = 100;
271
+ if (verifyEmailTimestamps.length >= VERIFY_EMAIL_MAX)
272
+ return false;
273
+ verifyEmailTimestamps.push(now);
274
+ return true;
275
+ }
276
+ // Rate limit resend_verification
277
+ const RESEND_MAX = 3;
278
+ const RESEND_WINDOW_MS = 900_000; // 15 minutes
279
+ const resendTimestamps = [];
280
+ function checkResendLimit() {
281
+ const now = Date.now();
282
+ while (resendTimestamps.length > 0 && now - resendTimestamps[0] > RESEND_WINDOW_MS) {
283
+ resendTimestamps.shift();
284
+ }
285
+ if (resendTimestamps.length > 100)
286
+ resendTimestamps.length = 100;
287
+ if (resendTimestamps.length >= RESEND_MAX)
288
+ return false;
289
+ resendTimestamps.push(now);
290
+ return true;
291
+ }
292
+ server.tool("dominusnode_verify_email", "Verify your email address using a verification token. The token is returned when registering via API/MCP. Email verification is required before you can make payments (Stripe or crypto). Wallet-authenticated accounts are auto-verified and do not need this.", {
293
+ token: z.string().min(32).max(128).describe("Email verification token from registration response"),
294
+ }, async (args) => {
295
+ if (!checkVerifyEmailLimit()) {
296
+ return { isError: true, content: [{ type: "text", text: "Email verification rate limit exceeded. Try again in 15 minutes." }] };
297
+ }
298
+ try {
299
+ await httpClient.post("/api/auth/verify-email", { token: args.token }, false);
300
+ return {
301
+ content: [{ type: "text", text: "Email verified successfully! You can now use dominusnode_pay_crypto to add funds to your wallet." }],
302
+ };
303
+ }
304
+ catch (err) {
305
+ return {
306
+ isError: true,
307
+ content: [{ type: "text", text: `Verification failed: ${err instanceof Error ? err.message : String(err)}` }],
308
+ };
309
+ }
310
+ });
311
+ server.tool("dominusnode_resend_verification", "Resend the email verification link. Use this if you registered with email/password but the verification email didn't arrive. Requires authentication (login first).", {}, async () => {
312
+ if (!checkResendLimit()) {
313
+ return { isError: true, content: [{ type: "text", text: "Resend verification rate limit exceeded. Try again in 15 minutes." }] };
314
+ }
315
+ try {
316
+ const data = await httpClient.post("/api/auth/resend-verification", {});
317
+ return {
318
+ content: [{ type: "text", text: data.message }],
319
+ };
320
+ }
321
+ catch (err) {
322
+ return {
323
+ isError: true,
324
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
325
+ };
326
+ }
327
+ });
328
+ }
329
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/tools/account.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,8DAA8D;AAC9D,4EAA4E;AAC5E,6EAA6E;AAC7E,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,0BAA0B,GAAG,QAAQ,CAAC,CAAC,SAAS;AACtD,MAAM,gBAAgB,GAAa,EAAE,CAAC;AAEtC,oEAAoE;AACpE,MAAM,UAAU,2BAA2B;IACzC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,kEAAkE;AAClE,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,aAAa;AAC9C,MAAM,eAAe,GAAa,EAAE,CAAC;AAErC,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,CAAC;QAChF,eAAe,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,GAAG,GAAG;QAAE,eAAe,CAAC,MAAM,GAAG,GAAG,CAAC;IAC/D,IAAI,eAAe,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IACtD,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,yBAAyB;IACzB,OAAO,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,0BAA0B,EAAE,CAAC;QAC7F,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,mEAAmE;IACnE,IAAI,gBAAgB,CAAC,MAAM,GAAG,GAAG;QAAE,gBAAgB,CAAC,MAAM,GAAG,GAAG,CAAC;IACjE,IAAI,gBAAgB,CAAC,MAAM,IAAI,oBAAoB;QAAE,OAAO,KAAK,CAAC;IAClE,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,UAAsB;IAC5E,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B,4EAA4E,EAC5E,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAc,cAAc,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,IAAI,GAAG;gBACX,YAAY,IAAI,CAAC,EAAE,EAAE;gBACrB,UAAU,IAAI,CAAC,KAAK,EAAE;gBACtB,mBAAmB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACvD,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACxC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI;aAC9D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aAChG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,+NAA+N,EAC/N;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACvE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC7E,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;gBACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gFAAgF,EAAE,CAAC,EAAE,CAAC;YAChJ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAChC,oBAAoB,EACpB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAC9C,KAAK,CACN,CAAC;YACF,uEAAuE;YACvE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACxD,CAAC;YAED,kFAAkF;YAClF,iFAAiF;YACjF,MAAM,IAAI,GAAG;gBACX,+BAA+B;gBAC/B,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC3B,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;gBAC1B,kCAAkC;gBAClC,EAAE;gBACF,qEAAqE;gBACrE,aAAa;gBACb,mFAAmF;gBACnF,4EAA4E;gBAC5E,iEAAiE;gBACjE,kEAAkE;aACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,6CAA6C;YAC7C,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxG,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4JAA4J,EAAE,CAAC;iBAChM,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,GAAG,EAAE,EAAE,CAAC;aAChE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,oEAAoE,EACpE;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAClE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,kEAAkE;QAClE,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qDAAqD,EAAE,CAAC;aACzF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAChC,iBAAiB,EACjB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAC9C,KAAK,CACN,CAAC;YACF,uEAAuE;YACvE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,IAAI,GAAG;gBACX,yBAAyB;gBACzB,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC3B,YAAY,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;aAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACtG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,6JAA6J,EAC7J;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACvE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC5E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAC5F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC;gBACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gFAAgF,EAAE,CAAC,EAAE,CAAC;YAChJ,CAAC;YACD,mBAAmB;YACnB,iFAAiF;YACjF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAC/B,oBAAoB,EACpB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAC9C,KAAK,CACN,CAAC;YAEF,yFAAyF;YACzF,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBAClC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;YACtD,CAAC;YAED,yDAAyD;YACzD,IAAI,OAAmD,CAAC;YACxD,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAC7B,WAAW,EACX,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAC1B,CAAC;YACJ,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,uEAAuE;gBACvE,MAAM,IAAI,GAAG;oBACX,8CAA8C;oBAC9C,EAAE;oBACF,UAAU;oBACV,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;oBAC5B,cAAc,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;oBAC3B,EAAE;oBACF,8CAA8C;oBAC9C,mFAAmF;oBACnF,4DAA4D;oBAC5D,EAAE;oBACF,UAAU,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;iBACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,CAAC;YAED,MAAM,IAAI,GAAG;gBACX,sCAAsC;gBACtC,EAAE;gBACF,UAAU;gBACV,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC5B,cAAc,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;gBAC3B,oCAAoC;gBACpC,EAAE;gBACF,uCAAuC;gBACvC,UAAU,OAAO,CAAC,GAAG,EAAE;gBACvB,YAAY,OAAO,CAAC,KAAK,EAAE;gBAC3B,EAAE;gBACF,cAAc;gBACd,wFAAwF;gBACxF,EAAE;gBACF,2CAA2C;gBAC3C,2EAA2E;gBAC3E,8EAA8E;aAC/E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,6CAA6C;YAC7C,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxG,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4JAA4J,EAAE,CAAC;iBAChM,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,EAAE,EAAE,CAAC;aACzD,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,mBAAmB,GAAG,CAAC,CAAC;IAC9B,MAAM,yBAAyB,GAAG,QAAQ,CAAC,CAAC,SAAS;IACrD,MAAM,wBAAwB,GAAa,EAAE,CAAC;IAC9C,SAAS,wBAAwB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,wBAAwB,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,yBAAyB,EAAE,CAAC;YAC5G,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC;QACD,IAAI,wBAAwB,CAAC,MAAM,GAAG,GAAG;YAAE,wBAAwB,CAAC,MAAM,GAAG,GAAG,CAAC;QACjF,IAAI,wBAAwB,CAAC,MAAM,IAAI,mBAAmB;YAAE,OAAO,KAAK,CAAC;QACzE,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,qLAAqL,EACrL;QACE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACjF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KACrF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+EAA+E,EAAE,CAAC;aACnH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACjD,eAAe,EAAE,IAAI,CAAC,gBAAgB;gBACtC,WAAW,EAAE,IAAI,CAAC,YAAY;aAC/B,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG;gBACX,gCAAgC;gBAChC,EAAE;gBACF,0EAA0E;gBAC1E,2DAA2D;aAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aAClH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,gBAAgB,GAAG,EAAE,CAAC;IAC5B,MAAM,sBAAsB,GAAG,OAAO,CAAC,CAAC,aAAa;IACrD,MAAM,qBAAqB,GAAa,EAAE,CAAC;IAC3C,SAAS,qBAAqB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,qBAAqB,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,sBAAsB,EAAE,CAAC;YACnG,qBAAqB,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,qBAAqB,CAAC,MAAM,GAAG,GAAG;YAAE,qBAAqB,CAAC,MAAM,GAAG,GAAG,CAAC;QAC3E,IAAI,qBAAqB,CAAC,MAAM,IAAI,gBAAgB;YAAE,OAAO,KAAK,CAAC;QACnE,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iCAAiC;IACjC,MAAM,UAAU,GAAG,CAAC,CAAC;IACrB,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,aAAa;IAC/C,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,SAAS,gBAAgB;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,EAAE,CAAC;YACnF,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,GAAG;YAAE,gBAAgB,CAAC,MAAM,GAAG,GAAG,CAAC;QACjE,IAAI,gBAAgB,CAAC,MAAM,IAAI,UAAU;YAAE,OAAO,KAAK,CAAC;QACxD,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,iQAAiQ,EACjQ;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KACnG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kEAAkE,EAAE,CAAC,EAAE,CAAC;QAClI,CAAC;QACD,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kGAAkG,EAAE,CAAC;aACtI,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aAC9G,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,qKAAqK,EACrK,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mEAAmE,EAAE,CAAC,EAAE,CAAC;QACnI,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAsB,+BAA+B,EAAE,EAAE,CAAC,CAAC;YAC7F,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aAChG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { HttpClient } from "../http-client.js";
3
+ import type { McpConfig } from "../config.js";
4
+ export declare function registerAgentWalletTools(server: McpServer, httpClient: HttpClient, config: McpConfig): void;
5
+ //# sourceMappingURL=agent-wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-wallet.d.ts","sourceRoot":"","sources":["../../../src/tools/agent-wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAmB9C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAmf3G"}