remote-access-mcp 3.1.2 → 4.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 (111) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +104 -2
  3. package/dist/core/agent-contracts.d.ts +57 -0
  4. package/dist/core/agent-contracts.d.ts.map +1 -0
  5. package/dist/core/agent-contracts.js +35 -0
  6. package/dist/core/agent-contracts.js.map +1 -0
  7. package/dist/core/agent-profiles.d.ts +11 -0
  8. package/dist/core/agent-profiles.d.ts.map +1 -0
  9. package/dist/core/agent-profiles.js +12 -0
  10. package/dist/core/agent-profiles.js.map +1 -0
  11. package/dist/core/automation-engine.d.ts +53 -0
  12. package/dist/core/automation-engine.d.ts.map +1 -0
  13. package/dist/core/automation-engine.js +310 -0
  14. package/dist/core/automation-engine.js.map +1 -0
  15. package/dist/core/autonomy.d.ts +11 -0
  16. package/dist/core/autonomy.d.ts.map +1 -0
  17. package/dist/core/autonomy.js +30 -0
  18. package/dist/core/autonomy.js.map +1 -0
  19. package/dist/core/capability-router.d.ts +16 -0
  20. package/dist/core/capability-router.d.ts.map +1 -0
  21. package/dist/core/capability-router.js +83 -0
  22. package/dist/core/capability-router.js.map +1 -0
  23. package/dist/core/config.js +1 -1
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/context-engine.d.ts +75 -0
  26. package/dist/core/context-engine.d.ts.map +1 -0
  27. package/dist/core/context-engine.js +330 -0
  28. package/dist/core/context-engine.js.map +1 -0
  29. package/dist/core/context.d.ts +5 -0
  30. package/dist/core/context.d.ts.map +1 -1
  31. package/dist/core/context.js.map +1 -1
  32. package/dist/core/policy.d.ts.map +1 -1
  33. package/dist/core/policy.js +15 -5
  34. package/dist/core/policy.js.map +1 -1
  35. package/dist/core/project-profiles.d.ts +17 -0
  36. package/dist/core/project-profiles.d.ts.map +1 -0
  37. package/dist/core/project-profiles.js +32 -0
  38. package/dist/core/project-profiles.js.map +1 -0
  39. package/dist/core/recovery-engine.d.ts +37 -0
  40. package/dist/core/recovery-engine.d.ts.map +1 -0
  41. package/dist/core/recovery-engine.js +99 -0
  42. package/dist/core/recovery-engine.js.map +1 -0
  43. package/dist/core/security-analysis.d.ts +19 -0
  44. package/dist/core/security-analysis.d.ts.map +1 -0
  45. package/dist/core/security-analysis.js +39 -0
  46. package/dist/core/security-analysis.js.map +1 -0
  47. package/dist/core/task-engine.d.ts +76 -0
  48. package/dist/core/task-engine.d.ts.map +1 -0
  49. package/dist/core/task-engine.js +319 -0
  50. package/dist/core/task-engine.js.map +1 -0
  51. package/dist/server/app.d.ts +2 -1
  52. package/dist/server/app.d.ts.map +1 -1
  53. package/dist/server/app.js +117 -5
  54. package/dist/server/app.js.map +1 -1
  55. package/dist/server/run.d.ts.map +1 -1
  56. package/dist/server/run.js +15 -1
  57. package/dist/server/run.js.map +1 -1
  58. package/dist/tools/agent.d.ts +4 -0
  59. package/dist/tools/agent.d.ts.map +1 -0
  60. package/dist/tools/agent.js +16 -0
  61. package/dist/tools/agent.js.map +1 -0
  62. package/dist/tools/automation.d.ts +4 -0
  63. package/dist/tools/automation.d.ts.map +1 -0
  64. package/dist/tools/automation.js +87 -0
  65. package/dist/tools/automation.js.map +1 -0
  66. package/dist/tools/autonomous.d.ts +4 -0
  67. package/dist/tools/autonomous.d.ts.map +1 -0
  68. package/dist/tools/autonomous.js +82 -0
  69. package/dist/tools/autonomous.js.map +1 -0
  70. package/dist/tools/browser.d.ts +4 -0
  71. package/dist/tools/browser.d.ts.map +1 -0
  72. package/dist/tools/browser.js +99 -0
  73. package/dist/tools/browser.js.map +1 -0
  74. package/dist/tools/context.d.ts +4 -0
  75. package/dist/tools/context.d.ts.map +1 -0
  76. package/dist/tools/context.js +53 -0
  77. package/dist/tools/context.js.map +1 -0
  78. package/dist/tools/index.d.ts +1 -1
  79. package/dist/tools/index.d.ts.map +1 -1
  80. package/dist/tools/index.js +20 -2
  81. package/dist/tools/index.js.map +1 -1
  82. package/dist/tools/infrastructure.d.ts +4 -0
  83. package/dist/tools/infrastructure.d.ts.map +1 -0
  84. package/dist/tools/infrastructure.js +124 -0
  85. package/dist/tools/infrastructure.js.map +1 -0
  86. package/dist/tools/intelligence.d.ts +9 -0
  87. package/dist/tools/intelligence.d.ts.map +1 -0
  88. package/dist/tools/intelligence.js +120 -0
  89. package/dist/tools/intelligence.js.map +1 -0
  90. package/dist/tools/planning.d.ts.map +1 -1
  91. package/dist/tools/planning.js +9 -0
  92. package/dist/tools/planning.js.map +1 -1
  93. package/dist/tools/plugin-host.d.ts +2 -0
  94. package/dist/tools/plugin-host.d.ts.map +1 -0
  95. package/dist/tools/plugin-host.js +54 -0
  96. package/dist/tools/plugin-host.js.map +1 -0
  97. package/dist/tools/plugin-network-blocker.cjs +39 -0
  98. package/dist/tools/plugins.d.ts.map +1 -1
  99. package/dist/tools/plugins.js +344 -30
  100. package/dist/tools/plugins.js.map +1 -1
  101. package/dist/tools/router.d.ts +4 -0
  102. package/dist/tools/router.d.ts.map +1 -0
  103. package/dist/tools/router.js +39 -0
  104. package/dist/tools/router.js.map +1 -0
  105. package/dist/tools/tasks.d.ts +4 -0
  106. package/dist/tools/tasks.d.ts.map +1 -0
  107. package/dist/tools/tasks.js +71 -0
  108. package/dist/tools/tasks.js.map +1 -0
  109. package/docs/ai/agent-architecture.md +145 -0
  110. package/docs/ai/decisions.md +119 -1
  111. package/package.json +2 -2
