@clawrent/mcp-server 0.1.1 → 0.2.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 +15 -0
- package/dist/index.js +34 -37
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
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 = {
|
|
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) {
|
|
@@ -445,18 +451,12 @@ import { z as z2 } from "zod";
|
|
|
445
451
|
function registerProviderTools(server, client, providerAgent) {
|
|
446
452
|
server.tool(
|
|
447
453
|
"clawrent_register_agent",
|
|
448
|
-
"Register a new agent on the ClawRent platform",
|
|
454
|
+
"Register a new agent on the ClawRent platform (consumer by default). To become a provider, use clawrent_apply_provider after creation.",
|
|
449
455
|
{
|
|
450
456
|
name: z2.string().describe("Agent name (1-100 chars)"),
|
|
451
457
|
slug: z2.string().describe("URL-friendly slug (lowercase, hyphens)"),
|
|
452
458
|
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)")
|
|
459
|
+
longDescription: z2.string().optional().describe("Detailed description (max 5000 chars)")
|
|
460
460
|
},
|
|
461
461
|
async (params) => {
|
|
462
462
|
const data = {
|
|
@@ -465,12 +465,6 @@ function registerProviderTools(server, client, providerAgent) {
|
|
|
465
465
|
description: params.description
|
|
466
466
|
};
|
|
467
467
|
if (params.longDescription) data["longDescription"] = params.longDescription;
|
|
468
|
-
if (params.pricingModel) data["pricingModel"] = params.pricingModel;
|
|
469
|
-
if (params.priceAmount) data["priceAmount"] = params.priceAmount;
|
|
470
|
-
if (params.currency) data["currency"] = params.currency;
|
|
471
|
-
if (params.hostingType) data["hostingType"] = params.hostingType;
|
|
472
|
-
if (params.approvalMode) data["approvalMode"] = params.approvalMode;
|
|
473
|
-
if (params.maxConcurrentSessions) data["maxConcurrentSessions"] = params.maxConcurrentSessions;
|
|
474
468
|
const result = await client.registerAgent(data);
|
|
475
469
|
return {
|
|
476
470
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
@@ -478,26 +472,28 @@ function registerProviderTools(server, client, providerAgent) {
|
|
|
478
472
|
}
|
|
479
473
|
);
|
|
480
474
|
server.tool(
|
|
481
|
-
"
|
|
482
|
-
"
|
|
483
|
-
{
|
|
484
|
-
agentId: z2.string().describe("Agent ID")
|
|
485
|
-
},
|
|
486
|
-
async ({ agentId }) => {
|
|
487
|
-
const result = await client.publishAgent(agentId);
|
|
488
|
-
return {
|
|
489
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
);
|
|
493
|
-
server.tool(
|
|
494
|
-
"clawrent_activate_agent",
|
|
495
|
-
"Activate an agent (changes status from pending_review to active). Requires agent token and active WS connection.",
|
|
475
|
+
"clawrent_apply_provider",
|
|
476
|
+
"Apply for provider role on an existing agent. Requires admin review.",
|
|
496
477
|
{
|
|
497
|
-
agentId: z2.string().describe("Agent ID")
|
|
478
|
+
agentId: z2.string().describe("Agent ID"),
|
|
479
|
+
pricingModel: z2.enum(["per_token", "per_session", "per_minute"]).optional().describe("Pricing model (default: per_session)"),
|
|
480
|
+
priceAmount: z2.string().optional().describe("Price amount (default: 1.00)"),
|
|
481
|
+
currency: z2.enum(["CNY", "USD"]).optional().describe("Currency (default: CNY)"),
|
|
482
|
+
hostingType: z2.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
|
|
483
|
+
approvalMode: z2.enum(["manual", "auto"]).optional().describe("Session approval mode (default: manual)"),
|
|
484
|
+
maxConcurrentSessions: z2.number().optional().describe("Max concurrent sessions (default: 5)"),
|
|
485
|
+
maxConsumerSlots: z2.number().optional().describe("Max consumer slots per session (default: 1)")
|
|
498
486
|
},
|
|
499
|
-
async (
|
|
500
|
-
const
|
|
487
|
+
async (params) => {
|
|
488
|
+
const data = {};
|
|
489
|
+
if (params.pricingModel) data["pricingModel"] = params.pricingModel;
|
|
490
|
+
if (params.priceAmount) data["priceAmount"] = params.priceAmount;
|
|
491
|
+
if (params.currency) data["currency"] = params.currency;
|
|
492
|
+
if (params.hostingType) data["hostingType"] = params.hostingType;
|
|
493
|
+
if (params.approvalMode) data["approvalMode"] = params.approvalMode;
|
|
494
|
+
if (params.maxConcurrentSessions) data["maxConcurrentSessions"] = params.maxConcurrentSessions;
|
|
495
|
+
if (params.maxConsumerSlots) data["maxConsumerSlots"] = params.maxConsumerSlots;
|
|
496
|
+
const result = await client.applyProvider(params.agentId, data);
|
|
501
497
|
return {
|
|
502
498
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
503
499
|
};
|
|
@@ -521,12 +517,12 @@ function registerProviderTools(server, client, providerAgent) {
|
|
|
521
517
|
"clawrent_list_my_agents",
|
|
522
518
|
"List agents owned by the current user",
|
|
523
519
|
{
|
|
524
|
-
|
|
520
|
+
roles: z2.string().optional().describe("Filter by roles (consumer, both)"),
|
|
525
521
|
page: z2.number().optional().describe("Page number"),
|
|
526
522
|
limit: z2.number().optional().describe("Results per page")
|
|
527
523
|
},
|
|
528
|
-
async ({
|
|
529
|
-
const result = await client.getMyAgents({
|
|
524
|
+
async ({ roles, page, limit }) => {
|
|
525
|
+
const result = await client.getMyAgents({ roles, page, limit });
|
|
530
526
|
return {
|
|
531
527
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
532
528
|
};
|
|
@@ -681,7 +677,8 @@ Waiting for incoming sessions via /ws/agent channel.`
|
|
|
681
677
|
sessions: sessions.map((s) => ({
|
|
682
678
|
sessionId: s.sessionId,
|
|
683
679
|
taskDescription: s.taskDescription,
|
|
684
|
-
consumerUserId: s.consumerUserId
|
|
680
|
+
consumerUserId: s.consumerUserId,
|
|
681
|
+
slotIndex: s.slotIndex
|
|
685
682
|
}))
|
|
686
683
|
}, null, 2)
|
|
687
684
|
}]
|
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/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 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 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 (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_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"],"mappings":"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","names":["ApiClient","z","ApiClient"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clawrent/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.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.
|
|
21
|
-
"@clawrent/protocol": "0.
|
|
22
|
-
"@clawrent/shared-types": "0.
|
|
20
|
+
"@clawrent/cli": "0.3.0",
|
|
21
|
+
"@clawrent/protocol": "0.2.0",
|
|
22
|
+
"@clawrent/shared-types": "0.2.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/node": "^22.0.0",
|