mobilecoder-mcp 1.0.4 β 2.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/.security.log +5 -0
- package/dist/agent.d.ts +15 -8
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +161 -61
- package/dist/agent.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +35 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.js +24 -21
- package/dist/index.js.map +1 -1
- package/dist/mcp-handler.d.ts.map +1 -1
- package/dist/mcp-handler.js +46 -6
- package/dist/mcp-handler.js.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +2 -5
- package/dist/security.js.map +1 -1
- package/dist/webrtc.d.ts +4 -10
- package/dist/webrtc.d.ts.map +1 -1
- package/dist/webrtc.js +96 -305
- package/dist/webrtc.js.map +1 -1
- package/package.json +23 -24
- package/src/agent.ts +178 -67
- package/src/cli.ts +35 -0
- package/src/types.d.ts +8 -0
- package/src/adapters/cli-adapter.ts +0 -73
- package/src/index.ts +0 -172
- package/src/mcp-handler.ts +0 -327
- package/src/security.ts +0 -345
- package/src/tool-detector.ts +0 -110
- package/src/webrtc.ts +0 -387
package/.security.log
CHANGED
|
@@ -46,3 +46,8 @@
|
|
|
46
46
|
{"timestamp":"2026-01-24T20:19:47.199Z","event":"mcp_server_started","details":{"timestamp":1769285987199},"severity":"low","pid":9716,"user":"unknown"}
|
|
47
47
|
{"timestamp":"2026-01-24T20:24:33.021Z","event":"mobile_device_connected","details":{"timestamp":1769286273021},"severity":"low","pid":9716,"user":"unknown"}
|
|
48
48
|
{"timestamp":"2026-01-24T23:11:46.753Z","event":"mcp_server_started","details":{"timestamp":1769296306753},"severity":"low","pid":17644,"user":"unknown"}
|
|
49
|
+
{"timestamp":"2026-01-25T06:14:25.194Z","event":"mcp_server_started","details":{"timestamp":1769321665193},"severity":"low","pid":1464,"user":"unknown"}
|
|
50
|
+
{"timestamp":"2026-01-25T06:49:16.008Z","event":"mcp_server_started","details":{"timestamp":1769323756008},"severity":"low","pid":19532,"user":"unknown"}
|
|
51
|
+
{"timestamp":"2026-02-02T22:30:02.241Z","event":"mcp_server_started","details":{"timestamp":1770071402240},"severity":"low","pid":12948,"user":"unknown"}
|
|
52
|
+
{"timestamp":"2026-02-02T22:33:52.400Z","event":"mcp_server_started","details":{"timestamp":1770071632399},"severity":"low","pid":7800,"user":"unknown"}
|
|
53
|
+
{"timestamp":"2026-02-03T19:10:22.296Z","event":"mcp_server_started","details":{"timestamp":1770145822295},"severity":"low","pid":7864,"user":"unknown"}
|
package/dist/agent.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
private
|
|
4
|
-
private
|
|
5
|
-
private
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
export declare class ZKRelayAgent {
|
|
2
|
+
private socket;
|
|
3
|
+
private ptyProcess;
|
|
4
|
+
private secretCode;
|
|
5
|
+
private roomId;
|
|
6
|
+
private encryptionKey;
|
|
7
|
+
private spinner;
|
|
8
|
+
constructor();
|
|
9
|
+
private setupSecurity;
|
|
10
|
+
private initPTY;
|
|
11
|
+
private connectToRelay;
|
|
12
|
+
private handleIncomingMessage;
|
|
13
|
+
private sendSecurePayload;
|
|
14
|
+
private sendEnvInfo;
|
|
15
|
+
private printBanner;
|
|
9
16
|
}
|
|
10
17
|
//# sourceMappingURL=agent.d.ts.map
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAWA,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAwC;;IASvD,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,cAAc;IA+DtB,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;CAYtB"}
|
package/dist/agent.js
CHANGED
|
@@ -1,75 +1,175 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { io } from 'socket.io-client';
|
|
2
|
+
import * as os from 'os';
|
|
3
|
+
import * as pty from 'node-pty';
|
|
4
|
+
import CryptoJS from 'crypto-js';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
// π¨ BURAYI KENDΔ° DOMAIN ADRESΔ°NLE DEΔΔ°ΕTΔ°R!
|
|
8
|
+
const RELAY_SERVER_URL = 'https://api.mobilecoder.xyz';
|
|
9
|
+
export class ZKRelayAgent {
|
|
10
|
+
socket;
|
|
11
|
+
ptyProcess;
|
|
12
|
+
secretCode;
|
|
13
|
+
roomId;
|
|
14
|
+
encryptionKey;
|
|
15
|
+
spinner = ora('Initializing Secure Tunnel...');
|
|
16
|
+
constructor() {
|
|
17
|
+
this.setupSecurity();
|
|
18
|
+
this.initPTY();
|
|
19
|
+
this.connectToRelay();
|
|
10
20
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
// 1. GΓΌvenlik KatmanΔ±: Kod Γret ve Anahtar TΓΌret
|
|
22
|
+
setupSecurity() {
|
|
23
|
+
// 6 Haneli rastgele kod (KullanΔ±cΔ±nΔ±n gΓΆreceΔi)
|
|
24
|
+
const randomNum = Math.floor(100000 + Math.random() * 900000);
|
|
25
|
+
this.secretCode = randomNum.toString();
|
|
26
|
+
// Oda ID'si: Kodun Hash'i (Sunucu sadece bunu gΓΆrΓΌr, kodu gΓΆremez)
|
|
27
|
+
this.roomId = CryptoJS.SHA256(this.secretCode).toString();
|
|
28
|
+
// Εifreleme AnahtarΔ±: Kodun kendisi (AES-256 iΓ§in kullanΔ±lacak)
|
|
29
|
+
this.encryptionKey = this.secretCode;
|
|
30
|
+
}
|
|
31
|
+
// 2. Terminal (PTY) BaΕlatma
|
|
32
|
+
initPTY() {
|
|
33
|
+
const shell = os.platform() === 'win32' ? 'powershell.exe' : (process.env.SHELL || 'bash');
|
|
34
|
+
this.ptyProcess = pty.spawn(shell, [], {
|
|
35
|
+
name: 'xterm-256color',
|
|
36
|
+
cols: 80,
|
|
37
|
+
rows: 24,
|
|
38
|
+
cwd: process.cwd(),
|
|
39
|
+
env: process.env
|
|
40
|
+
});
|
|
41
|
+
// Terminalden Γ§Δ±kan veriyi Εifrele ve yolla
|
|
42
|
+
this.ptyProcess.onData((data) => {
|
|
43
|
+
this.sendSecurePayload('term_data', data);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// 3. Relay Sunucusuna BaΔlanma
|
|
47
|
+
connectToRelay() {
|
|
48
|
+
this.spinner.start('Connecting to MobileCoder Relay Network...');
|
|
49
|
+
this.socket = io(RELAY_SERVER_URL, {
|
|
50
|
+
transports: ['websocket'], // HΔ±z iΓ§in sadece websocket
|
|
51
|
+
reconnection: true,
|
|
52
|
+
reconnectionAttempts: Infinity
|
|
53
|
+
});
|
|
54
|
+
this.socket.on('connect', () => {
|
|
55
|
+
this.spinner.succeed(chalk.green('Connected to Relay Node!'));
|
|
56
|
+
// Odaya KatΔ±l (Sadece Hash ID gΓΆnderilir)
|
|
57
|
+
this.socket.emit('join_room', { code: this.roomId, type: 'agent' });
|
|
58
|
+
// Note: Changed 'join_secure_room' to 'join_room' to match server implementation
|
|
59
|
+
// Server implementation in index.ts: socket.on('join_room', (data: { code: string; type: 'agent' | 'client' }) => ...)
|
|
60
|
+
this.printBanner();
|
|
61
|
+
});
|
|
62
|
+
this.socket.on('disconnect', () => {
|
|
63
|
+
this.spinner.warn(chalk.yellow('Connection lost. Reconnecting...'));
|
|
64
|
+
});
|
|
65
|
+
// Mobilden biri baΔlandΔ±ΔΔ±nda
|
|
66
|
+
this.socket.on('peer_joined', () => {
|
|
67
|
+
console.log(chalk.green('\nπ± Mobile Client Connected via Encrypted Tunnel!'));
|
|
68
|
+
this.sendEnvInfo();
|
|
18
69
|
});
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
70
|
+
// Mobilden Εifreli veri geldiΔinde
|
|
71
|
+
// RelayManager emits 'term_data' and 'meta_data'.
|
|
72
|
+
// Server implementation:
|
|
73
|
+
// socket.on('term_data', ...) -> pass through term_data
|
|
74
|
+
// socket.on('meta_data', ...) -> pass through meta_data
|
|
75
|
+
// Agent connects to /, Server index.ts uses / (global namespace) BUT has:
|
|
76
|
+
// const relayNamespace = io.of('/terminal');
|
|
77
|
+
// WAIT. Previous user setup had /terminal.
|
|
78
|
+
// My previous edit REMOVED /terminal and used RelayManager on root io.
|
|
79
|
+
// But RelayManager implementation listens on 'relay_data'.
|
|
80
|
+
// My RelayManager uses: socket.on('relay_data', ...)
|
|
81
|
+
// But user snippet provided for Agent uses 'relay_encrypted' and listens on 'stream_encrypted'.
|
|
82
|
+
// I need to align Agent and Server.
|
|
83
|
+
// The previous edit to server/index.ts instantiates RelayManager.
|
|
84
|
+
// RelayManager listens to 'relay_data'.
|
|
85
|
+
// So the Agent MUST emit 'relay_data'.
|
|
86
|
+
this.socket.on('relay_data', (message) => {
|
|
87
|
+
// RelayManager checks payload structure?
|
|
88
|
+
// Wait, RelayManager implementation:
|
|
89
|
+
// socket.on('relay_data', (data) => { ... socket.to(room).emit('relay_data', data.payload) ... })
|
|
90
|
+
// So client receives `payload`.
|
|
91
|
+
// If payload is encrypted string, handle it.
|
|
92
|
+
this.handleIncomingMessage(message);
|
|
26
93
|
});
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
this.webrtc.onMessage((message) => {
|
|
31
|
-
this.handleMessage(message);
|
|
94
|
+
// Also listen for connect_error
|
|
95
|
+
this.socket.on('connect_error', (err) => {
|
|
96
|
+
// console.error(err);
|
|
32
97
|
});
|
|
98
|
+
}
|
|
99
|
+
// Gelen veriyi Γ§ΓΆz ve iΕle
|
|
100
|
+
handleIncomingMessage(encryptedPayload) {
|
|
33
101
|
try {
|
|
34
|
-
|
|
102
|
+
// Payload might be wrapped { e: ... } or string
|
|
103
|
+
let ciphertext = encryptedPayload;
|
|
104
|
+
if (typeof encryptedPayload === 'object' && encryptedPayload.e) {
|
|
105
|
+
ciphertext = encryptedPayload.e;
|
|
106
|
+
}
|
|
107
|
+
const bytes = CryptoJS.AES.decrypt(ciphertext, this.encryptionKey);
|
|
108
|
+
const originalText = bytes.toString(CryptoJS.enc.Utf8);
|
|
109
|
+
if (!originalText)
|
|
110
|
+
return;
|
|
111
|
+
// Veri JSON mu? (Resize komutu vs olabilir)
|
|
112
|
+
try {
|
|
113
|
+
const cmd = JSON.parse(originalText);
|
|
114
|
+
if (cmd.type === 'resize') {
|
|
115
|
+
this.ptyProcess.resize(cmd.cols, cmd.rows);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (cmd.type === 'input') {
|
|
119
|
+
this.ptyProcess.write(cmd.data);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Fallback checks
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
// JSON deΔilse saf terminal girdisidir
|
|
126
|
+
this.ptyProcess.write(originalText);
|
|
127
|
+
}
|
|
35
128
|
}
|
|
36
129
|
catch (error) {
|
|
37
|
-
|
|
130
|
+
// Εifre Γ§ΓΆzΓΌlemezse (YanlΔ±Ε anahtar vb.) sessizce yut
|
|
38
131
|
}
|
|
39
132
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
type: 'system',
|
|
47
|
-
message: `Switched to ${this.activeTool}`
|
|
48
|
-
});
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
if (message.type === 'switch_ide') {
|
|
52
|
-
console.log(`π₯οΈ Target IDE switched to: ${message.ide}`);
|
|
53
|
-
this.webrtc.send({
|
|
54
|
-
type: 'system',
|
|
55
|
-
message: `Target IDE: ${message.ide}`
|
|
56
|
-
});
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
if (message.type === 'switch_model') {
|
|
60
|
-
console.log(`π€ AI Model preference: ${message.model}`);
|
|
61
|
-
this.webrtc.send({
|
|
62
|
-
type: 'system',
|
|
63
|
-
message: `Model: ${message.model}`
|
|
64
|
-
});
|
|
65
|
-
return;
|
|
133
|
+
// Veriyi Εifrele ve gΓΆnder
|
|
134
|
+
sendSecurePayload(type, data) {
|
|
135
|
+
let payloadStr = data;
|
|
136
|
+
if (type === 'meta') {
|
|
137
|
+
// Standardize format
|
|
138
|
+
payloadStr = JSON.stringify(data);
|
|
66
139
|
}
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
140
|
+
else if (type === 'term_data' && typeof data === 'string') {
|
|
141
|
+
// Wrap output in { type: 'output', data: ... } for client consistency if client expects JSON
|
|
142
|
+
// The Client handles { type: 'output' ... }
|
|
143
|
+
payloadStr = JSON.stringify({ type: 'output', data: data });
|
|
71
144
|
}
|
|
72
|
-
|
|
145
|
+
const encrypted = CryptoJS.AES.encrypt(payloadStr, this.encryptionKey).toString();
|
|
146
|
+
// RelayManager expects 'relay_data' event with { room, payload }
|
|
147
|
+
// It emits 'relay_data' with just payload to other peer.
|
|
148
|
+
this.socket.emit('relay_data', {
|
|
149
|
+
room: this.roomId,
|
|
150
|
+
payload: { e: encrypted }
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
sendEnvInfo() {
|
|
154
|
+
const info = {
|
|
155
|
+
type: 'host_info', // Changed to match client expectation
|
|
156
|
+
username: os.userInfo().username, // user -> username
|
|
157
|
+
hostname: os.hostname(), // host -> hostname
|
|
158
|
+
platform: os.platform(),
|
|
159
|
+
cwd: process.cwd()
|
|
160
|
+
};
|
|
161
|
+
this.sendSecurePayload('meta', info);
|
|
162
|
+
}
|
|
163
|
+
printBanner() {
|
|
164
|
+
console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.0 '));
|
|
165
|
+
console.log(chalk.gray('Secure, End-to-End Encrypted Terminal Bridge\n'));
|
|
166
|
+
console.log(chalk.yellow('ββββββββββββββββββββββββββββββββββββββββ'));
|
|
167
|
+
console.log(chalk.yellow('β π CONNECTION CODE (ENTER ON APP) β'));
|
|
168
|
+
console.log(chalk.yellow('β β'));
|
|
169
|
+
console.log(chalk.yellow(`β ${chalk.white.bold.bgBlack(` ${this.secretCode.slice(0, 3)} - ${this.secretCode.slice(3)} `)} β`));
|
|
170
|
+
console.log(chalk.yellow('β β'));
|
|
171
|
+
console.log(chalk.yellow('ββββββββββββββββββββββββββββββββββββββββ'));
|
|
172
|
+
console.log(chalk.cyan('\nWaiting for mobile connection...'));
|
|
73
173
|
}
|
|
74
174
|
}
|
|
75
175
|
//# sourceMappingURL=agent.js.map
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { ZKRelayAgent } from './agent.js';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const program = new Command();
|
|
6
|
+
program
|
|
7
|
+
.name('mobilecoder-mcp')
|
|
8
|
+
.description('MobileCoder Desktop Agent - ZK-Relay Edition')
|
|
9
|
+
.version('2.0.0');
|
|
10
|
+
program
|
|
11
|
+
.command('init')
|
|
12
|
+
.description('Start the secure relay agent')
|
|
13
|
+
.action(() => {
|
|
14
|
+
try {
|
|
15
|
+
new ZKRelayAgent();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(chalk.red('Fatal Error:'), error);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
// VarsayΔ±lan komut (argΓΌman girilmezse init Γ§alΔ±ΕsΔ±n)
|
|
23
|
+
if (!process.argv.slice(2).length) {
|
|
24
|
+
try {
|
|
25
|
+
new ZKRelayAgent();
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error(chalk.red('Fatal Error:'), error);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
program.parse(process.argv);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,OAAO;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,GAAG,EAAE;IACT,IAAI,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,sDAAsD;AACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,IAAI,CAAC;QACD,IAAI,YAAY,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;KAAM,CAAC;IACJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,10 +3,6 @@ import { Command } from 'commander';
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import * as os from 'os';
|
|
6
|
-
import * as crypto from 'crypto';
|
|
7
|
-
import { createRequire } from 'module';
|
|
8
|
-
const require = createRequire(import.meta.url);
|
|
9
|
-
const qrcode = require('qrcode-terminal');
|
|
10
6
|
import { UniversalAgent } from './agent.js';
|
|
11
7
|
import { WebRTCConnection } from './webrtc.js';
|
|
12
8
|
const program = new Command();
|
|
@@ -16,7 +12,7 @@ program
|
|
|
16
12
|
.version('1.0.0');
|
|
17
13
|
program
|
|
18
14
|
.command('init')
|
|
19
|
-
.description('Initialize connection
|
|
15
|
+
.description('Initialize connection and start the agent')
|
|
20
16
|
.option('-s, --signaling <url>', 'Signaling server URL', process.env.MCP_SIGNALING_URL || 'https://api.mobilecoder.xyz/api')
|
|
21
17
|
.option('--debug', 'Enable debug logging', false)
|
|
22
18
|
.action(async (options) => {
|
|
@@ -24,18 +20,24 @@ program
|
|
|
24
20
|
if (options.debug) {
|
|
25
21
|
console.log('π Debug mode enabled');
|
|
26
22
|
}
|
|
27
|
-
console.log('\n
|
|
28
|
-
console.log('
|
|
29
|
-
console.log(
|
|
30
|
-
console.log('
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
console.log('
|
|
23
|
+
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
|
|
24
|
+
console.log('β β');
|
|
25
|
+
console.log('β π± MobileCoderMCP β');
|
|
26
|
+
console.log('β β');
|
|
27
|
+
console.log('β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£');
|
|
28
|
+
console.log(`β β`);
|
|
29
|
+
console.log(`β π YOUR CONNECTION CODE: ${code} β`);
|
|
30
|
+
console.log(`β β`);
|
|
31
|
+
console.log('β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£');
|
|
32
|
+
console.log('β β');
|
|
33
|
+
console.log('β π² From your phone or another device: β');
|
|
34
|
+
console.log('β β');
|
|
35
|
+
console.log('β 1. Go to https://mobilecoder.xyz β');
|
|
36
|
+
console.log('β 2. Sign in with Google β');
|
|
37
|
+
console.log('β 3. Enter the code above β');
|
|
38
|
+
console.log('β β');
|
|
39
|
+
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
|
|
37
40
|
await autoConfigureIDEs(code, options.signaling);
|
|
38
|
-
console.log('\nπ Starting Universal Agent...');
|
|
39
41
|
const webrtc = new WebRTCConnection(code, options.signaling, options.debug);
|
|
40
42
|
const agent = new UniversalAgent(webrtc);
|
|
41
43
|
await agent.start();
|
|
@@ -52,9 +54,6 @@ program
|
|
|
52
54
|
console.log(' Use: mobilecoder-mcp start --code=YOUR_CODE');
|
|
53
55
|
process.exit(1);
|
|
54
56
|
}
|
|
55
|
-
console.log('π Starting Universal Agent...');
|
|
56
|
-
console.log(` Connection code: ${options.code}`);
|
|
57
|
-
console.log(` Signaling server: ${options.signaling}\n`);
|
|
58
57
|
const webrtc = new WebRTCConnection(options.code, options.signaling, options.debug);
|
|
59
58
|
const agent = new UniversalAgent(webrtc);
|
|
60
59
|
await agent.start();
|
|
@@ -83,7 +82,12 @@ program
|
|
|
83
82
|
});
|
|
84
83
|
program.parse();
|
|
85
84
|
function generateConnectionCode() {
|
|
86
|
-
|
|
85
|
+
const chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
|
|
86
|
+
let result = '';
|
|
87
|
+
for (let i = 0; i < 6; i++) {
|
|
88
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
87
91
|
}
|
|
88
92
|
async function autoConfigureIDEs(code, signalingUrl) {
|
|
89
93
|
const configs = {
|
|
@@ -128,7 +132,6 @@ async function configureIDE(configPath, ideName, code, signalingUrl) {
|
|
|
128
132
|
}
|
|
129
133
|
};
|
|
130
134
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
131
|
-
console.log(` β
${ideName.charAt(0).toUpperCase() + ideName.slice(1)} linked.`);
|
|
132
135
|
}
|
|
133
136
|
async function removeFromConfig(configPath, serverName) {
|
|
134
137
|
if (!fs.existsSync(configPath)) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-handler.d.ts","sourceRoot":"","sources":["../src/mcp-handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-handler.d.ts","sourceRoot":"","sources":["../src/mcp-handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwC/C,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiP5E"}
|
package/dist/mcp-handler.js
CHANGED
|
@@ -6,6 +6,24 @@ import * as fs from 'fs';
|
|
|
6
6
|
import * as path from 'path';
|
|
7
7
|
// Queue to store commands received from mobile
|
|
8
8
|
const commandQueue = [];
|
|
9
|
+
const ALLOWED_METHODS = {
|
|
10
|
+
'initialize': true,
|
|
11
|
+
'initialized': true,
|
|
12
|
+
'tools/list': true,
|
|
13
|
+
'tools/call': true,
|
|
14
|
+
'prompts/list': true,
|
|
15
|
+
'prompts/get': true,
|
|
16
|
+
'resources/list': true,
|
|
17
|
+
'resources/read': true,
|
|
18
|
+
'resources/subscribe': true,
|
|
19
|
+
'resources/unsubscribe': true,
|
|
20
|
+
'sampling/createMessage': true,
|
|
21
|
+
'logging/setLevel': true,
|
|
22
|
+
'completion/complete': true
|
|
23
|
+
};
|
|
24
|
+
function isMethodAllowed(method) {
|
|
25
|
+
return ALLOWED_METHODS[method] === true;
|
|
26
|
+
}
|
|
9
27
|
export async function setupMCPServer(webrtc) {
|
|
10
28
|
// Create MCP server
|
|
11
29
|
const server = new Server({
|
|
@@ -136,10 +154,37 @@ export async function setupMCPServer(webrtc) {
|
|
|
136
154
|
});
|
|
137
155
|
// Connect WebRTC listeners
|
|
138
156
|
webrtc.onConnect(() => {
|
|
139
|
-
console.log('π± [MCP] Mobile device connected');
|
|
140
157
|
securityLogger.log('mobile_device_connected', { timestamp: Date.now() }, 'low');
|
|
141
158
|
});
|
|
142
159
|
webrtc.onMessage(async (message) => {
|
|
160
|
+
// Detailed logging for debugging
|
|
161
|
+
if (message.type !== 'pong') {
|
|
162
|
+
console.log('βββββββββββββββββββββββββββββββββββββββ');
|
|
163
|
+
console.log(`π₯ [MCP] Incoming: ${message.type || message.method || 'unknown'}`);
|
|
164
|
+
if (message.id)
|
|
165
|
+
console.log(`ID: ${message.id}`);
|
|
166
|
+
if (webrtc.getDebug()) {
|
|
167
|
+
console.log('Full:', JSON.stringify(message, null, 2));
|
|
168
|
+
}
|
|
169
|
+
console.log('βββββββββββββββββββββββββββββββββββββββ');
|
|
170
|
+
}
|
|
171
|
+
// Handle MCP method calls (JSON-RPC)
|
|
172
|
+
if (message.method) {
|
|
173
|
+
if (!isMethodAllowed(message.method)) {
|
|
174
|
+
console.warn(`β οΈ [Security] Blocked method: ${message.method}`);
|
|
175
|
+
webrtc.send({
|
|
176
|
+
jsonrpc: "2.0",
|
|
177
|
+
id: message.id,
|
|
178
|
+
error: {
|
|
179
|
+
code: -32001,
|
|
180
|
+
message: "Command blocked for security reasons",
|
|
181
|
+
data: { blocked: message.method }
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
console.log(`β
[Security] Allowed method: ${message.method}`);
|
|
187
|
+
}
|
|
143
188
|
// Handle command queueing
|
|
144
189
|
if (message.type === 'command' && message.text) {
|
|
145
190
|
const sanitizedCommand = sanitizeInput(message.text);
|
|
@@ -164,13 +209,11 @@ export async function setupMCPServer(webrtc) {
|
|
|
164
209
|
});
|
|
165
210
|
return;
|
|
166
211
|
}
|
|
167
|
-
console.log(` [MCP] Queuing command: ${sanitizedCommand}`);
|
|
168
212
|
commandQueue.push(sanitizedCommand);
|
|
169
213
|
}
|
|
170
214
|
// Handle direct tool calls from mobile (for File Explorer)
|
|
171
215
|
if (message.type === 'tool_call') {
|
|
172
216
|
const { tool, data, id } = message;
|
|
173
|
-
console.log(`π οΈ [MCP] Tool call received: ${tool}`, data);
|
|
174
217
|
try {
|
|
175
218
|
let result;
|
|
176
219
|
if (tool === 'list_directory') {
|
|
@@ -191,7 +234,6 @@ export async function setupMCPServer(webrtc) {
|
|
|
191
234
|
});
|
|
192
235
|
}
|
|
193
236
|
catch (error) {
|
|
194
|
-
console.error(`β [MCP] Tool execution failed: ${error.message}`);
|
|
195
237
|
securityLogger.log('tool_execution_failed', { tool, error: error.message }, 'medium');
|
|
196
238
|
webrtc.send({
|
|
197
239
|
type: 'tool_result',
|
|
@@ -206,8 +248,6 @@ export async function setupMCPServer(webrtc) {
|
|
|
206
248
|
// Start MCP server with stdio transport
|
|
207
249
|
const transport = new StdioServerTransport();
|
|
208
250
|
await server.connect(transport);
|
|
209
|
-
console.log('β
MCP Server initialized (stdio transport)');
|
|
210
|
-
securityLogger.log('mcp_server_started', { timestamp: Date.now() }, 'low');
|
|
211
251
|
}
|
|
212
252
|
// Helper functions for file system operations
|
|
213
253
|
async function handleListDirectory(cwd, args, requestId) {
|