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 @@
|
|
|
1
|
+
{"version":3,"file":"udp.tools.js","sourceRoot":"","sources":["../../../../src/mcp/tools/udp.tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,mHAAmH;QAChI,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAC,MAAM,EAAC,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,oCAAoC,EAAC,EAAC,MAAM,EAAC,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,sBAAsB,EAAC,EAAC,MAAM,EAAC,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,6BAA6B,EAAC,EAAC,EAAC,UAAU,EAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC3T,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACjF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC1B,CAAC;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,uHAAuH;QACpI,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAC,MAAM,EAAC,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,sBAAsB,EAAC,EAAC,MAAM,EAAC,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,kCAAkC,EAAC,EAAC,EAAC,UAAU,EAAC,CAAC,MAAM,EAAC,MAAM,CAAC,EAAC,sBAAsB,EAAC,KAAK,EAAC;QAC7O,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,YAAY,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC1B,CAAC;KACF;CACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wol.tools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/wol.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGzC,eAAO,MAAM,QAAQ,EAAE,UAAU,EAahC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NetworkTools } from 'capacitor-network-tools';
|
|
2
|
+
export const wolTools = [
|
|
3
|
+
{
|
|
4
|
+
name: 'wol_send',
|
|
5
|
+
description: 'Send a Wake-on-LAN magic packet to wake up a sleeping device on the local network. Requires the target device MAC address and that WoL is enabled in the device BIOS/firmware.',
|
|
6
|
+
inputSchema: { "type": "object", "properties": { "macAddress": { "type": "string", "description": "Target device MAC address (e.g. \"AA:BB:CC:DD:EE:FF\" or \"AA-BB-CC-DD-EE-FF\")" }, "broadcastAddress": { "description": "Broadcast address for the subnet (default: \"255.255.255.255\")", "type": "string" } }, "required": ["macAddress"], "additionalProperties": false },
|
|
7
|
+
execute: async (args) => {
|
|
8
|
+
await NetworkTools.wolSend({
|
|
9
|
+
macAddress: args.macAddress,
|
|
10
|
+
broadcastAddress: args.broadcastAddress,
|
|
11
|
+
});
|
|
12
|
+
return { success: true, macAddress: args.macAddress };
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
];
|
|
16
|
+
//# sourceMappingURL=wol.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wol.tools.js","sourceRoot":"","sources":["../../../../src/mcp/tools/wol.tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,gLAAgL;QAC7L,WAAW,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,YAAY,EAAC,EAAC,YAAY,EAAC,EAAC,MAAM,EAAC,QAAQ,EAAC,aAAa,EAAC,iFAAiF,EAAC,EAAC,kBAAkB,EAAC,EAAC,aAAa,EAAC,iEAAiE,EAAC,MAAM,EAAC,QAAQ,EAAC,EAAC,EAAC,UAAU,EAAC,CAAC,YAAY,CAAC,EAAC,sBAAsB,EAAC,KAAK,EAAC;QACxV,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,YAAY,CAAC,OAAO,CAAC;gBACzB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC,CAAC,CAAA;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAA;QACvD,CAAC;KACF;CACF,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge-based MCP Server Transport
|
|
3
|
+
*
|
|
4
|
+
* Implements the MCP SDK Transport interface over the Capacitor-NodeJS bridge.
|
|
5
|
+
* This allows the Node.js worker (mobile-claw) to call MCP device tools
|
|
6
|
+
* without going through a remote broker — communication is in-process via IPC.
|
|
7
|
+
*
|
|
8
|
+
* The worker sends JSON-RPC requests as { type: 'mcp.jsonrpc', payload: {...} }
|
|
9
|
+
* and receives responses as { type: 'mcp.jsonrpc.response', payload: {...} }.
|
|
10
|
+
*/
|
|
11
|
+
import type { Transport, TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
12
|
+
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
13
|
+
export declare class BridgeServerTransport implements Transport {
|
|
14
|
+
onmessage?: <T extends JSONRPCMessage>(message: T) => void;
|
|
15
|
+
onclose?: () => void;
|
|
16
|
+
onerror?: (error: Error) => void;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
private nodePlugin;
|
|
19
|
+
private removeListener?;
|
|
20
|
+
private _started;
|
|
21
|
+
constructor(nodePlugin: any);
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
send(message: JSONRPCMessage, _options?: TransportSendOptions): Promise<void>;
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
get connected(): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=bridge-server-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-server-transport.d.ts","sourceRoot":"","sources":["../../../../src/mcp/transport/bridge-server-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAA;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAExE,qBAAa,qBAAsB,YAAW,SAAS;IAE9C,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;IAC1D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAEzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAC,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,UAAU,EAAE,GAAG;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BtB,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,IAAI,SAAS,IAAI,OAAO,CAEvB;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge-based MCP Server Transport
|
|
3
|
+
*
|
|
4
|
+
* Implements the MCP SDK Transport interface over the Capacitor-NodeJS bridge.
|
|
5
|
+
* This allows the Node.js worker (mobile-claw) to call MCP device tools
|
|
6
|
+
* without going through a remote broker — communication is in-process via IPC.
|
|
7
|
+
*
|
|
8
|
+
* The worker sends JSON-RPC requests as { type: 'mcp.jsonrpc', payload: {...} }
|
|
9
|
+
* and receives responses as { type: 'mcp.jsonrpc.response', payload: {...} }.
|
|
10
|
+
*/
|
|
11
|
+
export class BridgeServerTransport {
|
|
12
|
+
// Transport interface callbacks (set by MCP Server on connect)
|
|
13
|
+
onmessage;
|
|
14
|
+
onclose;
|
|
15
|
+
onerror;
|
|
16
|
+
sessionId;
|
|
17
|
+
nodePlugin; // Capacitor-NodeJS plugin reference
|
|
18
|
+
removeListener = null;
|
|
19
|
+
_started = false;
|
|
20
|
+
constructor(nodePlugin) {
|
|
21
|
+
this.nodePlugin = nodePlugin;
|
|
22
|
+
}
|
|
23
|
+
async start() {
|
|
24
|
+
if (this._started)
|
|
25
|
+
return;
|
|
26
|
+
// Listen for MCP JSON-RPC messages from the Node.js worker.
|
|
27
|
+
// The worker sends: channel.send('message', { type: 'mcp.jsonrpc', payload: {...} })
|
|
28
|
+
// Capacitor-NodeJS wraps this as: { args: [{ type: 'mcp.jsonrpc', payload: {...} }] }
|
|
29
|
+
const handle = await this.nodePlugin.addListener('message', (event) => {
|
|
30
|
+
const msg = event?.args?.[0] ?? event;
|
|
31
|
+
if (!msg || msg.type !== 'mcp.jsonrpc')
|
|
32
|
+
return;
|
|
33
|
+
try {
|
|
34
|
+
const jsonRpcMessage = msg.payload;
|
|
35
|
+
console.log(`[MCP-Bridge] Received ${jsonRpcMessage.method || 'response'} (id: ${jsonRpcMessage.id})`);
|
|
36
|
+
this.onmessage?.(jsonRpcMessage);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
40
|
+
console.error('[MCP-Bridge] Error processing message:', err.message);
|
|
41
|
+
this.onerror?.(err);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
this.removeListener = () => handle?.remove?.();
|
|
45
|
+
this._started = true;
|
|
46
|
+
console.log('[MCP-Bridge] Transport started — listening for worker requests');
|
|
47
|
+
}
|
|
48
|
+
async send(message, _options) {
|
|
49
|
+
if (!this.nodePlugin) {
|
|
50
|
+
console.warn('[MCP-Bridge] Cannot send — plugin not available');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
console.log(`[MCP-Bridge] Sending response (id: ${message.id})`);
|
|
54
|
+
await this.nodePlugin.send({
|
|
55
|
+
eventName: 'message',
|
|
56
|
+
args: [{ type: 'mcp.jsonrpc.response', payload: message }],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async close() {
|
|
60
|
+
this._started = false;
|
|
61
|
+
if (this.removeListener) {
|
|
62
|
+
this.removeListener();
|
|
63
|
+
this.removeListener = null;
|
|
64
|
+
}
|
|
65
|
+
this.onclose?.();
|
|
66
|
+
console.log('[MCP-Bridge] Transport closed');
|
|
67
|
+
}
|
|
68
|
+
get connected() {
|
|
69
|
+
return this._started;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=bridge-server-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-server-transport.js","sourceRoot":"","sources":["../../../../src/mcp/transport/bridge-server-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,MAAM,OAAO,qBAAqB;IAChC,+DAA+D;IACxD,SAAS,CAAiD;IAC1D,OAAO,CAAa;IACpB,OAAO,CAAyB;IAChC,SAAS,CAAS;IAEjB,UAAU,CAAK,CAAC,oCAAoC;IACpD,cAAc,GAAyB,IAAI,CAAA;IAC3C,QAAQ,GAAG,KAAK,CAAA;IAExB,YAAY,UAAe;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEzB,4DAA4D;QAC5D,qFAAqF;QACrF,sFAAsF;QACtF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAU,EAAE,EAAE;YACzE,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAA;YACrC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAM;YAE9C,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,GAAG,CAAC,OAAyB,CAAA;gBACpD,OAAO,CAAC,GAAG,CACT,yBAA0B,cAAsB,CAAC,MAAM,IAAI,UAAU,SAAU,cAAsB,CAAC,EAAE,GAAG,CAC5G,CAAA;gBACD,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,CAAA;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBACrE,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;gBACpE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA;YACrB,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAA;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;IAC/E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB,EAAE,QAA+B;QACjE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;YAC/D,OAAM;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,sCAAuC,OAAe,CAAC,EAAE,GAAG,CAAC,CAAA;QAEzE,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACzB,SAAS,EAAE,SAAS;YACpB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;SAC3D,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACrB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,EAAE,CAAA;YACrB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC5B,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,EAAE,CAAA;QAChB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STOMP-based MCP Server Transport
|
|
3
|
+
*
|
|
4
|
+
* Bridges WebSocket STOMP to the MCP SDK Transport interface, using a
|
|
5
|
+
* requestContextMap pattern for correlating JSON-RPC request/response pairs.
|
|
6
|
+
*
|
|
7
|
+
* Each incoming STOMP frame carries a JSON-RPC message with reply-to / correlation-id
|
|
8
|
+
* headers. The transport stores these in a map keyed by the JSON-RPC message id, then
|
|
9
|
+
* routes the MCP server's response back to the correct reply-to destination.
|
|
10
|
+
*/
|
|
11
|
+
import type { Transport, TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
12
|
+
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
13
|
+
export interface StompTransportConfig {
|
|
14
|
+
/** WebSocket STOMP broker URL, e.g. wss://your-broker.example.com/ws */
|
|
15
|
+
brokerURL: string;
|
|
16
|
+
/** RabbitMQ username */
|
|
17
|
+
login: string;
|
|
18
|
+
/** RabbitMQ password */
|
|
19
|
+
passcode: string;
|
|
20
|
+
/** Unique device identifier — determines the request queue name */
|
|
21
|
+
deviceId: string;
|
|
22
|
+
/** Reconnection delay in ms (default 5000) */
|
|
23
|
+
reconnectDelay?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class StompServerTransport implements Transport {
|
|
26
|
+
private config;
|
|
27
|
+
onmessage?: <T extends JSONRPCMessage>(message: T) => void;
|
|
28
|
+
onclose?: () => void;
|
|
29
|
+
onerror?: (error: Error) => void;
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
private stompClient;
|
|
32
|
+
private requestContextMap;
|
|
33
|
+
private requestQueue;
|
|
34
|
+
private _started;
|
|
35
|
+
constructor(config: StompTransportConfig);
|
|
36
|
+
start(): Promise<void>;
|
|
37
|
+
send(message: JSONRPCMessage, _options?: TransportSendOptions): Promise<void>;
|
|
38
|
+
close(): Promise<void>;
|
|
39
|
+
get connected(): boolean;
|
|
40
|
+
get deviceId(): string;
|
|
41
|
+
private handleIncomingMessage;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=stomp-server-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stomp-server-transport.d.ts","sourceRoot":"","sources":["../../../../src/mcp/transport/stomp-server-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAA;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AAQxE,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,oBAAqB,YAAW,SAAS;IAYxC,OAAO,CAAC,MAAM;IAVnB,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,IAAI,CAAA;IAC1D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAEzB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,iBAAiB,CAA6C;IACtE,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAQ;gBAEJ,MAAM,EAAE,oBAAoB;IAe1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCtB,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,OAAO,CAAC,qBAAqB;CA6B9B"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STOMP-based MCP Server Transport
|
|
3
|
+
*
|
|
4
|
+
* Bridges WebSocket STOMP to the MCP SDK Transport interface, using a
|
|
5
|
+
* requestContextMap pattern for correlating JSON-RPC request/response pairs.
|
|
6
|
+
*
|
|
7
|
+
* Each incoming STOMP frame carries a JSON-RPC message with reply-to / correlation-id
|
|
8
|
+
* headers. The transport stores these in a map keyed by the JSON-RPC message id, then
|
|
9
|
+
* routes the MCP server's response back to the correct reply-to destination.
|
|
10
|
+
*/
|
|
11
|
+
import { Client as StompClient } from '@stomp/stompjs';
|
|
12
|
+
export class StompServerTransport {
|
|
13
|
+
config;
|
|
14
|
+
// Transport interface callbacks
|
|
15
|
+
onmessage;
|
|
16
|
+
onclose;
|
|
17
|
+
onerror;
|
|
18
|
+
sessionId;
|
|
19
|
+
stompClient;
|
|
20
|
+
requestContextMap = new Map();
|
|
21
|
+
requestQueue;
|
|
22
|
+
_started = false;
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.requestQueue = `/queue/mcp.device.${config.deviceId}.requests`;
|
|
26
|
+
this.stompClient = new StompClient({
|
|
27
|
+
brokerURL: config.brokerURL,
|
|
28
|
+
connectHeaders: {
|
|
29
|
+
login: config.login,
|
|
30
|
+
passcode: config.passcode,
|
|
31
|
+
},
|
|
32
|
+
reconnectDelay: config.reconnectDelay ?? 5000,
|
|
33
|
+
heartbeatIncoming: 10000,
|
|
34
|
+
heartbeatOutgoing: 10000,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async start() {
|
|
38
|
+
if (this._started)
|
|
39
|
+
return;
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.stompClient.onConnect = () => {
|
|
42
|
+
console.log('[MCP-STOMP] Connected to broker');
|
|
43
|
+
// Subscribe to device-specific request queue
|
|
44
|
+
// auto-delete queue: disappears when consumer disconnects
|
|
45
|
+
this.stompClient.subscribe(this.requestQueue, (frame) => this.handleIncomingMessage(frame), {
|
|
46
|
+
'auto-delete': 'true',
|
|
47
|
+
'x-expires': '3600000', // auto-delete after 1h of no consumers
|
|
48
|
+
});
|
|
49
|
+
console.log(`[MCP-STOMP] Subscribed to ${this.requestQueue}`);
|
|
50
|
+
this._started = true;
|
|
51
|
+
resolve();
|
|
52
|
+
};
|
|
53
|
+
this.stompClient.onStompError = (frame) => {
|
|
54
|
+
const msg = frame.headers['message'] || 'STOMP error';
|
|
55
|
+
const error = new Error(`[MCP-STOMP] ${msg}`);
|
|
56
|
+
console.error(error.message, frame.body);
|
|
57
|
+
this.onerror?.(error);
|
|
58
|
+
if (!this._started)
|
|
59
|
+
reject(error);
|
|
60
|
+
};
|
|
61
|
+
this.stompClient.onWebSocketClose = () => {
|
|
62
|
+
console.log('[MCP-STOMP] WebSocket closed');
|
|
63
|
+
// Don't invoke onclose here — stompjs reconnect will handle it
|
|
64
|
+
// onclose is invoked only on explicit close()
|
|
65
|
+
};
|
|
66
|
+
this.stompClient.onDisconnect = () => {
|
|
67
|
+
console.log('[MCP-STOMP] Disconnected');
|
|
68
|
+
};
|
|
69
|
+
this.stompClient.activate();
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async send(message, _options) {
|
|
73
|
+
const messageId = message.id;
|
|
74
|
+
const context = messageId !== undefined ? this.requestContextMap.get(messageId) : undefined;
|
|
75
|
+
if (context) {
|
|
76
|
+
const { replyTo, correlationId } = context;
|
|
77
|
+
this.stompClient.publish({
|
|
78
|
+
destination: replyTo,
|
|
79
|
+
headers: { 'correlation-id': correlationId, 'content-type': 'application/json' },
|
|
80
|
+
body: JSON.stringify(message),
|
|
81
|
+
});
|
|
82
|
+
console.log(`[MCP-STOMP] Sent response to ${replyTo} (correlation: ${correlationId})`);
|
|
83
|
+
this.requestContextMap.delete(messageId);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Notifications (no id) — broadcast to a notification destination if needed
|
|
87
|
+
console.warn('[MCP-STOMP] No reply destination for message', message);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async close() {
|
|
91
|
+
this._started = false;
|
|
92
|
+
this.requestContextMap.clear();
|
|
93
|
+
await this.stompClient.deactivate();
|
|
94
|
+
this.onclose?.();
|
|
95
|
+
}
|
|
96
|
+
get connected() {
|
|
97
|
+
return this.stompClient.connected;
|
|
98
|
+
}
|
|
99
|
+
get deviceId() {
|
|
100
|
+
return this.config.deviceId;
|
|
101
|
+
}
|
|
102
|
+
handleIncomingMessage(frame) {
|
|
103
|
+
try {
|
|
104
|
+
const jsonRpcMessage = JSON.parse(frame.body);
|
|
105
|
+
// Extract routing info from STOMP headers
|
|
106
|
+
const replyTo = frame.headers['reply-to'];
|
|
107
|
+
const correlationId = frame.headers['correlation-id'] || frame.headers['message-id'] || '';
|
|
108
|
+
// Store context for response routing (mirrors requestContextMap from amqp.service.ts)
|
|
109
|
+
if (replyTo && jsonRpcMessage.id !== undefined) {
|
|
110
|
+
this.requestContextMap.set(jsonRpcMessage.id, { replyTo, correlationId });
|
|
111
|
+
}
|
|
112
|
+
// Strip non-standard headers field before passing to MCP server
|
|
113
|
+
const cleanMessage = { ...jsonRpcMessage };
|
|
114
|
+
if ('headers' in cleanMessage) {
|
|
115
|
+
delete cleanMessage.headers;
|
|
116
|
+
}
|
|
117
|
+
console.log(`[MCP-STOMP] Received ${cleanMessage.method || 'response'} (id: ${cleanMessage.id})`);
|
|
118
|
+
// Dispatch to MCP server
|
|
119
|
+
this.onmessage?.(cleanMessage);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
123
|
+
console.error('[MCP-STOMP] Error processing message:', err.message);
|
|
124
|
+
this.onerror?.(err);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=stomp-server-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stomp-server-transport.js","sourceRoot":"","sources":["../../../../src/mcp/transport/stomp-server-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Transport Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple concurrent transports for the device MCP server.
|
|
5
|
+
* Each transport gets its own MCP Server instance (the SDK only supports
|
|
6
|
+
* one transport per Server.connect()), but all instances share the same
|
|
7
|
+
* DeviceTool array — so every transport sees the same tools.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const manager = new TransportManager(() => enabledTools.value)
|
|
11
|
+
* await manager.addTransport('bridge', bridgeTransport)
|
|
12
|
+
* await manager.addTransport('stomp', stompTransport) // opt-in
|
|
13
|
+
* await manager.removeTransport('stomp')
|
|
14
|
+
* await manager.closeAll()
|
|
15
|
+
*/
|
|
16
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
17
|
+
import type { DeviceTool } from '../tools/types';
|
|
18
|
+
export declare class TransportManager {
|
|
19
|
+
private connections;
|
|
20
|
+
private toolsFn;
|
|
21
|
+
/**
|
|
22
|
+
* @param toolsFn - Factory function that returns the current set of enabled tools.
|
|
23
|
+
* Called each time a transport is added, so permission changes
|
|
24
|
+
* take effect on next addTransport/restart.
|
|
25
|
+
*/
|
|
26
|
+
constructor(toolsFn: () => DeviceTool[]);
|
|
27
|
+
/** Add and start a transport. Creates a dedicated MCP Server instance for it. */
|
|
28
|
+
addTransport(id: string, transport: Transport): Promise<void>;
|
|
29
|
+
/** Stop and remove a transport by id. */
|
|
30
|
+
removeTransport(id: string): Promise<void>;
|
|
31
|
+
/** Stop and remove all transports. */
|
|
32
|
+
closeAll(): Promise<void>;
|
|
33
|
+
/** Check if a specific transport is active. */
|
|
34
|
+
hasTransport(id: string): boolean;
|
|
35
|
+
/** Get the list of active transport ids. */
|
|
36
|
+
get activeTransports(): string[];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=transport-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-manager.d.ts","sourceRoot":"","sources":["../../../../src/mcp/transport/transport-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAE9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAOhD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,OAAO,CAAoB;IAEnC;;;;OAIG;gBACS,OAAO,EAAE,MAAM,UAAU,EAAE;IAIvC,iFAAiF;IAC3E,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAenE,yCAAyC;IACnC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAchD,sCAAsC;IAChC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIjC,4CAA4C;IAC5C,IAAI,gBAAgB,IAAI,MAAM,EAAE,CAE/B;CACF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Transport Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple concurrent transports for the device MCP server.
|
|
5
|
+
* Each transport gets its own MCP Server instance (the SDK only supports
|
|
6
|
+
* one transport per Server.connect()), but all instances share the same
|
|
7
|
+
* DeviceTool array — so every transport sees the same tools.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const manager = new TransportManager(() => enabledTools.value)
|
|
11
|
+
* await manager.addTransport('bridge', bridgeTransport)
|
|
12
|
+
* await manager.addTransport('stomp', stompTransport) // opt-in
|
|
13
|
+
* await manager.removeTransport('stomp')
|
|
14
|
+
* await manager.closeAll()
|
|
15
|
+
*/
|
|
16
|
+
import { createDeviceMcpServer } from '../server/device-mcp-server';
|
|
17
|
+
export class TransportManager {
|
|
18
|
+
connections = new Map();
|
|
19
|
+
toolsFn;
|
|
20
|
+
/**
|
|
21
|
+
* @param toolsFn - Factory function that returns the current set of enabled tools.
|
|
22
|
+
* Called each time a transport is added, so permission changes
|
|
23
|
+
* take effect on next addTransport/restart.
|
|
24
|
+
*/
|
|
25
|
+
constructor(toolsFn) {
|
|
26
|
+
this.toolsFn = toolsFn;
|
|
27
|
+
}
|
|
28
|
+
/** Add and start a transport. Creates a dedicated MCP Server instance for it. */
|
|
29
|
+
async addTransport(id, transport) {
|
|
30
|
+
// Remove existing transport with same id if present
|
|
31
|
+
if (this.connections.has(id)) {
|
|
32
|
+
await this.removeTransport(id);
|
|
33
|
+
}
|
|
34
|
+
const tools = this.toolsFn();
|
|
35
|
+
const server = createDeviceMcpServer(tools);
|
|
36
|
+
await server.connect(transport);
|
|
37
|
+
this.connections.set(id, { server, transport });
|
|
38
|
+
console.log(`[TransportManager] Added transport "${id}" — ${tools.length} tools available`);
|
|
39
|
+
}
|
|
40
|
+
/** Stop and remove a transport by id. */
|
|
41
|
+
async removeTransport(id) {
|
|
42
|
+
const entry = this.connections.get(id);
|
|
43
|
+
if (!entry)
|
|
44
|
+
return;
|
|
45
|
+
try {
|
|
46
|
+
await entry.transport.close();
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.warn(`[TransportManager] Error closing transport "${id}":`, err);
|
|
50
|
+
}
|
|
51
|
+
this.connections.delete(id);
|
|
52
|
+
console.log(`[TransportManager] Removed transport "${id}"`);
|
|
53
|
+
}
|
|
54
|
+
/** Stop and remove all transports. */
|
|
55
|
+
async closeAll() {
|
|
56
|
+
const ids = [...this.connections.keys()];
|
|
57
|
+
for (const id of ids) {
|
|
58
|
+
await this.removeTransport(id);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Check if a specific transport is active. */
|
|
62
|
+
hasTransport(id) {
|
|
63
|
+
return this.connections.has(id);
|
|
64
|
+
}
|
|
65
|
+
/** Get the list of active transport ids. */
|
|
66
|
+
get activeTransports() {
|
|
67
|
+
return [...this.connections.keys()];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=transport-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-manager.js","sourceRoot":"","sources":["../../../../src/mcp/transport/transport-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAQnE,MAAM,OAAO,gBAAgB;IACnB,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAA;IAC/C,OAAO,CAAoB;IAEnC;;;;OAIG;IACH,YAAY,OAA2B;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,SAAoB;QACjD,oDAAoD;QACpD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAChC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;QAE3C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QAE/C,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAA;IAC7F,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC1E,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC3B,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAA;IAC7D,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,QAAQ;QACZ,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,YAAY,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,4CAA4C;IAC5C,IAAI,gBAAgB;QAClB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MobileClaw Capacitor Plugin — Plugin class implementation.
|
|
3
|
+
*
|
|
4
|
+
* Wraps MobileClawEngine in the Capacitor WebPlugin interface.
|
|
5
|
+
* This is the bridge between Capacitor's addListener/removeAllListeners
|
|
6
|
+
* pattern and the engine's event system.
|
|
7
|
+
*/
|
|
8
|
+
import { WebPlugin } from '@capacitor/core';
|
|
9
|
+
import type { AuthStatus, FileReadResult, MobileClawEvent, MobileClawEventName, MobileClawInitOptions, MobileClawPlugin, MobileClawReadyInfo, SessionHistoryResult, SessionInfo, SessionListResult, ToolInvokeResult } from './definitions';
|
|
10
|
+
import { MobileClawEngine } from './engine';
|
|
11
|
+
export declare class MobileClawWeb extends WebPlugin implements MobileClawPlugin {
|
|
12
|
+
private engine;
|
|
13
|
+
init(options?: MobileClawInitOptions): Promise<MobileClawReadyInfo>;
|
|
14
|
+
isReady(): Promise<{
|
|
15
|
+
ready: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
sendMessage(options: {
|
|
18
|
+
prompt: string;
|
|
19
|
+
agentId?: string;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
sessionKey: string;
|
|
22
|
+
}>;
|
|
23
|
+
stopTurn(): Promise<void>;
|
|
24
|
+
approveTool(options: {
|
|
25
|
+
toolCallId: string;
|
|
26
|
+
approved: boolean;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
steerAgent(options: {
|
|
29
|
+
text: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
updateConfig(options: {
|
|
32
|
+
config: Record<string, unknown>;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
getAuthStatus(): Promise<AuthStatus>;
|
|
35
|
+
readFile(options: {
|
|
36
|
+
path: string;
|
|
37
|
+
}): Promise<FileReadResult>;
|
|
38
|
+
writeFile(options: {
|
|
39
|
+
path: string;
|
|
40
|
+
content: string;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
listSessions(options?: {
|
|
43
|
+
agentId?: string;
|
|
44
|
+
}): Promise<SessionListResult>;
|
|
45
|
+
getLatestSession(options?: {
|
|
46
|
+
agentId?: string;
|
|
47
|
+
}): Promise<SessionInfo | null>;
|
|
48
|
+
loadSessionHistory(options: {
|
|
49
|
+
sessionKey: string;
|
|
50
|
+
agentId?: string;
|
|
51
|
+
}): Promise<SessionHistoryResult>;
|
|
52
|
+
resumeSession(options: {
|
|
53
|
+
sessionKey: string;
|
|
54
|
+
agentId?: string;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
clearConversation(): Promise<{
|
|
57
|
+
success: boolean;
|
|
58
|
+
}>;
|
|
59
|
+
setSessionKey(options: {
|
|
60
|
+
sessionKey: string;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
getSessionKey(): Promise<{
|
|
63
|
+
sessionKey: string | null;
|
|
64
|
+
}>;
|
|
65
|
+
invokeTool(options: {
|
|
66
|
+
toolName: string;
|
|
67
|
+
args?: Record<string, unknown>;
|
|
68
|
+
}): Promise<ToolInvokeResult>;
|
|
69
|
+
addListener(eventName: MobileClawEventName, handler: (event: MobileClawEvent) => void): Promise<{
|
|
70
|
+
remove: () => Promise<void>;
|
|
71
|
+
}>;
|
|
72
|
+
removeAllListeners(eventName?: MobileClawEventName): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Low-level access to the engine for framework wrappers.
|
|
75
|
+
* Useful for Vue/React integrations that need raw bridge message access.
|
|
76
|
+
*/
|
|
77
|
+
getEngine(): MobileClawEngine;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MobileClaw Capacitor Plugin — Plugin class implementation.
|
|
3
|
+
*
|
|
4
|
+
* Wraps MobileClawEngine in the Capacitor WebPlugin interface.
|
|
5
|
+
* This is the bridge between Capacitor's addListener/removeAllListeners
|
|
6
|
+
* pattern and the engine's event system.
|
|
7
|
+
*/
|
|
8
|
+
import { WebPlugin } from '@capacitor/core';
|
|
9
|
+
import { MobileClawEngine } from './engine';
|
|
10
|
+
export class MobileClawWeb extends WebPlugin {
|
|
11
|
+
engine = new MobileClawEngine();
|
|
12
|
+
async init(options) {
|
|
13
|
+
return this.engine.init(options);
|
|
14
|
+
}
|
|
15
|
+
async isReady() {
|
|
16
|
+
return this.engine.isReady();
|
|
17
|
+
}
|
|
18
|
+
async sendMessage(options) {
|
|
19
|
+
return this.engine.sendMessage(options.prompt, options.agentId);
|
|
20
|
+
}
|
|
21
|
+
async stopTurn() {
|
|
22
|
+
return this.engine.stopTurn();
|
|
23
|
+
}
|
|
24
|
+
async approveTool(options) {
|
|
25
|
+
return this.engine.approveTool(options.toolCallId, options.approved);
|
|
26
|
+
}
|
|
27
|
+
async steerAgent(options) {
|
|
28
|
+
return this.engine.steerAgent(options.text);
|
|
29
|
+
}
|
|
30
|
+
async updateConfig(options) {
|
|
31
|
+
return this.engine.updateConfig(options.config);
|
|
32
|
+
}
|
|
33
|
+
async getAuthStatus() {
|
|
34
|
+
return this.engine.getAuthStatus();
|
|
35
|
+
}
|
|
36
|
+
async readFile(options) {
|
|
37
|
+
return this.engine.readFile(options.path);
|
|
38
|
+
}
|
|
39
|
+
async writeFile(options) {
|
|
40
|
+
return this.engine.writeFile(options.path, options.content);
|
|
41
|
+
}
|
|
42
|
+
async listSessions(options) {
|
|
43
|
+
return this.engine.listSessions(options?.agentId);
|
|
44
|
+
}
|
|
45
|
+
async getLatestSession(options) {
|
|
46
|
+
return this.engine.getLatestSession(options?.agentId);
|
|
47
|
+
}
|
|
48
|
+
async loadSessionHistory(options) {
|
|
49
|
+
return this.engine.loadSessionHistory(options.sessionKey, options.agentId);
|
|
50
|
+
}
|
|
51
|
+
async resumeSession(options) {
|
|
52
|
+
return this.engine.resumeSession(options.sessionKey, options.agentId);
|
|
53
|
+
}
|
|
54
|
+
async clearConversation() {
|
|
55
|
+
return this.engine.clearConversation();
|
|
56
|
+
}
|
|
57
|
+
async setSessionKey(options) {
|
|
58
|
+
return this.engine.setSessionKey(options.sessionKey);
|
|
59
|
+
}
|
|
60
|
+
async getSessionKey() {
|
|
61
|
+
return this.engine.getSessionKey();
|
|
62
|
+
}
|
|
63
|
+
async invokeTool(options) {
|
|
64
|
+
return this.engine.invokeTool(options.toolName, options.args);
|
|
65
|
+
}
|
|
66
|
+
async addListener(eventName, handler) {
|
|
67
|
+
const { remove } = this.engine.addListener(eventName, handler);
|
|
68
|
+
return { remove: async () => remove() };
|
|
69
|
+
}
|
|
70
|
+
async removeAllListeners(eventName) {
|
|
71
|
+
this.engine.removeAllListeners(eventName);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Low-level access to the engine for framework wrappers.
|
|
75
|
+
* Useful for Vue/React integrations that need raw bridge message access.
|
|
76
|
+
*/
|
|
77
|
+
getEngine() {
|
|
78
|
+
return this.engine;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|