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,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
|
+
}
|