capacitor-mobile-claw 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +231 -0
- package/dist/esm/definitions.d.ts +226 -0
- package/dist/esm/definitions.d.ts.map +1 -0
- package/dist/esm/definitions.js +16 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/engine.d.ts +93 -0
- package/dist/esm/engine.d.ts.map +1 -0
- package/dist/esm/engine.js +332 -0
- package/dist/esm/engine.js.map +1 -0
- package/dist/esm/index.d.ts +24 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +25 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/mcp/mcp-server-manager.d.ts +33 -0
- package/dist/esm/mcp/mcp-server-manager.d.ts.map +1 -0
- package/dist/esm/mcp/mcp-server-manager.js +99 -0
- package/dist/esm/mcp/mcp-server-manager.js.map +1 -0
- package/dist/esm/mcp/server/device-mcp-server.d.ts +43 -0
- package/dist/esm/mcp/server/device-mcp-server.d.ts.map +1 -0
- package/dist/esm/mcp/server/device-mcp-server.js +52 -0
- package/dist/esm/mcp/server/device-mcp-server.js.map +1 -0
- package/dist/esm/mcp/tools/app-state.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/app-state.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/app-state.tools.js +22 -0
- package/dist/esm/mcp/tools/app-state.tools.js.map +1 -0
- package/dist/esm/mcp/tools/barcode.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/barcode.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/barcode.tools.js +29 -0
- package/dist/esm/mcp/tools/barcode.tools.js.map +1 -0
- package/dist/esm/mcp/tools/biometric.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/biometric.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/biometric.tools.js +33 -0
- package/dist/esm/mcp/tools/biometric.tools.js.map +1 -0
- package/dist/esm/mcp/tools/bluetooth.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/bluetooth.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/bluetooth.tools.js +95 -0
- package/dist/esm/mcp/tools/bluetooth.tools.js.map +1 -0
- package/dist/esm/mcp/tools/camera.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/camera.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/camera.tools.js +36 -0
- package/dist/esm/mcp/tools/camera.tools.js.map +1 -0
- package/dist/esm/mcp/tools/categories.d.ts +22 -0
- package/dist/esm/mcp/tools/categories.d.ts.map +1 -0
- package/dist/esm/mcp/tools/categories.js +242 -0
- package/dist/esm/mcp/tools/categories.js.map +1 -0
- package/dist/esm/mcp/tools/clipboard.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/clipboard.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/clipboard.tools.js +22 -0
- package/dist/esm/mcp/tools/clipboard.tools.js.map +1 -0
- package/dist/esm/mcp/tools/contacts.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/contacts.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/contacts.tools.js +58 -0
- package/dist/esm/mcp/tools/contacts.tools.js.map +1 -0
- package/dist/esm/mcp/tools/device-info.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/device-info.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/device-info.tools.js +39 -0
- package/dist/esm/mcp/tools/device-info.tools.js.map +1 -0
- package/dist/esm/mcp/tools/discovery.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/discovery.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/discovery.tools.js +41 -0
- package/dist/esm/mcp/tools/discovery.tools.js.map +1 -0
- package/dist/esm/mcp/tools/geolocation.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/geolocation.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/geolocation.tools.js +25 -0
- package/dist/esm/mcp/tools/geolocation.tools.js.map +1 -0
- package/dist/esm/mcp/tools/haptics.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/haptics.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/haptics.tools.js +41 -0
- package/dist/esm/mcp/tools/haptics.tools.js.map +1 -0
- package/dist/esm/mcp/tools/health.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/health.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/health.tools.js +38 -0
- package/dist/esm/mcp/tools/health.tools.js.map +1 -0
- package/dist/esm/mcp/tools/http.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/http.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/http.tools.js +24 -0
- package/dist/esm/mcp/tools/http.tools.js.map +1 -0
- package/dist/esm/mcp/tools/index.d.ts +10 -0
- package/dist/esm/mcp/tools/index.d.ts.map +1 -0
- package/dist/esm/mcp/tools/index.js +70 -0
- package/dist/esm/mcp/tools/index.js.map +1 -0
- package/dist/esm/mcp/tools/keep-awake.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/keep-awake.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/keep-awake.tools.js +23 -0
- package/dist/esm/mcp/tools/keep-awake.tools.js.map +1 -0
- package/dist/esm/mcp/tools/motion-sensors.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/motion-sensors.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/motion-sensors.tools.js +60 -0
- package/dist/esm/mcp/tools/motion-sensors.tools.js.map +1 -0
- package/dist/esm/mcp/tools/network-status.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/network-status.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/network-status.tools.js +16 -0
- package/dist/esm/mcp/tools/network-status.tools.js.map +1 -0
- package/dist/esm/mcp/tools/nfc.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/nfc.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/nfc.tools.js +52 -0
- package/dist/esm/mcp/tools/nfc.tools.js.map +1 -0
- package/dist/esm/mcp/tools/notifications.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/notifications.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/notifications.tools.js +30 -0
- package/dist/esm/mcp/tools/notifications.tools.js.map +1 -0
- package/dist/esm/mcp/tools/push-notifications.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/push-notifications.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/push-notifications.tools.js +43 -0
- package/dist/esm/mcp/tools/push-notifications.tools.js.map +1 -0
- package/dist/esm/mcp/tools/secure-storage.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/secure-storage.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/secure-storage.tools.js +31 -0
- package/dist/esm/mcp/tools/secure-storage.tools.js.map +1 -0
- package/dist/esm/mcp/tools/sftp.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/sftp.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/sftp.tools.js +41 -0
- package/dist/esm/mcp/tools/sftp.tools.js.map +1 -0
- package/dist/esm/mcp/tools/share.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/share.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/share.tools.js +18 -0
- package/dist/esm/mcp/tools/share.tools.js.map +1 -0
- package/dist/esm/mcp/tools/speech.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/speech.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/speech.tools.js +38 -0
- package/dist/esm/mcp/tools/speech.tools.js.map +1 -0
- package/dist/esm/mcp/tools/ssh.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/ssh.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/ssh.tools.js +41 -0
- package/dist/esm/mcp/tools/ssh.tools.js.map +1 -0
- package/dist/esm/mcp/tools/tcp.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/tcp.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/tcp.tools.js +47 -0
- package/dist/esm/mcp/tools/tcp.tools.js.map +1 -0
- package/dist/esm/mcp/tools/tts.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/tts.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/tts.tools.js +29 -0
- package/dist/esm/mcp/tools/tts.tools.js.map +1 -0
- package/dist/esm/mcp/tools/types.d.ts +18 -0
- package/dist/esm/mcp/tools/types.d.ts.map +1 -0
- package/dist/esm/mcp/tools/types.js +2 -0
- package/dist/esm/mcp/tools/types.js.map +1 -0
- package/dist/esm/mcp/tools/udp.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/udp.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/udp.tools.js +22 -0
- package/dist/esm/mcp/tools/udp.tools.js.map +1 -0
- package/dist/esm/mcp/tools/wol.tools.d.ts +3 -0
- package/dist/esm/mcp/tools/wol.tools.d.ts.map +1 -0
- package/dist/esm/mcp/tools/wol.tools.js +16 -0
- package/dist/esm/mcp/tools/wol.tools.js.map +1 -0
- package/dist/esm/mcp/transport/bridge-server-transport.d.ts +27 -0
- package/dist/esm/mcp/transport/bridge-server-transport.d.ts.map +1 -0
- package/dist/esm/mcp/transport/bridge-server-transport.js +72 -0
- package/dist/esm/mcp/transport/bridge-server-transport.js.map +1 -0
- package/dist/esm/mcp/transport/stomp-server-transport.d.ts +43 -0
- package/dist/esm/mcp/transport/stomp-server-transport.d.ts.map +1 -0
- package/dist/esm/mcp/transport/stomp-server-transport.js +128 -0
- package/dist/esm/mcp/transport/stomp-server-transport.js.map +1 -0
- package/dist/esm/mcp/transport/transport-manager.d.ts +38 -0
- package/dist/esm/mcp/transport/transport-manager.d.ts.map +1 -0
- package/dist/esm/mcp/transport/transport-manager.js +70 -0
- package/dist/esm/mcp/transport/transport-manager.js.map +1 -0
- package/dist/esm/plugin.d.ts +79 -0
- package/dist/esm/plugin.d.ts.map +1 -0
- package/dist/esm/plugin.js +81 -0
- package/dist/esm/plugin.js.map +1 -0
- package/dist/esm/services/bridge-protocol.d.ts +107 -0
- package/dist/esm/services/bridge-protocol.d.ts.map +1 -0
- package/dist/esm/services/bridge-protocol.js +6 -0
- package/dist/esm/services/bridge-protocol.js.map +1 -0
- package/nodejs-assets/nodejs-project/main.js +1971 -0
- package/nodejs-assets/nodejs-project/mcp-agent-tools.js +57 -0
- package/nodejs-assets/nodejs-project/mcp-bridge-client.js +98 -0
- package/nodejs-assets/nodejs-project/package-lock.json +3639 -0
- package/nodejs-assets/nodejs-project/package.json +18 -0
- package/package.json +80 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MobileClawEngine — Framework-agnostic core engine.
|
|
3
|
+
*
|
|
4
|
+
* This is the headless implementation of the MobileClaw plugin.
|
|
5
|
+
* It manages the embedded Node.js worker, bridge communication,
|
|
6
|
+
* MCP server lifecycle, and exposes all plugin API methods.
|
|
7
|
+
*
|
|
8
|
+
* No Vue, React, or any UI framework dependency.
|
|
9
|
+
*/
|
|
10
|
+
import { McpServerManager } from './mcp/mcp-server-manager';
|
|
11
|
+
export class MobileClawEngine {
|
|
12
|
+
// ── State ──────────────────────────────────────────────────────────────
|
|
13
|
+
_ready = false;
|
|
14
|
+
_available = false;
|
|
15
|
+
_nodeVersion = null;
|
|
16
|
+
_openclawRoot = null;
|
|
17
|
+
_mcpToolCount = 0;
|
|
18
|
+
_loading = false;
|
|
19
|
+
_error = null;
|
|
20
|
+
_currentSessionKey = null;
|
|
21
|
+
nodePlugin = null;
|
|
22
|
+
listeners = new Map();
|
|
23
|
+
initPromise = null;
|
|
24
|
+
_mcpManager = null;
|
|
25
|
+
// ── Public getters ─────────────────────────────────────────────────────
|
|
26
|
+
get ready() {
|
|
27
|
+
return this._ready;
|
|
28
|
+
}
|
|
29
|
+
get available() {
|
|
30
|
+
return this._available;
|
|
31
|
+
}
|
|
32
|
+
get nodeVersion() {
|
|
33
|
+
return this._nodeVersion;
|
|
34
|
+
}
|
|
35
|
+
get openclawRoot() {
|
|
36
|
+
return this._openclawRoot;
|
|
37
|
+
}
|
|
38
|
+
get mcpToolCount() {
|
|
39
|
+
return this._mcpToolCount;
|
|
40
|
+
}
|
|
41
|
+
get loading() {
|
|
42
|
+
return this._loading;
|
|
43
|
+
}
|
|
44
|
+
get error() {
|
|
45
|
+
return this._error;
|
|
46
|
+
}
|
|
47
|
+
get currentSessionKey() {
|
|
48
|
+
return this._currentSessionKey;
|
|
49
|
+
}
|
|
50
|
+
/** Access the MCP server manager for status, restart, etc. */
|
|
51
|
+
get mcpManager() {
|
|
52
|
+
return this._mcpManager;
|
|
53
|
+
}
|
|
54
|
+
// ── Lifecycle ──────────────────────────────────────────────────────────
|
|
55
|
+
async init(options = {}) {
|
|
56
|
+
if (this.initPromise)
|
|
57
|
+
return this.initPromise;
|
|
58
|
+
this.initPromise = this._doInit(options);
|
|
59
|
+
return this.initPromise;
|
|
60
|
+
}
|
|
61
|
+
async _doInit(options) {
|
|
62
|
+
const { Capacitor } = await import('@capacitor/core');
|
|
63
|
+
if (!Capacitor.isNativePlatform()) {
|
|
64
|
+
this._available = false;
|
|
65
|
+
this._error = 'MobileClaw only works on native platforms (Android/iOS)';
|
|
66
|
+
return { nodeVersion: '', openclawRoot: '', mcpToolCount: 0 };
|
|
67
|
+
}
|
|
68
|
+
this._loading = true;
|
|
69
|
+
this._error = null;
|
|
70
|
+
try {
|
|
71
|
+
const { NodeJS } = await import('capacitor-nodejs');
|
|
72
|
+
this.nodePlugin = NodeJS;
|
|
73
|
+
this._available = true;
|
|
74
|
+
// Register message listener FIRST — the worker may have already
|
|
75
|
+
// emitted worker.ready before MCP init completes.
|
|
76
|
+
this.nodePlugin.addListener('message', (event) => {
|
|
77
|
+
const msg = event?.args?.[0] ?? event;
|
|
78
|
+
if (!msg || !msg.type)
|
|
79
|
+
return;
|
|
80
|
+
this._dispatch(msg);
|
|
81
|
+
});
|
|
82
|
+
// Set up worker.ready promise before MCP init (captures early ready events)
|
|
83
|
+
const timeout = options.workerTimeout ?? 60_000;
|
|
84
|
+
const readyPromise = new Promise((resolve) => {
|
|
85
|
+
const timer = setTimeout(() => {
|
|
86
|
+
this._error = `Worker startup timeout (${timeout}ms)`;
|
|
87
|
+
this._loading = false;
|
|
88
|
+
resolve({ nodeVersion: '', openclawRoot: '', mcpToolCount: this._mcpToolCount });
|
|
89
|
+
}, timeout);
|
|
90
|
+
this._onMessage('worker.ready', (msg) => {
|
|
91
|
+
clearTimeout(timer);
|
|
92
|
+
this._ready = true;
|
|
93
|
+
this._nodeVersion = msg.nodeVersion;
|
|
94
|
+
this._openclawRoot = msg.openclawRoot;
|
|
95
|
+
this._mcpToolCount = msg.mcpToolCount ?? this._mcpToolCount;
|
|
96
|
+
this._loading = false;
|
|
97
|
+
this._error = null;
|
|
98
|
+
resolve({
|
|
99
|
+
nodeVersion: msg.nodeVersion,
|
|
100
|
+
openclawRoot: msg.openclawRoot,
|
|
101
|
+
mcpToolCount: this._mcpToolCount,
|
|
102
|
+
});
|
|
103
|
+
}, { once: true });
|
|
104
|
+
});
|
|
105
|
+
// Start MCP bridge (worker calls tools/list during init)
|
|
106
|
+
try {
|
|
107
|
+
this._mcpManager = new McpServerManager();
|
|
108
|
+
const mcpOpts = {
|
|
109
|
+
enableBridge: options.enableBridge !== false,
|
|
110
|
+
enableStomp: options.enableStomp ?? false,
|
|
111
|
+
stompConfig: options.stompConfig,
|
|
112
|
+
tools: options.tools,
|
|
113
|
+
};
|
|
114
|
+
await this._mcpManager.start(mcpOpts);
|
|
115
|
+
this._mcpToolCount = this._mcpManager.toolCount;
|
|
116
|
+
console.log(`[MobileClaw] MCP server started — ${this._mcpToolCount} tools`);
|
|
117
|
+
}
|
|
118
|
+
catch (mcpErr) {
|
|
119
|
+
console.warn('[MobileClaw] MCP bridge start failed (non-fatal):', mcpErr);
|
|
120
|
+
}
|
|
121
|
+
const readyInfo = await readyPromise;
|
|
122
|
+
return readyInfo;
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
this._available = false;
|
|
126
|
+
this._error = `Capacitor-NodeJS not available: ${e.message}`;
|
|
127
|
+
this._loading = false;
|
|
128
|
+
return { nodeVersion: '', openclawRoot: '', mcpToolCount: 0 };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async isReady() {
|
|
132
|
+
return { ready: this._ready };
|
|
133
|
+
}
|
|
134
|
+
// ── Bridge communication ───────────────────────────────────────────────
|
|
135
|
+
async send(message) {
|
|
136
|
+
if (!this.nodePlugin) {
|
|
137
|
+
console.warn('[MobileClaw] Cannot send — plugin not loaded');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
await this.nodePlugin.send({ eventName: 'message', args: [message] });
|
|
141
|
+
}
|
|
142
|
+
/** Internal message listener (returns unsubscribe fn) */
|
|
143
|
+
_onMessage(type, handler, opts = {}) {
|
|
144
|
+
if (!this.listeners.has(type)) {
|
|
145
|
+
this.listeners.set(type, new Set());
|
|
146
|
+
}
|
|
147
|
+
const wrapped = opts.once
|
|
148
|
+
? (msg) => {
|
|
149
|
+
this.listeners.get(type)?.delete(wrapped);
|
|
150
|
+
handler(msg);
|
|
151
|
+
}
|
|
152
|
+
: handler;
|
|
153
|
+
this.listeners.get(type).add(wrapped);
|
|
154
|
+
return () => this.listeners.get(type)?.delete(wrapped);
|
|
155
|
+
}
|
|
156
|
+
_dispatch(msg) {
|
|
157
|
+
// Type-specific handlers
|
|
158
|
+
const handlers = this.listeners.get(msg.type);
|
|
159
|
+
if (handlers) {
|
|
160
|
+
for (const h of handlers) {
|
|
161
|
+
try {
|
|
162
|
+
h(msg);
|
|
163
|
+
}
|
|
164
|
+
catch (e) {
|
|
165
|
+
console.error('[MobileClaw] handler error:', e);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Wildcard handlers
|
|
170
|
+
const wildcards = this.listeners.get('*');
|
|
171
|
+
if (wildcards) {
|
|
172
|
+
for (const h of wildcards) {
|
|
173
|
+
try {
|
|
174
|
+
h(msg);
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
console.error('[MobileClaw] wildcard error:', e);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// ── Agent control ──────────────────────────────────────────────────────
|
|
183
|
+
async sendMessage(prompt, agentId = 'main', options) {
|
|
184
|
+
if (!this._currentSessionKey) {
|
|
185
|
+
this._currentSessionKey = `session-${Date.now()}`;
|
|
186
|
+
}
|
|
187
|
+
const idempotencyKey = typeof crypto !== 'undefined' && crypto.randomUUID
|
|
188
|
+
? crypto.randomUUID()
|
|
189
|
+
: `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
190
|
+
await this.send({
|
|
191
|
+
type: 'agent.start',
|
|
192
|
+
agentId,
|
|
193
|
+
sessionKey: this._currentSessionKey,
|
|
194
|
+
prompt,
|
|
195
|
+
...(options?.model && { model: options.model }),
|
|
196
|
+
idempotencyKey,
|
|
197
|
+
});
|
|
198
|
+
return { sessionKey: this._currentSessionKey };
|
|
199
|
+
}
|
|
200
|
+
async getModels() {
|
|
201
|
+
return new Promise((resolve) => {
|
|
202
|
+
this._onMessage('config.models.result', (msg) => resolve(msg.models || []), { once: true });
|
|
203
|
+
this.send({ type: 'config.models' });
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
async stopTurn() {
|
|
207
|
+
await this.send({ type: 'agent.stop' });
|
|
208
|
+
}
|
|
209
|
+
async approveTool(toolCallId, approved) {
|
|
210
|
+
await this.send({ type: 'tool.approve', toolCallId, approved });
|
|
211
|
+
}
|
|
212
|
+
async steerAgent(text) {
|
|
213
|
+
await this.send({ type: 'agent.steer', text });
|
|
214
|
+
}
|
|
215
|
+
// ── Configuration ──────────────────────────────────────────────────────
|
|
216
|
+
async updateConfig(config) {
|
|
217
|
+
await this.send({ type: 'config.update', config });
|
|
218
|
+
}
|
|
219
|
+
async exchangeOAuthCode(tokenUrl, body) {
|
|
220
|
+
return new Promise((resolve) => {
|
|
221
|
+
this._onMessage('oauth.exchange.result', (msg) => resolve(msg), { once: true });
|
|
222
|
+
this.send({ type: 'oauth.exchange', tokenUrl, body });
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async getAuthStatus() {
|
|
226
|
+
return new Promise((resolve) => {
|
|
227
|
+
this._onMessage('config.status.result', (msg) => resolve(msg), { once: true });
|
|
228
|
+
this.send({ type: 'config.status' });
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
// ── File operations ────────────────────────────────────────────────────
|
|
232
|
+
async readFile(path) {
|
|
233
|
+
return new Promise((resolve) => {
|
|
234
|
+
this._onMessage('file.read.result', (msg) => {
|
|
235
|
+
if (msg.path === path)
|
|
236
|
+
resolve(msg);
|
|
237
|
+
}, { once: true });
|
|
238
|
+
this.send({ type: 'file.read', path });
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async writeFile(path, content) {
|
|
242
|
+
await this.send({ type: 'file.write', path, content });
|
|
243
|
+
}
|
|
244
|
+
// ── Session management ─────────────────────────────────────────────────
|
|
245
|
+
async listSessions(agentId = 'main') {
|
|
246
|
+
return new Promise((resolve) => {
|
|
247
|
+
this._onMessage('session.list.result', (msg) => resolve(msg), { once: true });
|
|
248
|
+
this.send({ type: 'session.list', agentId });
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
async getLatestSession(agentId = 'main') {
|
|
252
|
+
return new Promise((resolve) => {
|
|
253
|
+
this._onMessage('session.latest.result', (msg) => resolve(msg), { once: true });
|
|
254
|
+
this.send({ type: 'session.latest', agentId });
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async loadSessionHistory(sessionKey, agentId = 'main') {
|
|
258
|
+
return new Promise((resolve) => {
|
|
259
|
+
this._onMessage('session.load.result', (msg) => resolve(msg), { once: true });
|
|
260
|
+
this.send({ type: 'session.load', sessionKey, agentId });
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
async resumeSession(sessionKey, agentId = 'main') {
|
|
264
|
+
return new Promise((resolve) => {
|
|
265
|
+
this._onMessage('session.resume.result', () => resolve(), { once: true });
|
|
266
|
+
this.send({ type: 'session.resume', sessionKey, agentId });
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
async clearConversation() {
|
|
270
|
+
this._currentSessionKey = null;
|
|
271
|
+
return new Promise((resolve) => {
|
|
272
|
+
this._onMessage('session.clear.result', (msg) => resolve(msg), { once: true });
|
|
273
|
+
this.send({ type: 'session.clear' });
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
async setSessionKey(sessionKey) {
|
|
277
|
+
this._currentSessionKey = sessionKey;
|
|
278
|
+
}
|
|
279
|
+
async getSessionKey() {
|
|
280
|
+
return { sessionKey: this._currentSessionKey };
|
|
281
|
+
}
|
|
282
|
+
// ── Tool invocation ────────────────────────────────────────────────────
|
|
283
|
+
async invokeTool(toolName, args = {}) {
|
|
284
|
+
return new Promise((resolve) => {
|
|
285
|
+
this._onMessage('tool.invoke.result', (msg) => {
|
|
286
|
+
if (msg.toolName === toolName)
|
|
287
|
+
resolve(msg);
|
|
288
|
+
}, { once: true });
|
|
289
|
+
this.send({ type: 'tool.invoke', toolName, args });
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
// ── Events (Capacitor plugin pattern) ──────────────────────────────────
|
|
293
|
+
/**
|
|
294
|
+
* Map from Capacitor event names to bridge message types.
|
|
295
|
+
*/
|
|
296
|
+
static EVENT_MAP = {
|
|
297
|
+
agentEvent: 'agent.event',
|
|
298
|
+
agentCompleted: 'agent.completed',
|
|
299
|
+
agentError: 'agent.error',
|
|
300
|
+
toolApprovalRequest: 'tool.approval_request',
|
|
301
|
+
workerReady: 'worker.ready',
|
|
302
|
+
};
|
|
303
|
+
addListener(eventName, handler) {
|
|
304
|
+
const bridgeType = MobileClawEngine.EVENT_MAP[eventName];
|
|
305
|
+
if (!bridgeType) {
|
|
306
|
+
console.warn(`[MobileClaw] Unknown event: ${eventName}`);
|
|
307
|
+
return { remove: () => { } };
|
|
308
|
+
}
|
|
309
|
+
const unsub = this._onMessage(bridgeType, handler);
|
|
310
|
+
return { remove: unsub };
|
|
311
|
+
}
|
|
312
|
+
removeAllListeners(eventName) {
|
|
313
|
+
if (eventName) {
|
|
314
|
+
const bridgeType = MobileClawEngine.EVENT_MAP[eventName];
|
|
315
|
+
if (bridgeType) {
|
|
316
|
+
this.listeners.delete(bridgeType);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
this.listeners.clear();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// ── Low-level message listener (for advanced use / framework wrappers) ─
|
|
324
|
+
/**
|
|
325
|
+
* Register a handler for a specific bridge message type.
|
|
326
|
+
* Useful for framework wrappers (Vue, React) that need raw bridge access.
|
|
327
|
+
*/
|
|
328
|
+
onMessage(type, handler, opts) {
|
|
329
|
+
return this._onMessage(type, handler, opts);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* capacitor-mobile-claw — On-device AI agent engine for Capacitor apps.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { MobileClaw } from 'capacitor-mobile-claw'
|
|
6
|
+
*
|
|
7
|
+
* const info = await MobileClaw.init()
|
|
8
|
+
* console.log(`Worker ready: Node ${info.nodeVersion}, ${info.mcpToolCount} tools`)
|
|
9
|
+
*
|
|
10
|
+
* MobileClaw.addListener('agentEvent', (e) => {
|
|
11
|
+
* if (e.eventType === 'text_delta') process.stdout.write(e.data.text)
|
|
12
|
+
* })
|
|
13
|
+
*
|
|
14
|
+
* const { sessionKey } = await MobileClaw.sendMessage({ prompt: 'Hello!' })
|
|
15
|
+
*/
|
|
16
|
+
import type { MobileClawPlugin } from './definitions';
|
|
17
|
+
declare const MobileClaw: MobileClawPlugin;
|
|
18
|
+
export * from './definitions';
|
|
19
|
+
export { MobileClaw };
|
|
20
|
+
export { MobileClawEngine } from './engine';
|
|
21
|
+
export { McpServerManager } from './mcp/mcp-server-manager';
|
|
22
|
+
export type { DeviceTool } from './mcp/tools/types';
|
|
23
|
+
export type { AgentCompletedMessage, AgentErrorMessage, AgentEventMessage, AgentStartMessage, AgentStopMessage, NodeToUIMessage, ReadyMessage, ToolApprovalRequestMessage, UIToNodeMessage, } from './services/bridge-protocol';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,QAAA,MAAM,UAAU,kBAEd,CAAA;AAEF,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,CAAA;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3D,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,0BAA0B,EAC1B,eAAe,GAChB,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* capacitor-mobile-claw — On-device AI agent engine for Capacitor apps.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { MobileClaw } from 'capacitor-mobile-claw'
|
|
6
|
+
*
|
|
7
|
+
* const info = await MobileClaw.init()
|
|
8
|
+
* console.log(`Worker ready: Node ${info.nodeVersion}, ${info.mcpToolCount} tools`)
|
|
9
|
+
*
|
|
10
|
+
* MobileClaw.addListener('agentEvent', (e) => {
|
|
11
|
+
* if (e.eventType === 'text_delta') process.stdout.write(e.data.text)
|
|
12
|
+
* })
|
|
13
|
+
*
|
|
14
|
+
* const { sessionKey } = await MobileClaw.sendMessage({ prompt: 'Hello!' })
|
|
15
|
+
*/
|
|
16
|
+
import { registerPlugin } from '@capacitor/core';
|
|
17
|
+
const MobileClaw = registerPlugin('MobileClaw', {
|
|
18
|
+
web: () => import('./plugin').then((m) => new m.MobileClawWeb()),
|
|
19
|
+
});
|
|
20
|
+
export * from './definitions';
|
|
21
|
+
export { MobileClaw };
|
|
22
|
+
// Export engine for direct use (framework wrappers, testing)
|
|
23
|
+
export { MobileClawEngine } from './engine';
|
|
24
|
+
export { McpServerManager } from './mcp/mcp-server-manager';
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAGhD,MAAM,UAAU,GAAG,cAAc,CAAmB,YAAY,EAAE;IAChE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;CACjE,CAAC,CAAA;AAEF,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB,6DAA6D;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Manager — Framework-agnostic lifecycle manager.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the Vue composable `useMcpServer.ts` with a plain class.
|
|
5
|
+
* Manages MCP bridge/STOMP transports and device tool discovery.
|
|
6
|
+
*/
|
|
7
|
+
import type { StompConfig } from '../definitions';
|
|
8
|
+
import type { DeviceTool } from './tools/types';
|
|
9
|
+
export type McpStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
|
|
10
|
+
export interface McpServerOptions {
|
|
11
|
+
enableBridge?: boolean;
|
|
12
|
+
enableStomp?: boolean;
|
|
13
|
+
stompConfig?: StompConfig;
|
|
14
|
+
/** MCP device tools to register. Provided by the caller (e.g. from a tools package). */
|
|
15
|
+
tools?: DeviceTool[];
|
|
16
|
+
}
|
|
17
|
+
export declare class McpServerManager {
|
|
18
|
+
private manager;
|
|
19
|
+
private _status;
|
|
20
|
+
private _error;
|
|
21
|
+
private _deviceId;
|
|
22
|
+
private _toolCount;
|
|
23
|
+
private _activeTransports;
|
|
24
|
+
get status(): McpStatus;
|
|
25
|
+
get error(): string | null;
|
|
26
|
+
get deviceId(): string | null;
|
|
27
|
+
get toolCount(): number;
|
|
28
|
+
get activeTransports(): string[];
|
|
29
|
+
start(options?: McpServerOptions): Promise<void>;
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
restart(options?: McpServerOptions): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=mcp-server-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-manager.d.ts","sourceRoot":"","sources":["../../../src/mcp/mcp-server-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI/C,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAA;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,wFAAwF;IACxF,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,iBAAiB,CAAe;IAExC,IAAI,MAAM,IAAI,SAAS,CAEtB;IACD,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IACD,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IACD,IAAI,SAAS,IAAI,MAAM,CAEtB;IACD,IAAI,gBAAgB,IAAI,MAAM,EAAE,CAE/B;IAEK,KAAK,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+DpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrB,OAAO,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Manager — Framework-agnostic lifecycle manager.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the Vue composable `useMcpServer.ts` with a plain class.
|
|
5
|
+
* Manages MCP bridge/STOMP transports and device tool discovery.
|
|
6
|
+
*/
|
|
7
|
+
import { BridgeServerTransport } from './transport/bridge-server-transport';
|
|
8
|
+
import { TransportManager } from './transport/transport-manager';
|
|
9
|
+
export class McpServerManager {
|
|
10
|
+
manager = null;
|
|
11
|
+
_status = 'disconnected';
|
|
12
|
+
_error = null;
|
|
13
|
+
_deviceId = null;
|
|
14
|
+
_toolCount = 0;
|
|
15
|
+
_activeTransports = [];
|
|
16
|
+
get status() {
|
|
17
|
+
return this._status;
|
|
18
|
+
}
|
|
19
|
+
get error() {
|
|
20
|
+
return this._error;
|
|
21
|
+
}
|
|
22
|
+
get deviceId() {
|
|
23
|
+
return this._deviceId;
|
|
24
|
+
}
|
|
25
|
+
get toolCount() {
|
|
26
|
+
return this._toolCount;
|
|
27
|
+
}
|
|
28
|
+
get activeTransports() {
|
|
29
|
+
return this._activeTransports;
|
|
30
|
+
}
|
|
31
|
+
async start(options = {}) {
|
|
32
|
+
const { Capacitor } = await import('@capacitor/core');
|
|
33
|
+
if (!Capacitor.isNativePlatform()) {
|
|
34
|
+
console.log('[MCP] Skipping — not a native platform');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (this._status === 'connected' || this._status === 'connecting')
|
|
38
|
+
return;
|
|
39
|
+
this._status = 'connecting';
|
|
40
|
+
this._error = null;
|
|
41
|
+
try {
|
|
42
|
+
// Get device identifier
|
|
43
|
+
const { Device } = await import('@capacitor/device');
|
|
44
|
+
const info = await Device.getId();
|
|
45
|
+
this._deviceId = info.identifier;
|
|
46
|
+
console.log(`[MCP] Starting MCP server for device ${info.identifier}`);
|
|
47
|
+
// Use tools provided by the caller (from an external tools package)
|
|
48
|
+
const tools = options.tools ?? [];
|
|
49
|
+
if (tools.length === 0) {
|
|
50
|
+
console.warn('[MCP] No tools provided — MCP server will have zero device tools');
|
|
51
|
+
}
|
|
52
|
+
this._toolCount = tools.length;
|
|
53
|
+
// Create transport manager
|
|
54
|
+
this.manager = new TransportManager(() => tools);
|
|
55
|
+
// Bridge transport: ON by default
|
|
56
|
+
if (options.enableBridge !== false) {
|
|
57
|
+
const { NodeJS } = await import('capacitor-nodejs');
|
|
58
|
+
const bridgeTransport = new BridgeServerTransport(NodeJS);
|
|
59
|
+
await this.manager.addTransport('bridge', bridgeTransport);
|
|
60
|
+
console.log('[MCP] Bridge transport active — worker can call device tools');
|
|
61
|
+
}
|
|
62
|
+
// STOMP transport: OFF by default
|
|
63
|
+
if (options.enableStomp && options.stompConfig) {
|
|
64
|
+
const { StompServerTransport } = await import('./transport/stomp-server-transport');
|
|
65
|
+
const stompTransport = new StompServerTransport({
|
|
66
|
+
brokerURL: options.stompConfig.brokerURL,
|
|
67
|
+
login: options.stompConfig.login,
|
|
68
|
+
passcode: options.stompConfig.passcode,
|
|
69
|
+
deviceId: options.stompConfig.deviceId ?? info.identifier,
|
|
70
|
+
reconnectDelay: options.stompConfig.reconnectDelay,
|
|
71
|
+
});
|
|
72
|
+
await this.manager.addTransport('stomp', stompTransport);
|
|
73
|
+
console.log('[MCP] STOMP transport active');
|
|
74
|
+
}
|
|
75
|
+
this._activeTransports = this.manager.activeTransports;
|
|
76
|
+
this._status = 'connected';
|
|
77
|
+
console.log(`[MCP] Server running — ${tools.length} tools, transports: [${this._activeTransports.join(', ')}]`);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
this._status = 'error';
|
|
81
|
+
this._error = err instanceof Error ? err.message : String(err);
|
|
82
|
+
console.error('[MCP] Failed to start:', this._error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async stop() {
|
|
86
|
+
if (this.manager) {
|
|
87
|
+
await this.manager.closeAll();
|
|
88
|
+
this.manager = null;
|
|
89
|
+
}
|
|
90
|
+
this._activeTransports = [];
|
|
91
|
+
this._status = 'disconnected';
|
|
92
|
+
console.log('[MCP] Server stopped');
|
|
93
|
+
}
|
|
94
|
+
async restart(options) {
|
|
95
|
+
await this.stop();
|
|
96
|
+
await this.start(options);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=mcp-server-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-manager.js","sourceRoot":"","sources":["../../../src/mcp/mcp-server-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device MCP Server Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates an MCP Server instance that exposes device tools.
|
|
5
|
+
* Implements the MCP Server protocol for device tool discovery and invocation.
|
|
6
|
+
*/
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
8
|
+
import type { DeviceTool } from '../tools/types';
|
|
9
|
+
export declare function createDeviceMcpServer(tools: DeviceTool[]): Server<{
|
|
10
|
+
method: string;
|
|
11
|
+
params?: {
|
|
12
|
+
[x: string]: unknown;
|
|
13
|
+
_meta?: {
|
|
14
|
+
[x: string]: unknown;
|
|
15
|
+
progressToken?: string | number | undefined;
|
|
16
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
17
|
+
taskId: string;
|
|
18
|
+
} | undefined;
|
|
19
|
+
} | undefined;
|
|
20
|
+
} | undefined;
|
|
21
|
+
}, {
|
|
22
|
+
method: string;
|
|
23
|
+
params?: {
|
|
24
|
+
[x: string]: unknown;
|
|
25
|
+
_meta?: {
|
|
26
|
+
[x: string]: unknown;
|
|
27
|
+
progressToken?: string | number | undefined;
|
|
28
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
29
|
+
taskId: string;
|
|
30
|
+
} | undefined;
|
|
31
|
+
} | undefined;
|
|
32
|
+
} | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
[x: string]: unknown;
|
|
35
|
+
_meta?: {
|
|
36
|
+
[x: string]: unknown;
|
|
37
|
+
progressToken?: string | number | undefined;
|
|
38
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
39
|
+
taskId: string;
|
|
40
|
+
} | undefined;
|
|
41
|
+
} | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=device-mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-mcp-server.d.ts","sourceRoot":"","sources":["../../../../src/mcp/server/device-mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEhD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDxD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device MCP Server Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates an MCP Server instance that exposes device tools.
|
|
5
|
+
* Implements the MCP Server protocol for device tool discovery and invocation.
|
|
6
|
+
*/
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
8
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
export function createDeviceMcpServer(tools) {
|
|
10
|
+
const server = new Server({ name: 'mcp-device', version: '1.0.0' }, { capabilities: { tools: {}, logging: {} } });
|
|
11
|
+
// Handle tool listing — agent calls tools/list to discover available tools
|
|
12
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
13
|
+
console.log(`[MCP-Server] tools/list — returning ${tools.length} tools`);
|
|
14
|
+
return {
|
|
15
|
+
tools: tools.map((t) => ({
|
|
16
|
+
name: t.name,
|
|
17
|
+
description: t.description,
|
|
18
|
+
inputSchema: t.inputSchema,
|
|
19
|
+
})),
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
// Handle tool execution — agent calls tools/call with name + arguments
|
|
23
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
24
|
+
const { name, arguments: args } = request.params;
|
|
25
|
+
const tool = tools.find((t) => t.name === name);
|
|
26
|
+
if (!tool) {
|
|
27
|
+
console.error(`[MCP-Server] Tool not found: ${name}`);
|
|
28
|
+
return {
|
|
29
|
+
content: [{ type: 'text', text: `Tool "${name}" not found` }],
|
|
30
|
+
isError: true,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
console.log(`[MCP-Server] Executing tool: ${name}`);
|
|
34
|
+
try {
|
|
35
|
+
const result = await tool.execute(args || {});
|
|
36
|
+
const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: 'text', text }],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
console.error(`[MCP-Server] Error executing ${name}:`, message);
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: 'text', text: `Error executing ${name}: ${message}` }],
|
|
46
|
+
isError: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return server;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=device-mcp-server.js.map
|