@mcp-consultant-tools/sharepoint 27.0.0-beta.1 → 28.0.0-beta.10

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 (69) hide show
  1. package/build/cli/commands/index.d.ts +8 -0
  2. package/build/cli/commands/index.d.ts.map +1 -0
  3. package/build/cli/commands/index.js +9 -0
  4. package/build/cli/commands/index.js.map +1 -0
  5. package/build/cli/commands/read-commands.d.ts +9 -0
  6. package/build/cli/commands/read-commands.d.ts.map +1 -0
  7. package/build/cli/commands/read-commands.js +347 -0
  8. package/build/cli/commands/read-commands.js.map +1 -0
  9. package/build/cli/output.d.ts +23 -0
  10. package/build/cli/output.d.ts.map +1 -0
  11. package/build/cli/output.js +31 -0
  12. package/build/cli/output.js.map +1 -0
  13. package/build/cli.d.ts +9 -0
  14. package/build/cli.d.ts.map +1 -0
  15. package/build/cli.js +27 -0
  16. package/build/cli.js.map +1 -0
  17. package/build/context-factory.d.ts +4 -0
  18. package/build/context-factory.d.ts.map +1 -0
  19. package/build/context-factory.js +89 -0
  20. package/build/context-factory.js.map +1 -0
  21. package/build/index.d.ts +13 -5
  22. package/build/index.d.ts.map +1 -1
  23. package/build/index.js +49 -23
  24. package/build/index.js.map +1 -1
  25. package/build/prompts/index.d.ts +7 -0
  26. package/build/prompts/index.d.ts.map +1 -0
  27. package/build/prompts/index.js +6 -0
  28. package/build/prompts/index.js.map +1 -0
  29. package/build/prompts/templates.d.ts +11 -0
  30. package/build/prompts/templates.d.ts.map +1 -0
  31. package/build/prompts/templates.js +462 -0
  32. package/build/prompts/templates.js.map +1 -0
  33. package/build/services/file-operations-service.d.ts +52 -0
  34. package/build/services/file-operations-service.d.ts.map +1 -0
  35. package/build/services/file-operations-service.js +441 -0
  36. package/build/services/file-operations-service.js.map +1 -0
  37. package/build/services/index.d.ts +6 -0
  38. package/build/services/index.d.ts.map +1 -0
  39. package/build/services/index.js +4 -0
  40. package/build/services/index.js.map +1 -0
  41. package/build/services/list-service.d.ts +25 -0
  42. package/build/services/list-service.d.ts.map +1 -0
  43. package/build/services/list-service.js +558 -0
  44. package/build/services/list-service.js.map +1 -0
  45. package/build/services/sharepoint-service.d.ts +59 -0
  46. package/build/services/sharepoint-service.d.ts.map +1 -0
  47. package/build/services/sharepoint-service.js +465 -0
  48. package/build/services/sharepoint-service.js.map +1 -0
  49. package/build/tools/index.d.ts +8 -0
  50. package/build/tools/index.d.ts.map +1 -0
  51. package/build/tools/index.js +9 -0
  52. package/build/tools/index.js.map +1 -0
  53. package/build/tools/read-tools.d.ts +3 -5
  54. package/build/tools/read-tools.d.ts.map +1 -1
  55. package/build/tools/read-tools.js +22 -39
  56. package/build/tools/read-tools.js.map +1 -1
  57. package/build/tools/write-tools.d.ts +2 -3
  58. package/build/tools/write-tools.d.ts.map +1 -1
  59. package/build/tools/write-tools.js +13 -19
  60. package/build/tools/write-tools.js.map +1 -1
  61. package/build/types.d.ts +16 -0
  62. package/build/types.d.ts.map +1 -0
  63. package/build/types.js +2 -0
  64. package/build/types.js.map +1 -0
  65. package/build/utils/tool-examples.d.ts +1 -10
  66. package/build/utils/tool-examples.d.ts.map +1 -1
  67. package/build/utils/tool-examples.js +1 -14
  68. package/build/utils/tool-examples.js.map +1 -1
  69. package/package.json +5 -3
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CLI Commands barrel export + combined registration
3
+ */
4
+ import type { Command } from 'commander';
5
+ import type { ServiceContext } from '../../context-factory.js';
6
+ export declare function registerAllCommands(program: Command, ctx: ServiceContext): void;
7
+ export { registerReadCommands } from './read-commands.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAE/E;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI Commands barrel export + combined registration
3
+ */
4
+ import { registerReadCommands } from './read-commands.js';
5
+ export function registerAllCommands(program, ctx) {
6
+ registerReadCommands(program, ctx);
7
+ }
8
+ export { registerReadCommands } from './read-commands.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAmB;IACvE,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SharePoint Read CLI Commands
3
+ *
4
+ * Maps all 16 read-only MCP tools to Commander CLI commands.
5
+ */
6
+ import type { Command } from 'commander';
7
+ import type { ServiceContext } from '../../context-factory.js';
8
+ export declare function registerReadCommands(program: Command, ctx: ServiceContext): void;
9
+ //# sourceMappingURL=read-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/read-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAuVhF"}
@@ -0,0 +1,347 @@
1
+ /**
2
+ * SharePoint Read CLI Commands
3
+ *
4
+ * Maps all 16 read-only MCP tools to Commander CLI commands.
5
+ */
6
+ import { outputResult, handleCliError } from '../output.js';
7
+ export function registerReadCommands(program, ctx) {
8
+ // spo-list-sites
9
+ program
10
+ .command('list-sites')
11
+ .description('List all configured SharePoint sites (active and inactive)')
12
+ .action(async () => {
13
+ try {
14
+ const sites = ctx.sharepoint.getAllSites();
15
+ outputResult({
16
+ fileName: 'list-sites',
17
+ data: sites,
18
+ summary: `Found ${sites.length} configured site(s):\n` +
19
+ sites.map((s) => ` - ${s.id}: ${s.name} (${s.active ? 'active' : 'inactive'})`).join('\n'),
20
+ });
21
+ }
22
+ catch (error) {
23
+ handleCliError(error);
24
+ }
25
+ });
26
+ // spo-get-site-info
27
+ program
28
+ .command('get-site-info')
29
+ .description('Get detailed site information including metadata')
30
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
31
+ .action(async (opts) => {
32
+ try {
33
+ const siteInfo = await ctx.sharepoint.getSiteInfo(opts.siteId);
34
+ outputResult({
35
+ fileName: `site-info-${opts.siteId}`,
36
+ data: siteInfo,
37
+ summary: `Site: ${siteInfo.displayName || opts.siteId}\nURL: ${siteInfo.webUrl || 'N/A'}`,
38
+ });
39
+ }
40
+ catch (error) {
41
+ handleCliError(error);
42
+ }
43
+ });
44
+ // spo-test-connection
45
+ program
46
+ .command('test-connection')
47
+ .description('Test connectivity to a SharePoint site and verify permissions')
48
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
49
+ .action(async (opts) => {
50
+ try {
51
+ const result = await ctx.sharepoint.testConnection(opts.siteId);
52
+ outputResult({
53
+ fileName: `test-connection-${opts.siteId}`,
54
+ data: result,
55
+ summary: `Connection test: ${result.success ? 'SUCCESS' : 'FAILED'}`,
56
+ });
57
+ }
58
+ catch (error) {
59
+ handleCliError(error);
60
+ }
61
+ });
62
+ // spo-list-drives
63
+ program
64
+ .command('list-drives')
65
+ .description('List all document libraries (drives) in a SharePoint site')
66
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
67
+ .action(async (opts) => {
68
+ try {
69
+ const drives = await ctx.sharepoint.listDrives(opts.siteId);
70
+ outputResult({
71
+ fileName: `drives-${opts.siteId}`,
72
+ data: drives,
73
+ summary: `Found ${drives.length} document library/libraries:\n` +
74
+ drives.map((d) => ` - ${d.name} (${d.id})`).join('\n'),
75
+ });
76
+ }
77
+ catch (error) {
78
+ handleCliError(error);
79
+ }
80
+ });
81
+ // spo-get-drive-info
82
+ program
83
+ .command('get-drive-info')
84
+ .description('Get detailed document library information')
85
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
86
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
87
+ .action(async (opts) => {
88
+ try {
89
+ const driveInfo = await ctx.sharepoint.getDriveInfo(opts.siteId, opts.driveId);
90
+ outputResult({
91
+ fileName: `drive-info-${opts.driveId}`,
92
+ data: driveInfo,
93
+ summary: `Drive: ${driveInfo.name || opts.driveId}\nType: ${driveInfo.driveType || 'N/A'}`,
94
+ });
95
+ }
96
+ catch (error) {
97
+ handleCliError(error);
98
+ }
99
+ });
100
+ // spo-clear-cache
101
+ program
102
+ .command('clear-cache')
103
+ .description('Clear cached SharePoint responses')
104
+ .option('--site-id <siteId>', 'Clear cache for specific site only')
105
+ .option('--pattern <pattern>', 'Clear only entries matching this pattern')
106
+ .action(async (opts) => {
107
+ try {
108
+ const clearedCount = ctx.sharepoint.clearCache(opts.pattern, opts.siteId);
109
+ outputResult({
110
+ fileName: 'clear-cache',
111
+ data: { clearedCount },
112
+ summary: `Cleared ${clearedCount} cache entries`,
113
+ });
114
+ }
115
+ catch (error) {
116
+ handleCliError(error);
117
+ }
118
+ });
119
+ // spo-list-items
120
+ program
121
+ .command('list-items')
122
+ .description('List all files and folders in a document library or folder')
123
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
124
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
125
+ .option('--folder-id <folderId>', 'Folder ID (defaults to root)')
126
+ .action(async (opts) => {
127
+ try {
128
+ const items = await ctx.lists.listItems(opts.siteId, opts.driveId, opts.folderId);
129
+ outputResult({
130
+ fileName: `items-${opts.driveId}`,
131
+ data: items,
132
+ summary: `Found ${items.length} item(s):\n` +
133
+ items.slice(0, 20).map((i) => ` - ${i.folder ? '[folder]' : '[file]'} ${i.name}`).join('\n') +
134
+ (items.length > 20 ? `\n ... and ${items.length - 20} more` : ''),
135
+ });
136
+ }
137
+ catch (error) {
138
+ handleCliError(error);
139
+ }
140
+ });
141
+ // spo-get-item
142
+ program
143
+ .command('get-item')
144
+ .description('Get detailed file or folder metadata by ID')
145
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
146
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
147
+ .requiredOption('--item-id <itemId>', 'Item ID')
148
+ .action(async (opts) => {
149
+ try {
150
+ const item = await ctx.lists.getItem(opts.siteId, opts.driveId, opts.itemId);
151
+ outputResult({
152
+ fileName: `item-${opts.itemId}`,
153
+ data: item,
154
+ summary: `Item: ${item.name || opts.itemId}\nType: ${item.folder ? 'Folder' : 'File'}`,
155
+ });
156
+ }
157
+ catch (error) {
158
+ handleCliError(error);
159
+ }
160
+ });
161
+ // spo-get-item-by-path
162
+ program
163
+ .command('get-item-by-path')
164
+ .description('Get file or folder metadata by path (relative to drive root)')
165
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
166
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
167
+ .requiredOption('--path <path>', 'Item path relative to drive root')
168
+ .action(async (opts) => {
169
+ try {
170
+ const item = await ctx.lists.getItemByPath(opts.siteId, opts.driveId, opts.path);
171
+ outputResult({
172
+ fileName: `item-by-path`,
173
+ data: item,
174
+ summary: `Item: ${item.name || opts.path}\nType: ${item.folder ? 'Folder' : 'File'}`,
175
+ });
176
+ }
177
+ catch (error) {
178
+ handleCliError(error);
179
+ }
180
+ });
181
+ // spo-search-items
182
+ program
183
+ .command('search-items')
184
+ .description('Search for files by filename or metadata')
185
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
186
+ .requiredOption('--query <query>', 'Search query')
187
+ .option('--drive-id <driveId>', 'Limit search to specific drive')
188
+ .option('--limit <limit>', 'Maximum results', parseInt)
189
+ .action(async (opts) => {
190
+ try {
191
+ const result = await ctx.lists.searchItems(opts.siteId, opts.query, opts.driveId, opts.limit);
192
+ const items = result.items || [];
193
+ outputResult({
194
+ fileName: `search-${opts.query.replace(/[^a-zA-Z0-9]/g, '_')}`,
195
+ data: result,
196
+ summary: `Search "${opts.query}": ${items.length} result(s)\n` +
197
+ items.slice(0, 10).map((i) => ` - ${i.name}`).join('\n') +
198
+ (items.length > 10 ? `\n ... and ${items.length - 10} more` : ''),
199
+ });
200
+ }
201
+ catch (error) {
202
+ handleCliError(error);
203
+ }
204
+ });
205
+ // spo-get-recent-items
206
+ program
207
+ .command('get-recent-items')
208
+ .description('Get recently modified items in a document library')
209
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
210
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
211
+ .option('--limit <limit>', 'Maximum results (default: 20)', parseInt)
212
+ .option('--days <days>', 'Days back to search (default: 30)', parseInt)
213
+ .action(async (opts) => {
214
+ try {
215
+ const items = await ctx.lists.getRecentItems(opts.siteId, opts.driveId, opts.limit, opts.days);
216
+ outputResult({
217
+ fileName: `recent-items-${opts.driveId}`,
218
+ data: items,
219
+ summary: `Found ${items.length} recently modified item(s):\n` +
220
+ items.slice(0, 10).map((i) => ` - ${i.name} (${i.lastModifiedDateTime})`).join('\n') +
221
+ (items.length > 10 ? `\n ... and ${items.length - 10} more` : ''),
222
+ });
223
+ }
224
+ catch (error) {
225
+ handleCliError(error);
226
+ }
227
+ });
228
+ // spo-get-folder-structure
229
+ program
230
+ .command('get-folder-structure')
231
+ .description('Get recursive folder tree structure')
232
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
233
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
234
+ .option('--folder-id <folderId>', 'Root folder ID (defaults to drive root)')
235
+ .option('--depth <depth>', 'Recursion depth (default: 3, max: 10)', parseInt)
236
+ .action(async (opts) => {
237
+ try {
238
+ const tree = await ctx.lists.getFolderStructure(opts.siteId, opts.driveId, opts.folderId, opts.depth);
239
+ outputResult({
240
+ fileName: `folder-structure-${opts.driveId}`,
241
+ data: tree,
242
+ summary: `Folder structure retrieved for drive ${opts.driveId} (depth: ${opts.depth || 3})`,
243
+ });
244
+ }
245
+ catch (error) {
246
+ handleCliError(error);
247
+ }
248
+ });
249
+ // spo-get-crm-doc-locs
250
+ program
251
+ .command('get-crm-doc-locs')
252
+ .description('Get SharePoint document locations configured in PowerPlatform Dataverse')
253
+ .option('--entity-name <entityName>', 'Filter by entity logical name')
254
+ .option('--record-id <recordId>', 'Filter by specific record ID (GUID)')
255
+ .action(async (opts) => {
256
+ try {
257
+ const ppService = ctx.getPowerPlatformService();
258
+ const locations = await ctx.lists.getCrmDocumentLocations(ppService, opts.entityName, opts.recordId);
259
+ outputResult({
260
+ fileName: 'crm-doc-locs',
261
+ data: locations,
262
+ summary: `Found ${locations.length} CRM document location(s)`,
263
+ });
264
+ }
265
+ catch (error) {
266
+ handleCliError(error);
267
+ }
268
+ });
269
+ // spo-validate-doc-loc
270
+ program
271
+ .command('validate-doc-loc')
272
+ .description('Validate a PowerPlatform document location configuration')
273
+ .requiredOption('--document-location-id <id>', 'GUID of the sharepointdocumentlocation record')
274
+ .action(async (opts) => {
275
+ try {
276
+ const ppService = ctx.getPowerPlatformService();
277
+ const result = await ctx.lists.validateDocumentLocation(ppService, opts.documentLocationId);
278
+ outputResult({
279
+ fileName: `validate-doc-loc-${opts.documentLocationId}`,
280
+ data: result,
281
+ summary: `Validation status: ${result.status?.toUpperCase() || 'UNKNOWN'}`,
282
+ });
283
+ }
284
+ catch (error) {
285
+ handleCliError(error);
286
+ }
287
+ });
288
+ // spo-verify-doc-mig
289
+ program
290
+ .command('verify-doc-mig')
291
+ .description('Verify that documents were successfully migrated between SharePoint folders')
292
+ .requiredOption('--source-site-id <sourceSiteId>', 'Source SharePoint site ID')
293
+ .requiredOption('--source-path <sourcePath>', 'Source folder path')
294
+ .requiredOption('--target-site-id <targetSiteId>', 'Target SharePoint site ID')
295
+ .requiredOption('--target-path <targetPath>', 'Target folder path')
296
+ .action(async (opts) => {
297
+ try {
298
+ const ppService = ctx.getPowerPlatformService();
299
+ const result = await ctx.lists.verifyDocumentMigration(ppService, opts.sourceSiteId, opts.sourcePath, opts.targetSiteId, opts.targetPath);
300
+ outputResult({
301
+ fileName: 'verify-doc-mig',
302
+ data: result,
303
+ summary: `Migration verification: ${result.status?.toUpperCase() || 'UNKNOWN'}\n` +
304
+ `Success rate: ${result.successRate || 0}%`,
305
+ });
306
+ }
307
+ catch (error) {
308
+ handleCliError(error);
309
+ }
310
+ });
311
+ // spo-download-file
312
+ program
313
+ .command('download-file')
314
+ .description('Download file content from SharePoint')
315
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
316
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
317
+ .option('--item-id <itemId>', 'Item ID (use this OR --path)')
318
+ .option('--path <path>', 'File path relative to drive root (use this OR --item-id)')
319
+ .action(async (opts) => {
320
+ try {
321
+ if (!opts.itemId && !opts.path) {
322
+ handleCliError(new Error("Provide either --item-id or --path to identify the file."));
323
+ return;
324
+ }
325
+ const byPath = !opts.itemId;
326
+ const identifier = opts.itemId || opts.path;
327
+ const result = await ctx.files.downloadFile(opts.siteId, opts.driveId, identifier, byPath);
328
+ outputResult({
329
+ fileName: `download-${result.fileName || 'file'}`,
330
+ data: {
331
+ fileName: result.fileName,
332
+ mimeType: result.mimeType,
333
+ encoding: result.encoding,
334
+ size: result.size,
335
+ itemId: result.itemId,
336
+ webUrl: result.webUrl,
337
+ content: result.content,
338
+ },
339
+ summary: `Downloaded: ${result.fileName}\nSize: ${result.size} bytes\nEncoding: ${result.encoding}`,
340
+ });
341
+ }
342
+ catch (error) {
343
+ handleCliError(error);
344
+ }
345
+ });
346
+ }
347
+ //# sourceMappingURL=read-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/read-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CLI Output Helper
3
+ *
4
+ * Saves full JSON responses to `.mcp-spo-cache/` and prints
5
+ * a concise summary to stdout.
6
+ */
7
+ export interface OutputOptions {
8
+ /** Base filename (without extension) for the cached JSON file */
9
+ fileName: string;
10
+ /** Full data object to persist */
11
+ data: unknown;
12
+ /** Human-readable summary printed to stdout */
13
+ summary: string;
14
+ }
15
+ /**
16
+ * Write full JSON to cache directory and print summary to stdout.
17
+ */
18
+ export declare function outputResult({ fileName, data, summary }: OutputOptions): void;
19
+ /**
20
+ * Print an error message to stderr and exit with code 1.
21
+ */
22
+ export declare function handleCliError(error: unknown): void;
23
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,GAAG,IAAI,CAW7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAInD"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * CLI Output Helper
3
+ *
4
+ * Saves full JSON responses to `.mcp-spo-cache/` and prints
5
+ * a concise summary to stdout.
6
+ */
7
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ const CACHE_DIR = '.mcp-spo-cache';
10
+ /**
11
+ * Write full JSON to cache directory and print summary to stdout.
12
+ */
13
+ export function outputResult({ fileName, data, summary }) {
14
+ // Ensure cache directory exists
15
+ if (!existsSync(CACHE_DIR)) {
16
+ mkdirSync(CACHE_DIR, { recursive: true });
17
+ }
18
+ const filePath = join(CACHE_DIR, `${fileName}.json`);
19
+ writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
20
+ console.log(summary);
21
+ console.log(`\nFull output: ${filePath}`);
22
+ }
23
+ /**
24
+ * Print an error message to stderr and exit with code 1.
25
+ */
26
+ export function handleCliError(error) {
27
+ const message = error instanceof Error ? error.message : String(error);
28
+ console.error(`Error: ${message}`);
29
+ process.exit(1);
30
+ }
31
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAWnC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAiB;IACrE,gCAAgC;IAChC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IACrD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
package/build/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @mcp-consultant-tools/sharepoint CLI
4
+ *
5
+ * Command-line interface for SharePoint Online operations.
6
+ * Reuses the same ServiceContext and services as the MCP server.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/build/cli.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @mcp-consultant-tools/sharepoint CLI
4
+ *
5
+ * Command-line interface for SharePoint Online operations.
6
+ * Reuses the same ServiceContext and services as the MCP server.
7
+ */
8
+ import { createCliProgram, loadEnvForCli } from '@mcp-consultant-tools/core';
9
+ import { createServiceContext } from './context-factory.js';
10
+ import { registerAllCommands } from './cli/commands/index.js';
11
+ const program = createCliProgram({
12
+ name: 'mcp-spo-cli',
13
+ description: 'SharePoint Online CLI - site management, document libraries, and file access',
14
+ version: '27.0.0',
15
+ });
16
+ // Load env before parsing (--env-file handled by commander hook)
17
+ program.hook('preAction', (thisCommand) => {
18
+ const opts = thisCommand.opts();
19
+ loadEnvForCli(opts.envFile);
20
+ });
21
+ const ctx = createServiceContext();
22
+ registerAllCommands(program, ctx);
23
+ program.parseAsync(process.argv).catch((error) => {
24
+ console.error('CLI error:', error.message);
25
+ process.exit(1);
26
+ });
27
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,gBAAgB,CAAC;IAC/B,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,8EAA8E;IAC3F,OAAO,EAAE,QAAQ;CAClB,CAAC,CAAC;AAEH,iEAAiE;AACjE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAgB,EAAE,EAAE;IAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;AACnC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAElC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAU,EAAE,EAAE;IACpD,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ServiceContext } from './types.js';
2
+ export type { ServiceContext } from './types.js';
3
+ export declare function createServiceContext(): ServiceContext;
4
+ //# sourceMappingURL=context-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-factory.d.ts","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,oBAAoB,IAAI,cAAc,CAsFrD"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Shared service context factory - used by both MCP server and CLI.
3
+ */
4
+ import { SharePointService } from './services/sharepoint-service.js';
5
+ import { ListService } from './services/list-service.js';
6
+ import { FileOperationsService } from './services/file-operations-service.js';
7
+ export function createServiceContext() {
8
+ let service = null;
9
+ let listService = null;
10
+ let fileOps = null;
11
+ function getSharePointService() {
12
+ if (!service) {
13
+ const missingConfig = [];
14
+ let resources = [];
15
+ if (process.env.SHAREPOINT_SITES) {
16
+ try {
17
+ resources = JSON.parse(process.env.SHAREPOINT_SITES);
18
+ }
19
+ catch {
20
+ throw new Error('Failed to parse SHAREPOINT_SITES JSON');
21
+ }
22
+ }
23
+ else if (process.env.SHAREPOINT_SITE_URL) {
24
+ resources = [{
25
+ id: 'default',
26
+ name: 'Default SharePoint Site',
27
+ siteUrl: process.env.SHAREPOINT_SITE_URL,
28
+ active: true,
29
+ }];
30
+ }
31
+ else {
32
+ missingConfig.push('SHAREPOINT_SITES or SHAREPOINT_SITE_URL');
33
+ }
34
+ if (!process.env.SHAREPOINT_TENANT_ID)
35
+ missingConfig.push('SHAREPOINT_TENANT_ID');
36
+ if (!process.env.SHAREPOINT_CLIENT_ID)
37
+ missingConfig.push('SHAREPOINT_CLIENT_ID');
38
+ if (!process.env.SHAREPOINT_CLIENT_SECRET)
39
+ missingConfig.push('SHAREPOINT_CLIENT_SECRET');
40
+ if (missingConfig.length > 0) {
41
+ throw new Error(`Missing SharePoint configuration: ${missingConfig.join(', ')}`);
42
+ }
43
+ const config = {
44
+ sites: resources,
45
+ authMethod: 'entra-id',
46
+ tenantId: process.env.SHAREPOINT_TENANT_ID,
47
+ clientId: process.env.SHAREPOINT_CLIENT_ID,
48
+ clientSecret: process.env.SHAREPOINT_CLIENT_SECRET,
49
+ };
50
+ service = new SharePointService(config);
51
+ console.error('SharePoint service initialized');
52
+ }
53
+ return service;
54
+ }
55
+ function getListService() {
56
+ if (!listService) {
57
+ listService = new ListService(getSharePointService());
58
+ }
59
+ return listService;
60
+ }
61
+ function getFileOperationsService() {
62
+ if (!fileOps) {
63
+ fileOps = new FileOperationsService(getSharePointService(), {
64
+ maxDownloadSizeMB: parseInt(process.env.SHAREPOINT_MAX_DOWNLOAD_SIZE_MB || '50', 10),
65
+ maxUploadSizeMB: parseInt(process.env.SHAREPOINT_MAX_UPLOAD_SIZE_MB || '100', 10),
66
+ });
67
+ }
68
+ return fileOps;
69
+ }
70
+ return {
71
+ get sharepoint() { return getSharePointService(); },
72
+ get lists() { return getListService(); },
73
+ get files() { return getFileOperationsService(); },
74
+ getPowerPlatformService() {
75
+ throw new Error('PowerPlatform integration not available in standalone SharePoint package.');
76
+ },
77
+ checkWriteEnabled() {
78
+ if (process.env.SHAREPOINT_ENABLE_WRITE !== 'true') {
79
+ throw new Error('Write operations are disabled. Set SHAREPOINT_ENABLE_WRITE=true to enable.');
80
+ }
81
+ },
82
+ checkDeleteEnabled() {
83
+ if (process.env.SHAREPOINT_ENABLE_DELETE !== 'true') {
84
+ throw new Error('Delete operations are disabled. Set SHAREPOINT_ENABLE_DELETE=true to enable.');
85
+ }
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=context-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-factory.js","sourceRoot":"","sources":["../src/context-factory.ts"],"names":[],"mappings":"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"}