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.
Files changed (172) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -0
  3. package/dist/esm/definitions.d.ts +226 -0
  4. package/dist/esm/definitions.d.ts.map +1 -0
  5. package/dist/esm/definitions.js +16 -0
  6. package/dist/esm/definitions.js.map +1 -0
  7. package/dist/esm/engine.d.ts +93 -0
  8. package/dist/esm/engine.d.ts.map +1 -0
  9. package/dist/esm/engine.js +332 -0
  10. package/dist/esm/engine.js.map +1 -0
  11. package/dist/esm/index.d.ts +24 -0
  12. package/dist/esm/index.d.ts.map +1 -0
  13. package/dist/esm/index.js +25 -0
  14. package/dist/esm/index.js.map +1 -0
  15. package/dist/esm/mcp/mcp-server-manager.d.ts +33 -0
  16. package/dist/esm/mcp/mcp-server-manager.d.ts.map +1 -0
  17. package/dist/esm/mcp/mcp-server-manager.js +99 -0
  18. package/dist/esm/mcp/mcp-server-manager.js.map +1 -0
  19. package/dist/esm/mcp/server/device-mcp-server.d.ts +43 -0
  20. package/dist/esm/mcp/server/device-mcp-server.d.ts.map +1 -0
  21. package/dist/esm/mcp/server/device-mcp-server.js +52 -0
  22. package/dist/esm/mcp/server/device-mcp-server.js.map +1 -0
  23. package/dist/esm/mcp/tools/app-state.tools.d.ts +3 -0
  24. package/dist/esm/mcp/tools/app-state.tools.d.ts.map +1 -0
  25. package/dist/esm/mcp/tools/app-state.tools.js +22 -0
  26. package/dist/esm/mcp/tools/app-state.tools.js.map +1 -0
  27. package/dist/esm/mcp/tools/barcode.tools.d.ts +3 -0
  28. package/dist/esm/mcp/tools/barcode.tools.d.ts.map +1 -0
  29. package/dist/esm/mcp/tools/barcode.tools.js +29 -0
  30. package/dist/esm/mcp/tools/barcode.tools.js.map +1 -0
  31. package/dist/esm/mcp/tools/biometric.tools.d.ts +3 -0
  32. package/dist/esm/mcp/tools/biometric.tools.d.ts.map +1 -0
  33. package/dist/esm/mcp/tools/biometric.tools.js +33 -0
  34. package/dist/esm/mcp/tools/biometric.tools.js.map +1 -0
  35. package/dist/esm/mcp/tools/bluetooth.tools.d.ts +3 -0
  36. package/dist/esm/mcp/tools/bluetooth.tools.d.ts.map +1 -0
  37. package/dist/esm/mcp/tools/bluetooth.tools.js +95 -0
  38. package/dist/esm/mcp/tools/bluetooth.tools.js.map +1 -0
  39. package/dist/esm/mcp/tools/camera.tools.d.ts +3 -0
  40. package/dist/esm/mcp/tools/camera.tools.d.ts.map +1 -0
  41. package/dist/esm/mcp/tools/camera.tools.js +36 -0
  42. package/dist/esm/mcp/tools/camera.tools.js.map +1 -0
  43. package/dist/esm/mcp/tools/categories.d.ts +22 -0
  44. package/dist/esm/mcp/tools/categories.d.ts.map +1 -0
  45. package/dist/esm/mcp/tools/categories.js +242 -0
  46. package/dist/esm/mcp/tools/categories.js.map +1 -0
  47. package/dist/esm/mcp/tools/clipboard.tools.d.ts +3 -0
  48. package/dist/esm/mcp/tools/clipboard.tools.d.ts.map +1 -0
  49. package/dist/esm/mcp/tools/clipboard.tools.js +22 -0
  50. package/dist/esm/mcp/tools/clipboard.tools.js.map +1 -0
  51. package/dist/esm/mcp/tools/contacts.tools.d.ts +3 -0
  52. package/dist/esm/mcp/tools/contacts.tools.d.ts.map +1 -0
  53. package/dist/esm/mcp/tools/contacts.tools.js +58 -0
  54. package/dist/esm/mcp/tools/contacts.tools.js.map +1 -0
  55. package/dist/esm/mcp/tools/device-info.tools.d.ts +3 -0
  56. package/dist/esm/mcp/tools/device-info.tools.d.ts.map +1 -0
  57. package/dist/esm/mcp/tools/device-info.tools.js +39 -0
  58. package/dist/esm/mcp/tools/device-info.tools.js.map +1 -0
  59. package/dist/esm/mcp/tools/discovery.tools.d.ts +3 -0
  60. package/dist/esm/mcp/tools/discovery.tools.d.ts.map +1 -0
  61. package/dist/esm/mcp/tools/discovery.tools.js +41 -0
  62. package/dist/esm/mcp/tools/discovery.tools.js.map +1 -0
  63. package/dist/esm/mcp/tools/geolocation.tools.d.ts +3 -0
  64. package/dist/esm/mcp/tools/geolocation.tools.d.ts.map +1 -0
  65. package/dist/esm/mcp/tools/geolocation.tools.js +25 -0
  66. package/dist/esm/mcp/tools/geolocation.tools.js.map +1 -0
  67. package/dist/esm/mcp/tools/haptics.tools.d.ts +3 -0
  68. package/dist/esm/mcp/tools/haptics.tools.d.ts.map +1 -0
  69. package/dist/esm/mcp/tools/haptics.tools.js +41 -0
  70. package/dist/esm/mcp/tools/haptics.tools.js.map +1 -0
  71. package/dist/esm/mcp/tools/health.tools.d.ts +3 -0
  72. package/dist/esm/mcp/tools/health.tools.d.ts.map +1 -0
  73. package/dist/esm/mcp/tools/health.tools.js +38 -0
  74. package/dist/esm/mcp/tools/health.tools.js.map +1 -0
  75. package/dist/esm/mcp/tools/http.tools.d.ts +3 -0
  76. package/dist/esm/mcp/tools/http.tools.d.ts.map +1 -0
  77. package/dist/esm/mcp/tools/http.tools.js +24 -0
  78. package/dist/esm/mcp/tools/http.tools.js.map +1 -0
  79. package/dist/esm/mcp/tools/index.d.ts +10 -0
  80. package/dist/esm/mcp/tools/index.d.ts.map +1 -0
  81. package/dist/esm/mcp/tools/index.js +70 -0
  82. package/dist/esm/mcp/tools/index.js.map +1 -0
  83. package/dist/esm/mcp/tools/keep-awake.tools.d.ts +3 -0
  84. package/dist/esm/mcp/tools/keep-awake.tools.d.ts.map +1 -0
  85. package/dist/esm/mcp/tools/keep-awake.tools.js +23 -0
  86. package/dist/esm/mcp/tools/keep-awake.tools.js.map +1 -0
  87. package/dist/esm/mcp/tools/motion-sensors.tools.d.ts +3 -0
  88. package/dist/esm/mcp/tools/motion-sensors.tools.d.ts.map +1 -0
  89. package/dist/esm/mcp/tools/motion-sensors.tools.js +60 -0
  90. package/dist/esm/mcp/tools/motion-sensors.tools.js.map +1 -0
  91. package/dist/esm/mcp/tools/network-status.tools.d.ts +3 -0
  92. package/dist/esm/mcp/tools/network-status.tools.d.ts.map +1 -0
  93. package/dist/esm/mcp/tools/network-status.tools.js +16 -0
  94. package/dist/esm/mcp/tools/network-status.tools.js.map +1 -0
  95. package/dist/esm/mcp/tools/nfc.tools.d.ts +3 -0
  96. package/dist/esm/mcp/tools/nfc.tools.d.ts.map +1 -0
  97. package/dist/esm/mcp/tools/nfc.tools.js +52 -0
  98. package/dist/esm/mcp/tools/nfc.tools.js.map +1 -0
  99. package/dist/esm/mcp/tools/notifications.tools.d.ts +3 -0
  100. package/dist/esm/mcp/tools/notifications.tools.d.ts.map +1 -0
  101. package/dist/esm/mcp/tools/notifications.tools.js +30 -0
  102. package/dist/esm/mcp/tools/notifications.tools.js.map +1 -0
  103. package/dist/esm/mcp/tools/push-notifications.tools.d.ts +3 -0
  104. package/dist/esm/mcp/tools/push-notifications.tools.d.ts.map +1 -0
  105. package/dist/esm/mcp/tools/push-notifications.tools.js +43 -0
  106. package/dist/esm/mcp/tools/push-notifications.tools.js.map +1 -0
  107. package/dist/esm/mcp/tools/secure-storage.tools.d.ts +3 -0
  108. package/dist/esm/mcp/tools/secure-storage.tools.d.ts.map +1 -0
  109. package/dist/esm/mcp/tools/secure-storage.tools.js +31 -0
  110. package/dist/esm/mcp/tools/secure-storage.tools.js.map +1 -0
  111. package/dist/esm/mcp/tools/sftp.tools.d.ts +3 -0
  112. package/dist/esm/mcp/tools/sftp.tools.d.ts.map +1 -0
  113. package/dist/esm/mcp/tools/sftp.tools.js +41 -0
  114. package/dist/esm/mcp/tools/sftp.tools.js.map +1 -0
  115. package/dist/esm/mcp/tools/share.tools.d.ts +3 -0
  116. package/dist/esm/mcp/tools/share.tools.d.ts.map +1 -0
  117. package/dist/esm/mcp/tools/share.tools.js +18 -0
  118. package/dist/esm/mcp/tools/share.tools.js.map +1 -0
  119. package/dist/esm/mcp/tools/speech.tools.d.ts +3 -0
  120. package/dist/esm/mcp/tools/speech.tools.d.ts.map +1 -0
  121. package/dist/esm/mcp/tools/speech.tools.js +38 -0
  122. package/dist/esm/mcp/tools/speech.tools.js.map +1 -0
  123. package/dist/esm/mcp/tools/ssh.tools.d.ts +3 -0
  124. package/dist/esm/mcp/tools/ssh.tools.d.ts.map +1 -0
  125. package/dist/esm/mcp/tools/ssh.tools.js +41 -0
  126. package/dist/esm/mcp/tools/ssh.tools.js.map +1 -0
  127. package/dist/esm/mcp/tools/tcp.tools.d.ts +3 -0
  128. package/dist/esm/mcp/tools/tcp.tools.d.ts.map +1 -0
  129. package/dist/esm/mcp/tools/tcp.tools.js +47 -0
  130. package/dist/esm/mcp/tools/tcp.tools.js.map +1 -0
  131. package/dist/esm/mcp/tools/tts.tools.d.ts +3 -0
  132. package/dist/esm/mcp/tools/tts.tools.d.ts.map +1 -0
  133. package/dist/esm/mcp/tools/tts.tools.js +29 -0
  134. package/dist/esm/mcp/tools/tts.tools.js.map +1 -0
  135. package/dist/esm/mcp/tools/types.d.ts +18 -0
  136. package/dist/esm/mcp/tools/types.d.ts.map +1 -0
  137. package/dist/esm/mcp/tools/types.js +2 -0
  138. package/dist/esm/mcp/tools/types.js.map +1 -0
  139. package/dist/esm/mcp/tools/udp.tools.d.ts +3 -0
  140. package/dist/esm/mcp/tools/udp.tools.d.ts.map +1 -0
  141. package/dist/esm/mcp/tools/udp.tools.js +22 -0
  142. package/dist/esm/mcp/tools/udp.tools.js.map +1 -0
  143. package/dist/esm/mcp/tools/wol.tools.d.ts +3 -0
  144. package/dist/esm/mcp/tools/wol.tools.d.ts.map +1 -0
  145. package/dist/esm/mcp/tools/wol.tools.js +16 -0
  146. package/dist/esm/mcp/tools/wol.tools.js.map +1 -0
  147. package/dist/esm/mcp/transport/bridge-server-transport.d.ts +27 -0
  148. package/dist/esm/mcp/transport/bridge-server-transport.d.ts.map +1 -0
  149. package/dist/esm/mcp/transport/bridge-server-transport.js +72 -0
  150. package/dist/esm/mcp/transport/bridge-server-transport.js.map +1 -0
  151. package/dist/esm/mcp/transport/stomp-server-transport.d.ts +43 -0
  152. package/dist/esm/mcp/transport/stomp-server-transport.d.ts.map +1 -0
  153. package/dist/esm/mcp/transport/stomp-server-transport.js +128 -0
  154. package/dist/esm/mcp/transport/stomp-server-transport.js.map +1 -0
  155. package/dist/esm/mcp/transport/transport-manager.d.ts +38 -0
  156. package/dist/esm/mcp/transport/transport-manager.d.ts.map +1 -0
  157. package/dist/esm/mcp/transport/transport-manager.js +70 -0
  158. package/dist/esm/mcp/transport/transport-manager.js.map +1 -0
  159. package/dist/esm/plugin.d.ts +79 -0
  160. package/dist/esm/plugin.d.ts.map +1 -0
  161. package/dist/esm/plugin.js +81 -0
  162. package/dist/esm/plugin.js.map +1 -0
  163. package/dist/esm/services/bridge-protocol.d.ts +107 -0
  164. package/dist/esm/services/bridge-protocol.d.ts.map +1 -0
  165. package/dist/esm/services/bridge-protocol.js +6 -0
  166. package/dist/esm/services/bridge-protocol.js.map +1 -0
  167. package/nodejs-assets/nodejs-project/main.js +1971 -0
  168. package/nodejs-assets/nodejs-project/mcp-agent-tools.js +57 -0
  169. package/nodejs-assets/nodejs-project/mcp-bridge-client.js +98 -0
  170. package/nodejs-assets/nodejs-project/package-lock.json +3639 -0
  171. package/nodejs-assets/nodejs-project/package.json +18 -0
  172. package/package.json +80 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * MCP-to-AgentTool adapter.
