@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,520 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
|
+
const TEAMS_RATE_MAX = 20;
|
|
4
|
+
const TEAMS_RATE_WINDOW_MS = 60_000;
|
|
5
|
+
const teamsTimestamps = [];
|
|
6
|
+
function checkTeamsRateLimit() {
|
|
7
|
+
const now = Date.now();
|
|
8
|
+
while (teamsTimestamps.length > 0 && now - teamsTimestamps[0] > TEAMS_RATE_WINDOW_MS) {
|
|
9
|
+
teamsTimestamps.shift();
|
|
10
|
+
}
|
|
11
|
+
if (teamsTimestamps.length > 100)
|
|
12
|
+
teamsTimestamps.length = 100;
|
|
13
|
+
if (teamsTimestamps.length >= TEAMS_RATE_MAX)
|
|
14
|
+
return false;
|
|
15
|
+
teamsTimestamps.push(now);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
export function registerTeamsTools(server, httpClient) {
|
|
19
|
+
server.tool("dominusnode_create_team", "Create a new team. Teams share a wallet and API keys. Optionally set a max member limit.", {
|
|
20
|
+
name: z.string().min(1).max(100).describe("Team name"),
|
|
21
|
+
max_members: z.number().int().min(1).max(100).optional().describe("Maximum number of team members (default: no limit)"),
|
|
22
|
+
}, async (args) => {
|
|
23
|
+
try {
|
|
24
|
+
if (!checkTeamsRateLimit()) {
|
|
25
|
+
return {
|
|
26
|
+
isError: true,
|
|
27
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const body = { name: args.name };
|
|
31
|
+
if (args.max_members !== undefined) {
|
|
32
|
+
body.maxMembers = args.max_members;
|
|
33
|
+
}
|
|
34
|
+
const data = await httpClient.post("/api/teams", body);
|
|
35
|
+
const text = [
|
|
36
|
+
`Team Created`,
|
|
37
|
+
``,
|
|
38
|
+
`Team ID: ${data.id}`,
|
|
39
|
+
`Name: ${data.name}`,
|
|
40
|
+
`Max Members: ${data.maxMembers ?? "Unlimited"}`,
|
|
41
|
+
`Balance: $${((data.balanceCents ?? 0) / 100).toFixed(2)}`,
|
|
42
|
+
`Created: ${data.createdAt}`,
|
|
43
|
+
``,
|
|
44
|
+
`Next steps:`,
|
|
45
|
+
` 1. Use dominusnode_team_add_member to invite members by email`,
|
|
46
|
+
` 2. Use dominusnode_team_fund to add funds from your personal wallet`,
|
|
47
|
+
` 3. Use dominusnode_team_create_key to create a shared API key`,
|
|
48
|
+
].join("\n");
|
|
49
|
+
return { content: [{ type: "text", text }] };
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return {
|
|
53
|
+
isError: true,
|
|
54
|
+
content: [{ type: "text", text: `Error creating team: ${err instanceof Error ? err.message : String(err)}` }],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
server.tool("dominusnode_list_teams", "List all teams you belong to, with roles and balances.", {}, async () => {
|
|
59
|
+
try {
|
|
60
|
+
const data = await httpClient.get("/api/teams");
|
|
61
|
+
if (data.teams.length === 0) {
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: "text", text: "No teams found. Use dominusnode_create_team to create one." }],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const lines = [
|
|
67
|
+
`Teams (${data.teams.length})`,
|
|
68
|
+
``,
|
|
69
|
+
];
|
|
70
|
+
for (const t of data.teams) {
|
|
71
|
+
lines.push(` ${t.name} (${t.id.slice(0, 8)}...)`);
|
|
72
|
+
lines.push(` Role: ${t.role} | Balance: $${(t.balanceCents / 100).toFixed(2)}`);
|
|
73
|
+
lines.push(``);
|
|
74
|
+
}
|
|
75
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return {
|
|
79
|
+
isError: true,
|
|
80
|
+
content: [{ type: "text", text: `Error listing teams: ${err instanceof Error ? err.message : String(err)}` }],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
server.tool("dominusnode_team_details", "Get detailed info about a team including balance, members, and settings.", {
|
|
85
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
86
|
+
}, async (args) => {
|
|
87
|
+
try {
|
|
88
|
+
const data = await httpClient.get(`/api/teams/${encodeURIComponent(args.team_id)}`);
|
|
89
|
+
const lines = [
|
|
90
|
+
`Team: ${data.name}`,
|
|
91
|
+
``,
|
|
92
|
+
`Team ID: ${data.id}`,
|
|
93
|
+
`Owner: ${data.ownerId}`,
|
|
94
|
+
`Status: ${data.status}`,
|
|
95
|
+
`Your Role: ${data.role}`,
|
|
96
|
+
`Balance: $${(data.balanceCents / 100).toFixed(2)}`,
|
|
97
|
+
`Max Members: ${data.maxMembers ?? "Unlimited"}`,
|
|
98
|
+
`Created: ${data.createdAt}`,
|
|
99
|
+
``,
|
|
100
|
+
`Use dominusnode_team_list_members to view members.`,
|
|
101
|
+
];
|
|
102
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return {
|
|
106
|
+
isError: true,
|
|
107
|
+
content: [{ type: "text", text: `Error fetching team details: ${err instanceof Error ? err.message : String(err)}` }],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
server.tool("dominusnode_team_update", "Update a team's name or max member limit. Only team owners and admins can update team settings.", {
|
|
112
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
113
|
+
name: z.string().min(1).max(100).optional().describe("New team name"),
|
|
114
|
+
max_members: z.number().int().min(1).max(100).optional().describe("New maximum member limit"),
|
|
115
|
+
}, async (args) => {
|
|
116
|
+
try {
|
|
117
|
+
if (!checkTeamsRateLimit()) {
|
|
118
|
+
return {
|
|
119
|
+
isError: true,
|
|
120
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const body = {};
|
|
124
|
+
if (args.name !== undefined)
|
|
125
|
+
body.name = args.name;
|
|
126
|
+
if (args.max_members !== undefined)
|
|
127
|
+
body.maxMembers = args.max_members;
|
|
128
|
+
if (Object.keys(body).length === 0) {
|
|
129
|
+
return {
|
|
130
|
+
isError: true,
|
|
131
|
+
content: [{ type: "text", text: "No updates provided. Specify name and/or max_members to update." }],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const data = await httpClient.patch(`/api/teams/${encodeURIComponent(args.team_id)}`, body);
|
|
135
|
+
const text = [
|
|
136
|
+
`Team Updated`,
|
|
137
|
+
``,
|
|
138
|
+
`Team ID: ${data.id}`,
|
|
139
|
+
`Name: ${data.name}`,
|
|
140
|
+
`Max Members: ${data.maxMembers ?? "Unlimited"}`,
|
|
141
|
+
`Status: ${data.status}`,
|
|
142
|
+
].join("\n");
|
|
143
|
+
return { content: [{ type: "text", text }] };
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
return {
|
|
147
|
+
isError: true,
|
|
148
|
+
content: [{ type: "text", text: `Error updating team: ${err instanceof Error ? err.message : String(err)}` }],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
server.tool("dominusnode_team_update_member_role", "Change a team member's role. Only team owners can change roles. Cannot change the owner's role or your own role.", {
|
|
153
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
154
|
+
user_id: z.string().regex(UUID_RE).describe("User ID of the member to update"),
|
|
155
|
+
role: z.enum(["member", "admin"]).describe("New role: 'admin' or 'member'"),
|
|
156
|
+
}, async (args) => {
|
|
157
|
+
try {
|
|
158
|
+
if (!checkTeamsRateLimit()) {
|
|
159
|
+
return {
|
|
160
|
+
isError: true,
|
|
161
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const data = await httpClient.patch(`/api/teams/${encodeURIComponent(args.team_id)}/members/${encodeURIComponent(args.user_id)}`, {
|
|
165
|
+
role: args.role,
|
|
166
|
+
});
|
|
167
|
+
const text = `Member ${data.userId} role updated to '${data.role}' in team ${data.teamId}.`;
|
|
168
|
+
return { content: [{ type: "text", text }] };
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return {
|
|
172
|
+
isError: true,
|
|
173
|
+
content: [{ type: "text", text: `Error updating member role: ${err instanceof Error ? err.message : String(err)}` }],
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
server.tool("dominusnode_team_add_member", "Add a member to a team by their email address. Optionally assign a role (default: member).", {
|
|
178
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
179
|
+
email: z.string().email().describe("Email address of the user to add"),
|
|
180
|
+
role: z.enum(["member", "admin"]).optional().describe("Role to assign: 'admin' or 'member'. Default: 'member'"),
|
|
181
|
+
}, async (args) => {
|
|
182
|
+
try {
|
|
183
|
+
if (!checkTeamsRateLimit()) {
|
|
184
|
+
return {
|
|
185
|
+
isError: true,
|
|
186
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const body = { email: args.email };
|
|
190
|
+
if (args.role !== undefined) {
|
|
191
|
+
body.role = args.role;
|
|
192
|
+
}
|
|
193
|
+
const data = await httpClient.post(`/api/teams/${encodeURIComponent(args.team_id)}/members`, body);
|
|
194
|
+
const text = `Member added to team ${args.team_id}\nMember ID: ${data.id}\nUser ID: ${data.userId}\nRole: ${data.role}\nJoined: ${data.joinedAt}`;
|
|
195
|
+
return { content: [{ type: "text", text }] };
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
return {
|
|
199
|
+
isError: true,
|
|
200
|
+
content: [{ type: "text", text: `Error adding member: ${err instanceof Error ? err.message : String(err)}` }],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
server.tool("dominusnode_team_remove_member", "Remove a member from a team by their user ID.", {
|
|
205
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
206
|
+
user_id: z.string().regex(UUID_RE).describe("User ID of the member to remove"),
|
|
207
|
+
}, async (args) => {
|
|
208
|
+
try {
|
|
209
|
+
if (!checkTeamsRateLimit()) {
|
|
210
|
+
return {
|
|
211
|
+
isError: true,
|
|
212
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
await httpClient.delete(`/api/teams/${encodeURIComponent(args.team_id)}/members/${encodeURIComponent(args.user_id)}`);
|
|
216
|
+
const text = `Member ${args.user_id} removed from team ${args.team_id} successfully.`;
|
|
217
|
+
return { content: [{ type: "text", text }] };
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
return {
|
|
221
|
+
isError: true,
|
|
222
|
+
content: [{ type: "text", text: `Error removing member: ${err instanceof Error ? err.message : String(err)}` }],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
server.tool("dominusnode_team_fund", "Transfer funds from your personal wallet to a team wallet. Minimum $1, maximum $10,000.", {
|
|
227
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID to fund"),
|
|
228
|
+
amount_cents: z.number().int().min(100).max(1000000).describe("Amount in cents to transfer (min $1, max $10,000)"),
|
|
229
|
+
}, async (args) => {
|
|
230
|
+
try {
|
|
231
|
+
if (!checkTeamsRateLimit()) {
|
|
232
|
+
return {
|
|
233
|
+
isError: true,
|
|
234
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const data = await httpClient.post(`/api/teams/${encodeURIComponent(args.team_id)}/wallet/fund`, {
|
|
238
|
+
amountCents: args.amount_cents,
|
|
239
|
+
});
|
|
240
|
+
const tx = data.transaction;
|
|
241
|
+
const text = [
|
|
242
|
+
`Team Funded Successfully`,
|
|
243
|
+
``,
|
|
244
|
+
`Transaction ID: ${tx.id}`,
|
|
245
|
+
`Amount: $${(tx.amountCents / 100).toFixed(2)}`,
|
|
246
|
+
`Type: ${tx.type}`,
|
|
247
|
+
`Wallet ID: ${tx.walletId}`,
|
|
248
|
+
``,
|
|
249
|
+
`The funds have been transferred from your personal wallet.`,
|
|
250
|
+
`Use dominusnode_team_details to check the new team balance.`,
|
|
251
|
+
].join("\n");
|
|
252
|
+
return { content: [{ type: "text", text }] };
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
return {
|
|
256
|
+
isError: true,
|
|
257
|
+
content: [{ type: "text", text: `Error funding team: ${err instanceof Error ? err.message : String(err)}` }],
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
server.tool("dominusnode_team_create_key", "Create a shared API key for a team. All team members can use team keys for proxy access.", {
|
|
262
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
263
|
+
label: z.string().min(1).max(100).describe("Label for the API key (e.g., 'production', 'staging')"),
|
|
264
|
+
}, async (args) => {
|
|
265
|
+
try {
|
|
266
|
+
if (!checkTeamsRateLimit()) {
|
|
267
|
+
return {
|
|
268
|
+
isError: true,
|
|
269
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
const data = await httpClient.post(`/api/teams/${encodeURIComponent(args.team_id)}/keys`, {
|
|
273
|
+
label: args.label,
|
|
274
|
+
});
|
|
275
|
+
const text = [
|
|
276
|
+
`Team API Key Created`,
|
|
277
|
+
``,
|
|
278
|
+
`Key ID: ${data.id}`,
|
|
279
|
+
`API Key: ${data.key}`,
|
|
280
|
+
`Prefix: ${data.prefix}`,
|
|
281
|
+
`Label: ${data.label}`,
|
|
282
|
+
`Team ID: ${args.team_id}`,
|
|
283
|
+
`Created: ${data.createdAt}`,
|
|
284
|
+
``,
|
|
285
|
+
`IMPORTANT: Save this API key now — it will not be shown again.`,
|
|
286
|
+
`Usage is billed against the team wallet.`,
|
|
287
|
+
].join("\n");
|
|
288
|
+
return { content: [{ type: "text", text }] };
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
return {
|
|
292
|
+
isError: true,
|
|
293
|
+
content: [{ type: "text", text: `Error creating team key: ${err instanceof Error ? err.message : String(err)}` }],
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
server.tool("dominusnode_team_revoke_key", "Revoke a team API key. Only team owners and admins can revoke keys. The key will immediately stop working.", {
|
|
298
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
299
|
+
key_id: z.string().regex(UUID_RE).describe("API key ID to revoke"),
|
|
300
|
+
}, async (args) => {
|
|
301
|
+
try {
|
|
302
|
+
if (!checkTeamsRateLimit()) {
|
|
303
|
+
return {
|
|
304
|
+
isError: true,
|
|
305
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
await httpClient.delete(`/api/teams/${encodeURIComponent(args.team_id)}/keys/${encodeURIComponent(args.key_id)}`);
|
|
309
|
+
const text = `Team API key ${args.key_id} has been revoked and will no longer work for proxy access.`;
|
|
310
|
+
return { content: [{ type: "text", text }] };
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
return {
|
|
314
|
+
isError: true,
|
|
315
|
+
content: [{ type: "text", text: `Error revoking team key: ${err instanceof Error ? err.message : String(err)}` }],
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
server.tool("dominusnode_team_usage", "Get the team wallet transaction history (funding, usage charges, refunds).", {
|
|
320
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
321
|
+
limit: z.number().int().min(1).max(100).default(20).describe("Number of transactions to return"),
|
|
322
|
+
}, async (args) => {
|
|
323
|
+
try {
|
|
324
|
+
const data = await httpClient.get(`/api/teams/${encodeURIComponent(args.team_id)}/wallet/transactions?limit=${args.limit}`);
|
|
325
|
+
if (data.transactions.length === 0) {
|
|
326
|
+
return {
|
|
327
|
+
content: [{ type: "text", text: "No transactions found for this team. Use dominusnode_team_fund to add funds." }],
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const lines = [
|
|
331
|
+
`Team Transactions (${data.transactions.length})`,
|
|
332
|
+
``,
|
|
333
|
+
];
|
|
334
|
+
for (const tx of data.transactions) {
|
|
335
|
+
const sign = tx.type === "fund" || tx.type === "refund" ? "+" : "-";
|
|
336
|
+
lines.push(` ${sign}$${(tx.amountCents / 100).toFixed(2)} [${tx.type}] ${tx.description}`);
|
|
337
|
+
lines.push(` ${tx.createdAt} | Wallet: ${tx.walletId.slice(0, 8)}...`);
|
|
338
|
+
}
|
|
339
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
return {
|
|
343
|
+
isError: true,
|
|
344
|
+
content: [{ type: "text", text: `Error fetching team transactions: ${err instanceof Error ? err.message : String(err)}` }],
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
server.tool("dominusnode_team_list_members", "List all members of a team with their roles and join dates.", {
|
|
349
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
350
|
+
}, async (args) => {
|
|
351
|
+
try {
|
|
352
|
+
const data = await httpClient.get(`/api/teams/${encodeURIComponent(args.team_id)}/members`);
|
|
353
|
+
if (data.members.length === 0) {
|
|
354
|
+
return {
|
|
355
|
+
content: [{ type: "text", text: "No members found for this team. Use dominusnode_team_add_member or dominusnode_team_invite_member to add members." }],
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
const lines = [
|
|
359
|
+
`Team Members (${data.members.length})`,
|
|
360
|
+
``,
|
|
361
|
+
];
|
|
362
|
+
for (const m of data.members) {
|
|
363
|
+
lines.push(` ${m.email} (${m.userId.slice(0, 8)}...)`);
|
|
364
|
+
lines.push(` Role: ${m.role} | Joined: ${m.joinedAt}`);
|
|
365
|
+
lines.push(``);
|
|
366
|
+
}
|
|
367
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
368
|
+
}
|
|
369
|
+
catch (err) {
|
|
370
|
+
return {
|
|
371
|
+
isError: true,
|
|
372
|
+
content: [{ type: "text", text: `Error listing team members: ${err instanceof Error ? err.message : String(err)}` }],
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
server.tool("dominusnode_team_invite_member", "Send an email invitation to join a team. The invited user will receive an email with a link to accept. Only team owners and admins can send invites.", {
|
|
377
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
378
|
+
email: z.string().email().describe("Email address of the person to invite"),
|
|
379
|
+
role: z.enum(["member", "admin"]).default("member").describe("Role to assign when they accept: 'admin' or 'member'. Default: 'member'"),
|
|
380
|
+
}, async (args) => {
|
|
381
|
+
try {
|
|
382
|
+
if (!checkTeamsRateLimit()) {
|
|
383
|
+
return {
|
|
384
|
+
isError: true,
|
|
385
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
const data = await httpClient.post(`/api/teams/${encodeURIComponent(args.team_id)}/invites`, {
|
|
389
|
+
email: args.email,
|
|
390
|
+
role: args.role,
|
|
391
|
+
});
|
|
392
|
+
const text = [
|
|
393
|
+
`Team Invite Sent`,
|
|
394
|
+
``,
|
|
395
|
+
`Invite ID: ${data.id}`,
|
|
396
|
+
`Email: ${data.email}`,
|
|
397
|
+
`Role: ${data.role}`,
|
|
398
|
+
`Expires: ${data.expiresAt}`,
|
|
399
|
+
`Created: ${data.createdAt}`,
|
|
400
|
+
``,
|
|
401
|
+
`An invitation email has been sent. The invite expires in 7 days.`,
|
|
402
|
+
`Use dominusnode_team_list_invites to see all pending invites.`,
|
|
403
|
+
].join("\n");
|
|
404
|
+
return { content: [{ type: "text", text }] };
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
return {
|
|
408
|
+
isError: true,
|
|
409
|
+
content: [{ type: "text", text: `Error sending invite: ${err instanceof Error ? err.message : String(err)}` }],
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
server.tool("dominusnode_team_list_invites", "List all pending invitations for a team. Shows invited email, role, and expiration.", {
|
|
414
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
415
|
+
}, async (args) => {
|
|
416
|
+
try {
|
|
417
|
+
const data = await httpClient.get(`/api/teams/${encodeURIComponent(args.team_id)}/invites`);
|
|
418
|
+
if (data.invites.length === 0) {
|
|
419
|
+
return {
|
|
420
|
+
content: [{ type: "text", text: "No pending invites for this team. Use dominusnode_team_invite_member to send invitations." }],
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
const lines = [
|
|
424
|
+
`Pending Invites (${data.invites.length})`,
|
|
425
|
+
``,
|
|
426
|
+
];
|
|
427
|
+
for (const inv of data.invites) {
|
|
428
|
+
lines.push(` ${inv.email} — ${inv.role}`);
|
|
429
|
+
lines.push(` Invite ID: ${inv.id}`);
|
|
430
|
+
lines.push(` Invited by: ${inv.invitedBy.slice(0, 8)}... | Expires: ${inv.expiresAt}`);
|
|
431
|
+
lines.push(``);
|
|
432
|
+
}
|
|
433
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
434
|
+
}
|
|
435
|
+
catch (err) {
|
|
436
|
+
return {
|
|
437
|
+
isError: true,
|
|
438
|
+
content: [{ type: "text", text: `Error listing invites: ${err instanceof Error ? err.message : String(err)}` }],
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
server.tool("dominusnode_team_cancel_invite", "Cancel a pending team invitation. Only team owners and admins can cancel invites.", {
|
|
443
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
444
|
+
invite_id: z.string().regex(UUID_RE).describe("Invite ID to cancel"),
|
|
445
|
+
}, async (args) => {
|
|
446
|
+
try {
|
|
447
|
+
if (!checkTeamsRateLimit()) {
|
|
448
|
+
return {
|
|
449
|
+
isError: true,
|
|
450
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
await httpClient.delete(`/api/teams/${encodeURIComponent(args.team_id)}/invites/${encodeURIComponent(args.invite_id)}`);
|
|
454
|
+
const text = `Invite ${args.invite_id} has been cancelled. The invited user can no longer accept it.`;
|
|
455
|
+
return { content: [{ type: "text", text }] };
|
|
456
|
+
}
|
|
457
|
+
catch (err) {
|
|
458
|
+
return {
|
|
459
|
+
isError: true,
|
|
460
|
+
content: [{ type: "text", text: `Error cancelling invite: ${err instanceof Error ? err.message : String(err)}` }],
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
server.tool("dominusnode_team_list_keys", "List all API keys for a team. Shows key prefix, label, and creation date.", {
|
|
465
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID"),
|
|
466
|
+
}, async (args) => {
|
|
467
|
+
try {
|
|
468
|
+
const data = await httpClient.get(`/api/teams/${encodeURIComponent(args.team_id)}/keys`);
|
|
469
|
+
if (data.keys.length === 0) {
|
|
470
|
+
return {
|
|
471
|
+
content: [{ type: "text", text: "No API keys found for this team. Use dominusnode_team_create_key to create one." }],
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
const lines = [
|
|
475
|
+
`Team API Keys (${data.keys.length})`,
|
|
476
|
+
``,
|
|
477
|
+
];
|
|
478
|
+
for (const k of data.keys) {
|
|
479
|
+
lines.push(` ${k.prefix}... — ${k.label}`);
|
|
480
|
+
lines.push(` Key ID: ${k.id} | Created: ${k.createdAt}`);
|
|
481
|
+
lines.push(``);
|
|
482
|
+
}
|
|
483
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
484
|
+
}
|
|
485
|
+
catch (err) {
|
|
486
|
+
return {
|
|
487
|
+
isError: true,
|
|
488
|
+
content: [{ type: "text", text: `Error listing team keys: ${err instanceof Error ? err.message : String(err)}` }],
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
server.tool("dominusnode_team_delete", "Delete a team. Only the team owner can delete a team. Any remaining balance in the team wallet is refunded to the owner's personal wallet. All team members, keys, and invites are removed.", {
|
|
493
|
+
team_id: z.string().regex(UUID_RE).describe("Team ID to delete"),
|
|
494
|
+
}, async (args) => {
|
|
495
|
+
try {
|
|
496
|
+
if (!checkTeamsRateLimit()) {
|
|
497
|
+
return {
|
|
498
|
+
isError: true,
|
|
499
|
+
content: [{ type: "text", text: "Rate limit exceeded: maximum 20 team operations per minute. Please wait before retrying." }],
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
const data = await httpClient.delete(`/api/teams/${encodeURIComponent(args.team_id)}`);
|
|
503
|
+
const text = [
|
|
504
|
+
`Team Deleted`,
|
|
505
|
+
``,
|
|
506
|
+
`Refunded: $${(data.refundedCents / 100).toFixed(2)} to your personal wallet`,
|
|
507
|
+
``,
|
|
508
|
+
`The team, all its members, API keys, and invites have been removed.`,
|
|
509
|
+
].join("\n");
|
|
510
|
+
return { content: [{ type: "text", text }] };
|
|
511
|
+
}
|
|
512
|
+
catch (err) {
|
|
513
|
+
return {
|
|
514
|
+
isError: true,
|
|
515
|
+
content: [{ type: "text", text: `Error deleting team: ${err instanceof Error ? err.message : String(err)}` }],
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=teams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../../src/tools/teams.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/tools/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAUpD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAuFlF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
function formatBytes(bytes) {
|
|
3
|
+
if (bytes < 1024)
|
|
4
|
+
return `${bytes} B`;
|
|
5
|
+
if (bytes < 1024 * 1024)
|
|
6
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
7
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
8
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
9
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(3)} GB`;
|
|
10
|
+
}
|
|
11
|
+
export function registerUsageTools(server, httpClient) {
|
|
12
|
+
server.tool("dominusnode_get_usage", "Get bandwidth usage summary for a time period. Shows total bytes, cost, and request count.", {
|
|
13
|
+
days: z.number().min(1).max(365).default(30).describe("Number of days to look back"),
|
|
14
|
+
}, async (args) => {
|
|
15
|
+
try {
|
|
16
|
+
const since = new Date(Date.now() - args.days * 24 * 60 * 60 * 1000).toISOString();
|
|
17
|
+
const until = new Date().toISOString();
|
|
18
|
+
const data = await httpClient.get(`/api/usage?since=${encodeURIComponent(since)}&until=${encodeURIComponent(until)}`);
|
|
19
|
+
const usage = data.summary;
|
|
20
|
+
const text = [
|
|
21
|
+
`Usage Summary (last ${args.days} days):`,
|
|
22
|
+
`Total Bandwidth: ${formatBytes(usage.totalBytes)}`,
|
|
23
|
+
`Total Cost: $${usage.totalCostUsd.toFixed(2)}`,
|
|
24
|
+
`Total Requests: ${usage.requestCount}`,
|
|
25
|
+
].join("\n");
|
|
26
|
+
return { content: [{ type: "text", text }] };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return {
|
|
30
|
+
isError: true,
|
|
31
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
server.tool("dominusnode_get_daily_usage", "Get daily bandwidth breakdown showing bytes, cost, and requests per day.", {
|
|
36
|
+
days: z.number().min(1).max(90).default(7).describe("Number of days"),
|
|
37
|
+
}, async (args) => {
|
|
38
|
+
try {
|
|
39
|
+
const since = new Date(Date.now() - args.days * 24 * 60 * 60 * 1000).toISOString();
|
|
40
|
+
const until = new Date().toISOString();
|
|
41
|
+
const data = await httpClient.get(`/api/usage/daily?since=${encodeURIComponent(since)}&until=${encodeURIComponent(until)}`);
|
|
42
|
+
if (!data.days || data.days.length === 0) {
|
|
43
|
+
return { content: [{ type: "text", text: "No usage data for this period." }] };
|
|
44
|
+
}
|
|
45
|
+
const header = "Date | Bandwidth | Cost | Requests";
|
|
46
|
+
const lines = data.days.map((d) => `${d.date} | ${formatBytes(d.totalBytes).padEnd(14)} | $${d.totalCostUsd.toFixed(2).padStart(5)} | ${d.requestCount}`);
|
|
47
|
+
return { content: [{ type: "text", text: [header, ...lines].join("\n") }] };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return {
|
|
51
|
+
isError: true,
|
|
52
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
server.tool("dominusnode_get_top_hosts", "Get top target hosts by bandwidth usage. Useful for understanding which sites consume the most data.", {
|
|
57
|
+
limit: z.number().min(1).max(50).default(10).describe("Number of top hosts to return"),
|
|
58
|
+
days: z.number().min(1).max(365).default(30).describe("Number of days"),
|
|
59
|
+
}, async (args) => {
|
|
60
|
+
try {
|
|
61
|
+
const since = new Date(Date.now() - args.days * 24 * 60 * 60 * 1000).toISOString();
|
|
62
|
+
const until = new Date().toISOString();
|
|
63
|
+
const data = await httpClient.get(`/api/usage/top-hosts?limit=${args.limit}&since=${encodeURIComponent(since)}&until=${encodeURIComponent(until)}`);
|
|
64
|
+
if (!data.hosts || data.hosts.length === 0) {
|
|
65
|
+
return { content: [{ type: "text", text: "No host data for this period." }] };
|
|
66
|
+
}
|
|
67
|
+
const header = "Host | Bandwidth | Requests";
|
|
68
|
+
const lines = data.hosts.map((h) => `${h.targetHost.padEnd(28)} | ${formatBytes(h.totalBytes).padEnd(14)} | ${h.requestCount}`);
|
|
69
|
+
return { content: [{ type: "text", text: [header, ...lines].join("\n") }] };
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return {
|
|
73
|
+
isError: true,
|
|
74
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=usage.js.map
|