@@ -1,21 +1,55 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { pathToFileURL } from 'node:url';
3
+ import crypto from 'node:crypto';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
6
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
4
7
  import { z } from 'zod';
5
8
  import { assertToolPermitted, assertAllowed } from '../core/policy.js';
6
- import { dataDir } from '../core/platform.js';
9
+ import { dataDir, isLinux, which } from '../core/platform.js';
10
+ const MAX_FILES = 256;
11
+ const MAX_TOTAL_BYTES = 20 * 1024 * 1024;
12
+ const MAX_TOOL_COUNT = 64;
13
+ const MAX_TOOL_SCHEMA_BYTES = 64 * 1024;
14
+ const PLUGIN_TIMEOUT_MS = 15_000;
15
+ const ALLOWED_PERMISSIONS = new Set(['fs.read', 'fs.write', 'process']);
16
+ const LOCK_FILE = () => path.join(root(), 'plugins.lock.json');
17
+ const LOCK_GUARD = () => path.join(root(), '.plugins.lock.guard');
7
18
  const root = () => path.join(dataDir(), 'plugins');
8
- function manifests() { if (!fs.existsSync(root()))
9
- return []; return fs.readdirSync(root(), { withFileTypes: true }).flatMap(d => { if (!d.isDirectory())
10
- return []; try {
11
- return [JSON.parse(fs.readFileSync(path.join(root(), d.name, 'manifest.json'), 'utf8'))];
12
- }
13
- catch {
14
- return [];
15
- } }); }
16
- function pluginDir(name) { return path.join(root(), name.replace(/[^a-zA-Z0-9._-]/g, '_')); }
17
- function pluginEntry(m) {
18
- if (!m.entry || !m.trusted)
19
+ function withPluginLock(fn) {
20
+ fs.mkdirSync(root(), { recursive: true, mode: 0o700 });
21
+ const guard = LOCK_GUARD();
22
+ let fd;
23
+ const deadline = Date.now() + 10_000;
24
+ while (fd === undefined) {
25
+ try {
26
+ fd = fs.openSync(guard, 'wx', 0o600);
27
+ }
28
+ catch (error) {
29
+ if (error?.code !== 'EEXIST' || Date.now() >= deadline)
30
+ throw new Error('Plugin registry is busy.');
31
+ try {
32
+ const stat = fs.statSync(guard);
33
+ if (Date.now() - stat.mtimeMs > 30_000)
34
+ fs.unlinkSync(guard);
35
+ }
36
+ catch { }
37
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10);
38
+ }
39
+ }
40
+ try {
41
+ return fn();
42
+ }
43
+ finally {
44
+ fs.closeSync(fd);
45
+ fs.unlinkSync(guard);
46
+ }
47
+ }
48
+ function pluginDir(name) {
49
+ return path.join(root(), name.replace(/[^a-zA-Z0-9._-]/g, '_'));
50
+ }
51
+ function safeEntry(m) {
52
+ if (!m.entry || path.isAbsolute(m.entry))
19
53
  return null;
20
54
  const dir = pluginDir(m.name);
21
55
  const resolved = path.resolve(dir, m.entry);
@@ -24,30 +58,310 @@ function pluginEntry(m) {
24
58
  return null;
25
59
  return resolved;
26
60
  }
61
+ function validateManifest(raw) {
62
+ if (!raw || typeof raw !== 'object')
63
+ throw new Error('Invalid plugin manifest.');
64
+ const m = raw;
65
+ if (typeof m.name !== 'string' || !/^[a-zA-Z0-9._-]{1,64}$/.test(m.name))
66
+ throw new Error('Invalid plugin name.');
67
+ if (typeof m.version !== 'string' || !/^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$/.test(m.version))
68
+ throw new Error('Invalid plugin version.');
69
+ if (typeof m.entry !== 'string' || !m.entry || path.isAbsolute(m.entry))
70
+ throw new Error('Invalid plugin entry.');
71
+ if (m.permissions !== undefined && (!Array.isArray(m.permissions) || m.permissions.some(p => typeof p !== 'string' || !ALLOWED_PERMISSIONS.has(p)))) {
72
+ throw new Error('Invalid plugin permissions.');
73
+ }
74
+ if (m.scopes !== undefined && (!Array.isArray(m.scopes) || m.scopes.some(s => typeof s !== 'string' || !/^[a-zA-Z0-9._-]{1,64}$/.test(s)))) {
75
+ throw new Error('Invalid plugin scopes.');
76
+ }
77
+ return { name: m.name, version: m.version, description: typeof m.description === 'string' ? m.description.slice(0, 1000) : undefined, entry: m.entry, permissions: m.permissions || [], scopes: m.scopes || [] };
78
+ }
79
+ function walkFiles(dir) {
80
+ const out = [];
81
+ const visit = (current) => {
82
+ const entries = fs.readdirSync(current, { withFileTypes: true });
83
+ for (const entry of entries) {
84
+ if (entry.name === 'plugins.lock.json')
85
+ continue;
86
+ const full = path.join(current, entry.name);
87
+ if (entry.isSymbolicLink())
88
+ throw new Error('Plugins may not contain symbolic links.');
89
+ if (entry.isDirectory())
90
+ visit(full);
91
+ else if (entry.isFile())
92
+ out.push(full);
93
+ else
94
+ throw new Error('Unsupported plugin filesystem entry.');
95
+ if (out.length > MAX_FILES)
96
+ throw new Error(`Plugin exceeds ${MAX_FILES} files.`);
97
+ }
98
+ };
99
+ visit(dir);
100
+ return out;
101
+ }
102
+ function fingerprint(dir) {
103
+ const hash = crypto.createHash('sha256');
104
+ let total = 0;
105
+ const files = walkFiles(dir).sort();
106
+ for (const file of files) {
107
+ const rel = path.relative(dir, file).split(path.sep).join('/');
108
+ const stat = fs.statSync(file);
109
+ total += stat.size;
110
+ if (total > MAX_TOTAL_BYTES)
111
+ throw new Error(`Plugin exceeds ${MAX_TOTAL_BYTES} byte limit.`);
112
+ hash.update(rel).update('\0');
113
+ hash.update(fs.readFileSync(file));
114
+ hash.update('\0');
115
+ }
116
+ return hash.digest('hex');
117
+ }
118
+ function loadLock() {
119
+ try {
120
+ return JSON.parse(fs.readFileSync(LOCK_FILE(), 'utf8'));
121
+ }
122
+ catch {
123
+ return {};
124
+ }
125
+ }
126
+ function saveLock(lock) {
127
+ fs.mkdirSync(root(), { recursive: true, mode: 0o700 });
128
+ const tmp = `${LOCK_FILE()}.${process.pid}.tmp`;
129
+ fs.writeFileSync(tmp, JSON.stringify(lock, null, 2) + '\n', { mode: 0o600 });
130
+ fs.renameSync(tmp, LOCK_FILE());
131
+ }
132
+ function manifests() {
133
+ if (!fs.existsSync(root()))
134
+ return [];
135
+ const lock = loadLock();
136
+ return fs.readdirSync(root(), { withFileTypes: true }).flatMap(d => {
137
+ if (!d.isDirectory())
138
+ return [];
139
+ try {
140
+ const dir = path.join(root(), d.name);
141
+ const m = validateManifest(JSON.parse(fs.readFileSync(path.join(dir, 'manifest.json'), 'utf8')));
142
+ const sha256 = fingerprint(dir);
143
+ const record = lock[m.name];
144
+ return [{ ...m, sha256, verified: !!record && record.version === m.version && record.sha256 === sha256 }];
145
+ }
146
+ catch {
147
+ return [];
148
+ }
149
+ });
150
+ }
151
+ function assertPluginAccess(ctx, m) {
152
+ if (ctx.token.scopes.length && !ctx.token.scopes.includes('plugins')) {
153
+ throw new Error('Plugin access requires the plugins scope.');
154
+ }
155
+ if (m.scopes?.some(s => ctx.token.scopes.length && !ctx.token.scopes.includes(s))) {
156
+ throw new Error(`Plugin ${m.name} requires unavailable token scopes.`);
157
+ }
158
+ }
159
+ function nodePermissionArgs(m, dir) {
160
+ const args = ['--permission', `--allow-fs-read=${dir}`];
161
+ const data = path.join(dir, 'data');
162
+ if (m.permissions?.includes('fs.write')) {
163
+ fs.mkdirSync(data, { recursive: true, mode: 0o700 });
164
+ args.push(`--allow-fs-write=${data}`);
165
+ }
166
+ if (m.permissions?.includes('process'))
167
+ args.push('--allow-child-process');
168
+ return args;
169
+ }
170
+ function sandboxCommand(m, dir, nodeModules) {
171
+ const host = hostEntry();
172
+ const blocker = path.resolve(path.dirname(host), 'plugin-network-blocker.cjs');
173
+ const nodeArgs = [...nodePermissionArgs(m, dir), `--allow-fs-read=${nodeModules}`, `--allow-fs-read=${host}`, `--allow-fs-read=${blocker}`, '--require', blocker, host, '--plugin-dir', dir, '--entry', safeEntry(m)];
174
+ const unshare = which('unshare');
175
+ const nft = which('nft');
176
+ if (isLinux() && unshare && nft) {
177
+ const script = `\"${nft}\" add table inet ramcp_plugin_filter && \"${nft}\" add chain inet ramcp_plugin_filter output '{ type filter hook output priority 0; policy drop; }' && node=\"$1\"; shift; exec \"$node\" \"$@\"`;
178
+ return { command: unshare, args: ['--fork', '--net', '--', '/bin/sh', '-c', script, '--', process.execPath, ...nodeArgs] };
179
+ }
180
+ if (process.env.RAMCP_PLUGIN_UNSANDBOXED === '1')
181
+ return { command: process.execPath, args: nodeArgs };
182
+ return null;
183
+ }
184
+ function hostEntry() {
185
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'plugin-host.js');
186
+ }
187
+ async function withPluginClient(m, fn) {
188
+ const dir = pluginDir(m.name);
189
+ const entry = safeEntry(m);
190
+ if (!entry)
191
+ throw new Error('Plugin entry escapes its installation directory.');
192
+ const lock = loadLock()[m.name];
193
+ if (!lock || lock.version !== m.version || lock.sha256 !== fingerprint(dir))
194
+ throw new Error(`Plugin ${m.name} failed integrity verification.`);
195
+ const nodeModules = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'node_modules');
196
+ const sandbox = sandboxCommand(m, dir, nodeModules);
197
+ if (!sandbox)
198
+ throw new Error('Plugin execution requires the built-in sandbox; set RAMCP_PLUGIN_UNSANDBOXED=1 only for explicit local trust.');
199
+ const transport = new StdioClientTransport({
200
+ command: sandbox.command,
201
+ args: sandbox.args,
202
+ cwd: dir,
203
+ env: { PATH: process.env.PATH || '', LANG: 'C.UTF-8', NODE_NO_WARNINGS: '1' },
204
+ stderr: 'pipe',
205
+ maxBufferSize: 2 * 1024 * 1024,
206
+ });
207
+ const client = new Client({ name: 'remote-access-mcp-plugin-bridge', version: '1' });
208
+ try {
209
+ await Promise.race([
210
+ client.connect(transport),
211
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Plugin startup timed out after ${PLUGIN_TIMEOUT_MS}ms.`)), PLUGIN_TIMEOUT_MS)),
212
+ ]);
213
+ return await Promise.race([
214
+ fn(client),
215
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Plugin execution timed out after ${PLUGIN_TIMEOUT_MS}ms.`)), PLUGIN_TIMEOUT_MS)),
216
+ ]);
217
+ }
218
+ finally {
219
+ await client.close().catch(() => { });
220
+ }
221
+ }
222
+ function jsonSchemaToZod(schema) {
223
+ if (!schema || typeof schema !== 'object')
224
+ return z.any();
225
+ if (schema.enum && Array.isArray(schema.enum) && schema.enum.length) {
226
+ if (schema.enum.every((v) => typeof v === 'string'))
227
+ return z.enum(schema.enum);
228
+ return z.union(schema.enum.map((v) => z.literal(v)));
229
+ }
230
+ if (schema.anyOf && Array.isArray(schema.anyOf) && schema.anyOf.length >= 2)
231
+ return z.union(schema.anyOf.slice(0, 8).map(jsonSchemaToZod));
232
+ switch (schema.type) {
233
+ case 'string': return z.string();
234
+ case 'number': return z.number();
235
+ case 'integer': return z.number().int();
236
+ case 'boolean': return z.boolean();
237
+ case 'null': return z.null();
238
+ case 'array': return z.array(jsonSchemaToZod(schema.items));
239
+ case 'object': {
240
+ const shape = {};
241
+ for (const [key, value] of Object.entries(schema.properties || {}).slice(0, 128)) {
242
+ const field = jsonSchemaToZod(value);
243
+ shape[key] = (schema.required || []).includes(key) ? field : field.optional();
244
+ }
245
+ return z.object(shape).passthrough();
246
+ }
247
+ default: return z.any();
248
+ }
249
+ }
27
250
  export async function registerInstalledPlugins(server, ctx) {
28
251
  for (const m of manifests()) {
29
- const entry = pluginEntry(m);
30
- if (!entry)
31
- continue;
32
- const dir = pluginDir(m.name);
33
- const allowed = (m.permissions || []).every(p => !ctx.token.scopes.length || ctx.token.scopes.includes(p));
34
- if (!allowed)
252
+ if (!m.verified)
35
253
  continue;
36
254
  try {
37
- const mod = await import(pathToFileURL(entry).href);
38
- if (typeof mod.register === 'function')
39
- await mod.register(server, ctx);
255
+ assertPluginAccess(ctx, m);
256
+ const listed = await withPluginClient(m, client => client.listTools());
257
+ if (listed.tools.length > MAX_TOOL_COUNT)
258
+ continue;
259
+ for (const tool of listed.tools) {
260
+ if (!/^[a-zA-Z0-9._-]{1,64}$/.test(tool.name))
261
+ continue;
262
+ const schemaText = JSON.stringify(tool.inputSchema || {});
263
+ if (schemaText.length > MAX_TOOL_SCHEMA_BYTES)
264
+ continue;
265
+ const exposedName = `plugin_${m.name}__${tool.name}`;
266
+ try {
267
+ server.registerTool(exposedName, {
268
+ description: `[plugin:${m.name}] ${String(tool.description || '').slice(0, 2000)}`,
269
+ inputSchema: jsonSchemaToZod(tool.inputSchema || { type: 'object', properties: {} }),
270
+ }, async (args) => {
271
+ assertToolPermitted({ tool: exposedName, scopes: ctx.token.scopes, readOnly: ctx.readOnly });
272
+ const result = await withPluginClient(m, client => client.callTool({ name: tool.name, arguments: args }));
273
+ return result;
274
+ });
275
+ }
276
+ catch {
277
+ // A single malformed/conflicting tool must not block other plugins.
278
+ }
279
+ }
280
+ }
281
+ catch {
282
+ // Broken, untrusted, incompatible or unsandboxable plugins are fail-closed.
40
283
  }
41
- catch { /* a broken plugin must not prevent gateway startup */ }
42
284
  }
43
285
  }
