remote-access-mcp 1.0.7 → 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.
Files changed (102) hide show
  1. package/README.fa.md +29 -70
  2. package/README.md +92 -65
  3. package/dist/cli/main.d.ts.map +1 -1
  4. package/dist/cli/main.js +352 -133
  5. package/dist/cli/main.js.map +1 -1
  6. package/dist/core/audit.d.ts +40 -0
  7. package/dist/core/audit.d.ts.map +1 -0
  8. package/dist/core/audit.js +96 -0
  9. package/dist/core/audit.js.map +1 -0
  10. package/dist/core/config.d.ts +37 -5
  11. package/dist/core/config.d.ts.map +1 -1
  12. package/dist/core/config.js +111 -34
  13. package/dist/core/config.js.map +1 -1
  14. package/dist/core/context.d.ts +23 -0
  15. package/dist/core/context.d.ts.map +1 -0
  16. package/dist/core/context.js +32 -0
  17. package/dist/core/context.js.map +1 -0
  18. package/dist/core/crypto.d.ts +6 -0
  19. package/dist/core/crypto.d.ts.map +1 -0
  20. package/dist/core/crypto.js +16 -0
  21. package/dist/core/crypto.js.map +1 -0
  22. package/dist/core/policy.d.ts +19 -0
  23. package/dist/core/policy.d.ts.map +1 -1
  24. package/dist/core/policy.js +57 -0
  25. package/dist/core/policy.js.map +1 -1
  26. package/dist/core/rate-limit.d.ts +14 -0
  27. package/dist/core/rate-limit.d.ts.map +1 -0
  28. package/dist/core/rate-limit.js +67 -0
  29. package/dist/core/rate-limit.js.map +1 -0
  30. package/dist/server/app.d.ts +18 -1
  31. package/dist/server/app.d.ts.map +1 -1
  32. package/dist/server/app.js +119 -25
  33. package/dist/server/app.js.map +1 -1
  34. package/dist/server/run.d.ts +5 -1
  35. package/dist/server/run.d.ts.map +1 -1
  36. package/dist/server/run.js +31 -8
  37. package/dist/server/run.js.map +1 -1
  38. package/dist/tools/filesystem.d.ts +3 -2
  39. package/dist/tools/filesystem.d.ts.map +1 -1
  40. package/dist/tools/filesystem.js +34 -23
  41. package/dist/tools/filesystem.js.map +1 -1
  42. package/dist/tools/git.d.ts +2 -2
  43. package/dist/tools/git.d.ts.map +1 -1
  44. package/dist/tools/git.js +33 -4
  45. package/dist/tools/git.js.map +1 -1
  46. package/dist/tools/http.d.ts +2 -1
  47. package/dist/tools/http.d.ts.map +1 -1
  48. package/dist/tools/http.js +47 -5
  49. package/dist/tools/http.js.map +1 -1
  50. package/dist/tools/index.d.ts +6 -3
  51. package/dist/tools/index.d.ts.map +1 -1
  52. package/dist/tools/index.js +29 -9
  53. package/dist/tools/index.js.map +1 -1
  54. package/dist/tools/logs.d.ts +4 -0
  55. package/dist/tools/logs.d.ts.map +1 -0
  56. package/dist/tools/logs.js +78 -0
  57. package/dist/tools/logs.js.map +1 -0
  58. package/dist/tools/packages.d.ts +4 -0
  59. package/dist/tools/packages.d.ts.map +1 -0
  60. package/dist/tools/packages.js +75 -0
  61. package/dist/tools/packages.js.map +1 -0
  62. package/dist/tools/planning.d.ts +4 -0
  63. package/dist/tools/planning.d.ts.map +1 -0
  64. package/dist/tools/planning.js +118 -0
  65. package/dist/tools/planning.js.map +1 -0
  66. package/dist/tools/policy.d.ts +7 -2
  67. package/dist/tools/policy.d.ts.map +1 -1
  68. package/dist/tools/policy.js +29 -18
  69. package/dist/tools/policy.js.map +1 -1
  70. package/dist/tools/project.d.ts +4 -0
  71. package/dist/tools/project.d.ts.map +1 -0
  72. package/dist/tools/project.js +141 -0
  73. package/dist/tools/project.js.map +1 -0
  74. package/dist/tools/schedule.d.ts +17 -0
  75. package/dist/tools/schedule.d.ts.map +1 -0
  76. package/dist/tools/schedule.js +113 -0
  77. package/dist/tools/schedule.js.map +1 -0
  78. package/dist/tools/security.d.ts +4 -0
  79. package/dist/tools/security.d.ts.map +1 -0
  80. package/dist/tools/security.js +103 -0
  81. package/dist/tools/security.js.map +1 -0
  82. package/dist/tools/services.d.ts +4 -0
  83. package/dist/tools/services.d.ts.map +1 -0
  84. package/dist/tools/services.js +56 -0
  85. package/dist/tools/services.js.map +1 -0
  86. package/dist/tools/shell.d.ts +2 -2
  87. package/dist/tools/shell.d.ts.map +1 -1
  88. package/dist/tools/shell.js +25 -10
  89. package/dist/tools/shell.js.map +1 -1
  90. package/dist/tools/sqlite.d.ts +2 -2
  91. package/dist/tools/sqlite.d.ts.map +1 -1
  92. package/dist/tools/sqlite.js +44 -9
  93. package/dist/tools/sqlite.js.map +1 -1
  94. package/dist/tools/system.d.ts +2 -1
  95. package/dist/tools/system.d.ts.map +1 -1
  96. package/dist/tools/system.js +6 -2
  97. package/dist/tools/system.js.map +1 -1
  98. package/dist/tools/web.d.ts +4 -0
  99. package/dist/tools/web.d.ts.map +1 -0
  100. package/dist/tools/web.js +77 -0
  101. package/dist/tools/web.js.map +1 -0
  102. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.js","sourceRoot":"","sources":["../../src/tools/packages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../core/context.js';
