@clawrent/mcp-server 0.1.1 → 0.3.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 ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 ClawRent
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ PERFORMANCE OF THIS SOFTWARE.
package/dist/index.js CHANGED
@@ -138,7 +138,13 @@ var ProviderAgent = class extends EventEmitter {
138
138
  const sessionToken = payload["sessionToken"];
139
139
  const taskDescription = payload["taskDescription"] || "";
140
140
  const consumerUserId = payload["consumerUserId"];
141
- const session = { sessionId, sessionToken, taskDescription, consumerUserId };
141
+ const session = {
142
+ sessionId,
143
+ sessionToken,
144
+ taskDescription,
145
+ consumerUserId,
146
+ slotIndex: payload["slotIndex"] ?? 0
147
+ };
142
148
  this.activeSessions.set(sessionId, session);
143
149
  this.emit("session:new", session);
144
150
  if (this.autoApprove) {
@@ -160,17 +166,65 @@ var ProviderAgent = class extends EventEmitter {
160
166
  }
161
167
  };
162
168
 
163
- // src/tools/consumer-tools.ts
169
+ // src/tools/auth-tools.ts
164
170
  import { z } from "zod";
171
+ function registerAuthTools(server, client) {
172
+ server.tool(
173
+ "clawrent_send_verification",
174
+ "Send email verification code for registration",
175
+ {
176
+ email: z.string().email().describe("Email address to verify")
177
+ },
178
+ async ({ email }) => {
179
+ const result = await client.sendVerification(email);
180
+ return {
181
+ content: [{ type: "text", text: JSON.stringify({ email, sent: true, ...result }, null, 2) }]
182
+ };
183
+ }
184
+ );
185
+ server.tool(
186
+ "clawrent_register_user",
187
+ "Register a new ClawRent user account",
188
+ {
189
+ email: z.string().email().describe("Email address"),
190
+ password: z.string().min(8).max(128).describe("Password (min 8 chars)"),
191
+ name: z.string().min(1).max(100).describe("Display name"),
192
+ verificationCode: z.string().length(6).describe("6-digit verification code from email")
193
+ },
194
+ async (input) => {
195
+ const result = await client.registerUser(input);
196
+ return {
197
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
198
+ };
199
+ }
200
+ );
201
+ server.tool(
202
+ "clawrent_login",
203
+ "Login to an existing ClawRent account",
204
+ {
205
+ email: z.string().email().describe("Email address"),
206
+ password: z.string().min(1).describe("Password")
207
+ },
208
+ async ({ email, password }) => {
209
+ const result = await client.login(email, password);
210
+ return {
211
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
212
+ };
213
+ }
214
+ );
215
+ }
216
+
217
+ // src/tools/consumer-tools.ts
218
+ import { z as z2 } from "zod";
165
219
  function registerConsumerTools(server, client) {
166
220
  server.tool(
167
221
  "clawrent_browse",
168
222
  "Browse available agents on the ClawRent marketplace",
169
223
  {
170
- search: z.string().optional().describe("Search agents by name"),
171
- category: z.string().optional().describe("Filter by category"),
172
- page: z.number().optional().describe("Page number (default: 1)"),
173
- limit: z.number().optional().describe("Results per page (default: 20)")
224
+ search: z2.string().optional().describe("Search agents by name"),
225
+ category: z2.string().optional().describe("Filter by category"),
226
+ page: z2.number().optional().describe("Page number (default: 1)"),
227
+ limit: z2.number().optional().describe("Results per page (default: 20)")
174
228
  },
175
229
  async ({ search, category, page, limit }) => {
176
230
  const result = await client.browse({ search, category, page, limit });
@@ -183,7 +237,7 @@ function registerConsumerTools(server, client) {
183
237
  "clawrent_agent_details",
184
238
  "Get detailed information about a specific agent by its slug",
185
239
  {
186
- slug: z.string().describe("Agent slug (URL-friendly identifier)")
240
+ slug: z2.string().describe("Agent slug (URL-friendly identifier)")
187
241
  },
188
242
  async ({ slug }) => {
189
243
  const result = await client.getAgent(slug);
@@ -196,9 +250,9 @@ function registerConsumerTools(server, client) {
196
250
  "clawrent_rent_agent",
197
251
  "Rent an agent by creating a new session. Returns session details including sessionId and sessionToken.",
198
252
  {
199
- agentId: z.string().describe("ID of the agent to rent"),
200
- taskDescription: z.string().describe("Description of the task (10-2000 chars)"),
201
- permissions: z.string().optional().describe("Granted permissions as JSON string (default: {})")
253
+ agentId: z2.string().describe("ID of the agent to rent"),
254
+ taskDescription: z2.string().describe("Description of the task (10-2000 chars)"),
255
+ permissions: z2.string().optional().describe("Granted permissions as JSON string (default: {})")
202
256
  },
203
257
  async ({ agentId, taskDescription, permissions }) => {
204
258
  let grantedPermissions = {};
@@ -222,10 +276,10 @@ function registerConsumerTools(server, client) {
222
276
  "clawrent_list_sessions",
223
277
  "List your sessions on the platform",
224
278
  {
225
- role: z.string().optional().describe("Filter by role: consumer or provider"),
226
- status: z.string().optional().describe("Filter by status (e.g., active, completed, pending_approval)"),
227
- page: z.number().optional().describe("Page number"),
228
- limit: z.number().optional().describe("Results per page")
279
+ role: z2.string().optional().describe("Filter by role: consumer or provider"),
280
+ status: z2.string().optional().describe("Filter by status (e.g., active, completed, pending_approval)"),
281
+ page: z2.number().optional().describe("Page number"),
282
+ limit: z2.number().optional().describe("Results per page")
229
283
  },
230
284
  async ({ role, status, page, limit }) => {
231
285
  const result = await client.getSessions({ role, status, page, limit });
@@ -238,7 +292,7 @@ function registerConsumerTools(server, client) {
238
292
  "clawrent_end_session",
239
293
  "End an active session. Triggers billing settlement.",
240
294
  {
241
- sessionId: z.string().describe("ID of the session to end")
295
+ sessionId: z2.string().describe("ID of the session to end")
242
296
  },
243
297
  async ({ sessionId }) => {
244
298
  const result = await client.endSession(sessionId);
@@ -251,7 +305,7 @@ function registerConsumerTools(server, client) {
251
305
  "clawrent_session_messages",
252
306
  "Get message history for a session",
253
307
  {
254
- sessionId: z.string().describe("Session ID")
308
+ sessionId: z2.string().describe("Session ID")
255
309
  },
256
310
  async ({ sessionId }) => {
257
311
  const result = await client.getSessionMessages(sessionId);
@@ -267,7 +321,7 @@ function registerConsumerTools(server, client) {
267
321
  async () => {
268
322
  const result = await client.getBalance();
269
323
  return {
270
- content: [{ type: "text", text: `Balance: ${result.balance}` }]
324
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
271
325
  };
272
326
  }
273
327
  );
@@ -275,12 +329,12 @@ function registerConsumerTools(server, client) {
275
329
  "clawrent_topup",
276
330
  "Top up your wallet balance",
277
331
  {
278
- amount: z.string().describe('Amount to top up (e.g., "100.00")')
332
+ amount: z2.string().describe('Amount to top up (e.g., "100.00")')
279
333
  },
280
334
  async ({ amount }) => {
281
335
  const result = await client.topUp(amount);
282
336
  return {
283
- content: [{ type: "text", text: `New balance: ${result.balance}` }]
337
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
284
338
  };
285
339
  }
286
340
  );
@@ -288,9 +342,9 @@ function registerConsumerTools(server, client) {
288
342
  "clawrent_create_order",
289
343
  "Create an order to rent one or more agents. Each item creates an associated session. Optionally checkout from cart.",
290
344
  {
291
- items: z.string().describe('JSON array of order items: [{"providerAgentId":"...","taskDescription":"...","consumerAgentId":"..."}]'),
292
- note: z.string().optional().describe("Order note"),
293
- fromCart: z.boolean().optional().describe("If true, clear cart after order creation")
345
+ items: z2.string().describe('JSON array of order items: [{"providerAgentId":"...","taskDescription":"...","consumerAgentId":"..."}]'),
346
+ note: z2.string().optional().describe("Order note"),
347
+ fromCart: z2.boolean().optional().describe("If true, clear cart after order creation")
294
348
  },
295
349
  async ({ items, note, fromCart }) => {
296
350
  let parsedItems;
@@ -312,9 +366,9 @@ function registerConsumerTools(server, client) {
312
366
  "clawrent_list_orders",
313
367
  "List your orders",
314
368
  {
315
- status: z.string().optional().describe("Filter by status (pending, active, completed, cancelled)"),
316
- page: z.number().optional().describe("Page number"),
317
- limit: z.number().optional().describe("Results per page")
369
+ status: z2.string().optional().describe("Filter by status (pending, active, completed, cancelled)"),
370
+ page: z2.number().optional().describe("Page number"),
371
+ limit: z2.number().optional().describe("Results per page")
318
372
  },
319
373
  async ({ status, page, limit }) => {
320
374
  const result = await client.getOrders({ status, page, limit });
@@ -327,7 +381,7 @@ function registerConsumerTools(server, client) {
327
381
  "clawrent_order_detail",
328
382
  "Get detailed information about a specific order including its items",
329
383
  {
330
- orderId: z.string().describe("Order ID")
384
+ orderId: z2.string().describe("Order ID")
331
385
  },
332
386
  async ({ orderId }) => {
333
387
  const result = await client.getOrder(orderId);
@@ -340,7 +394,7 @@ function registerConsumerTools(server, client) {
340
394
  "clawrent_cancel_order",
341
395
  "Cancel an order. Only pending/active orders can be cancelled.",
342
396
  {
343
- orderId: z.string().describe("Order ID")
397
+ orderId: z2.string().describe("Order ID")
344
398
  },
345
399
  async ({ orderId }) => {
346
400
  const result = await client.cancelOrder(orderId);
@@ -364,8 +418,8 @@ function registerConsumerTools(server, client) {
364
418
  "clawrent_add_to_cart",
365
419
  "Add an agent to your shopping cart",
366
420
  {
367
- providerAgentId: z.string().describe("Agent ID to add"),
368
- taskDescription: z.string().describe("Task description for the agent (10-2000 chars)")
421
+ providerAgentId: z2.string().describe("Agent ID to add"),
422
+ taskDescription: z2.string().describe("Task description for the agent (10-2000 chars)")
369
423
  },
370
424
  async ({ providerAgentId, taskDescription }) => {
371
425
  const result = await client.addToCart({ providerAgentId, taskDescription });
@@ -378,7 +432,7 @@ function registerConsumerTools(server, client) {
378
432
  "clawrent_remove_from_cart",
379
433
  "Remove a specific item from the shopping cart",
380
434
  {
381
- itemId: z.string().describe("Cart item ID to remove")
435
+ itemId: z2.string().describe("Cart item ID to remove")
382
436
  },
383
437
  async ({ itemId }) => {
384
438
  const result = await client.removeFromCart(itemId);
@@ -402,7 +456,7 @@ function registerConsumerTools(server, client) {
402
456
  "clawrent_add_favorite",
403
457
  "Add an agent to your favorites",
404
458
  {
405
- agentId: z.string().describe("Agent ID to favorite")
459
+ agentId: z2.string().describe("Agent ID to favorite")
406
460
  },
407
461
  async ({ agentId }) => {
408
462
  const result = await client.addFavorite(agentId);
@@ -415,7 +469,7 @@ function registerConsumerTools(server, client) {
415
469
  "clawrent_remove_favorite",
416
470
  "Remove an agent from your favorites",
417
471
  {
418
- agentId: z.string().describe("Agent ID to unfavorite")
472
+ agentId: z2.string().describe("Agent ID to unfavorite")
419
473
  },
420
474
  async ({ agentId }) => {
421
475
  const result = await client.removeFavorite(agentId);
@@ -428,8 +482,8 @@ function registerConsumerTools(server, client) {
428
482
  "clawrent_list_favorites",
429
483
  "List your favorited agents",
430
484
  {
431
- page: z.number().optional().describe("Page number"),
432
- limit: z.number().optional().describe("Results per page")
485
+ page: z2.number().optional().describe("Page number"),
486
+ limit: z2.number().optional().describe("Results per page")
433
487
  },
434
488
  async ({ page, limit }) => {
435
489
  const result = await client.listFavorites({ page, limit });
@@ -441,22 +495,16 @@ function registerConsumerTools(server, client) {
441
495
  }
442
496
 
443
497
  // src/tools/provider-tools.ts
444
- import { z as z2 } from "zod";
498
+ import { z as z3 } from "zod";
445
499
  function registerProviderTools(server, client, providerAgent) {
446
500
  server.tool(
447
501
  "clawrent_register_agent",
448
- "Register a new agent on the ClawRent platform",
449
- {
450
- name: z2.string().describe("Agent name (1-100 chars)"),
451
- slug: z2.string().describe("URL-friendly slug (lowercase, hyphens)"),
452
- description: z2.string().describe("Agent description (10-500 chars)"),
453
- longDescription: z2.string().optional().describe("Detailed description (max 5000 chars)"),
454
- pricingModel: z2.enum(["per_token", "per_session", "per_minute"]).optional().describe("Pricing model (default: per_session)"),
455
- priceAmount: z2.string().optional().describe("Price amount (default: 1.00)"),
456
- currency: z2.enum(["CNY", "USD"]).optional().describe("Currency (default: CNY)"),
457
- hostingType: z2.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
458
- approvalMode: z2.enum(["manual", "auto"]).optional().describe("Session approval mode (default: manual)"),
459
- maxConcurrentSessions: z2.number().optional().describe("Max concurrent sessions (default: 5)")
502
+ "Register a new agent on the ClawRent platform (consumer by default). To become a provider, use clawrent_apply_provider after creation.",
503
+ {
504
+ name: z3.string().describe("Agent name (1-100 chars)"),
505
+ slug: z3.string().describe("URL-friendly slug (lowercase, hyphens)"),
506
+ description: z3.string().describe("Agent description (10-500 chars)"),
507
+ longDescription: z3.string().optional().describe("Detailed description (max 5000 chars)")
460
508
  },
461
509
  async (params) => {
462
510
  const data = {
@@ -465,13 +513,35 @@ function registerProviderTools(server, client, providerAgent) {
465
513
  description: params.description
466
514
  };
467
515
  if (params.longDescription) data["longDescription"] = params.longDescription;
516
+ const result = await client.registerAgent(data);
517
+ return {
518
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
519
+ };
520
+ }
521
+ );
522
+ server.tool(
523
+ "clawrent_apply_provider",
524
+ "Apply for provider role on an existing agent. Requires admin review.",
525
+ {
526
+ agentId: z3.string().describe("Agent ID"),
527
+ pricingModel: z3.enum(["per_token", "per_session", "per_minute"]).optional().describe("Pricing model (default: per_session)"),
528
+ priceAmount: z3.string().optional().describe("Price amount (default: 1.00)"),
529
+ currency: z3.enum(["CNY", "USD"]).optional().describe("Currency (default: CNY)"),
530
+ hostingType: z3.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
531
+ approvalMode: z3.enum(["manual", "auto"]).optional().describe("Session approval mode (default: manual)"),
532
+ maxConcurrentSessions: z3.number().optional().describe("Max concurrent sessions (default: 5)"),
533
+ maxConsumerSlots: z3.number().optional().describe("Max consumer slots per session (default: 1)")
534
+ },
535
+ async (params) => {
536
+ const data = {};
468
537
  if (params.pricingModel) data["pricingModel"] = params.pricingModel;
469
538
  if (params.priceAmount) data["priceAmount"] = params.priceAmount;
470
539
  if (params.currency) data["currency"] = params.currency;
471
540
  if (params.hostingType) data["hostingType"] = params.hostingType;
472
541
  if (params.approvalMode) data["approvalMode"] = params.approvalMode;
473
542
  if (params.maxConcurrentSessions) data["maxConcurrentSessions"] = params.maxConcurrentSessions;
474
- const result = await client.registerAgent(data);
543
+ if (params.maxConsumerSlots) data["maxConsumerSlots"] = params.maxConsumerSlots;
544
+ const result = await client.applyProvider(params.agentId, data);
475
545
  return {
476
546
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
477
547
  };
@@ -479,12 +549,25 @@ function registerProviderTools(server, client, providerAgent) {
479
549
  );
480
550
  server.tool(
481
551
  "clawrent_publish_agent",
482
- "Publish an agent (changes status from draft to pending_review)",
552
+ "Publish an agent for admin review (draft \u2192 pending_review). \u26A0\uFE0F REQUIRES user confirmation before executing!",
483
553
  {
484
- agentId: z2.string().describe("Agent ID")
554
+ agentId: z3.string().describe("Agent ID"),
555
+ pricingModel: z3.enum(["per_token", "per_session", "per_minute", "fixed"]).optional().describe("Pricing model (default: per_token)"),
556
+ priceAmount: z3.string().optional().describe("Price amount (default: 0.05)"),
557
+ currency: z3.enum(["CNY", "USD"]).optional().describe("Currency (default: CNY)"),
558
+ hostingType: z3.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
559
+ approvalMode: z3.enum(["auto", "manual"]).optional().describe("Session approval mode (default: manual)"),
560
+ transparencyLevel: z3.enum(["opaque", "moderate", "transparent"]).optional().describe("Transparency level (default: moderate)")
485
561
  },
486
- async ({ agentId }) => {
487
- const result = await client.publishAgent(agentId);
562
+ async (params) => {
563
+ const data = {};
564
+ if (params.pricingModel) data["pricingModel"] = params.pricingModel;
565
+ if (params.priceAmount) data["priceAmount"] = params.priceAmount;
566
+ if (params.currency) data["currency"] = params.currency;
567
+ if (params.hostingType) data["hostingType"] = params.hostingType;
568
+ if (params.approvalMode) data["approvalMode"] = params.approvalMode;
569
+ if (params.transparencyLevel) data["transparencyLevel"] = params.transparencyLevel;
570
+ const result = await client.publishAgent(params.agentId, data);
488
571
  return {
489
572
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
490
573
  };
@@ -492,9 +575,9 @@ function registerProviderTools(server, client, providerAgent) {
492
575
  );
493
576
  server.tool(
494
577
  "clawrent_activate_agent",
495
- "Activate an agent (changes status from pending_review to active). Requires agent token and active WS connection.",
578
+ "Activate an agent after admin approval + WebSocket connected (goes online). \u26A0\uFE0F REQUIRES user confirmation! Agent must have approved provider profile and active WebSocket connection.",
496
579
  {
497
- agentId: z2.string().describe("Agent ID")
580
+ agentId: z3.string().describe("Agent ID")
498
581
  },
499
582
  async ({ agentId }) => {
500
583
  const result = await client.activateAgent(agentId);
@@ -507,8 +590,8 @@ function registerProviderTools(server, client, providerAgent) {
507
590
  "clawrent_set_agent_status",
508
591
  "Set agent online status (online, offline, or busy)",
509
592
  {
510
- agentId: z2.string().describe("Agent ID"),
511
- onlineStatus: z2.enum(["online", "offline", "busy"]).describe("Target online status")
593
+ agentId: z3.string().describe("Agent ID"),
594
+ onlineStatus: z3.enum(["online", "offline", "busy"]).describe("Target online status")
512
595
  },
513
596
  async ({ agentId, onlineStatus }) => {
514
597
  const result = await client.setOnlineStatus(agentId, onlineStatus);
@@ -521,12 +604,12 @@ function registerProviderTools(server, client, providerAgent) {
521
604
  "clawrent_list_my_agents",
522
605
  "List agents owned by the current user",
523
606
  {
524
- status: z2.string().optional().describe("Filter by status (draft, pending_review, active, suspended)"),
525
- page: z2.number().optional().describe("Page number"),
526
- limit: z2.number().optional().describe("Results per page")
607
+ roles: z3.string().optional().describe("Filter by roles (consumer, both)"),
608
+ page: z3.number().optional().describe("Page number"),
609
+ limit: z3.number().optional().describe("Results per page")
527
610
  },
528
- async ({ status, page, limit }) => {
529
- const result = await client.getMyAgents({ status, page, limit });
611
+ async ({ roles, page, limit }) => {
612
+ const result = await client.getMyAgents({ roles, page, limit });
530
613
  return {
531
614
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
532
615
  };
@@ -536,7 +619,7 @@ function registerProviderTools(server, client, providerAgent) {
536
619
  "clawrent_approve_session",
537
620
  "Approve a pending session request",
538
621
  {
539
- sessionId: z2.string().describe("Session ID to approve")
622
+ sessionId: z3.string().describe("Session ID to approve")
540
623
  },
541
624
  async ({ sessionId }) => {
542
625
  const result = await client.approveSession(sessionId);
@@ -549,7 +632,7 @@ function registerProviderTools(server, client, providerAgent) {
549
632
  "clawrent_generate_agent_token",
550
633
  "Generate or regenerate an agent token for WebSocket authentication. The token is shown only once.",
551
634
  {
552
- agentId: z2.string().describe("Agent ID")
635
+ agentId: z3.string().describe("Agent ID")
553
636
  },
554
637
  async ({ agentId }) => {
555
638
  const result = await client.generateAgentToken(agentId);
@@ -562,7 +645,7 @@ function registerProviderTools(server, client, providerAgent) {
562
645
  "clawrent_revoke_agent_token",
563
646
  "Revoke an agent token. The agent will be disconnected and cannot reconnect until a new token is generated.",
564
647
  {
565
- agentId: z2.string().describe("Agent ID")
648
+ agentId: z3.string().describe("Agent ID")
566
649
  },
567
650
  async ({ agentId }) => {
568
651
  const result = await client.revokeAgentToken(agentId);
@@ -575,9 +658,9 @@ function registerProviderTools(server, client, providerAgent) {
575
658
  "clawrent_start_serving",
576
659
  "Start serving as a provider agent. Connects to the platform via WebSocket in-process (no subprocess). Listens for incoming session requests and auto-approves them if enabled.",
577
660
  {
578
- agentId: z2.string().describe("Agent ID to serve"),
579
- agentToken: z2.string().describe("Agent token for WebSocket authentication"),
580
- autoApprove: z2.boolean().optional().describe("Automatically approve incoming sessions (default: true)")
661
+ agentId: z3.string().describe("Agent ID to serve"),
662
+ agentToken: z3.string().describe("Agent token for WebSocket authentication"),
663
+ autoApprove: z3.boolean().optional().describe("Automatically approve incoming sessions (default: true)")
581
664
  },
582
665
  async ({ agentId, agentToken, autoApprove }) => {
583
666
  if (providerAgent.running) {
@@ -625,9 +708,9 @@ Waiting for incoming sessions via /ws/agent channel.`
625
708
  "clawrent_send_session_message",
626
709
  "Send a message to an active session as the provider agent. Requires clawrent_start_serving to be active.",
627
710
  {
628
- sessionId: z2.string().describe("Session ID"),
629
- type: z2.string().optional().describe("Message type (default: result.success)"),
630
- payload: z2.string().describe("Message payload as JSON string")
711
+ sessionId: z3.string().describe("Session ID"),
712
+ type: z3.string().optional().describe("Message type (default: result.success)"),
713
+ payload: z3.string().describe("Message payload as JSON string")
631
714
  },
632
715
  async ({ sessionId, type, payload }) => {
633
716
  if (!providerAgent.running) {
@@ -681,7 +764,8 @@ Waiting for incoming sessions via /ws/agent channel.`
681
764
  sessions: sessions.map((s) => ({
682
765
  sessionId: s.sessionId,
683
766
  taskDescription: s.taskDescription,
684
- consumerUserId: s.consumerUserId
767
+ consumerUserId: s.consumerUserId,
768
+ slotIndex: s.slotIndex
685
769
  }))
686
770
  }, null, 2)
687
771
  }]
@@ -690,6 +774,190 @@ Waiting for incoming sessions via /ws/agent channel.`
690
774
  );
691
775
  }
692
776
 
777
+ // src/tools/docs-tools.ts
778
+ import { z as z4 } from "zod";
779
+ function registerDocsTools(server, client) {
780
+ server.tool(
781
+ "clawrent_docs_tree",
782
+ "Get the published documentation tree structure of ClawRent platform",
783
+ {},
784
+ async () => {
785
+ try {
786
+ const result = await client.getDocsTree();
787
+ return {
788
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
789
+ };
790
+ } catch (err) {
791
+ return {
792
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
793
+ isError: true
794
+ };
795
+ }
796
+ }
797
+ );
798
+ server.tool(
799
+ "clawrent_docs_read",
800
+ 'Read a specific document by its full path (e.g. "getting-started/quick-start")',
801
+ {
802
+ path: z4.string().describe('Full path of the document (e.g. "getting-started/quick-start")')
803
+ },
804
+ async ({ path }) => {
805
+ try {
806
+ const result = await client.getDocByPath(path);
807
+ return {
808
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
809
+ };
810
+ } catch (err) {
811
+ return {
812
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
813
+ isError: true
814
+ };
815
+ }
816
+ }
817
+ );
818
+ server.tool(
819
+ "clawrent_docs_search",
820
+ "Search published documentation by keyword (searches title and content)",
821
+ {
822
+ query: z4.string().describe("Search keyword")
823
+ },
824
+ async ({ query }) => {
825
+ try {
826
+ const result = await client.searchDocs(query);
827
+ return {
828
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
829
+ };
830
+ } catch (err) {
831
+ return {
832
+ content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
833
+ isError: true
834
+ };
835
+ }
836
+ }
837
+ );
838
+ server.tool(
839
+ "clawrent_docs_create",
840
+ "Create a new document or folder in the doc CMS. Requires admin permissions.",
841
+ {
842
+ type: z4.enum(["folder", "document"]).describe('Node type: "folder" or "document"'),
843
+ title: z4.string().describe("Document or folder title"),
844
+ parentId: z4.string().optional().describe("Parent folder ID (omit for root level)"),
845
+ content: z4.string().optional().describe("Markdown content (for documents)"),
846
+ slug: z4.string().optional().describe("URL-friendly slug (auto-generated from title if omitted)"),
847
+ icon: z4.string().optional().describe("Icon emoji or identifier")
848
+ },
849
+ async ({ type, title, parentId, content, slug, icon }) => {
850
+ try {
851
+ const result = await client.createDoc({ type, title, parentId, content, slug, icon });
852
+ return {
853
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
854
+ };
855
+ } catch (err) {
856
+ const msg = err instanceof Error ? err.message : String(err);
857
+ if (msg.includes("403")) {
858
+ return {
859
+ content: [{ type: "text", text: "Permission denied: This operation requires admin privileges with mcp.docs.create permission." }],
860
+ isError: true
861
+ };
862
+ }
863
+ return {
864
+ content: [{ type: "text", text: `Error: ${msg}` }],
865
+ isError: true
866
+ };
867
+ }
868
+ }
869
+ );
870
+ server.tool(
871
+ "clawrent_docs_update",
872
+ "Update an existing document (title, content, etc.). Requires admin permissions.",
873
+ {
874
+ id: z4.string().describe("Document ID to update"),
875
+ title: z4.string().optional().describe("New title"),
876
+ content: z4.string().optional().describe("New markdown content"),
877
+ changeSummary: z4.string().optional().describe("Brief summary of what changed (for version history)")
878
+ },
879
+ async ({ id, title, content, changeSummary }) => {
880
+ try {
881
+ const data = {};
882
+ if (title !== void 0) data["title"] = title;
883
+ if (content !== void 0) data["content"] = content;
884
+ if (changeSummary !== void 0) data["changeSummary"] = changeSummary;
885
+ const result = await client.updateDoc(id, data);
886
+ return {
887
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
888
+ };
889
+ } catch (err) {
890
+ const msg = err instanceof Error ? err.message : String(err);
891
+ if (msg.includes("403")) {
892
+ return {
893
+ content: [{ type: "text", text: "Permission denied: This operation requires admin privileges with mcp.docs.edit permission." }],
894
+ isError: true
895
+ };
896
+ }
897
+ return {
898
+ content: [{ type: "text", text: `Error: ${msg}` }],
899
+ isError: true
900
+ };
901
+ }
902
+ }
903
+ );
904
+ server.tool(
905
+ "clawrent_docs_delete",
906
+ "Delete a document or folder from the doc CMS. Requires admin permissions.",
907
+ {
908
+ id: z4.string().describe("Document or folder ID to delete")
909
+ },
910
+ async ({ id }) => {
911
+ try {
912
+ await client.deleteDoc(id);
913
+ return {
914
+ content: [{ type: "text", text: `Document ${id} deleted successfully.` }]
915
+ };
916
+ } catch (err) {
917
+ const msg = err instanceof Error ? err.message : String(err);
918
+ if (msg.includes("403")) {
919
+ return {
920
+ content: [{ type: "text", text: "Permission denied: This operation requires admin privileges with mcp.docs.delete permission." }],
921
+ isError: true
922
+ };
923
+ }
924
+ return {
925
+ content: [{ type: "text", text: `Error: ${msg}` }],
926
+ isError: true
927
+ };
928
+ }
929
+ }
930
+ );
931
+ server.tool(
932
+ "clawrent_docs_publish",
933
+ "Publish or unpublish a document. Requires admin permissions.",
934
+ {
935
+ id: z4.string().describe("Document ID"),
936
+ action: z4.enum(["publish", "unpublish"]).describe('Action: "publish" or "unpublish"')
937
+ },
938
+ async ({ id, action }) => {
939
+ try {
940
+ const result = action === "publish" ? await client.publishDoc(id) : await client.unpublishDoc(id);
941
+ return {
942
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
943
+ };
944
+ } catch (err) {
945
+ const msg = err instanceof Error ? err.message : String(err);
946
+ if (msg.includes("403")) {
947
+ return {
948
+ content: [{ type: "text", text: "Permission denied: This operation requires admin privileges with mcp.docs.publish permission." }],
949
+ isError: true
950
+ };
951
+ }
952
+ return {
953
+ content: [{ type: "text", text: `Error: ${msg}` }],
954
+ isError: true
955
+ };
956
+ }
957
+ }
958
+ );
959
+ }
960
+
693
961
  // src/index.ts
694
962
  async function main() {
695
963
  const config = loadConfig();
@@ -699,8 +967,10 @@ async function main() {
699
967
  name: "clawrent",
700
968
  version: "0.1.0"
701
969
  });
970
+ registerAuthTools(server, client);
702
971
  registerConsumerTools(server, client);
703
972
  registerProviderTools(server, client, providerAgent);
973
+ registerDocsTools(server, client);
704
974
  process.on("SIGINT", () => {
705
975
  providerAgent.stop();
706
976
  process.exit(0);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/provider-agent.ts","../src/tools/consumer-tools.ts","../src/tools/provider-tools.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { ApiClient, loadConfig } from '@clawrent/cli';\r\nimport { ProviderAgent } from './provider-agent.js';\r\nimport { registerConsumerTools } from './tools/consumer-tools.js';\r\nimport { registerProviderTools } from './tools/provider-tools.js';\r\n\r\nasync function main(): Promise<void> {\r\n const config = loadConfig();\r\n const client = new ApiClient(config);\r\n\r\n // In-process provider agent (shared singleton across all provider tools)\r\n const providerAgent = new ProviderAgent(client);\r\n\r\n const server = new McpServer({\r\n name: 'clawrent',\r\n version: '0.1.0',\r\n });\r\n\r\n // Register all tools\r\n registerConsumerTools(server, client);\r\n registerProviderTools(server, client, providerAgent);\r\n\r\n // Cleanup on exit\r\n process.on('SIGINT', () => {\r\n providerAgent.stop();\r\n process.exit(0);\r\n });\r\n process.on('SIGTERM', () => {\r\n providerAgent.stop();\r\n process.exit(0);\r\n });\r\n\r\n // Connect via stdio transport\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\nmain().catch((err) => {\r\n process.stderr.write(`MCP Server error: ${err instanceof Error ? err.message : String(err)}\\n`);\r\n process.exit(1);\r\n});\r\n","import { EventEmitter } from 'node:events';\r\nimport WebSocket from 'ws';\r\nimport { ApiClient, SessionManager } from '@clawrent/cli';\r\n\r\nexport interface ActiveSession {\r\n sessionId: string;\r\n sessionToken: string;\r\n taskDescription: string;\r\n consumerUserId?: string;\r\n}\r\n\r\n/**\r\n * ProviderAgent runs an in-process WebSocket connection to the\r\n * /ws/agent control channel, replacing the need to spawn a CLI subprocess.\r\n * It manages session lifecycle and delegates session-level WS to SessionManager.\r\n */\r\nexport class ProviderAgent extends EventEmitter {\r\n private client: ApiClient;\r\n private agentWs: WebSocket | null = null;\r\n private sessionManager: SessionManager | null = null;\r\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\r\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n private reconnectAttempts = 0;\r\n private maxReconnectDelay = 30_000;\r\n private _running = false;\r\n\r\n private agentId: string | null = null;\r\n private agentToken: string | null = null;\r\n private autoApprove = false;\r\n private activeSessions = new Map<string, ActiveSession>();\r\n\r\n constructor(client: ApiClient) {\r\n super();\r\n this.client = client;\r\n }\r\n\r\n get running(): boolean {\r\n return this._running;\r\n }\r\n\r\n get currentAgentId(): string | null {\r\n return this.agentId;\r\n }\r\n\r\n getSessions(): ActiveSession[] {\r\n return Array.from(this.activeSessions.values());\r\n }\r\n\r\n /**\r\n * Start the in-process agent: connect to /ws/agent and listen for sessions.\r\n */\r\n async start(agentId: string, agentToken: string, autoApprove = false): Promise<void> {\r\n if (this._running) {\r\n throw new Error(`Already serving agent ${this.agentId}`);\r\n }\r\n\r\n this.agentId = agentId;\r\n this.agentToken = agentToken;\r\n this.autoApprove = autoApprove;\r\n this._running = true;\r\n this.reconnectAttempts = 0;\r\n\r\n // Create session manager for per-session WS connections\r\n this.sessionManager = new SessionManager(this.client.wsUrl);\r\n this.sessionManager.agentId = agentId;\r\n\r\n this.sessionManager.on('session:connected', (sessionId: string) => {\r\n this.emit('session:connected', sessionId);\r\n });\r\n\r\n this.sessionManager.on('session:message', (sessionId: string, message: Record<string, unknown>) => {\r\n this.emit('session:message', sessionId, message);\r\n });\r\n\r\n this.sessionManager.on('session:disconnected', (sessionId: string) => {\r\n this.activeSessions.delete(sessionId);\r\n this.emit('session:disconnected', sessionId);\r\n });\r\n\r\n this.connectAgent();\r\n }\r\n\r\n /**\r\n * Stop the agent: disconnect all sessions and the control channel.\r\n */\r\n stop(): void {\r\n this._running = false;\r\n\r\n if (this.heartbeatTimer) {\r\n clearInterval(this.heartbeatTimer);\r\n this.heartbeatTimer = null;\r\n }\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n this.sessionManager?.disconnectAll();\r\n this.sessionManager = null;\r\n\r\n if (this.agentWs && (this.agentWs.readyState === WebSocket.OPEN || this.agentWs.readyState === WebSocket.CONNECTING)) {\r\n this.agentWs.close(1000, 'Agent stopping');\r\n }\r\n this.agentWs = null;\r\n\r\n this.activeSessions.clear();\r\n this.agentId = null;\r\n this.agentToken = null;\r\n\r\n this.emit('stopped');\r\n }\r\n\r\n /**\r\n * Send a message to a specific session.\r\n */\r\n send(sessionId: string, message: Record<string, unknown>): boolean {\r\n if (!this.sessionManager) return false;\r\n return this.sessionManager.send(sessionId, message);\r\n }\r\n\r\n private connectAgent(): void {\r\n if (!this._running || !this.agentToken) return;\r\n\r\n const url = `${this.client.wsUrl}/ws/agent?token=${this.agentToken}`;\r\n const ws = new WebSocket(url);\r\n this.agentWs = ws;\r\n\r\n ws.on('open', () => {\r\n this.reconnectAttempts = 0;\r\n this.emit('agent:connected', this.agentId);\r\n\r\n // Start heartbeat\r\n this.heartbeatTimer = setInterval(() => {\r\n if (ws.readyState === WebSocket.OPEN) {\r\n ws.send(JSON.stringify({ type: 'system.heartbeat', payload: {} }));\r\n }\r\n }, 25_000);\r\n });\r\n\r\n ws.on('message', (raw) => {\r\n try {\r\n const msg = JSON.parse(raw.toString()) as Record<string, unknown>;\r\n this.handleAgentMessage(msg);\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n });\r\n\r\n ws.on('close', (code) => {\r\n if (this.heartbeatTimer) {\r\n clearInterval(this.heartbeatTimer);\r\n this.heartbeatTimer = null;\r\n }\r\n\r\n this.emit('agent:disconnected', this.agentId);\r\n\r\n // Reconnect on abnormal close if still running\r\n if (this._running && code !== 1000) {\r\n const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), this.maxReconnectDelay);\r\n this.reconnectAttempts++;\r\n this.reconnectTimer = setTimeout(() => this.connectAgent(), delay);\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n this.emit('agent:error', err);\r\n });\r\n }\r\n\r\n private handleAgentMessage(msg: Record<string, unknown>): void {\r\n const type = msg['type'] as string;\r\n\r\n if (type === 'system.heartbeat_ack') return;\r\n\r\n if (type === 'session.new') {\r\n const payload = msg['payload'] as Record<string, unknown>;\r\n const sessionId = payload['sessionId'] as string;\r\n const sessionToken = payload['sessionToken'] as string;\r\n const taskDescription = (payload['taskDescription'] as string) || '';\r\n const consumerUserId = payload['consumerUserId'] as string | undefined;\r\n\r\n const session: ActiveSession = { sessionId, sessionToken, taskDescription, consumerUserId };\r\n this.activeSessions.set(sessionId, session);\r\n\r\n this.emit('session:new', session);\r\n\r\n if (this.autoApprove) {\r\n // Auto-approve and connect\r\n this.client.approveSession(sessionId).then(() => {\r\n this.sessionManager?.connect(sessionId, sessionToken);\r\n this.emit('session:approved', sessionId);\r\n }).catch((err) => {\r\n this.emit('session:error', sessionId, err);\r\n });\r\n }\r\n } else if (type === 'session.approved') {\r\n const payload = msg['payload'] as Record<string, unknown>;\r\n const sessionId = payload['sessionId'] as string;\r\n const session = this.activeSessions.get(sessionId);\r\n if (session) {\r\n this.sessionManager?.connect(sessionId, session.sessionToken);\r\n }\r\n }\r\n }\r\n}\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport type { ApiClient } from '@clawrent/cli';\r\n\r\nexport function registerConsumerTools(server: McpServer, client: ApiClient): void {\r\n // --- Marketplace ---\r\n\r\n server.tool(\r\n 'clawrent_browse',\r\n 'Browse available agents on the ClawRent marketplace',\r\n {\r\n search: z.string().optional().describe('Search agents by name'),\r\n category: z.string().optional().describe('Filter by category'),\r\n page: z.number().optional().describe('Page number (default: 1)'),\r\n limit: z.number().optional().describe('Results per page (default: 20)'),\r\n },\r\n async ({ search, category, page, limit }) => {\r\n const result = await client.browse({ search, category, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_agent_details',\r\n 'Get detailed information about a specific agent by its slug',\r\n {\r\n slug: z.string().describe('Agent slug (URL-friendly identifier)'),\r\n },\r\n async ({ slug }) => {\r\n const result = await client.getAgent(slug);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Sessions ---\r\n\r\n server.tool(\r\n 'clawrent_rent_agent',\r\n 'Rent an agent by creating a new session. Returns session details including sessionId and sessionToken.',\r\n {\r\n agentId: z.string().describe('ID of the agent to rent'),\r\n taskDescription: z.string().describe('Description of the task (10-2000 chars)'),\r\n permissions: z.string().optional().describe('Granted permissions as JSON string (default: {})'),\r\n },\r\n async ({ agentId, taskDescription, permissions }) => {\r\n let grantedPermissions: Record<string, unknown> = {};\r\n if (permissions) {\r\n try {\r\n grantedPermissions = JSON.parse(permissions) as Record<string, unknown>;\r\n } catch {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON for permissions' }],\r\n isError: true,\r\n };\r\n }\r\n }\r\n const result = await client.rent({ agentId, taskDescription, grantedPermissions });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_sessions',\r\n 'List your sessions on the platform',\r\n {\r\n role: z.string().optional().describe('Filter by role: consumer or provider'),\r\n status: z.string().optional().describe('Filter by status (e.g., active, completed, pending_approval)'),\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ role, status, page, limit }) => {\r\n const result = await client.getSessions({ role, status, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_end_session',\r\n 'End an active session. Triggers billing settlement.',\r\n {\r\n sessionId: z.string().describe('ID of the session to end'),\r\n },\r\n async ({ sessionId }) => {\r\n const result = await client.endSession(sessionId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_session_messages',\r\n 'Get message history for a session',\r\n {\r\n sessionId: z.string().describe('Session ID'),\r\n },\r\n async ({ sessionId }) => {\r\n const result = await client.getSessionMessages(sessionId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Billing ---\r\n\r\n server.tool(\r\n 'clawrent_check_balance',\r\n 'Check your wallet balance on the ClawRent platform',\r\n {},\r\n async () => {\r\n const result = await client.getBalance();\r\n return {\r\n content: [{ type: 'text' as const, text: `Balance: ${result.balance}` }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_topup',\r\n 'Top up your wallet balance',\r\n {\r\n amount: z.string().describe('Amount to top up (e.g., \"100.00\")'),\r\n },\r\n async ({ amount }) => {\r\n const result = await client.topUp(amount);\r\n return {\r\n content: [{ type: 'text' as const, text: `New balance: ${result.balance}` }],\r\n };\r\n },\r\n );\r\n\r\n // --- Orders ---\r\n\r\n server.tool(\r\n 'clawrent_create_order',\r\n 'Create an order to rent one or more agents. Each item creates an associated session. Optionally checkout from cart.',\r\n {\r\n items: z.string().describe('JSON array of order items: [{\"providerAgentId\":\"...\",\"taskDescription\":\"...\",\"consumerAgentId\":\"...\"}]'),\r\n note: z.string().optional().describe('Order note'),\r\n fromCart: z.boolean().optional().describe('If true, clear cart after order creation'),\r\n },\r\n async ({ items, note, fromCart }) => {\r\n let parsedItems: Array<{ providerAgentId: string; consumerAgentId?: string; taskDescription: string }>;\r\n try {\r\n parsedItems = JSON.parse(items) as typeof parsedItems;\r\n } catch {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON for items array' }],\r\n isError: true,\r\n };\r\n }\r\n const result = await client.createOrder({ items: parsedItems, note, fromCart });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_orders',\r\n 'List your orders',\r\n {\r\n status: z.string().optional().describe('Filter by status (pending, active, completed, cancelled)'),\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ status, page, limit }) => {\r\n const result = await client.getOrders({ status, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_order_detail',\r\n 'Get detailed information about a specific order including its items',\r\n {\r\n orderId: z.string().describe('Order ID'),\r\n },\r\n async ({ orderId }) => {\r\n const result = await client.getOrder(orderId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_cancel_order',\r\n 'Cancel an order. Only pending/active orders can be cancelled.',\r\n {\r\n orderId: z.string().describe('Order ID'),\r\n },\r\n async ({ orderId }) => {\r\n const result = await client.cancelOrder(orderId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Cart ---\r\n\r\n server.tool(\r\n 'clawrent_list_cart',\r\n 'View your shopping cart items',\r\n {},\r\n async () => {\r\n const result = await client.getCart();\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_add_to_cart',\r\n 'Add an agent to your shopping cart',\r\n {\r\n providerAgentId: z.string().describe('Agent ID to add'),\r\n taskDescription: z.string().describe('Task description for the agent (10-2000 chars)'),\r\n },\r\n async ({ providerAgentId, taskDescription }) => {\r\n const result = await client.addToCart({ providerAgentId, taskDescription });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_remove_from_cart',\r\n 'Remove a specific item from the shopping cart',\r\n {\r\n itemId: z.string().describe('Cart item ID to remove'),\r\n },\r\n async ({ itemId }) => {\r\n const result = await client.removeFromCart(itemId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_clear_cart',\r\n 'Clear all items from the shopping cart',\r\n {},\r\n async () => {\r\n const result = await client.clearCart();\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Favorites ---\r\n\r\n server.tool(\r\n 'clawrent_add_favorite',\r\n 'Add an agent to your favorites',\r\n {\r\n agentId: z.string().describe('Agent ID to favorite'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.addFavorite(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_remove_favorite',\r\n 'Remove an agent from your favorites',\r\n {\r\n agentId: z.string().describe('Agent ID to unfavorite'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.removeFavorite(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_favorites',\r\n 'List your favorited agents',\r\n {\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ page, limit }) => {\r\n const result = await client.listFavorites({ page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n}\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport type { ApiClient } from '@clawrent/cli';\r\nimport type { ProviderAgent } from '../provider-agent.js';\r\n\r\nexport function registerProviderTools(server: McpServer, client: ApiClient, providerAgent: ProviderAgent): void {\r\n server.tool(\r\n 'clawrent_register_agent',\r\n 'Register a new agent on the ClawRent platform',\r\n {\r\n name: z.string().describe('Agent name (1-100 chars)'),\r\n slug: z.string().describe('URL-friendly slug (lowercase, hyphens)'),\r\n description: z.string().describe('Agent description (10-500 chars)'),\r\n longDescription: z.string().optional().describe('Detailed description (max 5000 chars)'),\r\n pricingModel: z.enum(['per_token', 'per_session', 'per_minute']).optional().describe('Pricing model (default: per_session)'),\r\n priceAmount: z.string().optional().describe('Price amount (default: 1.00)'),\r\n currency: z.enum(['CNY', 'USD']).optional().describe('Currency (default: CNY)'),\r\n hostingType: z.enum(['self_hosted', 'platform_hosted']).optional().describe('Hosting type (default: self_hosted)'),\r\n approvalMode: z.enum(['manual', 'auto']).optional().describe('Session approval mode (default: manual)'),\r\n maxConcurrentSessions: z.number().optional().describe('Max concurrent sessions (default: 5)'),\r\n },\r\n async (params) => {\r\n const data: Record<string, unknown> = {\r\n name: params.name,\r\n slug: params.slug,\r\n description: params.description,\r\n };\r\n if (params.longDescription) data['longDescription'] = params.longDescription;\r\n if (params.pricingModel) data['pricingModel'] = params.pricingModel;\r\n if (params.priceAmount) data['priceAmount'] = params.priceAmount;\r\n if (params.currency) data['currency'] = params.currency;\r\n if (params.hostingType) data['hostingType'] = params.hostingType;\r\n if (params.approvalMode) data['approvalMode'] = params.approvalMode;\r\n if (params.maxConcurrentSessions) data['maxConcurrentSessions'] = params.maxConcurrentSessions;\r\n\r\n const result = await client.registerAgent(data);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_publish_agent',\r\n 'Publish an agent (changes status from draft to pending_review)',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.publishAgent(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_activate_agent',\r\n 'Activate an agent (changes status from pending_review to active). Requires agent token and active WS connection.',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.activateAgent(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_set_agent_status',\r\n 'Set agent online status (online, offline, or busy)',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n onlineStatus: z.enum(['online', 'offline', 'busy']).describe('Target online status'),\r\n },\r\n async ({ agentId, onlineStatus }) => {\r\n const result = await client.setOnlineStatus(agentId, onlineStatus);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_my_agents',\r\n 'List agents owned by the current user',\r\n {\r\n status: z.string().optional().describe('Filter by status (draft, pending_review, active, suspended)'),\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ status, page, limit }) => {\r\n const result = await client.getMyAgents({ status, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_approve_session',\r\n 'Approve a pending session request',\r\n {\r\n sessionId: z.string().describe('Session ID to approve'),\r\n },\r\n async ({ sessionId }) => {\r\n const result = await client.approveSession(sessionId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Token Management ---\r\n\r\n server.tool(\r\n 'clawrent_generate_agent_token',\r\n 'Generate or regenerate an agent token for WebSocket authentication. The token is shown only once.',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.generateAgentToken(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_revoke_agent_token',\r\n 'Revoke an agent token. The agent will be disconnected and cannot reconnect until a new token is generated.',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.revokeAgentToken(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- In-process Serve ---\r\n\r\n server.tool(\r\n 'clawrent_start_serving',\r\n 'Start serving as a provider agent. Connects to the platform via WebSocket in-process (no subprocess). Listens for incoming session requests and auto-approves them if enabled.',\r\n {\r\n agentId: z.string().describe('Agent ID to serve'),\r\n agentToken: z.string().describe('Agent token for WebSocket authentication'),\r\n autoApprove: z.boolean().optional().describe('Automatically approve incoming sessions (default: true)'),\r\n },\r\n async ({ agentId, agentToken, autoApprove }) => {\r\n if (providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Already serving agent ${providerAgent.currentAgentId}. Stop it first with clawrent_stop_serving.` }],\r\n isError: true,\r\n };\r\n }\r\n\r\n try {\r\n await providerAgent.start(agentId, agentToken, autoApprove ?? true);\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Agent ${agentId} is now serving in-process.\\nAuto-approve: ${autoApprove ?? true}\\nWaiting for incoming sessions via /ws/agent channel.`,\r\n }],\r\n };\r\n } catch (err: unknown) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Failed to start serving: ${err instanceof Error ? err.message : String(err)}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_stop_serving',\r\n 'Stop the in-process provider agent. Disconnects all sessions and the agent control channel.',\r\n {},\r\n async () => {\r\n if (!providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'No agent is currently serving.' }],\r\n };\r\n }\r\n\r\n const agentId = providerAgent.currentAgentId;\r\n providerAgent.stop();\r\n return {\r\n content: [{ type: 'text' as const, text: `Agent ${agentId} stopped serving.` }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_send_session_message',\r\n 'Send a message to an active session as the provider agent. Requires clawrent_start_serving to be active.',\r\n {\r\n sessionId: z.string().describe('Session ID'),\r\n type: z.string().optional().describe('Message type (default: result.success)'),\r\n payload: z.string().describe('Message payload as JSON string'),\r\n },\r\n async ({ sessionId, type, payload }) => {\r\n if (!providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'No agent is currently serving. Start with clawrent_start_serving first.' }],\r\n isError: true,\r\n };\r\n }\r\n\r\n let parsedPayload: Record<string, unknown>;\r\n try {\r\n parsedPayload = JSON.parse(payload) as Record<string, unknown>;\r\n } catch {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON for payload' }],\r\n isError: true,\r\n };\r\n }\r\n\r\n const sent = providerAgent.send(sessionId, {\r\n type: type ?? 'result.success',\r\n payload: parsedPayload,\r\n });\r\n\r\n if (!sent) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Session ${sessionId} is not connected or not found.` }],\r\n isError: true,\r\n };\r\n }\r\n\r\n return {\r\n content: [{ type: 'text' as const, text: `Message sent to session ${sessionId}.` }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_serving_status',\r\n 'Check the current serving status: whether an agent is active, which sessions are connected.',\r\n {},\r\n async () => {\r\n if (!providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify({ serving: false }, null, 2) }],\r\n };\r\n }\r\n\r\n const sessions = providerAgent.getSessions();\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n serving: true,\r\n agentId: providerAgent.currentAgentId,\r\n activeSessions: sessions.length,\r\n sessions: sessions.map(s => ({\r\n sessionId: s.sessionId,\r\n taskDescription: s.taskDescription,\r\n consumerUserId: s.consumerUserId,\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n}\r\n"],"mappings":"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","names":["ApiClient","z","ApiClient"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/provider-agent.ts","../src/tools/auth-tools.ts","../src/tools/consumer-tools.ts","../src/tools/provider-tools.ts","../src/tools/docs-tools.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { ApiClient, loadConfig } from '@clawrent/cli';\r\nimport { ProviderAgent } from './provider-agent.js';\r\nimport { registerAuthTools } from './tools/auth-tools.js';\r\nimport { registerConsumerTools } from './tools/consumer-tools.js';\r\nimport { registerProviderTools } from './tools/provider-tools.js';\r\nimport { registerDocsTools } from './tools/docs-tools.js';\r\n\r\nasync function main(): Promise<void> {\r\n const config = loadConfig();\r\n const client = new ApiClient(config);\r\n\r\n // In-process provider agent (shared singleton across all provider tools)\r\n const providerAgent = new ProviderAgent(client);\r\n\r\n const server = new McpServer({\r\n name: 'clawrent',\r\n version: '0.1.0',\r\n });\r\n\r\n // Register all tools\r\n registerAuthTools(server, client);\r\n registerConsumerTools(server, client);\r\n registerProviderTools(server, client, providerAgent);\r\n registerDocsTools(server, client);\r\n\r\n // Cleanup on exit\r\n process.on('SIGINT', () => {\r\n providerAgent.stop();\r\n process.exit(0);\r\n });\r\n process.on('SIGTERM', () => {\r\n providerAgent.stop();\r\n process.exit(0);\r\n });\r\n\r\n // Connect via stdio transport\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\nmain().catch((err) => {\r\n process.stderr.write(`MCP Server error: ${err instanceof Error ? err.message : String(err)}\\n`);\r\n process.exit(1);\r\n});\r\n","import { EventEmitter } from 'node:events';\r\nimport WebSocket from 'ws';\r\nimport { ApiClient, SessionManager } from '@clawrent/cli';\r\n\r\nexport interface ActiveSession {\r\n sessionId: string;\r\n sessionToken: string;\r\n taskDescription: string;\r\n consumerUserId?: string;\r\n slotIndex?: number;\r\n}\r\n\r\n/**\r\n * ProviderAgent runs an in-process WebSocket connection to the\r\n * /ws/agent control channel, replacing the need to spawn a CLI subprocess.\r\n * It manages session lifecycle and delegates session-level WS to SessionManager.\r\n */\r\nexport class ProviderAgent extends EventEmitter {\r\n private client: ApiClient;\r\n private agentWs: WebSocket | null = null;\r\n private sessionManager: SessionManager | null = null;\r\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\r\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n private reconnectAttempts = 0;\r\n private maxReconnectDelay = 30_000;\r\n private _running = false;\r\n\r\n private agentId: string | null = null;\r\n private agentToken: string | null = null;\r\n private autoApprove = false;\r\n private activeSessions = new Map<string, ActiveSession>();\r\n\r\n constructor(client: ApiClient) {\r\n super();\r\n this.client = client;\r\n }\r\n\r\n get running(): boolean {\r\n return this._running;\r\n }\r\n\r\n get currentAgentId(): string | null {\r\n return this.agentId;\r\n }\r\n\r\n getSessions(): ActiveSession[] {\r\n return Array.from(this.activeSessions.values());\r\n }\r\n\r\n /**\r\n * Start the in-process agent: connect to /ws/agent and listen for sessions.\r\n */\r\n async start(agentId: string, agentToken: string, autoApprove = false): Promise<void> {\r\n if (this._running) {\r\n throw new Error(`Already serving agent ${this.agentId}`);\r\n }\r\n\r\n this.agentId = agentId;\r\n this.agentToken = agentToken;\r\n this.autoApprove = autoApprove;\r\n this._running = true;\r\n this.reconnectAttempts = 0;\r\n\r\n // Create session manager for per-session WS connections\r\n this.sessionManager = new SessionManager(this.client.wsUrl);\r\n this.sessionManager.agentId = agentId;\r\n\r\n this.sessionManager.on('session:connected', (sessionId: string) => {\r\n this.emit('session:connected', sessionId);\r\n });\r\n\r\n this.sessionManager.on('session:message', (sessionId: string, message: Record<string, unknown>) => {\r\n this.emit('session:message', sessionId, message);\r\n });\r\n\r\n this.sessionManager.on('session:disconnected', (sessionId: string) => {\r\n this.activeSessions.delete(sessionId);\r\n this.emit('session:disconnected', sessionId);\r\n });\r\n\r\n this.connectAgent();\r\n }\r\n\r\n /**\r\n * Stop the agent: disconnect all sessions and the control channel.\r\n */\r\n stop(): void {\r\n this._running = false;\r\n\r\n if (this.heartbeatTimer) {\r\n clearInterval(this.heartbeatTimer);\r\n this.heartbeatTimer = null;\r\n }\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n this.sessionManager?.disconnectAll();\r\n this.sessionManager = null;\r\n\r\n if (this.agentWs && (this.agentWs.readyState === WebSocket.OPEN || this.agentWs.readyState === WebSocket.CONNECTING)) {\r\n this.agentWs.close(1000, 'Agent stopping');\r\n }\r\n this.agentWs = null;\r\n\r\n this.activeSessions.clear();\r\n this.agentId = null;\r\n this.agentToken = null;\r\n\r\n this.emit('stopped');\r\n }\r\n\r\n /**\r\n * Send a message to a specific session.\r\n */\r\n send(sessionId: string, message: Record<string, unknown>): boolean {\r\n if (!this.sessionManager) return false;\r\n return this.sessionManager.send(sessionId, message);\r\n }\r\n\r\n private connectAgent(): void {\r\n if (!this._running || !this.agentToken) return;\r\n\r\n const url = `${this.client.wsUrl}/ws/agent?token=${this.agentToken}`;\r\n const ws = new WebSocket(url);\r\n this.agentWs = ws;\r\n\r\n ws.on('open', () => {\r\n this.reconnectAttempts = 0;\r\n this.emit('agent:connected', this.agentId);\r\n\r\n // Start heartbeat\r\n this.heartbeatTimer = setInterval(() => {\r\n if (ws.readyState === WebSocket.OPEN) {\r\n ws.send(JSON.stringify({ type: 'system.heartbeat', payload: {} }));\r\n }\r\n }, 25_000);\r\n });\r\n\r\n ws.on('message', (raw) => {\r\n try {\r\n const msg = JSON.parse(raw.toString()) as Record<string, unknown>;\r\n this.handleAgentMessage(msg);\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n });\r\n\r\n ws.on('close', (code) => {\r\n if (this.heartbeatTimer) {\r\n clearInterval(this.heartbeatTimer);\r\n this.heartbeatTimer = null;\r\n }\r\n\r\n this.emit('agent:disconnected', this.agentId);\r\n\r\n // Reconnect on abnormal close if still running\r\n if (this._running && code !== 1000) {\r\n const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), this.maxReconnectDelay);\r\n this.reconnectAttempts++;\r\n this.reconnectTimer = setTimeout(() => this.connectAgent(), delay);\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n this.emit('agent:error', err);\r\n });\r\n }\r\n\r\n private handleAgentMessage(msg: Record<string, unknown>): void {\r\n const type = msg['type'] as string;\r\n\r\n if (type === 'system.heartbeat_ack') return;\r\n\r\n if (type === 'session.new') {\r\n const payload = msg['payload'] as Record<string, unknown>;\r\n const sessionId = payload['sessionId'] as string;\r\n const sessionToken = payload['sessionToken'] as string;\r\n const taskDescription = (payload['taskDescription'] as string) || '';\r\n const consumerUserId = payload['consumerUserId'] as string | undefined;\r\n\r\n const session: ActiveSession = {\r\n sessionId, sessionToken, taskDescription, consumerUserId,\r\n slotIndex: (payload['slotIndex'] as number) ?? 0,\r\n };\r\n this.activeSessions.set(sessionId, session);\r\n\r\n this.emit('session:new', session);\r\n\r\n if (this.autoApprove) {\r\n // Auto-approve and connect\r\n this.client.approveSession(sessionId).then(() => {\r\n this.sessionManager?.connect(sessionId, sessionToken);\r\n this.emit('session:approved', sessionId);\r\n }).catch((err) => {\r\n this.emit('session:error', sessionId, err);\r\n });\r\n }\r\n } else if (type === 'session.approved') {\r\n const payload = msg['payload'] as Record<string, unknown>;\r\n const sessionId = payload['sessionId'] as string;\r\n const session = this.activeSessions.get(sessionId);\r\n if (session) {\r\n this.sessionManager?.connect(sessionId, session.sessionToken);\r\n }\r\n }\r\n }\r\n}\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport type { ApiClient } from '@clawrent/cli';\r\n\r\nexport function registerAuthTools(server: McpServer, client: ApiClient): void {\r\n server.tool(\r\n 'clawrent_send_verification',\r\n 'Send email verification code for registration',\r\n {\r\n email: z.string().email().describe('Email address to verify'),\r\n },\r\n async ({ email }) => {\r\n const result = await client.sendVerification(email);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify({ email, sent: true, ...result }, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_register_user',\r\n 'Register a new ClawRent user account',\r\n {\r\n email: z.string().email().describe('Email address'),\r\n password: z.string().min(8).max(128).describe('Password (min 8 chars)'),\r\n name: z.string().min(1).max(100).describe('Display name'),\r\n verificationCode: z.string().length(6).describe('6-digit verification code from email'),\r\n },\r\n async (input) => {\r\n const result = await client.registerUser(input);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_login',\r\n 'Login to an existing ClawRent account',\r\n {\r\n email: z.string().email().describe('Email address'),\r\n password: z.string().min(1).describe('Password'),\r\n },\r\n async ({ email, password }) => {\r\n const result = await client.login(email, password);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n}\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport type { ApiClient } from '@clawrent/cli';\r\n\r\nexport function registerConsumerTools(server: McpServer, client: ApiClient): void {\r\n // --- Marketplace ---\r\n\r\n server.tool(\r\n 'clawrent_browse',\r\n 'Browse available agents on the ClawRent marketplace',\r\n {\r\n search: z.string().optional().describe('Search agents by name'),\r\n category: z.string().optional().describe('Filter by category'),\r\n page: z.number().optional().describe('Page number (default: 1)'),\r\n limit: z.number().optional().describe('Results per page (default: 20)'),\r\n },\r\n async ({ search, category, page, limit }) => {\r\n const result = await client.browse({ search, category, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_agent_details',\r\n 'Get detailed information about a specific agent by its slug',\r\n {\r\n slug: z.string().describe('Agent slug (URL-friendly identifier)'),\r\n },\r\n async ({ slug }) => {\r\n const result = await client.getAgent(slug);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Sessions ---\r\n\r\n server.tool(\r\n 'clawrent_rent_agent',\r\n 'Rent an agent by creating a new session. Returns session details including sessionId and sessionToken.',\r\n {\r\n agentId: z.string().describe('ID of the agent to rent'),\r\n taskDescription: z.string().describe('Description of the task (10-2000 chars)'),\r\n permissions: z.string().optional().describe('Granted permissions as JSON string (default: {})'),\r\n },\r\n async ({ agentId, taskDescription, permissions }) => {\r\n let grantedPermissions: Record<string, unknown> = {};\r\n if (permissions) {\r\n try {\r\n grantedPermissions = JSON.parse(permissions) as Record<string, unknown>;\r\n } catch {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON for permissions' }],\r\n isError: true,\r\n };\r\n }\r\n }\r\n const result = await client.rent({ agentId, taskDescription, grantedPermissions });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_sessions',\r\n 'List your sessions on the platform',\r\n {\r\n role: z.string().optional().describe('Filter by role: consumer or provider'),\r\n status: z.string().optional().describe('Filter by status (e.g., active, completed, pending_approval)'),\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ role, status, page, limit }) => {\r\n const result = await client.getSessions({ role, status, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_end_session',\r\n 'End an active session. Triggers billing settlement.',\r\n {\r\n sessionId: z.string().describe('ID of the session to end'),\r\n },\r\n async ({ sessionId }) => {\r\n const result = await client.endSession(sessionId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_session_messages',\r\n 'Get message history for a session',\r\n {\r\n sessionId: z.string().describe('Session ID'),\r\n },\r\n async ({ sessionId }) => {\r\n const result = await client.getSessionMessages(sessionId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Billing ---\r\n\r\n server.tool(\r\n 'clawrent_check_balance',\r\n 'Check your wallet balance on the ClawRent platform',\r\n {},\r\n async () => {\r\n const result = await client.getBalance();\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_topup',\r\n 'Top up your wallet balance',\r\n {\r\n amount: z.string().describe('Amount to top up (e.g., \"100.00\")'),\r\n },\r\n async ({ amount }) => {\r\n const result = await client.topUp(amount);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Orders ---\r\n\r\n server.tool(\r\n 'clawrent_create_order',\r\n 'Create an order to rent one or more agents. Each item creates an associated session. Optionally checkout from cart.',\r\n {\r\n items: z.string().describe('JSON array of order items: [{\"providerAgentId\":\"...\",\"taskDescription\":\"...\",\"consumerAgentId\":\"...\"}]'),\r\n note: z.string().optional().describe('Order note'),\r\n fromCart: z.boolean().optional().describe('If true, clear cart after order creation'),\r\n },\r\n async ({ items, note, fromCart }) => {\r\n let parsedItems: Array<{ providerAgentId: string; consumerAgentId?: string; taskDescription: string }>;\r\n try {\r\n parsedItems = JSON.parse(items) as typeof parsedItems;\r\n } catch {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON for items array' }],\r\n isError: true,\r\n };\r\n }\r\n const result = await client.createOrder({ items: parsedItems, note, fromCart });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_orders',\r\n 'List your orders',\r\n {\r\n status: z.string().optional().describe('Filter by status (pending, active, completed, cancelled)'),\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ status, page, limit }) => {\r\n const result = await client.getOrders({ status, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_order_detail',\r\n 'Get detailed information about a specific order including its items',\r\n {\r\n orderId: z.string().describe('Order ID'),\r\n },\r\n async ({ orderId }) => {\r\n const result = await client.getOrder(orderId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_cancel_order',\r\n 'Cancel an order. Only pending/active orders can be cancelled.',\r\n {\r\n orderId: z.string().describe('Order ID'),\r\n },\r\n async ({ orderId }) => {\r\n const result = await client.cancelOrder(orderId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Cart ---\r\n\r\n server.tool(\r\n 'clawrent_list_cart',\r\n 'View your shopping cart items',\r\n {},\r\n async () => {\r\n const result = await client.getCart();\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_add_to_cart',\r\n 'Add an agent to your shopping cart',\r\n {\r\n providerAgentId: z.string().describe('Agent ID to add'),\r\n taskDescription: z.string().describe('Task description for the agent (10-2000 chars)'),\r\n },\r\n async ({ providerAgentId, taskDescription }) => {\r\n const result = await client.addToCart({ providerAgentId, taskDescription });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_remove_from_cart',\r\n 'Remove a specific item from the shopping cart',\r\n {\r\n itemId: z.string().describe('Cart item ID to remove'),\r\n },\r\n async ({ itemId }) => {\r\n const result = await client.removeFromCart(itemId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_clear_cart',\r\n 'Clear all items from the shopping cart',\r\n {},\r\n async () => {\r\n const result = await client.clearCart();\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Favorites ---\r\n\r\n server.tool(\r\n 'clawrent_add_favorite',\r\n 'Add an agent to your favorites',\r\n {\r\n agentId: z.string().describe('Agent ID to favorite'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.addFavorite(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_remove_favorite',\r\n 'Remove an agent from your favorites',\r\n {\r\n agentId: z.string().describe('Agent ID to unfavorite'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.removeFavorite(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_favorites',\r\n 'List your favorited agents',\r\n {\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ page, limit }) => {\r\n const result = await client.listFavorites({ page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n}\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport type { ApiClient } from '@clawrent/cli';\r\nimport type { ProviderAgent } from '../provider-agent.js';\r\n\r\nexport function registerProviderTools(server: McpServer, client: ApiClient, providerAgent: ProviderAgent): void {\r\n server.tool(\r\n 'clawrent_register_agent',\r\n 'Register a new agent on the ClawRent platform (consumer by default). To become a provider, use clawrent_apply_provider after creation.',\r\n {\r\n name: z.string().describe('Agent name (1-100 chars)'),\r\n slug: z.string().describe('URL-friendly slug (lowercase, hyphens)'),\r\n description: z.string().describe('Agent description (10-500 chars)'),\r\n longDescription: z.string().optional().describe('Detailed description (max 5000 chars)'),\r\n },\r\n async (params) => {\r\n const data: Record<string, unknown> = {\r\n name: params.name,\r\n slug: params.slug,\r\n description: params.description,\r\n };\r\n if (params.longDescription) data['longDescription'] = params.longDescription;\r\n\r\n const result = await client.registerAgent(data);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_apply_provider',\r\n 'Apply for provider role on an existing agent. Requires admin review.',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n pricingModel: z.enum(['per_token', 'per_session', 'per_minute']).optional().describe('Pricing model (default: per_session)'),\r\n priceAmount: z.string().optional().describe('Price amount (default: 1.00)'),\r\n currency: z.enum(['CNY', 'USD']).optional().describe('Currency (default: CNY)'),\r\n hostingType: z.enum(['self_hosted', 'platform_hosted']).optional().describe('Hosting type (default: self_hosted)'),\r\n approvalMode: z.enum(['manual', 'auto']).optional().describe('Session approval mode (default: manual)'),\r\n maxConcurrentSessions: z.number().optional().describe('Max concurrent sessions (default: 5)'),\r\n maxConsumerSlots: z.number().optional().describe('Max consumer slots per session (default: 1)'),\r\n },\r\n async (params) => {\r\n const data: Record<string, unknown> = {};\r\n if (params.pricingModel) data['pricingModel'] = params.pricingModel;\r\n if (params.priceAmount) data['priceAmount'] = params.priceAmount;\r\n if (params.currency) data['currency'] = params.currency;\r\n if (params.hostingType) data['hostingType'] = params.hostingType;\r\n if (params.approvalMode) data['approvalMode'] = params.approvalMode;\r\n if (params.maxConcurrentSessions) data['maxConcurrentSessions'] = params.maxConcurrentSessions;\r\n if (params.maxConsumerSlots) data['maxConsumerSlots'] = params.maxConsumerSlots;\r\n\r\n const result = await client.applyProvider(params.agentId, data);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_publish_agent',\r\n 'Publish an agent for admin review (draft → pending_review). ⚠️ REQUIRES user confirmation before executing!',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n pricingModel: z.enum(['per_token', 'per_session', 'per_minute', 'fixed']).optional().describe('Pricing model (default: per_token)'),\r\n priceAmount: z.string().optional().describe('Price amount (default: 0.05)'),\r\n currency: z.enum(['CNY', 'USD']).optional().describe('Currency (default: CNY)'),\r\n hostingType: z.enum(['self_hosted', 'platform_hosted']).optional().describe('Hosting type (default: self_hosted)'),\r\n approvalMode: z.enum(['auto', 'manual']).optional().describe('Session approval mode (default: manual)'),\r\n transparencyLevel: z.enum(['opaque', 'moderate', 'transparent']).optional().describe('Transparency level (default: moderate)'),\r\n },\r\n async (params) => {\r\n const data: Record<string, unknown> = {};\r\n if (params.pricingModel) data['pricingModel'] = params.pricingModel;\r\n if (params.priceAmount) data['priceAmount'] = params.priceAmount;\r\n if (params.currency) data['currency'] = params.currency;\r\n if (params.hostingType) data['hostingType'] = params.hostingType;\r\n if (params.approvalMode) data['approvalMode'] = params.approvalMode;\r\n if (params.transparencyLevel) data['transparencyLevel'] = params.transparencyLevel;\r\n\r\n const result = await client.publishAgent(params.agentId, data);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_activate_agent',\r\n 'Activate an agent after admin approval + WebSocket connected (goes online). ⚠️ REQUIRES user confirmation! Agent must have approved provider profile and active WebSocket connection.',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.activateAgent(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_set_agent_status',\r\n 'Set agent online status (online, offline, or busy)',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n onlineStatus: z.enum(['online', 'offline', 'busy']).describe('Target online status'),\r\n },\r\n async ({ agentId, onlineStatus }) => {\r\n const result = await client.setOnlineStatus(agentId, onlineStatus);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_list_my_agents',\r\n 'List agents owned by the current user',\r\n {\r\n roles: z.string().optional().describe('Filter by roles (consumer, both)'),\r\n page: z.number().optional().describe('Page number'),\r\n limit: z.number().optional().describe('Results per page'),\r\n },\r\n async ({ roles, page, limit }) => {\r\n const result = await client.getMyAgents({ roles, page, limit });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_approve_session',\r\n 'Approve a pending session request',\r\n {\r\n sessionId: z.string().describe('Session ID to approve'),\r\n },\r\n async ({ sessionId }) => {\r\n const result = await client.approveSession(sessionId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- Token Management ---\r\n\r\n server.tool(\r\n 'clawrent_generate_agent_token',\r\n 'Generate or regenerate an agent token for WebSocket authentication. The token is shown only once.',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.generateAgentToken(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_revoke_agent_token',\r\n 'Revoke an agent token. The agent will be disconnected and cannot reconnect until a new token is generated.',\r\n {\r\n agentId: z.string().describe('Agent ID'),\r\n },\r\n async ({ agentId }) => {\r\n const result = await client.revokeAgentToken(agentId);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n\r\n // --- In-process Serve ---\r\n\r\n server.tool(\r\n 'clawrent_start_serving',\r\n 'Start serving as a provider agent. Connects to the platform via WebSocket in-process (no subprocess). Listens for incoming session requests and auto-approves them if enabled.',\r\n {\r\n agentId: z.string().describe('Agent ID to serve'),\r\n agentToken: z.string().describe('Agent token for WebSocket authentication'),\r\n autoApprove: z.boolean().optional().describe('Automatically approve incoming sessions (default: true)'),\r\n },\r\n async ({ agentId, agentToken, autoApprove }) => {\r\n if (providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Already serving agent ${providerAgent.currentAgentId}. Stop it first with clawrent_stop_serving.` }],\r\n isError: true,\r\n };\r\n }\r\n\r\n try {\r\n await providerAgent.start(agentId, agentToken, autoApprove ?? true);\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Agent ${agentId} is now serving in-process.\\nAuto-approve: ${autoApprove ?? true}\\nWaiting for incoming sessions via /ws/agent channel.`,\r\n }],\r\n };\r\n } catch (err: unknown) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Failed to start serving: ${err instanceof Error ? err.message : String(err)}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_stop_serving',\r\n 'Stop the in-process provider agent. Disconnects all sessions and the agent control channel.',\r\n {},\r\n async () => {\r\n if (!providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'No agent is currently serving.' }],\r\n };\r\n }\r\n\r\n const agentId = providerAgent.currentAgentId;\r\n providerAgent.stop();\r\n return {\r\n content: [{ type: 'text' as const, text: `Agent ${agentId} stopped serving.` }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_send_session_message',\r\n 'Send a message to an active session as the provider agent. Requires clawrent_start_serving to be active.',\r\n {\r\n sessionId: z.string().describe('Session ID'),\r\n type: z.string().optional().describe('Message type (default: result.success)'),\r\n payload: z.string().describe('Message payload as JSON string'),\r\n },\r\n async ({ sessionId, type, payload }) => {\r\n if (!providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'No agent is currently serving. Start with clawrent_start_serving first.' }],\r\n isError: true,\r\n };\r\n }\r\n\r\n let parsedPayload: Record<string, unknown>;\r\n try {\r\n parsedPayload = JSON.parse(payload) as Record<string, unknown>;\r\n } catch {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON for payload' }],\r\n isError: true,\r\n };\r\n }\r\n\r\n const sent = providerAgent.send(sessionId, {\r\n type: type ?? 'result.success',\r\n payload: parsedPayload,\r\n });\r\n\r\n if (!sent) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Session ${sessionId} is not connected or not found.` }],\r\n isError: true,\r\n };\r\n }\r\n\r\n return {\r\n content: [{ type: 'text' as const, text: `Message sent to session ${sessionId}.` }],\r\n };\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_serving_status',\r\n 'Check the current serving status: whether an agent is active, which sessions are connected.',\r\n {},\r\n async () => {\r\n if (!providerAgent.running) {\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify({ serving: false }, null, 2) }],\r\n };\r\n }\r\n\r\n const sessions = providerAgent.getSessions();\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n serving: true,\r\n agentId: providerAgent.currentAgentId,\r\n activeSessions: sessions.length,\r\n sessions: sessions.map((s) => ({\r\n sessionId: s.sessionId,\r\n taskDescription: s.taskDescription,\r\n consumerUserId: s.consumerUserId,\r\n slotIndex: s.slotIndex,\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n}\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport type { ApiClient } from '@clawrent/cli';\r\n\r\nexport function registerDocsTools(server: McpServer, client: ApiClient): void {\r\n // --- Read (public, no auth needed) ---\r\n\r\n server.tool(\r\n 'clawrent_docs_tree',\r\n 'Get the published documentation tree structure of ClawRent platform',\r\n {},\r\n async () => {\r\n try {\r\n const result = await client.getDocsTree();\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_docs_read',\r\n 'Read a specific document by its full path (e.g. \"getting-started/quick-start\")',\r\n {\r\n path: z.string().describe('Full path of the document (e.g. \"getting-started/quick-start\")'),\r\n },\r\n async ({ path }) => {\r\n try {\r\n const result = await client.getDocByPath(path);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_docs_search',\r\n 'Search published documentation by keyword (searches title and content)',\r\n {\r\n query: z.string().describe('Search keyword'),\r\n },\r\n async ({ query }) => {\r\n try {\r\n const result = await client.searchDocs(query);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n } catch (err) {\r\n return {\r\n content: [{ type: 'text' as const, text: `Error: ${err instanceof Error ? err.message : String(err)}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n // --- Write (admin agents only) ---\r\n\r\n server.tool(\r\n 'clawrent_docs_create',\r\n 'Create a new document or folder in the doc CMS. Requires admin permissions.',\r\n {\r\n type: z.enum(['folder', 'document']).describe('Node type: \"folder\" or \"document\"'),\r\n title: z.string().describe('Document or folder title'),\r\n parentId: z.string().optional().describe('Parent folder ID (omit for root level)'),\r\n content: z.string().optional().describe('Markdown content (for documents)'),\r\n slug: z.string().optional().describe('URL-friendly slug (auto-generated from title if omitted)'),\r\n icon: z.string().optional().describe('Icon emoji or identifier'),\r\n },\r\n async ({ type, title, parentId, content, slug, icon }) => {\r\n try {\r\n const result = await client.createDoc({ type, title, parentId, content, slug, icon });\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n if (msg.includes('403')) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Permission denied: This operation requires admin privileges with mcp.docs.create permission.' }],\r\n isError: true,\r\n };\r\n }\r\n return {\r\n content: [{ type: 'text' as const, text: `Error: ${msg}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_docs_update',\r\n 'Update an existing document (title, content, etc.). Requires admin permissions.',\r\n {\r\n id: z.string().describe('Document ID to update'),\r\n title: z.string().optional().describe('New title'),\r\n content: z.string().optional().describe('New markdown content'),\r\n changeSummary: z.string().optional().describe('Brief summary of what changed (for version history)'),\r\n },\r\n async ({ id, title, content, changeSummary }) => {\r\n try {\r\n const data: Record<string, string> = {};\r\n if (title !== undefined) data['title'] = title;\r\n if (content !== undefined) data['content'] = content;\r\n if (changeSummary !== undefined) data['changeSummary'] = changeSummary;\r\n const result = await client.updateDoc(id, data);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n if (msg.includes('403')) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Permission denied: This operation requires admin privileges with mcp.docs.edit permission.' }],\r\n isError: true,\r\n };\r\n }\r\n return {\r\n content: [{ type: 'text' as const, text: `Error: ${msg}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_docs_delete',\r\n 'Delete a document or folder from the doc CMS. Requires admin permissions.',\r\n {\r\n id: z.string().describe('Document or folder ID to delete'),\r\n },\r\n async ({ id }) => {\r\n try {\r\n await client.deleteDoc(id);\r\n return {\r\n content: [{ type: 'text' as const, text: `Document ${id} deleted successfully.` }],\r\n };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n if (msg.includes('403')) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Permission denied: This operation requires admin privileges with mcp.docs.delete permission.' }],\r\n isError: true,\r\n };\r\n }\r\n return {\r\n content: [{ type: 'text' as const, text: `Error: ${msg}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n\r\n server.tool(\r\n 'clawrent_docs_publish',\r\n 'Publish or unpublish a document. Requires admin permissions.',\r\n {\r\n id: z.string().describe('Document ID'),\r\n action: z.enum(['publish', 'unpublish']).describe('Action: \"publish\" or \"unpublish\"'),\r\n },\r\n async ({ id, action }) => {\r\n try {\r\n const result = action === 'publish'\r\n ? await client.publishDoc(id)\r\n : await client.unpublishDoc(id);\r\n return {\r\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\r\n };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n if (msg.includes('403')) {\r\n return {\r\n content: [{ type: 'text' as const, text: 'Permission denied: This operation requires admin privileges with mcp.docs.publish permission.' }],\r\n isError: true,\r\n };\r\n }\r\n return {\r\n content: [{ type: 'text' as const, text: `Error: ${msg}` }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n}\r\n"],"mappings":"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","names":["ApiClient","z","z","z","ApiClient"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawrent/mcp-server",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -17,9 +17,9 @@
17
17
  "@modelcontextprotocol/sdk": "^1.12.0",
18
18
  "ws": "^8.18.0",
19
19
  "zod": "^3.24.0",
20
- "@clawrent/cli": "0.1.1",
21
- "@clawrent/protocol": "0.1.0",
22
- "@clawrent/shared-types": "0.1.0"
20
+ "@clawrent/cli": "0.4.0",
21
+ "@clawrent/shared-types": "0.2.0",
22
+ "@clawrent/protocol": "0.2.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^22.0.0",