mobilecoder-mcp 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/webrtc.js CHANGED
@@ -1,116 +1,305 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.WebRTCConnection = void 0;
7
- const simple_peer_1 = __importDefault(require("simple-peer"));
8
- class WebRTCConnection {
1
+ import SimplePeer from 'simple-peer';
2
+ import { createRequire } from 'module';
3
+ import { createHash } from 'crypto';
4
+ const require = createRequire(import.meta.url);
5
+ // wrtc modülü Node.js ortamında WebRTC desteği sağlar
6
+ let wrtc;
7
+ try {
8
+ // Önce @roamhq/wrtc dene, sonra wrtc
9
+ wrtc = require('@roamhq/wrtc');
10
+ }
11
+ catch (e) {
12
+ try {
13
+ wrtc = require('wrtc');
14
+ }
15
+ catch (e2) {
16
+ console.warn('⚠️ wrtc module not available, WebRTC may not work in Node.js environment');
17
+ }
18
+ }
19
+ // Simple HMAC implementation for Node.js
20
+ function generateHMAC(data, secret) {
21
+ return createHash('sha256').update(data + secret).digest('hex');
22
+ }
23
+ // Validate SDP for security
24
+ function validateSDP(sdp) {
25
+ if (!sdp || typeof sdp !== 'string')
26
+ return false;
27
+ // Check for DTLS fingerprint (critical for encryption)
28
+ if (!sdp.includes('a=fingerprint:')) {
29
+ console.error('❌ [MCP] Invalid SDP: missing DTLS fingerprint');
30
+ return false;
31
+ }
32
+ // Check for DTLS setup
33
+ if (!sdp.includes('a=setup:')) {
34
+ console.error('❌ [MCP] Invalid SDP: missing DTLS setup');
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ export class WebRTCConnection {
9
40
  peer = null;
10
41
  code;
11
42
  signalingUrl;
43
+ isConnected = false;
44
+ pollingInterval;
12
45
  onMessageCallback;
13
46
  onConnectCallback;
14
47
  onDisconnectCallback;
15
- isConnected = false;
16
- pollingInterval;
17
- constructor(code, signalingUrl) {
48
+ debug;
49
+ hmacSecret;
50
+ cleanupInterval;
51
+ messageNonce = new Set();
52
+ constructor(code, signalingUrl, debug = false) {
18
53
  this.code = code;
19
54
  this.signalingUrl = signalingUrl;
55
+ this.debug = debug;
56
+ // Generate HMAC secret for this session
57
+ this.hmacSecret = createHash('sha256')
58
+ .update(code + Date.now() + Math.random())
59
+ .digest('hex');
60
+ // Start cleanup interval
61
+ this.startCleanup();
62
+ // Validate signaling URL
63
+ try {
64
+ const url = new URL(signalingUrl);
65
+ if (!url.protocol.startsWith('https') && url.hostname !== 'localhost' && url.hostname !== '127.0.0.1') {
66
+ console.warn('⚠️ [MCP] Warning: Signaling URL should use HTTPS in production');
67
+ }
68
+ }
69
+ catch (e) {
70
+ console.error('❌ [MCP] Invalid signaling URL:', signalingUrl);
71
+ }
72
+ }
73
+ startCleanup() {
74
+ this.cleanupInterval = setInterval(() => {
75
+ // Clean up old nonces (prevent memory leak)
76
+ if (this.messageNonce.size > 1000) {
77
+ this.messageNonce.clear();
78
+ }
79
+ }, 60000); // Every minute
80
+ }
81
+ async sendAnswerWithRetry(signal, attempts = 3) {
82
+ const timestamp = new Date().toLocaleTimeString();
83
+ const signalType = signal.type || (signal.candidate ? 'candidate' : 'answer');
84
+ // Use trickle endpoint for ICE candidates, standard answer endpoint for SDP answer
85
+ const endpoint = signal.candidate ? '/signaling/answer' : '/signaling/answer';
86
+ console.log(`[${timestamp}] 📤 [Desktop] Sending ${signalType} to server...`);
87
+ for (let i = 0; i < attempts; i++) {
88
+ try {
89
+ const response = await fetch(`${this.signalingUrl}${endpoint}`, {
90
+ method: 'POST',
91
+ headers: { 'Content-Type': 'application/json' },
92
+ body: JSON.stringify({ code: this.code, signal })
93
+ });
94
+ if (!response.ok) {
95
+ throw new Error(`Server returned ${response.status}`);
96
+ }
97
+ console.log(`[${timestamp}] ✅ [Desktop] ${signalType} sent. Waiting for P2P handshake...`);
98
+ return;
99
+ }
100
+ catch (error) {
101
+ console.error(`[${timestamp}] ❌ [Desktop] Failed to send ${signalType} (Attempt ${i + 1}/${attempts}):`, error);
102
+ if (i < attempts - 1) {
103
+ await new Promise(r => setTimeout(r, 1000)); // Wait 1s
104
+ }
105
+ }
106
+ }
107
+ console.error(`[${timestamp}] ❌ [Desktop] Failed to send ${signalType} after all attempts.`);
20
108
  }
21
109
  async connect() {
110
+ const timestamp = new Date().toLocaleTimeString();
111
+ console.log(`[${timestamp}] 📡 Connecting to signaling server: ${this.signalingUrl}`);
112
+ console.log(`[${timestamp}] 🔑 Using connection code: ${this.code}`);
22
113
  return new Promise((resolve, reject) => {
23
114
  try {
24
- // Desktop acts as answerer (not initiator)
25
- this.peer = new simple_peer_1.default({
26
- initiator: false,
27
- trickle: false,
28
- config: {
29
- iceServers: [
30
- { urls: 'stun:stun.l.google.com:19302' },
31
- { urls: 'stun:stun1.l.google.com:19302' }
32
- ]
33
- }
34
- });
35
- this.peer.on('signal', async (signal) => {
36
- // Send answer to signaling server
37
- try {
38
- await fetch(`${this.signalingUrl}/answer`, {
39
- method: 'POST',
40
- headers: { 'Content-Type': 'application/json' },
41
- body: JSON.stringify({ code: this.code, signal })
42
- });
43
- }
44
- catch (error) {
45
- console.error('Failed to send answer:', error);
46
- }
47
- });
48
- this.peer.on('connect', () => {
49
- console.log('✅ Connected to mobile device!');
50
- this.isConnected = true;
51
- if (this.onConnectCallback) {
52
- this.onConnectCallback();
53
- }
54
- resolve();
55
- });
56
- this.peer.on('data', (data) => {
57
- try {
58
- const message = JSON.parse(data.toString());
59
- if (this.onMessageCallback) {
60
- this.onMessageCallback(message);
61
- }
62
- }
63
- catch (error) {
64
- console.error('Failed to parse message:', error);
65
- }
66
- });
67
- this.peer.on('error', (error) => {
68
- console.error('WebRTC error:', error);
69
- this.isConnected = false;
70
- if (this.onDisconnectCallback) {
71
- this.onDisconnectCallback();
72
- }
73
- reject(error);
74
- });
75
- this.peer.on('close', () => {
76
- console.log('❌ Connection closed');
77
- this.isConnected = false;
78
- if (this.onDisconnectCallback) {
79
- this.onDisconnectCallback();
80
- }
115
+ if (!wrtc) {
116
+ console.warn(`[${timestamp}] ⚠️ WebRTC initialized without Node.js native support (wrtc). This might fail.`);
117
+ }
118
+ // Fetch dynamic ICE servers from signaling backend
119
+ fetch(`${this.signalingUrl}/signaling/ice-servers`)
120
+ .then(res => res.json())
121
+ .then((data) => {
122
+ const rtcConfig = {
123
+ iceServers: data.iceServers || [
124
+ { urls: "stun:stun.l.google.com:19302" }
125
+ ],
126
+ iceCandidatePoolSize: 10,
127
+ };
128
+ this.peer = new SimplePeer({
129
+ initiator: false,
130
+ trickle: true,
131
+ wrtc: wrtc,
132
+ config: rtcConfig
133
+ });
134
+ this.setupPeerListeners(resolve, reject);
135
+ })
136
+ .catch(err => {
137
+ console.error(`[${timestamp}] ❌ Failed to fetch ICE servers:`, err);
138
+ // Fallback to basic STUN
139
+ this.peer = new SimplePeer({
140
+ initiator: false,
141
+ trickle: true,
142
+ wrtc: wrtc,
143
+ config: { iceServers: [{ urls: "stun:stun.l.google.com:19302" }] }
144
+ });
145
+ this.setupPeerListeners(resolve, reject);
81
146
  });
147
+ console.log(`[${timestamp}] ⌛ Waiting for mobile device to initiate connection...`);
82
148
  // Start polling for offer from mobile
83
149
  this.startPollingForOffer();
84
150
  }
85
151
  catch (error) {
152
+ console.error(`[${timestamp}] ❌ Initialization error:`, error);
86
153
  reject(error);
87
154
  }
88
155
  });
89
156
  }
157
+ setupPeerListeners(resolve, reject) {
158
+ if (!this.peer)
159
+ return;
160
+ // Monitor ICE connection state
161
+ this.peer.on('iceConnectionStateChange', () => {
162
+ const state = this.peer._pc?.iceConnectionState;
163
+ const timestamp = new Date().toLocaleTimeString();
164
+ console.log(`[${timestamp}] 🔍 ICE Connection State: ${state}`);
165
+ if (state === 'connected' || state === 'completed') {
166
+ const pc = this.peer._pc;
167
+ if (pc) {
168
+ // Validate SDP for security
169
+ const remoteDescription = pc.remoteDescription;
170
+ if (remoteDescription && !validateSDP(remoteDescription.sdp)) {
171
+ console.error('❌ [MCP] Remote SDP validation failed');
172
+ this.disconnect();
173
+ return;
174
+ }
175
+ pc.getStats().then((stats) => {
176
+ let usingRelay = false;
177
+ stats.forEach((report) => {
178
+ if (report.type === 'candidate-pair' && report.selected) {
179
+ const localCandidate = stats.get(report.localCandidateId);
180
+ if (localCandidate && localCandidate.candidateType === 'relay')
181
+ usingRelay = true;
182
+ }
183
+ });
184
+ if (usingRelay)
185
+ console.log(`[${timestamp}] 🌐 TURN relay is being used (IP leak protected)`);
186
+ else
187
+ console.log(`[${timestamp}] ✅ Direct P2P connection established`);
188
+ });
189
+ }
190
+ }
191
+ else if (state === 'failed' || state === 'disconnected') {
192
+ console.error(`[${timestamp}] ❌ ICE connection failed: ${state}`);
193
+ this.isConnected = false;
194
+ }
195
+ });
196
+ this.peer.on('signal', async (signal) => {
197
+ const timestamp = new Date().toLocaleTimeString();
198
+ const signalType = signal.type || (signal.candidate ? 'candidate' : 'unknown');
199
+ console.log(`[${timestamp}] 📡 [Desktop] Signal generated: ${signalType}`);
200
+ // Validate SDP before sending
201
+ if (signal.sdp && !validateSDP(signal.sdp)) {
202
+ console.error('❌ [MCP] Local SDP validation failed, not sending signal');
203
+ return;
204
+ }
205
+ // Send answer and trickle ICE candidates
206
+ await this.sendAnswerWithRetry(signal);
207
+ });
208
+ this.peer.on('connect', () => {
209
+ const timestamp = new Date().toLocaleTimeString();
210
+ console.log(`\n[${timestamp}] ✨ [ONLINE] Connected to mobile device!`);
211
+ this.isConnected = true;
212
+ if (this.onConnectCallback)
213
+ this.onConnectCallback();
214
+ resolve();
215
+ });
216
+ this.peer.on('data', (data) => {
217
+ try {
218
+ const message = JSON.parse(data.toString());
219
+ this.handleIncomingMessage(message);
220
+ }
221
+ catch (e) {
222
+ // Silent fail for invalid JSON
223
+ }
224
+ });
225
+ this.peer.on('error', (err) => {
226
+ console.error('❌ WebRTC error:', err);
227
+ this.isConnected = false;
228
+ });
229
+ this.peer.on('close', () => {
230
+ console.log('❌ Connection closed');
231
+ this.isConnected = false;
232
+ });
233
+ }
234
+ handleIncomingMessage(message) {
235
+ // Validate message structure
236
+ if (!message || typeof message !== 'object') {
237
+ console.warn('⚠️ [MCP] Invalid message structure');
238
+ return;
239
+ }
240
+ // Check for nonce to prevent replay attacks
241
+ if (message.nonce) {
242
+ if (this.messageNonce.has(message.nonce)) {
243
+ console.warn('⚠️ [MCP] Duplicate message detected (replay attack)');
244
+ return;
245
+ }
246
+ this.messageNonce.add(message.nonce);
247
+ }
248
+ // Verify HMAC if present
249
+ if (message.hmac) {
250
+ const data = JSON.stringify({
251
+ type: message.type,
252
+ text: message.text,
253
+ command: message.command,
254
+ timestamp: message.timestamp,
255
+ nonce: message.nonce
256
+ });
257
+ const expectedHMAC = generateHMAC(data, this.hmacSecret);
258
+ if (message.hmac !== expectedHMAC) {
259
+ console.error('❌ [MCP] HMAC verification failed');
260
+ return;
261
+ }
262
+ }
263
+ if (this.onMessageCallback) {
264
+ this.onMessageCallback(message);
265
+ }
266
+ }
90
267
  async startPollingForOffer() {
268
+ let pollCount = 0;
91
269
  const poll = async () => {
92
270
  try {
93
- const response = await fetch(`${this.signalingUrl}/poll?code=${this.code}`);
271
+ // Stop if peer is connected or destroyed
272
+ if (this.peer && this.peer.connected) {
273
+ if (this.pollingInterval) {
274
+ clearInterval(this.pollingInterval);
275
+ this.pollingInterval = undefined;
276
+ }
277
+ return;
278
+ }
279
+ pollCount++;
280
+ const response = await fetch(`${this.signalingUrl}/signaling/poll?code=${this.code}`);
281
+ const timestamp = new Date().toLocaleTimeString();
94
282
  if (response.ok) {
95
283
  const data = await response.json();
96
284
  if (data.signal && this.peer) {
97
- // Received offer from mobile, signal the peer
285
+ console.log(`[${timestamp}] 📥 Received signal from mobile device, applying...`);
98
286
  this.peer.signal(data.signal);
99
- // Stop polling once we got the offer
100
- if (this.pollingInterval) {
101
- clearInterval(this.pollingInterval);
102
- }
287
+ // Don't clear interval, keep polling for trickle candidates
288
+ }
289
+ else if (this.debug && pollCount % 10 === 0) {
290
+ console.log(`[${timestamp}] ⌛ Still waiting for signals (Poll #${pollCount})...`);
103
291
  }
104
292
  }
105
293
  }
106
294
  catch (error) {
107
- // Silently handle polling errors
295
+ if (this.debug) {
296
+ console.error('❌ Error during polling:', error);
297
+ }
108
298
  }
109
299
  };
110
- // Poll every 2 seconds
111
- this.pollingInterval = setInterval(poll, 2000);
112
- // Initial poll
113
- await poll();
300
+ // Poll every 1.5 seconds
301
+ this.pollingInterval = setInterval(poll, 1500);
302
+ poll();
114
303
  }
115
304
  send(message) {
116
305
  if (this.peer && this.isConnected) {
@@ -138,15 +327,26 @@ class WebRTCConnection {
138
327
  if (this.pollingInterval) {
139
328
  clearInterval(this.pollingInterval);
140
329
  }
330
+ if (this.cleanupInterval) {
331
+ clearInterval(this.cleanupInterval);
332
+ }
141
333
  if (this.peer) {
334
+ this.peer.removeAllListeners();
142
335
  this.peer.destroy();
143
336
  this.peer = null;
144
337
  }
145
338
  this.isConnected = false;
339
+ this.messageNonce.clear();
340
+ }
341
+ // Cleanup method for proper resource disposal
342
+ destroy() {
343
+ this.disconnect();
344
+ this.onMessageCallback = undefined;
345
+ this.onConnectCallback = undefined;
346
+ this.onDisconnectCallback = undefined;
146
347
  }
147
348
  getConnected() {
148
349
  return this.isConnected;
149
350
  }
150
351
  }
151
- exports.WebRTCConnection = WebRTCConnection;
152
352
  //# sourceMappingURL=webrtc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webrtc.js","sourceRoot":"","sources":["../src/webrtc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webrtc.js","sourceRoot":"","sources":["../src/webrtc.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,35 +1,37 @@
1
- {
2
- "name": "mobilecoder-mcp",
3
- "version": "1.0.0",
4
- "description": "MCP server for MobileCoderMCP - enables mobile to desktop coding",
5
- "main": "dist/index.js",
6
- "bin": {
7
- "mobile-coder-mcp": "./dist/index.js"
8
- },
9
- "scripts": {
10
- "build": "tsc",
11
- "dev": "tsc --watch",
12
- "start": "node dist/index.js"
13
- },
14
- "keywords": [
15
- "mcp",
16
- "cursor",
17
- "windsurf",
18
- "mobile-coder"
19
- ],
20
- "author": "",
21
- "license": "MIT",
22
- "dependencies": {
23
- "@modelcontextprotocol/sdk": "^1.0.4",
24
- "commander": "^12.1.0",
25
- "qrcode-terminal": "^0.12.0",
26
- "simple-peer": "^9.11.1",
27
- "wrtc": "^0.4.7"
28
- },
29
- "devDependencies": {
30
- "@types/node": "^20.14.0",
31
- "@types/qrcode-terminal": "^0.12.2",
32
- "@types/simple-peer": "^9.11.8",
33
- "typescript": "^5.5.0"
34
- }
35
- }
1
+ {
2
+ "name": "mobilecoder-mcp",
3
+ "version": "1.0.2",
4
+ "type": "module",
5
+ "description": "MCP server for MobileCoderMCP - enables mobile to desktop coding",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "mobilecoder-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js"
14
+ },
15
+ "keywords": [
16
+ "mcp",
17
+ "cursor",
18
+ "windsurf",
19
+ "mobile-coder"
20
+ ],
21
+ "author": "",
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.25.2",
25
+ "@roamhq/wrtc": "^0.9.1",
26
+ "commander": "^12.1.0",
27
+ "qrcode-terminal": "^0.12.0",
28
+ "simple-peer": "^9.11.1",
29
+ "wrtc": "^0.4.7"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^20.14.0",
33
+ "@types/qrcode-terminal": "^0.12.2",
34
+ "@types/simple-peer": "^9.11.8",
35
+ "typescript": "^5.5.0"
36
+ }
37
+ }
package/src/agent.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { WebRTCConnection } from './webrtc';
2
- import { setupMCPServer } from './mcp-handler';
3
- import { CLIAdapter } from './adapters/cli-adapter';
1
+ import { WebRTCConnection } from './webrtc.js';
2
+ import { setupMCPServer } from './mcp-handler.js';
3
+ import { CLIAdapter } from './adapters/cli-adapter.js';
4
4
 
5
5
  export class UniversalAgent {
6
6
  private webrtc: WebRTCConnection;
@@ -60,6 +60,24 @@ export class UniversalAgent {
60
60
  return;
61
61
  }
62
62
 
63
+ if (message.type === 'switch_ide') {
64
+ console.log(`🖥️ Target IDE switched to: ${message.ide}`);
65
+ this.webrtc.send({
66
+ type: 'system',
67
+ message: `Target IDE: ${message.ide}`
68
+ });
69
+ return;
70
+ }
71
+
72
+ if (message.type === 'switch_model') {
73
+ console.log(`🤖 AI Model preference: ${message.model}`);
74
+ this.webrtc.send({
75
+ type: 'system',
76
+ message: `Model: ${message.model}`
77
+ });
78
+ return;
79
+ }
80
+
63
81
  if (message.type === 'cli_command') {
64
82
  const command = message.command;
65
83
  console.log(`💻 Received CLI command: ${command}`);