3
+ export declare function registerPlanningTools(server: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=planning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/tools/planning.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2CtD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAmG/E"}
@@ -0,0 +1,118 @@
1
+ import fs from 'node:fs';
2
+ import fsp from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import crypto from 'node:crypto';
5
+ import { z } from 'zod';
6
+ import { assertToolPermitted, assertAllowed } from '../core/policy.js';
7
+ function storePath(kind) {
8
+ const os = require('node:os');
9
+ return path.join(os.homedir(), '.config', 'remote-access-mcp', `${kind}.json`);
10
+ }
11
+ function loadStore(kind) {
12
+ try {
13
+ return JSON.parse(fs.readFileSync(storePath(kind), 'utf8'));
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ }
19
+ function saveStore(kind, data) {
20
+ fs.mkdirSync(path.dirname(storePath(kind)), { recursive: true });
21
+ fs.writeFileSync(storePath(kind), JSON.stringify(data, null, 2), { mode: 0o600 });
22
+ }
23
+ function snapDir() {
24
+ const os = require('node:os');
25
+ return path.join(os.homedir(), '.config', 'remote-access-mcp', 'snapshots');
26
+ }
27
+ export function registerPlanningTools(server, ctx) {
28
+ const policy = () => ({
29
+ allowed_paths: ctx.token.allowed_paths,
30
+ denied_paths: ctx.token.denied_paths,
31
+ shell_enabled: ctx.token.shell_enabled,
32
+ });
33
+ // ---- create_task_plan ---------------------------------------------------------
34
+ server.registerTool('create_task_plan', {
35
+ description: 'Create a multi-step task plan the AI can track. Steps can be marked done via task_status.',
36
+ inputSchema: {
37
+ goal: z.string().describe('What the plan achieves'),
38
+ steps: z.array(z.string()).describe('Ordered steps'),
39
+ },
40
+ }, async ({ goal, steps }) => {
41
+ assertToolPermitted({ tool: 'create_task_plan', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
42
+ const plans = loadStore('plans');
43
+ const plan = {
44
+ id: crypto.randomBytes(4).toString('hex'),
45
+ goal,
46
+ steps: steps.map(s => ({ text: s, done: false })),
47
+ created: new Date().toISOString(),
48
+ updated: new Date().toISOString(),
49
+ };
50
+ plans.push(plan);
51
+ saveStore('plans', plans);
52
+ return { content: [{ type: 'text', text: `Plan ${plan.id} created with ${steps.length} steps: ${goal}` }] };
53
+ });
54
+ // ---- task_status --------------------------------------------------------------------
55
+ server.registerTool('task_status', {
56
+ description: 'Show a task plan, or mark steps done by index (1-based).',
57
+ inputSchema: {
58
+ id: z.string().describe('Plan id'),
59
+ done_steps: z.array(z.number()).optional().describe('1-based step indices to mark done'),
60
+ },
61
+ }, async ({ id, done_steps }) => {
62
+ assertToolPermitted({ tool: 'task_status', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
63
+ const plans = loadStore('plans');
64
+ const plan = plans.find(p => p.id === id);
65
+ if (!plan)
66
+ return { content: [{ type: 'text', text: `Plan ${id} not found.` }], isError: true };
67
+ if (done_steps) {
68
+ for (const i of done_steps) {
69
+ if (plan.steps[i - 1])
70
+ plan.steps[i - 1].done = true;
71
+ }
72
+ plan.updated = new Date().toISOString();
73
+ saveStore('plans', plans);
74
+ }
75
+ const lines = plan.steps.map((s, i) => `${i + 1}. [${s.done ? 'x' : ' '}] ${s.text}`);
76
+ return { content: [{ type: 'text', text: `Plan ${plan.id}: ${plan.goal}\n${lines.join('\n')}` }] };
77
+ });
78
+ // ---- workspace_snapshot ---------------------------------------------------------------
79
+ server.registerTool('workspace_snapshot', {
80
+ description: 'Snapshot files (copy) before a risky change. Roll back with rollback_changes. Policy-checked.',
81
+ inputSchema: {
82
+ files: z.array(z.string()).describe('Absolute file paths to snapshot'),
83
+ },
84
+ }, async ({ files }) => {
85
+ assertToolPermitted({ tool: 'workspace_snapshot', scopes: ctx.token.scopes, readOnly: ctx.readOnly, policy: policy() });
86
+ const id = crypto.randomBytes(6).toString('hex');
87
+ const dir = path.join(snapDir(), id);
88
+ fs.mkdirSync(dir, { recursive: true });
89
+ const recs = [];
90
+ for (const f of files) {
91
+ assertAllowed(policy(), f);
92
+ const dest = path.join(dir, crypto.createHash('sha1').update(f).digest('hex').slice(0, 12) + path.basename(f));
93
+ await fsp.copyFile(f, dest);
94
+ recs.push({ orig: f, snap: dest });
95
+ }
96
+ const snaps = loadStore('snapshots');
97
+ snaps.push({ id, root: path.dirname(files[0] || '.'), files: recs, created: new Date().toISOString() });
98
+ saveStore('snapshots', snaps);
99
+ return { content: [{ type: 'text', text: `Snapshot ${id}: ${files.length} file(s) saved.` }] };
100
+ });
101
+ // ---- rollback_changes ---------------------------------------------------------------------
102
+ server.registerTool('rollback_changes', {
103
+ description: 'Restore files from a snapshot. Policy-checked.',
104
+ inputSchema: { id: z.string().describe('Snapshot id from workspace_snapshot') },
105
+ }, async ({ id }) => {
106
+ assertToolPermitted({ tool: 'rollback_changes', scopes: ctx.token.scopes, readOnly: ctx.readOnly, policy: policy() });
107
+ const snaps = loadStore('snapshots');
108
+ const snap = snaps.find(s => s.id === id);
109
+ if (!snap)
110
+ return { content: [{ type: 'text', text: `Snapshot ${id} not found.` }], isError: true };
111
+ for (const f of snap.files) {
112
+ assertAllowed(policy(), f.orig);
113
+ await fsp.copyFile(f.snap, f.orig);
114
+ }
115
+ return { content: [{ type: 'text', text: `Rolled back ${snap.files.length} file(s) from snapshot ${id}.` }] };
116
+ });
117
+ }
118
+ //# sourceMappingURL=planning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning.js","sourceRoot":"","sources":["../../src/tools/planning.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { type RamcpConfig } from '../core/config.js';
3
- export declare function registerPolicyTools(server: McpServer, cfg: RamcpConfig, reload: () => void): void;
2
+ import type { ToolContext } from '../core/context.js';
3
+ /**
4
+ * In-chat policy management. Mutations are limited to the CALLING token:
5
+ * a token can widen or narrow its own sandbox but never touch other
6
+ * tokens' policies — that stays a CLI-only operation (root).
7
+ */
8
+ export declare function registerPolicyTools(server: McpServer, ctx: ToolContext): void;
4
9
  //# sourceMappingURL=policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGjE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAyDjG"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA8D7E"}
@@ -1,52 +1,63 @@
1
1
  import { z } from 'zod';
2
2
  import { saveConfig } from '../core/config.js';
3
3
  import { resolveReal } from '../core/policy.js';
4
- export function registerPolicyTools(server, cfg, reload) {
5
- const persist = () => {
6
- saveConfig(cfg);
7
- reload();
8
- };
4
+ import { assertToolPermitted } from '../core/policy.js';
5
+ /**
6
+ * In-chat policy management. Mutations are limited to the CALLING token:
7
+ * a token can widen or narrow its own sandbox but never touch other
8
+ * tokens' policies — that stays a CLI-only operation (root).
9
+ */
10
+ export function registerPolicyTools(server, ctx) {
11
+ const persist = () => saveConfig(ctx.cfg);
9
12
  // ---- list_allowed_paths ----------------------------------------------------------
10
13
  server.registerTool('list_allowed_paths', {
11
- description: 'Show which paths the AI may access and whether shell is enabled.',
14
+ description: 'Show this token\'s path policy and shell flag.',
12
15
  inputSchema: {},
13
16
  }, async () => {
17
+ assertToolPermitted({ tool: 'list_allowed_paths', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
18
+ const t = ctx.token;
14
19
  const out = [
15
- `allowed: ${cfg.allowed_paths.length ? cfg.allowed_paths.join(', ') : '(none)'}`,
16
- `denied: ${cfg.denied_paths.length ? cfg.denied_paths.join(', ') : '(none)'}`,
17
- `shell: ${cfg.shell_enabled ? 'enabled' : 'disabled'}`,
20
+ `token: ${t.name}`,
21
+ `allowed: ${t.allowed_paths.length ? '\n ' + t.allowed_paths.join('\n ') : '(none)'}`,
22
+ `denied: ${t.denied_paths.length ? '\n ' + t.denied_paths.join('\n ') : '(none)'}`,
23
+ `shell: ${t.shell_enabled ? 'enabled' : 'disabled'}`,
24
+ `read_only: ${t.read_only ? 'yes' : 'no'}`,
25
+ `scopes: ${t.scopes.length ? t.scopes.join(', ') : '(all tools)'}`,
18
26
  ].join('\n');
19
27
  return { content: [{ type: 'text', text: out }] };
20
28
  });
21
29
  // ---- allow_path ----------------------------------------------------------------------
22
30
  server.registerTool('allow_path', {
23
- description: 'Grant the AI access to a directory path.',
31
+ description: 'Grant this token access to a directory path.',
24
32
  inputSchema: { path: z.string().describe('Absolute path to allow') },
25
33
  }, async ({ path }) => {
34
+ assertToolPermitted({ tool: 'allow_path', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
26
35
  const real = resolveReal(path);
27
- if (!cfg.allowed_paths.includes(real))
28
- cfg.allowed_paths.push(real);
36
+ if (!ctx.token.allowed_paths.includes(real))
37
+ ctx.token.allowed_paths.push(real);
29
38
  persist();
30
39
  return { content: [{ type: 'text', text: `Allowed: ${real}` }] };
31
40
  });
32
41
  // ---- deny_path -------------------------------------------------------------------------
33
42
  server.registerTool('deny_path', {
34
- description: 'Revoke access to a directory path and/or explicitly deny it.',
43
+ description: 'Revoke this token\'s access to a directory path.',
35
44
  inputSchema: { path: z.string().describe('Absolute path to deny') },
36
45
  }, async ({ path }) => {
46
+ assertToolPermitted({ tool: 'deny_path', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
37
47
  const real = resolveReal(path);
38
- cfg.allowed_paths = cfg.allowed_paths.filter(p => p !== real);
39
- if (!cfg.denied_paths.includes(real))
40
- cfg.denied_paths.push(real);
48
+ ctx.token.allowed_paths = ctx.token.allowed_paths.filter((p) => p !== real);
49
+ if (!ctx.token.denied_paths.includes(real))
50
+ ctx.token.denied_paths.push(real);
41
51
  persist();
42
52
  return { content: [{ type: 'text', text: `Denied: ${real}` }] };
43
53
  });
44
54
  // ---- shell_enabled ----------------------------------------------------------------------
45
55
  server.registerTool('shell_enabled', {
46
- description: 'Check whether shell command execution is currently allowed.',
56
+ description: 'Check whether shell command execution is allowed for this token.',
47
57
  inputSchema: {},
48
58
  }, async () => {
49
- return { content: [{ type: 'text', text: cfg.shell_enabled ? 'enabled' : 'disabled' }] };
59
+ assertToolPermitted({ tool: 'shell_enabled', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
60
+ return { content: [{ type: 'text', text: ctx.token.shell_enabled ? 'enabled' : 'disabled' }] };
50
61
  });
51
62
  }
52
63
  //# sourceMappingURL=policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../core/context.js';
3
+ export declare function registerProjectTools(server: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiH9E"}
@@ -0,0 +1,141 @@
1
+ import fs from 'node:fs';
2
+ import fsp from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { z } from 'zod';
5
+ import { assertToolPermitted } from '../core/policy.js';
6
+ const SKIP = new Set(['node_modules', '.git', 'dist', 'build', '__pycache__', '.venv', 'coverage', '.next']);
7
+ export function registerProjectTools(server, ctx) {
8
+ const policy = () => ({
9
+ allowed_paths: ctx.token.allowed_paths,
10
+ denied_paths: ctx.token.denied_paths,
11
+ shell_enabled: ctx.token.shell_enabled,
12
+ });
13
+ // ---- analyze_project ------------------------------------------------------
14
+ server.registerTool('analyze_project', {
15
+ description: 'Summarize a project: languages, file counts, LOC, entry points, manifests, frameworks. Policy-checked.',
16
+ inputSchema: { path: z.string().describe('Project root') },
17
+ }, async ({ path: root }) => {
18
+ assertToolPermitted({ tool: 'analyze_project', scopes: ctx.token.scopes, readOnly: ctx.readOnly, policy: policy(), target: root });
19
+ const stats = {
20
+ files: 0, loc: 0,
21
+ byExt: new Map(),
22
+ manifests: [],
23
+ entryPoints: [],
24
+ };
25
+ const walk = async (d, depth = 0) => {
26
+ if (depth > 6)
27
+ return;
28
+ let entries;
29
+ try {
30
+ entries = await fsp.readdir(d, { withFileTypes: true });
31
+ }
32
+ catch {
33
+ return;
34
+ }
35
+ for (const e of entries) {
36
+ if (SKIP.has(e.name) || e.name.startsWith('.DS'))
37
+ continue;
38
+ const full = path.join(d, e.name);
39
+ if (e.isDirectory()) {
40
+ await walk(full, depth + 1);
41
+ continue;
42
+ }
43
+ if (!e.isFile())
44
+ continue;
45
+ stats.files++;
46
+ const ext = path.extname(e.name) || '(none)';
47
+ stats.byExt.set(ext, (stats.byExt.get(ext) || 0) + 1);
48
+ if (/^(package\.json|pyproject\.toml|requirements\.txt|go\.mod|Cargo\.toml|composer\.json|pom\.xml|Gemfile|makefile|Makefile|dockerfile|Dockerfile)$/i.test(e.name)) {
49
+ stats.manifests.push(path.relative(root, full));
50
+ }
51
+ if (/^(index|main|app|server|cli|start|run)\.(js|ts|mjs|py|go|rb|php)$/i.test(e.name)) {
52
+ stats.entryPoints.push(path.relative(root, full));
53
+ }
54
+ if (/\.(js|ts|py|go|rb|rs|java|php|c|cpp|h|sh|sql|css|html)$/i.test(ext)) {
55
+ try {
56
+ const content = await fsp.readFile(full, 'utf8');
57
+ stats.loc += content.split('\n').length;
58
+ }
59
+ catch { /* binary? */ }
60
+ }
61
+ }
62
+ };
63
+ await walk(root);
64
+ const langs = [...stats.byExt.entries()]
65
+ .sort((a, b) => b[1] - a[1]).slice(0, 10)
66
+ .map(([ext, n]) => `${ext}: ${n} files`).join('\n');
67
+ const out = [
68
+ `project: ${root}`,
69
+ `files: ${stats.files}`,
70
+ `code lines: ${stats.loc}`,
71
+ ``,
72
+ `top file types:`,
73
+ langs || '(none)',
74
+ ``,
75
+ `manifests: ${stats.manifests.join(', ') || '(none found)'}`,
76
+ `entry points: ${stats.entryPoints.join(', ') || '(none found)'}`,
77
+ ].join('\n');
78
+ return { content: [{ type: 'text', text: out }] };
79
+ });
80
+ // ---- project_health_check -----------------------------------------------------
81
+ server.registerTool('project_health_check', {
82
+ description: 'Quick health check: git dirty state, huge files, missing README, TODO/FIXME density. Policy-checked.',
83
+ inputSchema: { path: z.string().describe('Project root') },
84
+ }, async ({ path: root }) => {
85
+ assertToolPermitted({ tool: 'project_health_check', scopes: ctx.token.scopes, readOnly: ctx.readOnly, policy: policy(), target: root });
86
+ const notes = [];
87
+ // git dirty
88
+ if (fs.existsSync(path.join(root, '.git'))) {
89
+ const { execFile } = await import('node:child_process');
90
+ const { promisify } = await import('node:util');
91
+ const exec = promisify(execFile);
92
+ try {
93
+ const { stdout } = await exec('git', ['status', '--porcelain'], { cwd: root });
94
+ const n = stdout.split('\n').filter(Boolean).length;
95
+ notes.push(`git: ${n} uncommitted change(s)`);
96
+ }
97
+ catch {
98
+ notes.push('git: (status failed)');
99
+ }
100
+ }
101
+ else {
102
+ notes.push('git: not a repository');
103
+ }
104
+ // README
105
+ notes.push(fs.existsSync(path.join(root, 'README.md')) ? 'README.md: present' : 'README.md: MISSING');
106
+ // TODO density
107
+ let todos = 0, files = 0;
108
+ const walk = async (d, depth = 0) => {
109
+ if (depth > 5)
110
+ return;
111
+ let entries;
112
+ try {
113
+ entries = await fsp.readdir(d, { withFileTypes: true });
114
+ }
115
+ catch {
116
+ return;
117
+ }
118
+ for (const e of entries) {
119
+ if (SKIP.has(e.name))
120
+ continue;
121
+ const full = path.join(d, e.name);
122
+ if (e.isDirectory()) {
123
+ await walk(full, depth + 1);
124
+ continue;
125
+ }
126
+ if (!/\.(js|ts|py|go|rb|php|rs|java)$/i.test(e.name))
127
+ continue;
128
+ files++;
129
+ try {
130
+ const c = await fsp.readFile(full, 'utf8');
131
+ todos += (c.match(/TODO|FIXME|HACK/g) || []).length;
132
+ }
133
+ catch { /* skip */ }
134
+ }
135
+ };
136
+ await walk(root);
137
+ notes.push(`TODOs: ${todos} across ${files} source files`);
138
+ return { content: [{ type: 'text', text: notes.join('\n') }] };
139
+ });
140
+ }
141
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../core/context.js';
3
+ interface ScheduledTask {
4
+ id: string;
5
+ command: string;
6
+ run_at?: string;
7
+ every_seconds?: number;
8
+ last_run?: string;
9
+ next_run?: string;
10
+ enabled: boolean;
11
+ created: string;
12
+ }
13
+ /** Start the background ticker. Called once from the server entry. */
14
+ export declare function startScheduler(onRun: (t: ScheduledTask) => void): NodeJS.Timeout;
15
+ export declare function registerScheduleTools(server: McpServer, ctx: ToolContext): void;
16
+ export {};
17
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/tools/schedule.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAStD,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAiBD,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,CAAC,OAAO,CAuBhF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAoE/E"}
@@ -0,0 +1,113 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { z } from 'zod';
6
+ import { assertToolPermitted } from '../core/policy.js';
7
+ const exec = promisify(execFile);
8
+ function tasksPath() {
9
+ const os = require('node:os');
10
+ return path.join(os.homedir(), '.config', 'remote-access-mcp', 'schedule.json');
11
+ }
12
+ function loadTasks() {
13
+ try {
14
+ return JSON.parse(fs.readFileSync(tasksPath(), 'utf8'));
15
+ }
16
+ catch {
17
+ return [];
18
+ }
19
+ }
20
+ function saveTasks(tasks) {
21
+ fs.mkdirSync(path.dirname(tasksPath()), { recursive: true });
22
+ fs.writeFileSync(tasksPath(), JSON.stringify(tasks, null, 2), { mode: 0o600 });
23
+ }
24
+ /** Start the background ticker. Called once from the server entry. */
25
+ export function startScheduler(onRun) {
26
+ return setInterval(async () => {
27
+ const tasks = loadTasks().filter(t => t.enabled);
28
+ const now = Date.now();
29
+ let dirty = false;
30
+ for (const t of tasks) {
31
+ const next = t.next_run ? new Date(t.next_run).getTime() : (t.run_at ? new Date(t.run_at).getTime() : 0);
32
+ if (next && next <= now) {
33
+ try {
34
+ onRun(t);
35
+ t.last_run = new Date().toISOString();
36
+ }
37
+ finally {
38
+ if (t.every_seconds) {
39
+ t.next_run = new Date(now + t.every_seconds * 1000).toISOString();
40
+ }
41
+ else {
42
+ t.enabled = false; // one-shot done
43
+ }
44
+ dirty = true;
45
+ }
46
+ }
47
+ }
48
+ if (dirty)
49
+ saveTasks(tasks);
50
+ }, 30_000);
51
+ }
52
+ export function registerScheduleTools(server, ctx) {
53
+ // ---- schedule_command -------------------------------------------------------
54
+ server.registerTool('schedule_command', {
55
+ description: 'Schedule a shell command: one-shot at an ISO time, or recurring every N seconds. Shell must be enabled.',
56
+ inputSchema: {
57
+ command: z.string().describe('Shell command to run'),
58
+ run_at: z.string().optional().describe('ISO datetime for one-shot execution'),
59
+ every_seconds: z.number().optional().describe('Recur every N seconds (min 60)'),
60
+ },
61
+ }, async ({ command, run_at, every_seconds }) => {
62
+ assertToolPermitted({ tool: 'schedule_command', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
63
+ if (!ctx.token.shell_enabled) {
64
+ return { content: [{ type: 'text', text: 'Shell is disabled for this token — scheduling refused.' }], isError: true };
65
+ }
66
+ if (!run_at && !every_seconds) {
67
+ return { content: [{ type: 'text', text: 'Provide run_at (one-shot) or every_seconds (recurring).' }], isError: true };
68
+ }
69
+ if (every_seconds && every_seconds < 60) {
70
+ return { content: [{ type: 'text', text: 'Recurring tasks must be >= 60s apart.' }], isError: true };
71
+ }
72
+ const tasks = loadTasks();
73
+ const t = {
74
+ id: Math.random().toString(36).slice(2, 10),
75
+ command,
76
+ run_at: run_at || new Date(Date.now() + (every_seconds || 0) * 1000).toISOString(),
77
+ every_seconds,
78
+ next_run: run_at,
79
+ enabled: true,
80
+ created: new Date().toISOString(),
81
+ };
82
+ tasks.push(t);
83
+ saveTasks(tasks);
84
+ return { content: [{ type: 'text', text: `Scheduled task ${t.id}: ${command}` }] };
85
+ });
86
+ // ---- list_scheduled_tasks --------------------------------------------------------
87
+ server.registerTool('list_scheduled_tasks', {
88
+ description: 'List all scheduled tasks with their next run times.',
89
+ inputSchema: {},
90
+ }, async () => {
91
+ assertToolPermitted({ tool: 'list_scheduled_tasks', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
92
+ const tasks = loadTasks();
93
+ if (!tasks.length)
94
+ return { content: [{ type: 'text', text: '(no scheduled tasks)' }] };
95
+ const out = tasks.map(t => `${t.id} | ${t.enabled ? 'on' : 'off'} | ${t.command} | run_at: ${t.run_at || '-'} | every: ${t.every_seconds || '-'}s | next: ${t.next_run || '-'}`).join('\n');
96
+ return { content: [{ type: 'text', text: out }] };
97
+ });
98
+ // ---- cancel_scheduled_task -----------------------------------------------------------
99
+ server.registerTool('cancel_scheduled_task', {
100
+ description: 'Cancel a scheduled task by id.',
101
+ inputSchema: { id: z.string().describe('Task id from list_scheduled_tasks') },
102
+ }, async ({ id }) => {
103
+ assertToolPermitted({ tool: 'cancel_scheduled_task', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
104
+ const tasks = loadTasks();
105
+ const idx = tasks.findIndex(t => t.id === id);
106
+ if (idx === -1)
107
+ return { content: [{ type: 'text', text: `Task ${id} not found.` }], isError: true };
108
+ tasks.splice(idx, 1);
109
+ saveTasks(tasks);
110
+ return { content: [{ type: 'text', text: `Cancelled ${id}` }] };
111
+ });
112
+ }
113
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/tools/schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ToolContext } from '../core/context.js';
3
+ export declare function registerSecurityTools(server: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/tools/security.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAsBtD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAmE/E"}