@clawrent/mcp-server 0.3.4 → 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 +87 -184
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -3,221 +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
|
|
6
|
+
import { ApiClient, loadConfig } from "@clawrent/provider";
|
|
7
7
|
|
|
8
8
|
// src/provider-agent.ts
|
|
9
9
|
import { EventEmitter } from "events";
|
|
10
|
-
import
|
|
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.
|
|
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.
|
|
28
|
+
return Array.from(this.wrapperSessions.values());
|
|
37
29
|
}
|
|
38
30
|
/**
|
|
39
|
-
* Start
|
|
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.
|
|
42
|
+
if (this.pc) {
|
|
43
43
|
throw new Error(`Already serving agent ${this.agentId}`);
|
|
44
44
|
}
|
|
45
45
|
this.agentId = agentId;
|
|
46
|
-
this.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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.
|
|
64
|
-
|
|
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
65
|
});
|
|
66
66
|
}
|
|
67
|
-
/**
|
|
68
|
-
* Stop the agent: disconnect all sessions and the control channel.
|
|
69
|
-
*/
|
|
67
|
+
/** Stop serving: tear down the ProviderClient and clear local state. */
|
|
70
68
|
stop() {
|
|
71
|
-
this.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this.heartbeatTimer = null;
|
|
75
|
-
}
|
|
76
|
-
if (this.reconnectTimer) {
|
|
77
|
-
clearTimeout(this.reconnectTimer);
|
|
78
|
-
this.reconnectTimer = null;
|
|
79
|
-
}
|
|
80
|
-
this.sessionManager?.disconnectAll();
|
|
81
|
-
this.sessionManager = null;
|
|
82
|
-
if (this.agentWs && (this.agentWs.readyState === WebSocket.OPEN || this.agentWs.readyState === WebSocket.CONNECTING)) {
|
|
83
|
-
this.agentWs.close(1e3, "Agent stopping");
|
|
84
|
-
}
|
|
85
|
-
this.agentWs = null;
|
|
86
|
-
this.activeSessions.clear();
|
|
69
|
+
this.pc?.stop();
|
|
70
|
+
this.pc = null;
|
|
71
|
+
this.wrapperSessions.clear();
|
|
87
72
|
this.agentId = null;
|
|
88
|
-
this.agentToken = null;
|
|
89
73
|
this.client.setAgentToken(null);
|
|
90
74
|
this.emit("stopped");
|
|
91
75
|
}
|
|
92
76
|
/**
|
|
93
|
-
*
|
|
77
|
+
* Fire-and-forget send. Returns false when not serving. MCP tools use
|
|
78
|
+
* `sendViaWsOrRest` (which awaits); this is kept for surface compatibility.
|
|
94
79
|
*/
|
|
95
80
|
send(sessionId, message) {
|
|
96
|
-
if (!this.
|
|
97
|
-
|
|
81
|
+
if (!this.pc) return false;
|
|
82
|
+
void this.pc.send(sessionId, message);
|
|
83
|
+
return true;
|
|
98
84
|
}
|
|
99
85
|
/**
|
|
100
|
-
* Send
|
|
101
|
-
*
|
|
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.
|
|
102
90
|
*/
|
|
103
91
|
async sendViaWsOrRest(sessionId, message) {
|
|
104
|
-
if (this.
|
|
105
|
-
|
|
106
|
-
|
|
92
|
+
if (!this.pc) {
|
|
93
|
+
await this.client.sendSessionMessage(sessionId, message);
|
|
94
|
+
return { via: "rest" };
|
|
107
95
|
}
|
|
108
|
-
|
|
109
|
-
return { via: "rest" };
|
|
96
|
+
return this.pc.send(sessionId, message);
|
|
110
97
|
}
|
|
111
98
|
/**
|
|
112
|
-
* Re-
|
|
113
|
-
*
|
|
114
|
-
* in
|
|
115
|
-
*
|
|
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.
|
|
116
103
|
*/
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
if (!
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
sm.connect(s.id, s.sessionToken);
|
|
136
|
-
this.emit("session:reattached", s.id);
|
|
137
|
-
})
|
|
138
|
-
);
|
|
139
|
-
const failed = results.filter((r) => r.status === "rejected").length;
|
|
140
|
-
if (failed > 0) {
|
|
141
|
-
this.emit(
|
|
142
|
-
"agent:error",
|
|
143
|
-
new Error(`reattach: ${failed}/${active.length} sessions failed to attach`)
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
} catch (err) {
|
|
147
|
-
this.emit("agent:error", err instanceof Error ? err : new Error(String(err)));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
connectAgent() {
|
|
151
|
-
if (!this._running || !this.agentToken) return;
|
|
152
|
-
const url = `${this.client.wsUrl}/ws/agent?token=${this.agentToken}`;
|
|
153
|
-
const ws = new WebSocket(url);
|
|
154
|
-
this.agentWs = ws;
|
|
155
|
-
ws.on("open", () => {
|
|
156
|
-
this.reconnectAttempts = 0;
|
|
157
|
-
this.emit("agent:connected", this.agentId);
|
|
158
|
-
this.heartbeatTimer = setInterval(() => {
|
|
159
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
160
|
-
ws.send(JSON.stringify({ type: "system.heartbeat", payload: {} }));
|
|
161
|
-
}
|
|
162
|
-
}, 25e3);
|
|
163
|
-
});
|
|
164
|
-
ws.on("message", (raw) => {
|
|
165
|
-
try {
|
|
166
|
-
const msg = JSON.parse(raw.toString());
|
|
167
|
-
this.handleAgentMessage(msg);
|
|
168
|
-
} catch {
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
ws.on("close", (code) => {
|
|
172
|
-
if (this.heartbeatTimer) {
|
|
173
|
-
clearInterval(this.heartbeatTimer);
|
|
174
|
-
this.heartbeatTimer = null;
|
|
175
|
-
}
|
|
176
|
-
this.emit("agent:disconnected", this.agentId);
|
|
177
|
-
if (this._running && code !== 1e3) {
|
|
178
|
-
const delay = Math.min(1e3 * Math.pow(2, this.reconnectAttempts), this.maxReconnectDelay);
|
|
179
|
-
this.reconnectAttempts++;
|
|
180
|
-
this.reconnectTimer = setTimeout(() => this.connectAgent(), delay);
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
ws.on("error", (err) => {
|
|
184
|
-
this.emit("agent:error", err);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
handleAgentMessage(msg) {
|
|
188
|
-
const type = msg["type"];
|
|
189
|
-
if (type === "system.heartbeat_ack") return;
|
|
190
|
-
if (type === "session.new") {
|
|
191
|
-
const payload = msg["payload"];
|
|
192
|
-
const sessionId = payload["sessionId"];
|
|
193
|
-
const sessionToken = payload["sessionToken"];
|
|
194
|
-
const taskDescription = payload["taskDescription"] || "";
|
|
195
|
-
const consumerUserId = payload["consumerUserId"];
|
|
196
|
-
const session = {
|
|
197
|
-
sessionId,
|
|
198
|
-
sessionToken,
|
|
199
|
-
taskDescription,
|
|
200
|
-
consumerUserId,
|
|
201
|
-
slotIndex: payload["slotIndex"] ?? 0
|
|
202
|
-
};
|
|
203
|
-
this.activeSessions.set(sessionId, session);
|
|
204
|
-
this.emit("session:new", session);
|
|
205
|
-
if (this.autoApprove) {
|
|
206
|
-
this.client.approveSession(sessionId).then(() => {
|
|
207
|
-
this.sessionManager?.connect(sessionId, sessionToken);
|
|
208
|
-
this.emit("session:approved", sessionId);
|
|
209
|
-
}).catch((err) => {
|
|
210
|
-
this.emit("session:error", sessionId, err);
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
} else if (type === "session.approved") {
|
|
214
|
-
const payload = msg["payload"];
|
|
215
|
-
const sessionId = payload["sessionId"];
|
|
216
|
-
const session = this.activeSessions.get(sessionId);
|
|
217
|
-
if (session) {
|
|
218
|
-
this.sessionManager?.connect(sessionId, session.sessionToken);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
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");
|
|
221
122
|
}
|
|
222
123
|
};
|
|
223
124
|
|
|
@@ -585,7 +486,9 @@ function registerProviderTools(server, client, providerAgent) {
|
|
|
585
486
|
hostingType: z3.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
|
|
586
487
|
approvalMode: z3.enum(["manual", "auto"]).optional().describe("Session approval mode (default: manual)"),
|
|
587
488
|
maxConcurrentSessions: z3.number().optional().describe("Max concurrent sessions (default: 5)"),
|
|
588
|
-
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")
|
|
589
492
|
},
|
|
590
493
|
async (params) => {
|
|
591
494
|
const data = {};
|
|
@@ -596,6 +499,8 @@ function registerProviderTools(server, client, providerAgent) {
|
|
|
596
499
|
if (params.approvalMode) data["approvalMode"] = params.approvalMode;
|
|
597
500
|
if (params.maxConcurrentSessions) data["maxConcurrentSessions"] = params.maxConcurrentSessions;
|
|
598
501
|
if (params.maxConsumerSlots) data["maxConsumerSlots"] = params.maxConsumerSlots;
|
|
502
|
+
if (params.endpoint) data["endpoint"] = params.endpoint;
|
|
503
|
+
if (params.healthCheckUrl) data["healthCheckUrl"] = params.healthCheckUrl;
|
|
599
504
|
const result = await client.applyProvider(params.agentId, data);
|
|
600
505
|
return {
|
|
601
506
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
@@ -612,7 +517,9 @@ function registerProviderTools(server, client, providerAgent) {
|
|
|
612
517
|
currency: z3.enum(["CNY", "USD"]).optional().describe("Currency (default: CNY)"),
|
|
613
518
|
hostingType: z3.enum(["self_hosted", "platform_hosted"]).optional().describe("Hosting type (default: self_hosted)"),
|
|
614
519
|
approvalMode: z3.enum(["auto", "manual"]).optional().describe("Session approval mode (default: manual)"),
|
|
615
|
-
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")
|
|
616
523
|
},
|
|
617
524
|
async (params) => {
|
|
618
525
|
const data = {};
|
|
@@ -622,6 +529,8 @@ function registerProviderTools(server, client, providerAgent) {
|
|
|
622
529
|
if (params.hostingType) data["hostingType"] = params.hostingType;
|
|
623
530
|
if (params.approvalMode) data["approvalMode"] = params.approvalMode;
|
|
624
531
|
if (params.transparencyLevel) data["transparencyLevel"] = params.transparencyLevel;
|
|
532
|
+
if (params.endpoint) data["endpoint"] = params.endpoint;
|
|
533
|
+
if (params.healthCheckUrl) data["healthCheckUrl"] = params.healthCheckUrl;
|
|
625
534
|
const result = await client.publishAgent(params.agentId, data);
|
|
626
535
|
return {
|
|
627
536
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
@@ -761,19 +670,13 @@ Waiting for incoming sessions via /ws/agent channel.`
|
|
|
761
670
|
);
|
|
762
671
|
server.tool(
|
|
763
672
|
"clawrent_send_session_message",
|
|
764
|
-
"Send a message to
|
|
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).",
|
|
765
674
|
{
|
|
766
675
|
sessionId: z3.string().describe("Session ID"),
|
|
767
676
|
type: z3.string().optional().describe("Message type (default: result.success)"),
|
|
768
677
|
payload: z3.string().describe("Message payload as JSON string")
|
|
769
678
|
},
|
|
770
679
|
async ({ sessionId, type, payload }) => {
|
|
771
|
-
if (!providerAgent.running) {
|
|
772
|
-
return {
|
|
773
|
-
content: [{ type: "text", text: "No agent is currently serving. Start with clawrent_start_serving first." }],
|
|
774
|
-
isError: true
|
|
775
|
-
};
|
|
776
|
-
}
|
|
777
680
|
let parsedPayload;
|
|
778
681
|
try {
|
|
779
682
|
parsedPayload = JSON.parse(payload);
|
|
@@ -1032,7 +935,7 @@ function registerDocsTools(server, client) {
|
|
|
1032
935
|
// src/index.ts
|
|
1033
936
|
async function main() {
|
|
1034
937
|
const config = loadConfig();
|
|
1035
|
-
const client = new
|
|
938
|
+
const client = new ApiClient(config);
|
|
1036
939
|
const agentTokenEnv = process.env["CLAWRENT_AGENT_TOKEN"];
|
|
1037
940
|
if (agentTokenEnv) {
|
|
1038
941
|
client.setAgentToken(agentTokenEnv);
|
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 // 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';\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 // Re-attach to active sessions that existed before this process started\r\n // (e.g. after MCP/connector restart). Best-effort — failures don't block serving.\r\n void this.reattachActiveSessions().catch(() => {\r\n // errors already surfaced via 'agent:error'\r\n });\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 /**\r\n * Send a message via WS if attached, else fall back to REST POST.\r\n * Never fails with \"not attached\" — uses REST instead. Returns the transport used.\r\n */\r\n async sendViaWsOrRest(\r\n sessionId: string,\r\n message: { type: string; payload: Record<string, unknown> },\r\n ): Promise<{ via: 'ws' | 'rest' }> {\r\n if (this.sessionManager?.isConnected(sessionId)) {\r\n const ok = this.sessionManager.send(sessionId, message);\r\n if (ok) return { via: 'ws' };\r\n }\r\n await this.client.sendSessionMessage(sessionId, message);\r\n return { via: 'rest' };\r\n }\r\n\r\n /**\r\n * Re-attach WS to active provider sessions (e.g. after MCP process restart).\r\n * Pulls active sessions from the platform and connects each; refills the\r\n * in-memory activeSessions map so serving_status / session.approved paths work.\r\n * Failures are isolated — one stale sessionToken won't block the others.\r\n */\r\n async reattachActiveSessions(): Promise<void> {\r\n const sm = this.sessionManager;\r\n if (!this._running || !sm) return;\r\n try {\r\n const res = (await this.client.getSessions({ role: 'provider', status: 'active' })) as {\r\n data?: Array<{\r\n id: string;\r\n sessionToken?: string;\r\n taskDescription?: string;\r\n consumerUserId?: string;\r\n }>;\r\n };\r\n const active = res?.data ?? [];\r\n if (active.length === 0) return;\r\n\r\n const results = await Promise.allSettled(\r\n active.map((s) => {\r\n if (!s.sessionToken) {\r\n throw new Error(`list response missing sessionToken for session ${s.id}`);\r\n }\r\n this.activeSessions.set(s.id, {\r\n sessionId: s.id,\r\n sessionToken: s.sessionToken,\r\n taskDescription: s.taskDescription ?? '',\r\n consumerUserId: s.consumerUserId,\r\n });\r\n sm.connect(s.id, s.sessionToken);\r\n this.emit('session:reattached', s.id);\r\n }),\r\n );\r\n const failed = results.filter((r) => r.status === 'rejected').length;\r\n if (failed > 0) {\r\n this.emit(\r\n 'agent:error',\r\n new Error(`reattach: ${failed}/${active.length} sessions failed to attach`),\r\n );\r\n }\r\n } catch (err) {\r\n this.emit('agent:error', err instanceof Error ? err : new Error(String(err)));\r\n }\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 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/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
|
+
"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/
|
|
20
|
+
"@clawrent/provider": "0.1.0",
|
|
21
21
|
"@clawrent/shared-types": "0.2.0",
|
|
22
|
-
"@clawrent/
|
|
22
|
+
"@clawrent/protocol": "0.3.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/node": "^22.0.0",
|