44
286
  export function registerPluginTools(server, ctx) {
45
- server.registerTool('plugin_list', { description: 'List installed local Remote Access MCP plugins and their declared permissions.', inputSchema: {} }, async () => { assertToolPermitted({ tool: 'plugin_list', scopes: ctx.token.scopes, readOnly: ctx.readOnly }); return { content: [{ type: 'text', text: JSON.stringify(manifests(), null, 2) }] }; });
46
- server.registerTool('plugin_install', { description: 'Install a trusted local plugin directory containing manifest.json. The source must already exist on the machine.', inputSchema: { source: z.string() } }, async ({ source }) => { assertToolPermitted({ tool: 'plugin_install', scopes: ctx.token.scopes, readOnly: ctx.readOnly }); const src = path.resolve(source); assertAllowed({ allowed_paths: ctx.token.allowed_paths, denied_paths: ctx.token.denied_paths, shell_enabled: ctx.token.shell_enabled }, src); const mf = path.join(src, 'manifest.json'); if (!fs.existsSync(mf))
47
- return { content: [{ type: 'text', text: 'manifest.json not found.' }], isError: true }; const m = JSON.parse(fs.readFileSync(mf, 'utf8')); if (!m.name || !m.version)
48
- return { content: [{ type: 'text', text: 'Invalid plugin manifest.' }], isError: true }; if (m.trusted !== true)
49
- return { content: [{ type: 'text', text: 'Plugin manifest must explicitly set trusted=true before installation.' }], isError: true }; const dest = pluginDir(m.name); fs.mkdirSync(root(), { recursive: true }); fs.cpSync(src, dest, { recursive: true }); return { content: [{ type: 'text', text: `Plugin ${m.name}@${m.version} installed. Declared permissions: ${(m.permissions || []).join(', ') || 'none'}.` }] }; });
50
- server.registerTool('plugin_remove', { description: 'Remove an installed local plugin.', inputSchema: { name: z.string().regex(/^[a-zA-Z0-9._-]+$/) } }, async ({ name }) => { assertToolPermitted({ tool: 'plugin_remove', scopes: ctx.token.scopes, readOnly: ctx.readOnly }); const p = path.join(root(), name); if (!fs.existsSync(p))
51
- return { content: [{ type: 'text', text: 'Plugin not found.' }], isError: true }; fs.rmSync(p, { recursive: true, force: true }); return { content: [{ type: 'text', text: `Plugin ${name} removed.` }] }; });
287
+ server.registerTool('plugin_list', {
288
+ description: 'List installed Remote Access MCP plugins and integrity verification status.',
289
+ inputSchema: {},
290
+ }, async () => {
291
+ assertToolPermitted({ tool: 'plugin_list', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
292
+ return { content: [{ type: 'text', text: JSON.stringify(manifests(), null, 2) }] };
293
+ });
294
+ server.registerTool('plugin_install', {
295
+ description: 'Install a local plugin after validating its manifest, filesystem tree and integrity fingerprint.',
296
+ inputSchema: { source: z.string() },
297
+ }, async ({ source }) => {
298
+ assertToolPermitted({ tool: 'plugin_install', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
299
+ const src = path.resolve(source);
300
+ assertAllowed({ allowed_paths: ctx.token.allowed_paths, denied_paths: ctx.token.denied_paths, shell_enabled: ctx.token.shell_enabled }, src);
301
+ if (!fs.existsSync(src) || !fs.statSync(src).isDirectory())
302
+ return { content: [{ type: 'text', text: 'Plugin source directory not found.' }], isError: true };
303
+ try {
304
+ const m = validateManifest(JSON.parse(fs.readFileSync(path.join(src, 'manifest.json'), 'utf8')));
305
+ const entry = path.resolve(src, m.entry);
306
+ const rel = path.relative(src, entry);
307
+ if (!rel || rel.startsWith('..' + path.sep) || path.isAbsolute(rel) || !fs.existsSync(entry))
308
+ throw new Error('Plugin entry is invalid or outside the source directory.');
309
+ fingerprint(src);
310
+ return withPluginLock(() => {
311
+ const dest = pluginDir(m.name);
312
+ if (fs.existsSync(dest))
313
+ throw new Error(`Plugin ${m.name} is already installed; remove it first.`);
314
+ fs.mkdirSync(root(), { recursive: true, mode: 0o700 });
315
+ const copyRecursive = (from, to) => {
316
+ for (const e of fs.readdirSync(from, { withFileTypes: true })) {
317
+ const a = path.join(from, e.name), b = path.join(to, e.name);
318
+ if (e.isSymbolicLink())
319
+ throw new Error('Plugins may not contain symbolic links.');
320
+ if (e.isDirectory()) {
321
+ fs.mkdirSync(b, { mode: 0o700 });
322
+ copyRecursive(a, b);
323
+ }
324
+ else if (e.isFile())
325
+ fs.copyFileSync(a, b, fs.constants.COPYFILE_EXCL);
326
+ }
327
+ };
328
+ fs.mkdirSync(dest, { recursive: true, mode: 0o700 });
329
+ try {
330
+ copyRecursive(src, dest);
331
+ const installed = validateManifest(JSON.parse(fs.readFileSync(path.join(dest, 'manifest.json'), 'utf8')));
332
+ if (installed.name !== m.name || installed.version !== m.version || installed.entry !== m.entry)
333
+ throw new Error('Plugin source changed during installation.');
334
+ const sha256 = fingerprint(dest);
335
+ const lock = loadLock();
336
+ lock[m.name] = { name: m.name, version: m.version, sha256, installedAt: new Date().toISOString() };
337
+ saveLock(lock);
338
+ return { content: [{ type: 'text', text: `Plugin ${m.name}@${m.version} installed and fingerprinted (${sha256.slice(0, 16)}…).` }] };
339
+ }
340
+ catch (error) {
341
+ fs.rmSync(dest, { recursive: true, force: true });
342
+ throw error;
343
+ }
344
+ });
345
+ }
346
+ catch (error) {
347
+ return { content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }], isError: true };
348
+ }
349
+ });
350
+ server.registerTool('plugin_remove', {
351
+ description: 'Remove an installed local plugin and its integrity record.',
352
+ inputSchema: { name: z.string().regex(/^[a-zA-Z0-9._-]+$/) },
353
+ }, async ({ name }) => {
354
+ assertToolPermitted({ tool: 'plugin_remove', scopes: ctx.token.scopes, readOnly: ctx.readOnly });
355
+ return withPluginLock(() => {
356
+ const p = pluginDir(name);
357
+ if (!fs.existsSync(p))
358
+ return { content: [{ type: 'text', text: 'Plugin not found.' }], isError: true };
359
+ fs.rmSync(p, { recursive: true, force: true });
360
+ const lock = loadLock();
361
+ delete lock[name];
362
+ saveLock(lock);
363
+ return { content: [{ type: 'text', text: `Plugin ${name} removed.` }] };
364
+ });
365
+ });
52
366
  }
53
367
  //# sourceMappingURL=plugins.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/tools/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/tools/plugins.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 registerRouterTools(server: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/tools/router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA6B7E"}
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { authorizedCapabilities, capabilityCategories } from '../core/capability-router.js';
3
+ import { MUTATING_TOOLS } from '../core/policy.js';
4
+ export function registerRouterTools(server, ctx) {
5
+ server.registerTool('capability_discover', {
6
+ description: 'Discover only the capabilities available to the current token. Use query/category/cost to keep context small.',
7
+ inputSchema: {
8
+ query: z.string().optional(),
9
+ category: z.string().optional(),
10
+ max_cost: z.number().int().min(1).max(100).optional(),
11
+ limit: z.number().int().min(1).max(128).optional(),
12
+ },
13
+ }, async ({ query, category, max_cost, limit }) => {
14
+ const result = authorizedCapabilities(ctx.token.scopes, { query, category, maxCost: max_cost, limit });
15
+ return { content: [{ type: 'text', text: JSON.stringify({ count: result.length, categories: capabilityCategories(), capabilities: result }) }] };
16
+ });
17
+ server.registerTool('capability_batch', {
18
+ description: 'Run multiple independent read-only tool calls in parallel. Maximum 8 calls; mutating tools are rejected.',
19
+ inputSchema: {
20
+ calls: z.array(z.object({ name: z.string(), arguments: z.record(z.unknown()).optional() })).min(1).max(8),
21
+ },
22
+ }, async ({ calls }) => {
23
+ if (!ctx.invokeTool)
24
+ return { content: [{ type: 'text', text: 'Capability batch executor is unavailable.' }], isError: true };
25
+ const denied = calls.filter(c => MUTATING_TOOLS.has(c.name) || c.name === 'approval_decide' || c.name === 'capability_batch');
26
+ if (denied.length)
27
+ return { content: [{ type: 'text', text: `Batch accepts read-only calls only: ${denied.map(c => c.name).join(', ')}` }], isError: true };
28
+ const results = await Promise.all(calls.map(async (c) => {
29
+ try {
30
+ return { name: c.name, ok: true, result: await ctx.invokeTool(c.name, c.arguments || {}) };
31
+ }
32
+ catch (e) {
33
+ return { name: c.name, ok: false, error: e?.message || 'tool error' };
34
+ }
35
+ }));
36
+ return { content: [{ type: 'text', text: JSON.stringify({ results }) }] };
37
+ });
38
+ }
39
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/tools/router.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 registerTaskTools(server: McpServer, ctx: ToolContext): void;
4
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAqE3E"}
@@ -0,0 +1,71 @@
1
+ import { z } from 'zod';
2
+ import { assertToolPermitted } from '../core/policy.js';
3
+ import { TaskEngine, taskSummary } from '../core/task-engine.js';
4
+ export function registerTaskTools(server, ctx) {
5
+ const permitted = (tool) => assertToolPermitted({ tool, scopes: ctx.token.scopes, readOnly: ctx.readOnly });
6
+ const engine = new TaskEngine(ctx.token.token, async (name, args) => {
7
+ if (!ctx.invokeTool)
8
+ throw new Error('task executor is unavailable');
9
+ return ctx.invokeTool(name, args);
10
+ });
11
+ server.registerTool('task', {
12
+ description: 'Create and optionally execute an intent-driven task. Actions form a validated dependency graph; use dry_run to inspect without executing.',
13
+ inputSchema: {
14
+ goal: z.string().min(1).max(4000),
15
+ actions: z.array(z.object({
16
+ id: z.string().min(1).max(64),
17
+ agent: z.enum(['explorer', 'planner', 'implementer', 'tester', 'reviewer', 'security', 'deployer']).optional(),
18
+ tool: z.string().min(1),
19
+ arguments: z.record(z.unknown()).optional(),
20
+ depends_on: z.array(z.string()).optional(),
21
+ condition: z.enum(['always', 'on_success', 'on_failure']).optional(),
22
+ timeout_ms: z.number().int().min(100).max(600000).optional(),
23
+ retries: z.number().int().min(0).max(5).optional(),
24
+ rollback: z.object({ tool: z.string().min(1), arguments: z.record(z.unknown()).optional() }).optional(),
25
+ verify: z.object({ tool: z.string().min(1), arguments: z.record(z.unknown()).optional() }).optional(),
26
+ })).min(1).max(64),
27
+ autonomy: z.enum(['readonly', 'safe', 'supervised', 'autonomous']).default('safe'),
28
+ dry_run: z.boolean().default(false),
29
+ execute: z.boolean().default(true),
30
+ },
31
+ }, async ({ goal, actions, autonomy, dry_run, execute }) => {
32
+ permitted('task');
33
+ const row = engine.create({ goal, actions: actions.map(a => ({ id: a.id, agent: a.agent, tool: a.tool, arguments: a.arguments, dependsOn: a.depends_on, condition: a.condition, timeoutMs: a.timeout_ms, retries: a.retries, rollback: a.rollback, verify: a.verify })), autonomy: autonomy, dryRun: dry_run });
34
+ if (!execute || dry_run)
35
+ return { content: [{ type: 'text', text: JSON.stringify(taskSummary(row)) }] };
36
+ const result = await engine.run(row.id);
37
+ return { content: [{ type: 'text', text: JSON.stringify(taskSummary(result)) }], isError: result.state === 'failed' };
38
+ });
39
+ server.registerTool('task_list', {
40
+ description: 'List recent durable tasks belonging to the current token.',
41
+ inputSchema: { limit: z.number().int().min(1).max(100).default(20) },
42
+ }, async ({ limit }) => {
43
+ permitted('task_list');
44
+ return { content: [{ type: 'text', text: JSON.stringify(engine.list(limit)) }] };
45
+ });
46
+ server.registerTool('task_approve', {
47
+ description: 'Approve a supervised task and resume its execution. Approval is scoped to the current token.',
48
+ inputSchema: { id: z.string() },
49
+ }, async ({ id }) => {
50
+ permitted('task_approve');
51
+ const result = await engine.approve(id);
52
+ return { content: [{ type: 'text', text: JSON.stringify(taskSummary(result)) }], isError: result.state === 'failed' };
53
+ });
54
+ server.registerTool('task_reject', {
55
+ description: 'Reject a supervised task that is waiting for approval. The task is durably cancelled.',
56
+ inputSchema: { id: z.string() },
57
+ }, async ({ id }) => {
58
+ permitted('task_reject');
59
+ const result = engine.reject(id);
60
+ return { content: [{ type: 'text', text: JSON.stringify(taskSummary(result)) }] };
61
+ });
62
+ server.registerTool('task_resume', {
63
+ description: 'Resume a queued, interrupted, or failed task from its durable action state.',
64
+ inputSchema: { id: z.string() },
65
+ }, async ({ id }) => {
66
+ permitted('task_resume');
67
+ const result = await engine.resume(id);
68
+ return { content: [{ type: 'text', text: JSON.stringify(taskSummary(result)) }], isError: result.state === 'failed' };
69
+ });
70
+ }
71
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}