remote-access-mcp 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 (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/dist/cli/main.d.ts +2 -0
  4. package/dist/cli/main.d.ts.map +1 -0
  5. package/dist/cli/main.js +430 -0
  6. package/dist/cli/main.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +7 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/core/config.d.ts +17 -0
  12. package/dist/core/config.d.ts.map +1 -0
  13. package/dist/core/config.js +57 -0
  14. package/dist/core/config.js.map +1 -0
  15. package/dist/core/policy.d.ts +22 -0
  16. package/dist/core/policy.d.ts.map +1 -0
  17. package/dist/core/policy.js +66 -0
  18. package/dist/core/policy.js.map +1 -0
  19. package/dist/main.d.ts +3 -0
  20. package/dist/main.d.ts.map +1 -0
  21. package/dist/main.js +7 -0
  22. package/dist/main.js.map +1 -0
  23. package/dist/server/app.d.ts +7 -0
  24. package/dist/server/app.d.ts.map +1 -0
  25. package/dist/server/app.js +95 -0
  26. package/dist/server/app.js.map +1 -0
  27. package/dist/server/run.d.ts +2 -0
  28. package/dist/server/run.d.ts.map +1 -0
  29. package/dist/server/run.js +25 -0
  30. package/dist/server/run.js.map +1 -0
  31. package/dist/tools/filesystem.d.ts +5 -0
  32. package/dist/tools/filesystem.d.ts.map +1 -0
  33. package/dist/tools/filesystem.js +155 -0
  34. package/dist/tools/filesystem.js.map +1 -0
  35. package/dist/tools/git.d.ts +4 -0
  36. package/dist/tools/git.d.ts.map +1 -0
  37. package/dist/tools/git.js +33 -0
  38. package/dist/tools/git.js.map +1 -0
  39. package/dist/tools/http.d.ts +3 -0
  40. package/dist/tools/http.d.ts.map +1 -0
  41. package/dist/tools/http.js +70 -0
  42. package/dist/tools/http.js.map +1 -0
  43. package/dist/tools/index.d.ts +5 -0
  44. package/dist/tools/index.d.ts.map +1 -0
  45. package/dist/tools/index.js +17 -0
  46. package/dist/tools/index.js.map +1 -0
  47. package/dist/tools/policy.d.ts +4 -0
  48. package/dist/tools/policy.d.ts.map +1 -0
  49. package/dist/tools/policy.js +52 -0
  50. package/dist/tools/policy.js.map +1 -0
  51. package/dist/tools/shell.d.ts +4 -0
  52. package/dist/tools/shell.d.ts.map +1 -0
  53. package/dist/tools/shell.js +73 -0
  54. package/dist/tools/shell.js.map +1 -0
  55. package/dist/tools/sqlite.d.ts +4 -0
  56. package/dist/tools/sqlite.d.ts.map +1 -0
  57. package/dist/tools/sqlite.js +57 -0
  58. package/dist/tools/sqlite.js.map +1 -0
  59. package/dist/tools/system.d.ts +3 -0
  60. package/dist/tools/system.d.ts.map +1 -0
  61. package/dist/tools/system.js +56 -0
  62. package/dist/tools/system.js.map +1 -0
  63. package/install.sh +79 -0
  64. package/package.json +63 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ali Manzar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,141 @@
1
+ # remote-access-mcp
2
+
3
+ Turn any Linux server into an AI-agent-accessible machine via the [Model Context Protocol](https://modelcontextprotocol.io) (MCP).
4
+
5
+ ChatGPT (Developer Mode), Claude, Grok, and any MCP-compatible client connect over HTTPS and securely control your server: read/write files, run shell commands, inspect system state, query SQLite databases, work with git — all behind a single bearer token.
6
+
7
+ **Zero Python. Zero Docker. Just Node.js.**
8
+
9
+ ```bash
10
+ npm install -g remote-access-mcp
11
+ ramcp init
12
+ ```
13
+
14
+ ## Why
15
+
16
+ AI assistants are great, but they're sandboxed away from your infrastructure. This gateway flips that: your chatbot *becomes* the ops engineer. "Check why the disk is filling up on the server" or "deploy the new branch and tail the logs" become actual conversations.
17
+
18
+ The server binds to `127.0.0.1` only. You put it behind nginx/Caddy (with Cloudflare or any TLS edge in front) and expose exactly one HTTPS endpoint to the world. Every request must carry your token — either as `Authorization: Bearer <token>` header or embedded in the URL path (`/<token>/mcp`) for clients like ChatGPT's custom connectors that can't set custom headers.
19
+
20
+ ## Install
21
+
22
+ ### One-liner (any Ubuntu/Debian server)
23
+
24
+ ```bash
25
+ curl -fsSL https://raw.githubusercontent.com/amiralimanzar/remote-access-mcp/main/install.sh | bash
26
+ ```
27
+
28
+ Installs Node.js (if missing) via NodeSource, then the package globally. Then run:
29
+
30
+ ```bash
31
+ ramcp init
32
+ ```
33
+
34
+ ### Manual
35
+
36
+ ```bash
37
+ npm install -g remote-access-mcp
38
+ ramcp init
39
+ ```
40
+
41
+ ## Quick start
42
+
43
+ ```bash
44
+ $ ramcp init
45
+
46
+ ___ _____
47
+ | _ \__ _ __ _ ___ _ _ |_ _|__ _ _ _ __ _ ___
48
+ | / _` / _` / -_) '_| | |/ - \ '_| '_/ _` / -_)
49
+ |_|_\__,_\__, \___|_| |_|\___/_| |_| \__,_\___|
50
+ |___/ remote-access-mcp v1.0.0
51
+
52
+ ✔ Config written to /root/.config/remote-access-mcp/config.json
53
+ ✔ Token generated: 6kX9mQ... (stored in config, never shown again in full)
54
+ ✔ Test the server: ramcp start --dry-run
55
+
56
+ Next steps:
57
+ 1. ramcp start # run in foreground
58
+ 2. ramcp service install # systemd unit + nginx vhost (recommended)
59
+ 3. ramcp url # show the connector URL for your chatbot
60
+ ```
61
+
62
+ ## Commands
63
+
64
+ | Command | Description |
65
+ |---|---|
66
+ | `ramcp init` | Generate config + token. Safe to re-run. |
67
+ | `ramcp start` | Run the gateway in the foreground. |
68
+ | `ramcp url` | Print the MCP endpoint URL for chatbot connectors. |
69
+ | `ramcp token rotate` | Generate a new token (old one stops working immediately). |
70
+ | `ramcp policy` | Show which paths the AI may access. |
71
+ | `ramcp policy allow <path>` | Allow the AI access to a directory. |
72
+ | `ramcp policy deny <path>` | Revoke access to a directory. |
73
+ | `ramcp policy shell on/off` | Enable/disable shell command execution. |
74
+ | `ramcp service install` | Install systemd service + nginx reverse-proxy vhost. |
75
+ | `ramcp service uninstall` | Remove service + nginx vhost. |
76
+ | `ramcp status` | Check if the service is running. |
77
+
78
+ ## Connecting your chatbot
79
+
80
+ ### ChatGPT (Developer Mode → Connectors)
81
+
82
+ Use the URL form (ChatGPT can't set custom headers):
83
+
84
+ ```
85
+ https://your-domain.com/<token>/mcp
86
+ ```
87
+
88
+ Get it ready-made:
89
+
90
+ ```bash
91
+ $ ramcp url
92
+ https://mcp.example.com/6kX9mQf2.../mcp
93
+ ```
94
+
95
+ ### Claude / any MCP client with header support
96
+
97
+ Endpoint: `https://your-domain.com/mcp`
98
+ Header: `Authorization: Bearer <token>`
99
+
100
+ ## Tools exposed
101
+
102
+ **Filesystem** (7) — `list_directory`, `read_file`, `write_file`, `edit_file`, `delete_path`, `search_code`, `file_info`
103
+
104
+ **Shell** (3) — `run_command`, `process_list`, `kill_process`
105
+
106
+ **System** (3) — `system_info`, `disk_usage`, `network_interfaces`
107
+
108
+ **HTTP** (2) — `http_request`, `port_check`
109
+
110
+ **Git** (1) — `git` (status, diff, log, add, commit, push, pull…)
111
+
112
+ **SQLite** (2) — `sqlite_query`, `sqlite_schema`
113
+
114
+ **Policy** (4) — `list_allowed_paths`, `allow_path`, `deny_path`, `shell_enabled`
115
+
116
+ Filesystem tools are sandboxed by an allow/deny policy (`ramcp policy`). By default nothing is allowed — you decide what the AI can touch. Shell is off by default too.
117
+
118
+ ## Security model
119
+
120
+ - **Bind-local only.** The gateway listens on `127.0.0.1:8765` — unreachable from the network directly.
121
+ - **Token auth on every request.** Two forms supported: bearer header or URL path.
122
+ - **Path policy engine.** Filesystem tools resolve symlinks and normalize `..` traversal before checking allow/deny lists. Deny always wins.
123
+ - **Shell behind a flag.** Off until you explicitly turn it on.
124
+ - **No secrets in logs.** The token is never printed to stdout in full after generation.
125
+
126
+ You are expected to put TLS in front (nginx + Let's Encrypt, or your CDN edge). The gateway itself speaks plain HTTP on loopback — same pattern as phpMyAdmin, Redis, and every other loopback service.
127
+
128
+ ## FAQ
129
+
130
+ **Is exposing a shell to an AI safe?**
131
+ It's exposing a shell to *you*, via the AI as the interface. The token gates everything; shell is opt-in; filesystem is policy-sandboxed. If you wouldn't give an intern SSH access, don't give them this token.
132
+
133
+ **Why stateless mode?**
134
+ Each request creates a fresh MCP transport. No session state to corrupt, trivially horizontal-scalable, and it's what ChatGPT's connector flow works best with.
135
+
136
+ **Does it run as root?**
137
+ It can, and on a dedicated server that's often simplest — the tools need broad access to be useful. The policy engine is the guardrail, not the UID.
138
+
139
+ ## License
140
+
141
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,2 @@
1
+ export declare function main(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAwXA,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxD"}
@@ -0,0 +1,430 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { loadConfig, saveConfig, generateToken, configPath, } from '../core/config.js';
4
+ const PKG = { name: 'remote-access-mcp', version: '1.0.0' };
5
+ // ---------------------------------------------------------------------------
6
+ // help text
7
+ // ---------------------------------------------------------------------------
8
+ const HELP = `${PKG.name} v${PKG.version} — turn any Linux server into an AI-agent-accessible machine
9
+
10
+ Usage:
11
+ ramcp <command> [options]
12
+
13
+ Commands:
14
+ init Generate config + token (safe to re-run)
15
+ start [--host H] [--port P] Run the gateway in the foreground
16
+ url Print the MCP connector URL for chatbots
17
+ status Check whether the systemd service is running
18
+ token rotate Generate a new token (old one dies instantly)
19
+ token show [--full] Show the current token (masked unless --full)
20
+ policy Show the path policy + shell flag
21
+ policy allow <path> Allow the AI access to a directory
22
+ policy deny <path> Deny a directory (removes it from allowed)
23
+ policy shell on|off Enable or disable shell execution
24
+ service install Install systemd unit + nginx vhost
25
+ service uninstall Remove systemd unit + nginx vhost
26
+ service logs [-f] Tail gateway logs (journalctl wrapper)
27
+ version Print version
28
+
29
+ Options:
30
+ -h, --help Show this help
31
+ `;
32
+ function parseArgs(argv) {
33
+ const [command = '', ...rest] = argv;
34
+ const sub = [];
35
+ const flags = new Set();
36
+ const values = new Map();
37
+ for (let i = 0; i < rest.length; i++) {
38
+ const a = rest[i];
39
+ if (a.startsWith('--')) {
40
+ const key = a.slice(2);
41
+ const next = rest[i + 1];
42
+ if (next !== undefined && !next.startsWith('-')) {
43
+ values.set(key, next);
44
+ i++;
45
+ }
46
+ else {
47
+ flags.add(key);
48
+ }
49
+ }
50
+ else if (a.startsWith('-') && a.length > 1) {
51
+ for (const c of a.slice(1))
52
+ flags.add(c);
53
+ }
54
+ else {
55
+ sub.push(a);
56
+ }
57
+ }
58
+ return { command, sub, flags, values };
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // init
62
+ // ---------------------------------------------------------------------------
63
+ function cmdInit() {
64
+ const existing = fs.existsSync(configPath());
65
+ let cfg;
66
+ if (existing) {
67
+ cfg = loadConfig();
68
+ if (!cfg.token)
69
+ cfg.token = generateToken();
70
+ }
71
+ else {
72
+ cfg = {
73
+ ...loadConfig(),
74
+ token: generateToken(),
75
+ };
76
+ }
77
+ saveConfig(cfg);
78
+ const masked = cfg.token.slice(0, 6) + '…' + cfg.token.slice(-4);
79
+ console.log(`
80
+ ___ _____
81
+ | _ \\__ _ __ _ ___ _ _ |_ _|__ _ _ _ __ _ ___
82
+ | / _\` / _\` / -_) '_| | |/ - \\ '_| '_/ _\` / -_)
83
+ |_|_\\__,_\\__, \\___|_| |_|\\___/_| |_| \\__,_\\___|
84
+ |___/ ${PKG.name} v${PKG.version}
85
+
86
+ ${existing ? '✔ Existing config found — token kept' : '✔ Config written to ' + configPath()}
87
+ ✔ Token: ${masked} (full: ramcp token show --full)
88
+ ✔ Config: ${configPath()}
89
+
90
+ Next steps:
91
+ 1. ramcp start # run in foreground
92
+ 2. ramcp service install # systemd + nginx (production)
93
+ 3. ramcp policy allow /srv/myapp # let the AI touch your project
94
+ 4. ramcp url # connector URL for your chatbot
95
+ `);
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // start
99
+ // ---------------------------------------------------------------------------
100
+ async function cmdStart(args) {
101
+ const cfg = loadConfig();
102
+ if (args.values.has('host'))
103
+ cfg.host = args.values.get('host');
104
+ if (args.values.has('port'))
105
+ cfg.port = parseInt(args.values.get('port'), 10);
106
+ if (!cfg.token) {
107
+ console.error('No token. Run `ramcp init` first.');
108
+ process.exit(1);
109
+ }
110
+ const { runServer } = await import('../server/run.js');
111
+ await runServer();
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // url
115
+ // ---------------------------------------------------------------------------
116
+ function cmdUrl() {
117
+ const cfg = loadConfig();
118
+ if (!cfg.token) {
119
+ console.error('No token. Run `ramcp init` first.');
120
+ process.exit(1);
121
+ }
122
+ const host = cfg.public_host || `${cfg.host}:${cfg.port}`;
123
+ const scheme = cfg.public_host ? 'https' : 'http';
124
+ console.log(`${scheme}://${host}/${cfg.token}${cfg.mcp_path}`);
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // token
128
+ // ---------------------------------------------------------------------------
129
+ function cmdToken(args) {
130
+ const sub = args.sub[0];
131
+ const cfg = loadConfig();
132
+ if (sub === 'rotate') {
133
+ const fresh = generateToken();
134
+ cfg.token = fresh;
135
+ saveConfig(cfg);
136
+ console.log(`New token: ${fresh}`);
137
+ console.log('Old token is dead. Update your chatbot connector now.');
138
+ if (isSystemdInstalled()) {
139
+ console.log('Restart the service to apply: systemctl restart remote-access-mcp');
140
+ }
141
+ }
142
+ else if (sub === 'show') {
143
+ if (!cfg.token) {
144
+ console.error('No token. Run `ramcp init` first.');
145
+ process.exit(1);
146
+ }
147
+ if (args.flags.has('full'))
148
+ console.log(cfg.token);
149
+ else
150
+ console.log(cfg.token.slice(0, 6) + '…' + cfg.token.slice(-4) + ' (use --full for the complete token)');
151
+ }
152
+ else {
153
+ console.log('Usage: ramcp token <rotate|show [--full]>');
154
+ process.exit(1);
155
+ }
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // policy
159
+ // ---------------------------------------------------------------------------
160
+ function cmdPolicy(args) {
161
+ const cfg = loadConfig();
162
+ const sub = args.sub[0] || '';
163
+ const { resolveReal } = require('../core/policy.js');
164
+ if (sub === 'allow' && args.sub[1]) {
165
+ const real = resolveReal(args.sub[1]);
166
+ if (!cfg.allowed_paths.includes(real))
167
+ cfg.allowed_paths.push(real);
168
+ saveConfig(cfg);
169
+ console.log(`Allowed: ${real}`);
170
+ reloadService();
171
+ }
172
+ else if (sub === 'deny' && args.sub[1]) {
173
+ const real = resolveReal(args.sub[1]);
174
+ cfg.allowed_paths = cfg.allowed_paths.filter((p) => p !== real);
175
+ if (!cfg.denied_paths.includes(real))
176
+ cfg.denied_paths.push(real);
177
+ saveConfig(cfg);
178
+ console.log(`Denied: ${real}`);
179
+ reloadService();
180
+ }
181
+ else if (sub === 'shell' && args.sub[1]) {
182
+ const flag = args.sub[1].toLowerCase();
183
+ if (flag !== 'on' && flag !== 'off') {
184
+ console.error('Usage: ramcp policy shell on|off');
185
+ process.exit(1);
186
+ }
187
+ cfg.shell_enabled = flag === 'on';
188
+ saveConfig(cfg);
189
+ console.log(`Shell execution ${cfg.shell_enabled ? 'enabled' : 'disabled'}`);
190
+ reloadService();
191
+ }
192
+ else {
193
+ console.log(`allowed: ${cfg.allowed_paths.length ? '\n ' + cfg.allowed_paths.join('\n ') : '(none)'}`);
194
+ console.log(`denied: ${cfg.denied_paths.length ? '\n ' + cfg.denied_paths.join('\n ') : '(none)'}`);
195
+ console.log(`shell: ${cfg.shell_enabled ? 'enabled' : 'disabled'}`);
196
+ }
197
+ }
198
+ // ---------------------------------------------------------------------------
199
+ // service
200
+ // ---------------------------------------------------------------------------
201
+ const SERVICE_NAME = 'remote-access-mcp';
202
+ const SERVICE_FILE = `/etc/systemd/system/${SERVICE_NAME}.service`;
203
+ function isSystemdInstalled() {
204
+ return fs.existsSync(SERVICE_FILE);
205
+ }
206
+ function serviceRunning() {
207
+ try {
208
+ const out = fs.readFileSync(`/proc/self/cgroup`, 'utf8');
209
+ return false; // placeholder, real check below via systemctl
210
+ }
211
+ catch {
212
+ return false;
213
+ }
214
+ }
215
+ function reloadService() {
216
+ if (isSystemdInstalled()) {
217
+ const { execFileSync } = require('node:child_process');
218
+ try {
219
+ execFileSync('systemctl', ['restart', SERVICE_NAME], { stdio: 'ignore' });
220
+ console.log('Service restarted to apply changes.');
221
+ }
222
+ catch {
223
+ console.log('Note: service did not restart (not root?). Reboot or restart manually.');
224
+ }
225
+ }
226
+ }
227
+ function cmdService(args) {
228
+ const sub = args.sub[0] || '';
229
+ if (sub === 'install') {
230
+ installService(args);
231
+ }
232
+ else if (sub === 'uninstall') {
233
+ uninstallService();
234
+ }
235
+ else if (sub === 'logs') {
236
+ const { execFileSync } = require('node:child_process');
237
+ const flags = args.flags.has('f') || args.flags.has('follow') ? ['-f'] : [];
238
+ try {
239
+ execFileSync('journalctl', ['-u', SERVICE_NAME, '-n', '100', ...flags], { stdio: 'inherit' });
240
+ }
241
+ catch (e) {
242
+ console.error(e.message);
243
+ process.exit(1);
244
+ }
245
+ }
246
+ else if (sub === 'status') {
247
+ cmdStatus();
248
+ }
249
+ else {
250
+ console.log('Usage: ramcp service <install|uninstall|logs [-f]|status>');
251
+ process.exit(1);
252
+ }
253
+ }
254
+ function installService(args) {
255
+ if (process.getuid?.() !== 0) {
256
+ console.error('service install requires root (sudo).');
257
+ process.exit(1);
258
+ }
259
+ const domain = args.values.get('domain') || '';
260
+ const cfg = loadConfig();
261
+ const nodeBin = process.execPath;
262
+ const pkgRoot = path.resolve(path.dirname(require.main?.filename || __filename), '..');
263
+ const unit = `[Unit]
264
+ Description=Remote Access MCP Gateway
265
+ After=network.target
266
+
267
+ [Service]
268
+ Type=simple
269
+ ExecStart=${nodeBin} ${pkgRoot}/dist/server/run.js
270
+ Restart=on-failure
271
+ RestartSec=5
272
+ Environment=NODE_ENV=production
273
+
274
+ [Install]
275
+ WantedBy=multi-user.target
276
+ `;
277
+ fs.writeFileSync(SERVICE_FILE, unit);
278
+ const { execFileSync } = require('node:child_process');
279
+ execFileSync('systemctl', ['daemon-reload']);
280
+ execFileSync('systemctl', ['enable', '--now', SERVICE_NAME]);
281
+ console.log(`✔ systemd service installed and started: ${SERVICE_NAME}`);
282
+ if (domain) {
283
+ const nginxFile = `/etc/nginx/sites-available/${domain}`;
284
+ const vhost = `server {
285
+ listen 80;
286
+ listen [::]:80;
287
+ server_name ${domain};
288
+
289
+ # TLS terminates upstream (Cloudflare/CDN or your own LB).
290
+ location / {
291
+ proxy_pass http://${cfg.host}:${cfg.port};
292
+ proxy_http_version 1.1;
293
+ proxy_set_header Host $host;
294
+ proxy_set_header X-Real-IP $remote_addr;
295
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
296
+ proxy_set_header X-Forwarded-Proto $scheme;
297
+
298
+ # SSE / streaming support — critical for MCP Streamable HTTP
299
+ proxy_buffering off;
300
+ proxy_read_timeout 300s;
301
+ proxy_send_timeout 300s;
302
+ client_max_body_size 64m;
303
+ }
304
+
305
+ access_log /var/log/nginx/${domain}.access.log;
306
+ error_log /var/log/nginx/${domain}.error.log;
307
+ }
308
+ `;
309
+ fs.writeFileSync(nginxFile, vhost);
310
+ const link = `/etc/nginx/sites-enabled/${domain}`;
311
+ if (!fs.existsSync(link))
312
+ fs.symlinkSync(nginxFile, link);
313
+ try {
314
+ execFileSync('nginx', ['-t']);
315
+ execFileSync('systemctl', ['reload', 'nginx']);
316
+ console.log(`✔ nginx vhost installed: ${domain} → 127.0.0.1:${cfg.port}`);
317
+ }
318
+ catch (e) {
319
+ console.error(`nginx config test failed:\n${e.stdout || e.message}`);
320
+ process.exit(1);
321
+ }
322
+ }
323
+ else {
324
+ console.log('Note: pass --domain mcp.example.com to also install the nginx vhost.');
325
+ }
326
+ }
327
+ function uninstallService() {
328
+ if (process.getuid?.() !== 0) {
329
+ console.error('service uninstall requires root (sudo).');
330
+ process.exit(1);
331
+ }
332
+ const { execFileSync } = require('node:child_process');
333
+ const { existsSync, readFileSync } = fs;
334
+ if (existsSync(SERVICE_FILE)) {
335
+ try {
336
+ execFileSync('systemctl', ['disable', '--now', SERVICE_NAME]);
337
+ }
338
+ catch { /* not running */ }
339
+ fs.unlinkSync(SERVICE_FILE);
340
+ execFileSync('systemctl', ['daemon-reload']);
341
+ console.log(`✔ systemd service removed`);
342
+ }
343
+ else {
344
+ console.log('Service not installed.');
345
+ }
346
+ // remove any nginx vhost that points at us
347
+ const sitesDir = '/etc/nginx/sites-enabled';
348
+ if (existsSync(sitesDir)) {
349
+ for (const f of fs.readdirSync(sitesDir)) {
350
+ try {
351
+ const content = readFileSync(path.join(sitesDir, f), 'utf8');
352
+ if (content.includes(`proxy_pass http://127.0.0.1:${loadConfig().port}`)) {
353
+ fs.unlinkSync(path.join(sitesDir, f));
354
+ console.log(`✔ nginx vhost removed: ${f}`);
355
+ }
356
+ }
357
+ catch { /* skip unreadable */ }
358
+ }
359
+ try {
360
+ execFileSync('nginx', ['-t']);
361
+ execFileSync('systemctl', ['reload', 'nginx']);
362
+ }
363
+ catch { /* nginx may be absent */ }
364
+ }
365
+ }
366
+ // ---------------------------------------------------------------------------
367
+ // status
368
+ // ---------------------------------------------------------------------------
369
+ function cmdStatus() {
370
+ const { execFileSync } = require('node:child_process');
371
+ const installed = isSystemdInstalled();
372
+ console.log(`service installed: ${installed ? 'yes' : 'no'}`);
373
+ if (installed) {
374
+ try {
375
+ const out = execFileSync('systemctl', ['is-active', SERVICE_NAME], { encoding: 'utf8' }).trim();
376
+ console.log(`service status: ${out}`);
377
+ }
378
+ catch (e) {
379
+ console.log(`service status: ${e.stdout?.toString().trim() || 'unknown'}`);
380
+ }
381
+ }
382
+ const cfg = loadConfig();
383
+ console.log(`listen: ${cfg.host}:${cfg.port}`);
384
+ console.log(`token: ${cfg.token ? cfg.token.slice(0, 6) + '…' : '(none — run ramcp init)'}`);
385
+ }
386
+ // ---------------------------------------------------------------------------
387
+ // main
388
+ // ---------------------------------------------------------------------------
389
+ export async function main(argv) {
390
+ const args = parseArgs(argv);
391
+ if (args.flags.has('h') || args.flags.has('help')) {
392
+ console.log(HELP);
393
+ process.exit(0);
394
+ }
395
+ switch (args.command) {
396
+ case 'init':
397
+ cmdInit();
398
+ break;
399
+ case 'start':
400
+ await cmdStart(args);
401
+ break;
402
+ case 'url':
403
+ cmdUrl();
404
+ break;
405
+ case 'token':
406
+ cmdToken(args);
407
+ break;
408
+ case 'policy':
409
+ cmdPolicy(args);
410
+ break;
411
+ case 'service':
412
+ cmdService(args);
413
+ break;
414
+ case 'status':
415
+ cmdStatus();
416
+ break;
417
+ case 'version':
418
+ console.log(PKG.version);
419
+ break;
420
+ case '':
421
+ console.log(HELP);
422
+ process.exit(0);
423
+ break;
424
+ default:
425
+ console.error(`Unknown command: ${args.command}\n`);
426
+ console.log(HELP);
427
+ process.exit(1);
428
+ }
429
+ }
430
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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,7 @@
1
+ #!/usr/bin/env node
2
+ import { main } from './cli/main.js';
3
+ main(process.argv.slice(2)).catch((e) => {
4
+ console.error(e);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface RamcpConfig {
2
+ token: string;
3
+ host: string;
4
+ port: number;
5
+ public_host: string;
6
+ mcp_path: string;
7
+ shell_enabled: boolean;
8
+ allowed_paths: string[];
9
+ denied_paths: string[];
10
+ }
11
+ export declare function configDir(): string;
12
+ export declare function configPath(): string;
13
+ export declare function loadConfig(): RamcpConfig;
14
+ export declare function saveConfig(cfg: RamcpConfig): void;
15
+ export declare function generateToken(): string;
16
+ export declare function requireToken(cfg: RamcpConfig): string;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAKD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AASD,wBAAgB,UAAU,IAAI,WAAW,CAuBxC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAGjD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAMrD"}