@mcptoolshop/file-forge 0.1.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/build/config/index.d.ts +29 -0
  4. package/build/config/index.d.ts.map +1 -0
  5. package/build/config/index.js +229 -0
  6. package/build/config/index.js.map +1 -0
  7. package/build/index.d.ts +9 -0
  8. package/build/index.d.ts.map +1 -0
  9. package/build/index.js +23 -0
  10. package/build/index.js.map +1 -0
  11. package/build/security/index.d.ts +8 -0
  12. package/build/security/index.d.ts.map +1 -0
  13. package/build/security/index.js +8 -0
  14. package/build/security/index.js.map +1 -0
  15. package/build/security/read-only.d.ts +32 -0
  16. package/build/security/read-only.d.ts.map +1 -0
  17. package/build/security/read-only.js +62 -0
  18. package/build/security/read-only.js.map +1 -0
  19. package/build/security/sandbox.d.ts +60 -0
  20. package/build/security/sandbox.d.ts.map +1 -0
  21. package/build/security/sandbox.js +231 -0
  22. package/build/security/sandbox.js.map +1 -0
  23. package/build/server.d.ts +20 -0
  24. package/build/server.d.ts.map +1 -0
  25. package/build/server.js +63 -0
  26. package/build/server.js.map +1 -0
  27. package/build/tools/metadata.d.ts +11 -0
  28. package/build/tools/metadata.d.ts.map +1 -0
  29. package/build/tools/metadata.js +423 -0
  30. package/build/tools/metadata.js.map +1 -0
  31. package/build/tools/read.d.ts +11 -0
  32. package/build/tools/read.d.ts.map +1 -0
  33. package/build/tools/read.js +335 -0
  34. package/build/tools/read.js.map +1 -0
  35. package/build/tools/scaffold.d.ts +11 -0
  36. package/build/tools/scaffold.d.ts.map +1 -0
  37. package/build/tools/scaffold.js +345 -0
  38. package/build/tools/scaffold.js.map +1 -0
  39. package/build/tools/search.d.ts +11 -0
  40. package/build/tools/search.d.ts.map +1 -0
  41. package/build/tools/search.js +250 -0
  42. package/build/tools/search.js.map +1 -0
  43. package/build/tools/write.d.ts +11 -0
  44. package/build/tools/write.d.ts.map +1 -0
  45. package/build/tools/write.js +538 -0
  46. package/build/tools/write.js.map +1 -0
  47. package/build/types.d.ts +402 -0
  48. package/build/types.d.ts.map +1 -0
  49. package/build/types.js +146 -0
  50. package/build/types.js.map +1 -0
  51. package/build/utils/errors.d.ts +43 -0
  52. package/build/utils/errors.d.ts.map +1 -0
  53. package/build/utils/errors.js +125 -0
  54. package/build/utils/errors.js.map +1 -0
  55. package/build/utils/index.d.ts +10 -0
  56. package/build/utils/index.d.ts.map +1 -0
  57. package/build/utils/index.js +9 -0
  58. package/build/utils/index.js.map +1 -0
  59. package/build/utils/logger.d.ts +88 -0
  60. package/build/utils/logger.d.ts.map +1 -0
  61. package/build/utils/logger.js +166 -0
  62. package/build/utils/logger.js.map +1 -0
  63. package/build/utils/validation.d.ts +43 -0
  64. package/build/utils/validation.d.ts.map +1 -0
  65. package/build/utils/validation.js +196 -0
  66. package/build/utils/validation.js.map +1 -0
  67. package/package.json +64 -0
  68. package/templates/typescript-starter/package.json +18 -0
  69. package/templates/typescript-starter/src/index.ts +9 -0
  70. package/templates/typescript-starter/template.json +24 -0
  71. package/templates/typescript-starter/tsconfig.json +14 -0
