@clawrent/mcp-server 0.3.3 → 0.4.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/dist/index.js CHANGED
@@ -3,168 +3,122 @@
3
3
  // src/index.ts
4
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
- import { ApiClient as ApiClient2, loadConfig } from "@clawrent/cli";
6
+ import { ApiClient, loadConfig } from "@clawrent/provider";
7
7
 
8
8
  // src/provider-agent.ts
9
9
  import { EventEmitter } from "events";
10
- import WebSocket from "ws";
11
- import { SessionManager } from "@clawrent/cli";
10
+ import { ProviderClient } from "@clawrent/provider";
12
11
  var ProviderAgent = class extends EventEmitter {
13
- client;
14
- agentWs = null;
15
- sessionManager = null;
16
- heartbeatTimer = null;
17
- reconnectTimer = null;
18
- reconnectAttempts = 0;
19
- maxReconnectDelay = 3e4;
20
- _running = false;
21
- agentId = null;
22
- agentToken = null;
23
- autoApprove = false;
24
- activeSessions = /* @__PURE__ */ new Map();
25
12
  constructor(client) {
26
13
  super();
27
14
  this.client = client;
28
15
  }
16
+ client;
17
+ pc = null;
18
+ agentId = null;
19
+ /** Sessions observed via ProviderClient callbacks; backs getSessions() for serving_status. */
20
+ wrapperSessions = /* @__PURE__ */ new Map();
29
21
  get running() {
30
- return this._running;
22
+ return this.pc?.running ?? false;
31
23
  }
32
24
  get currentAgentId() {
33
25
  return this.agentId;
34
26
  }
35
27
  getSessions() {
36
- return Array.from(this.activeSessions.values());
28
+ return Array.from(this.wrapperSessions.values());
37
29
  }
38
30
  /**
39
- * Start the in-process agent: connect to /ws/agent and listen for sessions.
31
+ * Start serving: spin up a ProviderClient (which connects /ws/agent, activates
32
+ * the agent, re-attaches active sessions) and re-emit its events on this
33
+ * instance under the names mcp tools already listen to.
34
+ *
35
+ * The shared ApiClient's agent-token override is set too, so non-serving
36
+ * provider REST calls (approve/list/end/balance) made by other mcp tools
37
+ * authenticate as the agent owner without a separate user JWT. This mirrors
38
+ * the pre-Task-7 behavior; ProviderClient uses its own internal ApiClient for
39
+ * its own REST calls, so the wrapper must keep the shared one in sync.
40
40
  */
41
41
  async start(agentId, agentToken, autoApprove = false) {
42
- if (this._running) {
42
+ if (this.pc) {
43
43
  throw new Error(`Already serving agent ${this.agentId}`);
44
44
  }
45
45
  this.agentId = agentId;
46
- this.agentToken = agentToken;
47
- this.autoApprove = autoApprove;
48
- this._running = true;
49
- this.reconnectAttempts = 0;
50
- this.sessionManager = new SessionManager(this.client.wsUrl);
51
- this.sessionManager.agentId = agentId;
52
- this.sessionManager.on("session:connected", (sessionId) => {
53
- this.emit("session:connected", sessionId);
54
- });
55
- this.sessionManager.on("session:message", (sessionId, message) => {
56
- this.emit("session:message", sessionId, message);
57
- });
58
- this.sessionManager.on("session:disconnected", (sessionId) => {
59
- this.activeSessions.delete(sessionId);
60
- this.emit("session:disconnected", sessionId);
46
+ this.pc = new ProviderClient({
47
+ apiUrl: this.client.apiUrl,
48
+ wsUrl: this.client.wsUrl,
49
+ agentToken,
50
+ autoApprove
61
51
  });
52
+ this.forwardProviderClientEvents();
62
53
  this.client.setAgentToken(agentToken);
63
- this.connectAgent();
54
+ await this.pc.start({
55
+ agentId,
56
+ onMessage: async (session, message) => {
57
+ this.emit("session:message", session.sessionId, message);
58
+ },
59
+ onSessionNew: (session) => {
60
+ this.wrapperSessions.set(session.sessionId, session);
61
+ },
62
+ onSessionEnded: (session) => {
63
+ this.wrapperSessions.delete(session.sessionId);
64
+ }
65
+ });
64
66
  }
65
- /**
66
- * Stop the agent: disconnect all sessions and the control channel.
67
- */
67
+ /** Stop serving: tear down the ProviderClient and clear local state. */
68
68
  stop() {
69
- this._running = false;
70
- if (this.heartbeatTimer) {
71
- clearInterval(this.heartbeatTimer);
72
- this.heartbeatTimer = null;
73
- }
74
- if (this.reconnectTimer) {
75
- clearTimeout(this.reconnectTimer);
76
- this.reconnectTimer = null;
77
- }
78
- this.sessionManager?.disconnectAll();
79
- this.sessionManager = null;
80
- if (this.agentWs && (this.agentWs.readyState === WebSocket.OPEN || this.agentWs.readyState === WebSocket.CONNECTING)) {
81
- this.agentWs.close(1e3, "Agent stopping");
82
- }
83
- this.agentWs = null;
84
- this.activeSessions.clear();
69
+ this.pc?.stop();
70
+ this.pc = null;
71
+ this.wrapperSessions.clear();
85
72
  this.agentId = null;
86
- this.agentToken = null;
87
73
  this.client.setAgentToken(null);
88
74
  this.emit("stopped");
89
75
  }
90
76
  /**
91
- * Send a message to a specific session.
77
+ * Fire-and-forget send. Returns false when not serving. MCP tools use
78
+ * `sendViaWsOrRest` (which awaits); this is kept for surface compatibility.
92
79
  */
93
80
  send(sessionId, message) {
94
- if (!this.sessionManager) return false;
95
- return this.sessionManager.send(sessionId, message);
81
+ if (!this.pc) return false;
82
+ void this.pc.send(sessionId, message);
83
+ return true;
96
84
  }
97
- connectAgent() {
98
- if (!this._running || !this.agentToken) return;
99
- const url = `${this.client.wsUrl}/ws/agent?token=${this.agentToken}`;
100
- const ws = new WebSocket(url);
101
- this.agentWs = ws;
102
- ws.on("open", () => {
103
- this.reconnectAttempts = 0;
104
- this.emit("agent:connected", this.agentId);
105
- this.heartbeatTimer = setInterval(() => {
106
- if (ws.readyState === WebSocket.OPEN) {
107
- ws.send(JSON.stringify({ type: "system.heartbeat", payload: {} }));
108
- }
109
- }, 25e3);
110
- });
111
- ws.on("message", (raw) => {
112
- try {
113
- const msg = JSON.parse(raw.toString());
114
- this.handleAgentMessage(msg);
115
- } catch {
116
- }
117
- });
118
- ws.on("close", (code) => {
119
- if (this.heartbeatTimer) {
120
- clearInterval(this.heartbeatTimer);
121
- this.heartbeatTimer = null;
122
- }
123
- this.emit("agent:disconnected", this.agentId);
124
- if (this._running && code !== 1e3) {
125
- const delay = Math.min(1e3 * Math.pow(2, this.reconnectAttempts), this.maxReconnectDelay);
126
- this.reconnectAttempts++;
127
- this.reconnectTimer = setTimeout(() => this.connectAgent(), delay);
128
- }
129
- });
130
- ws.on("error", (err) => {
131
- this.emit("agent:error", err);
132
- });
133
- }
134
- handleAgentMessage(msg) {
135
- const type = msg["type"];
136
- if (type === "system.heartbeat_ack") return;
137
- if (type === "session.new") {
138
- const payload = msg["payload"];
139
- const sessionId = payload["sessionId"];
140
- const sessionToken = payload["sessionToken"];
141
- const taskDescription = payload["taskDescription"] || "";
142
- const consumerUserId = payload["consumerUserId"];
143
- const session = {
144
- sessionId,
145
- sessionToken,
146
- taskDescription,
147
- consumerUserId,
148
- slotIndex: payload["slotIndex"] ?? 0
149
- };
150
- this.activeSessions.set(sessionId, session);
151
- this.emit("session:new", session);
152
- if (this.autoApprove) {
153
- this.client.approveSession(sessionId).then(() => {
154
- this.sessionManager?.connect(sessionId, sessionToken);
155
- this.emit("session:approved", sessionId);
156
- }).catch((err) => {
157
- this.emit("session:error", sessionId, err);
158
- });
159
- }
160
- } else if (type === "session.approved") {
161
- const payload = msg["payload"];
162
- const sessionId = payload["sessionId"];
163
- const session = this.activeSessions.get(sessionId);
164
- if (session) {
165
- this.sessionManager?.connect(sessionId, session.sessionToken);
166
- }
85
+ /**
86
+ * Send via WS if attached, else fall back to REST. Never fails with "not
87
+ * attached" when not serving, uses the shared ApiClient's REST endpoint so
88
+ * `clawrent_send_session_message` still works after a restart that detached
89
+ * the socket. Returns the transport actually used.
90
+ */
91
+ async sendViaWsOrRest(sessionId, message) {
92
+ if (!this.pc) {
93
+ await this.client.sendSessionMessage(sessionId, message);
94
+ return { via: "rest" };
167
95
  }
96
+ return this.pc.send(sessionId, message);
97
+ }
98
+ /**
99
+ * Re-emit ProviderClient's lifecycle / session events under the same names on
100
+ * this instance. `session:message` is handled separately via the onMessage
101
+ * callback in start(); the rest are forwarded here so any future listener
102
+ * (matching the pre-Task-7 surface) keeps working.
103
+ */
104
+ forwardProviderClientEvents() {
105
+ const pc = this.pc;
106
+ if (!pc) return;
107
+ const forward = (evt) => {
108
+ pc.on(evt, (...args) => {
109
+ this.emit(evt, ...args);
110
+ });
111
+ };
112
+ forward("agent:connected");
113
+ forward("agent:disconnected");
114
+ forward("agent:started");
115
+ forward("agent:warning");
116
+ forward("session:new");
117
+ forward("session:approved");
118
+ forward("session:connected");
119
+ forward("session:disconnected");
120
+ forward("session:reattached");
121
+ forward("session:error");
168
122
  }
169
123
  };
170
124
 
@@ -532,7 +486,9 @@ function registerProviderTools(server, client, providerAgent) {
532
486
  hostingType: z3.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
533
487
  approvalMode: z3.enum(["manual", "auto"]).optional().describe("Session approval mode (default: manual)"),
534
488
  maxConcurrentSessions: z3.number().optional().describe("Max concurrent sessions (default: 5)"),
535
- maxConsumerSlots: z3.number().optional().describe("Max consumer slots per session (default: 1)")
489
+ maxConsumerSlots: z3.number().optional().describe("Max consumer slots per session (default: 1)"),
490
+ endpoint: z3.string().url().optional().describe("External runtime endpoint URL (self-hosted providers)"),
491
+ healthCheckUrl: z3.string().url().optional().describe("Health check URL the platform may poll")
536
492
  },
537
493
  async (params) => {
538
494
  const data = {};
@@ -543,6 +499,8 @@ function registerProviderTools(server, client, providerAgent) {
543
499
  if (params.approvalMode) data["approvalMode"] = params.approvalMode;
544
500
  if (params.maxConcurrentSessions) data["maxConcurrentSessions"] = params.maxConcurrentSessions;
545
501
  if (params.maxConsumerSlots) data["maxConsumerSlots"] = params.maxConsumerSlots;
502
+ if (params.endpoint) data["endpoint"] = params.endpoint;
503
+ if (params.healthCheckUrl) data["healthCheckUrl"] = params.healthCheckUrl;
546
504
  const result = await client.applyProvider(params.agentId, data);
547
505
  return {
548
506
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
@@ -559,7 +517,9 @@ function registerProviderTools(server, client, providerAgent) {
559
517
  currency: z3.enum(["CNY", "USD"]).optional().describe("Currency (default: CNY)"),
560
518
  hostingType: z3.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
561
519
  approvalMode: z3.enum(["auto", "manual"]).optional().describe("Session approval mode (default: manual)"),
562
- transparencyLevel: z3.enum(["opaque", "moderate", "transparent"]).optional().describe("Transparency level (default: moderate)")
520
+ transparencyLevel: z3.enum(["opaque", "moderate", "transparent"]).optional().describe("Transparency level (default: moderate)"),
521
+ endpoint: z3.string().url().optional().describe("External runtime endpoint URL (self-hosted providers)"),
522
+ healthCheckUrl: z3.string().url().optional().describe("Health check URL the platform may poll")
563
523
  },
564
524
  async (params) => {
565
525
  const data = {};
@@ -569,6 +529,8 @@ function registerProviderTools(server, client, providerAgent) {
569
529
  if (params.hostingType) data["hostingType"] = params.hostingType;
570
530
  if (params.approvalMode) data["approvalMode"] = params.approvalMode;
571
531
  if (params.transparencyLevel) data["transparencyLevel"] = params.transparencyLevel;
532
+ if (params.endpoint) data["endpoint"] = params.endpoint;
533
+ if (params.healthCheckUrl) data["healthCheckUrl"] = params.healthCheckUrl;
572
534
  const result = await client.publishAgent(params.agentId, data);
573
535
  return {
574
536
  content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
@@ -708,19 +670,13 @@ Waiting for incoming sessions via /ws/agent channel.`
708
670
  );
709
671
  server.tool(
710
672
  "clawrent_send_session_message",
711
- "Send a message to an active session as the provider agent. Requires clawrent_start_serving to be active.",
673
+ "Send a message to a session as the provider agent. Works in both realtime (after clawrent_start_serving, sent via WebSocket) and REST-only mode (when not serving, posted via REST API \u2014 e.g. after a restart that detached the socket).",
712
674
  {
713
675
  sessionId: z3.string().describe("Session ID"),
714
676
  type: z3.string().optional().describe("Message type (default: result.success)"),
715
677
  payload: z3.string().describe("Message payload as JSON string")
716
678
  },
717
679
  async ({ sessionId, type, payload }) => {
718
- if (!providerAgent.running) {
719
- return {
720
- content: [{ type: "text", text: "No agent is currently serving. Start with clawrent_start_serving first." }],
721
- isError: true
722
- };
723
- }
724
680
  let parsedPayload;
725
681
  try {
726
682
  parsedPayload = JSON.parse(payload);
@@ -730,19 +686,21 @@ Waiting for incoming sessions via /ws/agent channel.`
730
686
  isError: true
731
687
  };
732
688
  }
733
- const sent = providerAgent.send(sessionId, {
734
- type: type ?? "result.success",
735
- payload: parsedPayload
736
- });
737
- if (!sent) {
689
+ try {
690
+ const { via } = await providerAgent.sendViaWsOrRest(sessionId, {
691
+ type: type ?? "result.success",
692
+ payload: parsedPayload
693
+ });
694
+ return {
695
+ content: [{ type: "text", text: `Message sent to session ${sessionId} via ${via}.` }]
696
+ };
697
+ } catch (err) {
698
+ const errMsg = err instanceof Error ? err.message : String(err);
738
699
  return {
739
- content: [{ type: "text", text: `Session ${sessionId} is not connected or not found.` }],
700
+ content: [{ type: "text", text: `Failed to send to session ${sessionId}: ${errMsg}` }],
740
701
  isError: true
741
702
  };
742
703
  }
743
- return {
744
- content: [{ type: "text", text: `Message sent to session ${sessionId}.` }]
745
- };
746
704
  }
747
705
  );
748
706
  server.tool(
@@ -774,6 +732,20 @@ Waiting for incoming sessions via /ws/agent channel.`
774
732
  };
775
733
  }
776
734
  );
735
+ server.tool(
736
+ "clawrent_get_session_messages",
737
+ "Fetch messages for a session you are serving (as provider). For incremental polling, pass `since` = the largest createdAt from the previous response (ISO string); omit for full history. Messages persist server-side, so this still works after a restart that detached the WS.",
738
+ {
739
+ sessionId: z3.string().describe("Session ID"),
740
+ since: z3.string().optional().describe("ISO timestamp \u2014 only return messages with createdAt > since")
741
+ },
742
+ async ({ sessionId, since }) => {
743
+ const result = await client.getSessionMessages(sessionId, since ? { since } : void 0);
744
+ return {
745
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
746
+ };
747
+ }
748
+ );
777
749
  }
778
750
 
779
751
  // src/tools/docs-tools.ts
@@ -963,7 +935,7 @@ function registerDocsTools(server, client) {
963
935
  // src/index.ts
964
936
  async function main() {
965
937
  const config = loadConfig();
966
- const client = new ApiClient2(config);
938
+ const client = new ApiClient(config);
967
939
  const agentTokenEnv = process.env["CLAWRENT_AGENT_TOKEN"];
968
940
  if (agentTokenEnv) {
969
941
  client.setAgentToken(agentTokenEnv);
@@ -977,6 +949,13 @@ async function main() {
977
949
  registerConsumerTools(server, client);
978
950
  registerProviderTools(server, client, providerAgent);
979
951
  registerDocsTools(server, client);
952
+ providerAgent.on("session:message", (sessionId, message) => {
953
+ void server.sendLoggingMessage({
954
+ level: "info",
955
+ logger: `session:${sessionId}`,
956
+ data: message
957
+ });
958
+ });
980
959
  process.on("SIGINT", () => {
981
960
  providerAgent.stop();
982
961
  process.exit(0);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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 // Provider mode via env: if CLAWRENT_AGENT_TOKEN is set, use it for all REST\r\n // calls (approve/list/end/balance) without needing clawrent_start_serving.\r\n // start_serving's agentToken parameter still overrides this at runtime.\r\n const agentTokenEnv = process.env['CLAWRENT_AGENT_TOKEN'];\r\n if (agentTokenEnv) {\r\n client.setAgentToken(agentTokenEnv);\r\n }\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 // Route REST calls (approve/list/end + internal autoApprove) through the\r\n // agent token — the backend resolves agt_clawrent_* to the agent owner,\r\n // so provider tools work without a separate user JWT login.\r\n this.client.setAgentToken(agentToken);\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 this.client.setAgentToken(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"]}
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/provider';\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 // Provider mode via env: if CLAWRENT_AGENT_TOKEN is set, use it for all REST\r\n // calls (approve/list/end/balance) without needing clawrent_start_serving.\r\n // start_serving's agentToken parameter still overrides this at runtime.\r\n const agentTokenEnv = process.env['CLAWRENT_AGENT_TOKEN'];\r\n if (agentTokenEnv) {\r\n client.setAgentToken(agentTokenEnv);\r\n }\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 // Forward incoming consumer messages (from WS) as MCP logging notifications, so\r\n // the host UI can surface them in real time. Some clients treat these as logs\r\n // and don't feed them to the LLM — for authoritative history, poll\r\n // clawrent_get_session_messages with a `since` cursor.\r\n providerAgent.on('session:message', (sessionId: string, message: Record<string, unknown>) => {\r\n void server.sendLoggingMessage({\r\n level: 'info',\r\n logger: `session:${sessionId}`,\r\n data: message,\r\n });\r\n });\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';\nimport { ProviderClient } from '@clawrent/provider';\nimport type { ApiClient, ActiveSession } from '@clawrent/provider';\n\nexport type { ActiveSession };\n\n/**\n * ProviderAgent — thin adapter letting MCP tools keep their existing\n * ProviderAgent-shaped surface while delegating the real WebSocket / session\n * work to `@clawrent/provider.ProviderClient`.\n *\n * History: this file used to ship a full in-process /ws/agent client + session\n * manager (a copy of what now lives in @clawrent/provider). Task 7 collapsed it\n * into a delegate so all provider logic is maintained in one place. MCP tools\n * (`provider-tools.ts`) and `index.ts` keep calling `running` / `start` / `stop`\n * / `send` / `sendViaWsOrRest` / `getSessions` and listening for the\n * `session:message` event — unchanged.\n *\n * The wrapper also re-emits the rest of ProviderClient's lifecycle / session\n * events under their existing names so any future listener keeps working.\n */\nexport class ProviderAgent extends EventEmitter {\n private pc: ProviderClient | null = null;\n private agentId: string | null = null;\n /** Sessions observed via ProviderClient callbacks; backs getSessions() for serving_status. */\n private readonly wrapperSessions = new Map<string, ActiveSession>();\n\n constructor(private readonly client: ApiClient) {\n super();\n }\n\n get running(): boolean {\n return this.pc?.running ?? false;\n }\n\n get currentAgentId(): string | null {\n return this.agentId;\n }\n\n getSessions(): ActiveSession[] {\n return Array.from(this.wrapperSessions.values());\n }\n\n /**\n * Start serving: spin up a ProviderClient (which connects /ws/agent, activates\n * the agent, re-attaches active sessions) and re-emit its events on this\n * instance under the names mcp tools already listen to.\n *\n * The shared ApiClient's agent-token override is set too, so non-serving\n * provider REST calls (approve/list/end/balance) made by other mcp tools\n * authenticate as the agent owner without a separate user JWT. This mirrors\n * the pre-Task-7 behavior; ProviderClient uses its own internal ApiClient for\n * its own REST calls, so the wrapper must keep the shared one in sync.\n */\n async start(agentId: string, agentToken: string, autoApprove = false): Promise<void> {\n if (this.pc) {\n throw new Error(`Already serving agent ${this.agentId}`);\n }\n\n this.agentId = agentId;\n this.pc = new ProviderClient({\n apiUrl: this.client.apiUrl,\n wsUrl: this.client.wsUrl,\n agentToken,\n autoApprove,\n });\n\n this.forwardProviderClientEvents();\n\n this.client.setAgentToken(agentToken);\n\n await this.pc.start({\n agentId,\n onMessage: async (session, message) => {\n // ProviderClient routes /ws/session frames through onMessage (with cursor\n // dedupe); re-emit under the event name index.ts listens to.\n this.emit('session:message', session.sessionId, message);\n },\n onSessionNew: (session) => {\n this.wrapperSessions.set(session.sessionId, session);\n },\n onSessionEnded: (session) => {\n this.wrapperSessions.delete(session.sessionId);\n },\n });\n }\n\n /** Stop serving: tear down the ProviderClient and clear local state. */\n stop(): void {\n this.pc?.stop();\n this.pc = null;\n this.wrapperSessions.clear();\n this.agentId = null;\n this.client.setAgentToken(null);\n this.emit('stopped');\n }\n\n /**\n * Fire-and-forget send. Returns false when not serving. MCP tools use\n * `sendViaWsOrRest` (which awaits); this is kept for surface compatibility.\n */\n send(sessionId: string, message: { type: string; payload: Record<string, unknown> }): boolean {\n if (!this.pc) return false;\n void this.pc.send(sessionId, message);\n return true;\n }\n\n /**\n * Send via WS if attached, else fall back to REST. Never fails with \"not\n * attached\" — when not serving, uses the shared ApiClient's REST endpoint so\n * `clawrent_send_session_message` still works after a restart that detached\n * the socket. Returns the transport actually used.\n */\n async sendViaWsOrRest(\n sessionId: string,\n message: { type: string; payload: Record<string, unknown> },\n ): Promise<{ via: 'ws' | 'rest' }> {\n if (!this.pc) {\n await this.client.sendSessionMessage(sessionId, message);\n return { via: 'rest' };\n }\n return this.pc.send(sessionId, message);\n }\n\n /**\n * Re-emit ProviderClient's lifecycle / session events under the same names on\n * this instance. `session:message` is handled separately via the onMessage\n * callback in start(); the rest are forwarded here so any future listener\n * (matching the pre-Task-7 surface) keeps working.\n */\n private forwardProviderClientEvents(): void {\n const pc = this.pc;\n if (!pc) return;\n const forward = (evt: string): void => {\n pc.on(evt, (...args: unknown[]) => {\n this.emit(evt, ...args);\n });\n };\n forward('agent:connected');\n forward('agent:disconnected');\n forward('agent:started');\n forward('agent:warning');\n forward('session:new');\n forward('session:approved');\n forward('session:connected');\n forward('session:disconnected');\n forward('session:reattached');\n forward('session:error');\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { z } from 'zod';\r\nimport type { ApiClient } from '@clawrent/provider';\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/provider';\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/provider';\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 endpoint: z.string().url().optional().describe('External runtime endpoint URL (self-hosted providers)'),\r\n healthCheckUrl: z.string().url().optional().describe('Health check URL the platform may poll'),\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 if (params.endpoint) data['endpoint'] = params.endpoint;\r\n if (params.healthCheckUrl) data['healthCheckUrl'] = params.healthCheckUrl;\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 endpoint: z.string().url().optional().describe('External runtime endpoint URL (self-hosted providers)'),\r\n healthCheckUrl: z.string().url().optional().describe('Health check URL the platform may poll'),\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 if (params.endpoint) data['endpoint'] = params.endpoint;\r\n if (params.healthCheckUrl) data['healthCheckUrl'] = params.healthCheckUrl;\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 a session as the provider agent. Works in both realtime (after clawrent_start_serving, sent via WebSocket) and REST-only mode (when not serving, posted via REST API — e.g. after a restart that detached the socket).',\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 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 try {\r\n const { via } = await providerAgent.sendViaWsOrRest(sessionId, {\r\n type: type ?? 'result.success',\r\n payload: parsedPayload,\r\n });\r\n return {\r\n content: [{ type: 'text' as const, text: `Message sent to session ${sessionId} via ${via}.` }],\r\n };\r\n } catch (err: unknown) {\r\n const errMsg = err instanceof Error ? err.message : String(err);\r\n return {\r\n content: [{ type: 'text' as const, text: `Failed to send to session ${sessionId}: ${errMsg}` }],\r\n isError: true,\r\n };\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 // --- Provider: read session messages (restart-resilient polling) ---\r\n\r\n server.tool(\r\n 'clawrent_get_session_messages',\r\n 'Fetch messages for a session you are serving (as provider). For incremental polling, pass `since` = the largest createdAt from the previous response (ISO string); omit for full history. Messages persist server-side, so this still works after a restart that detached the WS.',\r\n {\r\n sessionId: z.string().describe('Session ID'),\r\n since: z.string().optional().describe('ISO timestamp — only return messages with createdAt > since'),\r\n },\r\n async ({ sessionId, since }) => {\r\n const result = await client.getSessionMessages(sessionId, since ? { since } : undefined);\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/provider';\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":["z","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawrent/mcp-server",
3
- "version": "0.3.3",
3
+ "version": "0.4.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.4.3",
20
+ "@clawrent/provider": "0.1.0",
21
21
  "@clawrent/shared-types": "0.2.0",
22
- "@clawrent/protocol": "0.2.0"
22
+ "@clawrent/protocol": "0.3.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^22.0.0",