3
+ *
4
+ * Converts MCP tool descriptors (from tools/list) into pi-agent-core AgentTool
5
+ * format so the on-device agent can call device MCP tools alongside its native
6
+ * file/git/code tools.
7
+ *
8
+ * The adapter wraps each MCP tool's JSON Schema inputSchema with TypeBox's
9
+ * Type.Unsafe() — this is a pass-through that satisfies pi-agent-core's
10
+ * TypeBox requirement while preserving the original JSON Schema for the LLM.
11
+ */
12
+
13
+ import { Type } from '@sinclair/typebox';
14
+
15
+ /**
16
+ * Build pi-agent-core AgentTool[] from MCP tool descriptors.
17
+ *
18
+ * @param {object} mcpClient - The MCP bridge client ({ callTool })
19
+ * @param {Array<{ name: string, description: string, inputSchema: object }>} mcpTools
20
+ * @returns {Array} AgentTool-compatible objects
21
+ */
22
+ export function buildMcpAgentTools(mcpClient, mcpTools) {
23
+ return mcpTools.map(tool => ({
24
+ name: tool.name,
25
+ label: tool.name.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
26
+ description: `[Device] ${tool.description}`,
27
+ parameters: Type.Unsafe(tool.inputSchema || { type: 'object', properties: {} }),
28
+ execute: async (_toolCallId, params) => {
29
+ try {
30
+ const result = await mcpClient.callTool(tool.name, params);
31
+
32
+ // MCP returns { content: [{ type: 'text', text: '...' }], isError?: boolean }
33
+ const text = result?.content
34
+ ?.filter(c => c.type === 'text')
35
+ .map(c => c.text)
36
+ .join('\n') || JSON.stringify(result);
37
+
38
+ if (result?.isError) {
39
+ return {
40
+ content: [{ type: 'text', text: `Error: ${text}` }],
41
+ details: { error: text },
42
+ };
43
+ }
44
+
45
+ return {
46
+ content: [{ type: 'text', text }],
47
+ details: result,
48
+ };
49
+ } catch (err) {
50
+ return {
51
+ content: [{ type: 'text', text: `MCP tool error: ${err.message}` }],
52
+ details: { error: err.message },
53
+ };
54
+ }
55
+ },
56
+ }));
57
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Lightweight MCP JSON-RPC client over the Capacitor-NodeJS bridge.
3
+ *
4
+ * This module runs in the Node.js worker and speaks the MCP protocol
5
+ * (JSON-RPC 2.0) to the WebView-side MCP server via bridge messages.
6
+ * It does NOT depend on @modelcontextprotocol/sdk — keeping the worker lean.
7
+ *
8
+ * Message format:
9
+ * Worker → WebView: { type: 'mcp.jsonrpc', payload: { jsonrpc:'2.0', id, method, params } }
10
+ * WebView → Worker: { type: 'mcp.jsonrpc.response', payload: { jsonrpc:'2.0', id, result/error } }
11
+ */
12
+
13
+ let requestId = 0;
14
+ const pendingRequests = new Map(); // id → { resolve, reject, timer }
15
+
16
+ const DEFAULT_TIMEOUT = 10_000; // 10 seconds per request
17
+
18
+ /**
19
+ * Initialize the MCP bridge client.
20
+ *
21
+ * @param {object} channel - The Capacitor-NodeJS bridge channel
22
+ * @returns {{ listTools, callTool, destroy }}
23
+ */
24
+ export function initMcpBridge(channel) {
25
+ // Listen for JSON-RPC responses from the WebView MCP server
26
+ channel.addListener('message', (event) => {
27
+ if (!event || event.type !== 'mcp.jsonrpc.response') return;
28
+
29
+ const msg = event.payload;
30
+ if (!msg || msg.id === undefined) return;
31
+
32
+ const pending = pendingRequests.get(msg.id);
33
+ if (!pending) return;
34
+
35
+ pendingRequests.delete(msg.id);
36
+ clearTimeout(pending.timer);
37
+
38
+ if (msg.error) {
39
+ pending.reject(new Error(msg.error.message || 'MCP RPC error'));
40
+ } else {
41
+ pending.resolve(msg.result);
42
+ }
43
+ });
44
+
45
+ /**
46
+ * Send a JSON-RPC request to the WebView MCP server.
47
+ * @param {string} method - e.g. 'tools/list', 'tools/call'
48
+ * @param {object} params
49
+ * @param {number} [timeout]
50
+ * @returns {Promise<any>}
51
+ */
52
+ function rpcCall(method, params, timeout = DEFAULT_TIMEOUT) {
53
+ const id = ++requestId;
54
+ return new Promise((resolve, reject) => {
55
+ const timer = setTimeout(() => {
56
+ pendingRequests.delete(id);
57
+ reject(new Error(`MCP RPC timeout: ${method} (${timeout}ms)`));
58
+ }, timeout);
59
+
60
+ pendingRequests.set(id, { resolve, reject, timer });
61
+
62
+ channel.send('message', {
63
+ type: 'mcp.jsonrpc',
64
+ payload: { jsonrpc: '2.0', id, method, params: params || {} },
65
+ });
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Discover available MCP tools from the WebView server.
71
+ * @returns {Promise<Array<{ name: string, description: string, inputSchema: object }>>}
72
+ */
73
+ async function listTools() {
74
+ const result = await rpcCall('tools/list', {});
75
+ return result.tools || [];
76
+ }
77
+
78
+ /**
79
+ * Call an MCP tool by name.
80
+ * @param {string} name - Tool name, e.g. 'ssh_exec', 'camera_take_photo'
81
+ * @param {object} args - Tool arguments matching the inputSchema
82
+ * @returns {Promise<{ content: Array<{ type: string, text: string }>, isError?: boolean }>}
83
+ */
84
+ async function callTool(name, args) {
85
+ return rpcCall('tools/call', { name, arguments: args || {} }, 120_000);
86
+ }
87
+
88
+ /** Clean up pending requests. */
89
+ function destroy() {
90
+ for (const [id, pending] of pendingRequests) {
91
+ clearTimeout(pending.timer);
92
+ pending.reject(new Error('MCP bridge destroyed'));
93
+ }
94
+ pendingRequests.clear();
95
+ }
96
+
97
+ return { listTools, callTool, destroy };
98
+ }