@@ -0,0 +1,538 @@
1
+ /**
2
+ * MCP File Forge - File Writing Tools
3
+ *
4
+ * Tools for writing, copying, moving, and deleting files.
5
+ */
6
+ import * as fs from 'node:fs/promises';
7
+ import * as path from 'node:path';
8
+ import { z } from 'zod';
9
+ import { WriteFileInputSchema, CreateDirectoryInputSchema, CopyFileInputSchema, MoveFileInputSchema, DeleteFileInputSchema, } from '../types.js';
10
+ /**
11
+ * Write content to a file.
12
+ */
13
+ async function writeFileImpl(input) {
14
+ try {
15
+ const absolutePath = path.resolve(input.path);
16
+ // Check if file exists
17
+ let exists = false;
18
+ try {
19
+ await fs.access(absolutePath);
20
+ exists = true;
21
+ }
22
+ catch {
23
+ // File doesn't exist
24
+ }
25
+ // Handle overwrite logic
26
+ if (exists && !input.overwrite) {
27
+ return {
28
+ isError: true,
29
+ content: [
30
+ {
31
+ type: 'text',
32
+ text: JSON.stringify({
33
+ code: 'ALREADY_EXISTS',
34
+ message: `File already exists and overwrite is false: ${input.path}`,
35
+ }),
36
+ },
37
+ ],
38
+ };
39
+ }
40
+ // Create backup if requested
41
+ if (exists && input.backup) {
42
+ const backupPath = `${absolutePath}.bak`;
43
+ await fs.copyFile(absolutePath, backupPath);
44
+ }
45
+ // Create parent directories if requested
46
+ if (input.create_dirs) {
47
+ const dir = path.dirname(absolutePath);
48
+ await fs.mkdir(dir, { recursive: true });
49
+ }
50
+ // Write the file
51
+ await fs.writeFile(absolutePath, input.content, {
52
+ encoding: input.encoding,
53
+ });
54
+ return {
55
+ content: [
56
+ {
57
+ type: 'text',
58
+ text: JSON.stringify({
59
+ success: true,
60
+ path: absolutePath,
61
+ bytes_written: Buffer.byteLength(input.content, input.encoding),
62
+ }),
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ catch (error) {
68
+ const err = error;
69
+ if (err.code === 'EACCES') {
70
+ return {
71
+ isError: true,
72
+ content: [
73
+ {
74
+ type: 'text',
75
+ text: JSON.stringify({
76
+ code: 'PERMISSION_DENIED',
77
+ message: `Permission denied: ${input.path}`,
78
+ }),
79
+ },
80
+ ],
81
+ };
82
+ }
83
+ return {
84
+ isError: true,
85
+ content: [
86
+ {
87
+ type: 'text',
88
+ text: JSON.stringify({
89
+ code: 'UNKNOWN_ERROR',
90
+ message: `Error writing file: ${err.message}`,
91
+ }),
92
+ },
93
+ ],
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * Create a directory.
99
+ */
100
+ async function createDirectoryImpl(input) {
101
+ try {
102
+ const absolutePath = path.resolve(input.path);
103
+ await fs.mkdir(absolutePath, { recursive: input.recursive });
104
+ return {
105
+ content: [
106
+ {
107
+ type: 'text',
108
+ text: JSON.stringify({
109
+ success: true,
110
+ path: absolutePath,
111
+ }),
112
+ },
113
+ ],
114
+ };
115
+ }
116
+ catch (error) {
117
+ const err = error;
118
+ if (err.code === 'EEXIST') {
119
+ return {
120
+ content: [
121
+ {
122
+ type: 'text',
123
+ text: JSON.stringify({
124
+ success: true,
125
+ path: path.resolve(input.path),
126
+ note: 'Directory already exists',
127
+ }),
128
+ },
129
+ ],
130
+ };
131
+ }
132
+ if (err.code === 'EACCES') {
133
+ return {
134
+ isError: true,
135
+ content: [
136
+ {
137
+ type: 'text',
138
+ text: JSON.stringify({
139
+ code: 'PERMISSION_DENIED',
140
+ message: `Permission denied: ${input.path}`,
141
+ }),
142
+ },
143
+ ],
144
+ };
145
+ }
146
+ return {
147
+ isError: true,
148
+ content: [
149
+ {
150
+ type: 'text',
151
+ text: JSON.stringify({
152
+ code: 'UNKNOWN_ERROR',
153
+ message: `Error creating directory: ${err.message}`,
154
+ }),
155
+ },
156
+ ],
157
+ };
158
+ }
159
+ }
160
+ /**
161
+ * Copy a file or directory.
162
+ */
163
+ async function copyFileImpl(input) {
164
+ try {
165
+ const srcPath = path.resolve(input.source);
166
+ const destPath = path.resolve(input.destination);
167
+ // Check if source exists
168
+ const srcStats = await fs.stat(srcPath);
169
+ // Check if destination exists
170
+ let destExists = false;
171
+ try {
172
+ await fs.access(destPath);
173
+ destExists = true;
174
+ }
175
+ catch {
176
+ // Destination doesn't exist
177
+ }
178
+ if (destExists && !input.overwrite) {
179
+ return {
180
+ isError: true,
181
+ content: [
182
+ {
183
+ type: 'text',
184
+ text: JSON.stringify({
185
+ code: 'ALREADY_EXISTS',
186
+ message: `Destination already exists and overwrite is false: ${input.destination}`,
187
+ }),
188
+ },
189
+ ],
190
+ };
191
+ }
192
+ if (srcStats.isDirectory()) {
193
+ if (!input.recursive) {
194
+ return {
195
+ isError: true,
196
+ content: [
197
+ {
198
+ type: 'text',
199
+ text: JSON.stringify({
200
+ code: 'INVALID_PATH',
201
+ message: 'Source is a directory but recursive is false',
202
+ }),
203
+ },
204
+ ],
205
+ };
206
+ }
207
+ // Copy directory recursively
208
+ await copyDirRecursive(srcPath, destPath);
209
+ }
210
+ else {
211
+ // Ensure parent directory exists
212
+ await fs.mkdir(path.dirname(destPath), { recursive: true });
213
+ // Copy file
214
+ await fs.copyFile(srcPath, destPath);
215
+ }
216
+ return {
217
+ content: [
218
+ {
219
+ type: 'text',
220
+ text: JSON.stringify({
221
+ success: true,
222
+ source: srcPath,
223
+ destination: destPath,
224
+ }),
225
+ },
226
+ ],
227
+ };
228
+ }
229
+ catch (error) {
230
+ const err = error;
231
+ if (err.code === 'ENOENT') {
232
+ return {
233
+ isError: true,
234
+ content: [
235
+ {
236
+ type: 'text',
237
+ text: JSON.stringify({
238
+ code: 'FILE_NOT_FOUND',
239
+ message: `Source not found: ${input.source}`,
240
+ }),
241
+ },
242
+ ],
243
+ };
244
+ }
245
+ if (err.code === 'EACCES') {
246
+ return {
247
+ isError: true,
248
+ content: [
249
+ {
250
+ type: 'text',
251
+ text: JSON.stringify({
252
+ code: 'PERMISSION_DENIED',
253
+ message: `Permission denied`,
254
+ }),
255
+ },
256
+ ],
257
+ };
258
+ }
259
+ return {
260
+ isError: true,
261
+ content: [
262
+ {
263
+ type: 'text',
264
+ text: JSON.stringify({
265
+ code: 'UNKNOWN_ERROR',
266
+ message: `Error copying: ${err.message}`,
267
+ }),
268
+ },
269
+ ],
270
+ };
271
+ }
272
+ }
273
+ /**
274
+ * Recursively copy a directory.
275
+ */
276
+ async function copyDirRecursive(src, dest) {
277
+ await fs.mkdir(dest, { recursive: true });
278
+ const entries = await fs.readdir(src, { withFileTypes: true });
279
+ for (const entry of entries) {
280
+ const srcPath = path.join(src, entry.name);
281
+ const destPath = path.join(dest, entry.name);
282
+ if (entry.isDirectory()) {
283
+ await copyDirRecursive(srcPath, destPath);
284
+ }
285
+ else {
286
+ await fs.copyFile(srcPath, destPath);
287
+ }
288
+ }
289
+ }
290
+ /**
291
+ * Move or rename a file or directory.
292
+ */
293
+ async function moveFileImpl(input) {
294
+ try {
295
+ const srcPath = path.resolve(input.source);
296
+ const destPath = path.resolve(input.destination);
297
+ // Check if source exists
298
+ await fs.stat(srcPath);
299
+ // Check if destination exists
300
+ let destExists = false;
301
+ try {
302
+ await fs.access(destPath);
303
+ destExists = true;
304
+ }
305
+ catch {
306
+ // Destination doesn't exist
307
+ }
308
+ if (destExists && !input.overwrite) {
309
+ return {
310
+ isError: true,
311
+ content: [
312
+ {
313
+ type: 'text',
314
+ text: JSON.stringify({
315
+ code: 'ALREADY_EXISTS',
316
+ message: `Destination already exists and overwrite is false: ${input.destination}`,
317
+ }),
318
+ },
319
+ ],
320
+ };
321
+ }
322
+ // Ensure parent directory exists
323
+ await fs.mkdir(path.dirname(destPath), { recursive: true });
324
+ // Move/rename
325
+ await fs.rename(srcPath, destPath);
326
+ return {
327
+ content: [
328
+ {
329
+ type: 'text',
330
+ text: JSON.stringify({
331
+ success: true,
332
+ source: srcPath,
333
+ destination: destPath,
334
+ }),
335
+ },
336
+ ],
337
+ };
338
+ }
339
+ catch (error) {
340
+ const err = error;
341
+ if (err.code === 'ENOENT') {
342
+ return {
343
+ isError: true,
344
+ content: [
345
+ {
346
+ type: 'text',
347
+ text: JSON.stringify({
348
+ code: 'FILE_NOT_FOUND',
349
+ message: `Source not found: ${input.source}`,
350
+ }),
351
+ },
352
+ ],
353
+ };
354
+ }
355
+ if (err.code === 'EACCES') {
356
+ return {
357
+ isError: true,
358
+ content: [
359
+ {
360
+ type: 'text',
361
+ text: JSON.stringify({
362
+ code: 'PERMISSION_DENIED',
363
+ message: `Permission denied`,
364
+ }),
365
+ },
366
+ ],
367
+ };
368
+ }
369
+ return {
370
+ isError: true,
371
+ content: [
372
+ {
373
+ type: 'text',
374
+ text: JSON.stringify({
375
+ code: 'UNKNOWN_ERROR',
376
+ message: `Error moving: ${err.message}`,
377
+ }),
378
+ },
379
+ ],
380
+ };
381
+ }
382
+ }
383
+ /**
384
+ * Delete a file or directory.
385
+ */
386
+ async function deleteFileImpl(input) {
387
+ try {
388
+ const absolutePath = path.resolve(input.path);
389
+ // Check what type of path this is
390
+ const stats = await fs.stat(absolutePath);
391
+ if (stats.isDirectory()) {
392
+ if (!input.recursive) {
393
+ // Check if directory is empty
394
+ const entries = await fs.readdir(absolutePath);
395
+ if (entries.length > 0) {
396
+ return {
397
+ isError: true,
398
+ content: [
399
+ {
400
+ type: 'text',
401
+ text: JSON.stringify({
402
+ code: 'DIRECTORY_NOT_EMPTY',
403
+ message: `Directory is not empty and recursive is false: ${input.path}`,
404
+ }),
405
+ },
406
+ ],
407
+ };
408
+ }
409
+ }
410
+ await fs.rm(absolutePath, { recursive: input.recursive, force: input.force });
411
+ }
412
+ else {
413
+ await fs.unlink(absolutePath);
414
+ }
415
+ return {
416
+ content: [
417
+ {
418
+ type: 'text',
419
+ text: JSON.stringify({
420
+ success: true,
421
+ path: absolutePath,
422
+ }),
423
+ },
424
+ ],
425
+ };
426
+ }
427
+ catch (error) {
428
+ const err = error;
429
+ if (input.force) {
430
+ return {
431
+ content: [
432
+ {
433
+ type: 'text',
434
+ text: JSON.stringify({
435
+ success: true,
436
+ path: path.resolve(input.path),
437
+ note: 'Force mode - errors ignored',
438
+ }),
439
+ },
440
+ ],
441
+ };
442
+ }
443
+ if (err.code === 'ENOENT') {
444
+ return {
445
+ isError: true,
446
+ content: [
447
+ {
448
+ type: 'text',
449
+ text: JSON.stringify({
450
+ code: 'FILE_NOT_FOUND',
451
+ message: `Path not found: ${input.path}`,
452
+ }),
453
+ },
454
+ ],
455
+ };
456
+ }
457
+ if (err.code === 'EACCES') {
458
+ return {
459
+ isError: true,
460
+ content: [
461
+ {
462
+ type: 'text',
463
+ text: JSON.stringify({
464
+ code: 'PERMISSION_DENIED',
465
+ message: `Permission denied: ${input.path}`,
466
+ }),
467
+ },
468
+ ],
469
+ };
470
+ }
471
+ return {
472
+ isError: true,
473
+ content: [
474
+ {
475
+ type: 'text',
476
+ text: JSON.stringify({
477
+ code: 'UNKNOWN_ERROR',
478
+ message: `Error deleting: ${err.message}`,
479
+ }),
480
+ },
481
+ ],
482
+ };
483
+ }
484
+ }
485
+ /**
486
+ * Register file writing tools with the MCP server.
487
+ */
488
+ export function registerWriteTools(server) {
489
+ // write_file tool
490
+ server.tool('write_file', 'Write content to a file', {
491
+ path: z.string().describe('Path to write to'),
492
+ content: z.string().describe('Content to write'),
493
+ encoding: z.string().optional().describe('File encoding (default: utf-8)'),
494
+ create_dirs: z.boolean().optional().describe('Create parent directories'),
495
+ overwrite: z.boolean().optional().describe('Overwrite if exists'),
496
+ backup: z.boolean().optional().describe('Create backup before overwrite'),
497
+ }, async (args) => {
498
+ const input = WriteFileInputSchema.parse(args);
499
+ return await writeFileImpl(input);
500
+ });
501
+ // create_directory tool
502
+ server.tool('create_directory', 'Create a directory', {
503
+ path: z.string().describe('Path to create'),
504
+ recursive: z.boolean().optional().describe('Create parent directories'),
505
+ }, async (args) => {
506
+ const input = CreateDirectoryInputSchema.parse(args);
507
+ return await createDirectoryImpl(input);
508
+ });
509
+ // copy_file tool
510
+ server.tool('copy_file', 'Copy a file or directory', {
511
+ source: z.string().describe('Source path'),
512
+ destination: z.string().describe('Destination path'),
513
+ overwrite: z.boolean().optional().describe('Overwrite if exists'),
514
+ recursive: z.boolean().optional().describe('Copy directories recursively'),
515
+ }, async (args) => {
516
+ const input = CopyFileInputSchema.parse(args);
517
+ return await copyFileImpl(input);
518
+ });
519
+ // move_file tool
520
+ server.tool('move_file', 'Move or rename a file or directory', {
521
+ source: z.string().describe('Source path'),
522
+ destination: z.string().describe('Destination path'),
523
+ overwrite: z.boolean().optional().describe('Overwrite if exists'),
524
+ }, async (args) => {
525
+ const input = MoveFileInputSchema.parse(args);
526
+ return await moveFileImpl(input);
527
+ });
528
+ // delete_file tool
529
+ server.tool('delete_file', 'Delete a file or directory', {
530
+ path: z.string().describe('Path to delete'),
531
+ recursive: z.boolean().optional().describe('Delete directories recursively'),
532
+ force: z.boolean().optional().describe('Ignore errors'),
533
+ }, async (args) => {
534
+ const input = DeleteFileInputSchema.parse(args);
535
+ return await deleteFileImpl(input);
536
+ });
537
+ }
538
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"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"}