@mcp-consultant-tools/sharepoint 28.0.0-beta.7 → 28.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.
@@ -0,0 +1,9 @@
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
+ export { registerWriteCommands } from './write-commands.js';
9
+ //# 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;AAI/D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAG/E;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CLI Commands barrel export + combined registration
3
+ */
4
+ import { registerReadCommands } from './read-commands.js';
5
+ import { registerWriteCommands } from './write-commands.js';
6
+ export function registerAllCommands(program, ctx) {
7
+ registerReadCommands(program, ctx);
8
+ registerWriteCommands(program, ctx);
9
+ }
10
+ export { registerReadCommands } from './read-commands.js';
11
+ export { registerWriteCommands } from './write-commands.js';
12
+ //# 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;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,GAAmB;IACvE,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,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,11 @@
1
+ /**
2
+ * SharePoint Write CLI Commands
3
+ *
4
+ * Maps 6 write MCP tools to Commander CLI commands under the `write` subcommand group.
5
+ * Requires SHAREPOINT_ENABLE_WRITE=true for upload/create-folder/move/copy/rename.
6
+ * Requires SHAREPOINT_ENABLE_DELETE=true for delete.
7
+ */
8
+ import type { Command } from 'commander';
9
+ import type { ServiceContext } from '../../context-factory.js';
10
+ export declare function registerWriteCommands(program: Command, ctx: ServiceContext): void;
11
+ //# sourceMappingURL=write-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/write-commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAoLjF"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * SharePoint Write CLI Commands
3
+ *
4
+ * Maps 6 write MCP tools to Commander CLI commands under the `write` subcommand group.
5
+ * Requires SHAREPOINT_ENABLE_WRITE=true for upload/create-folder/move/copy/rename.
6
+ * Requires SHAREPOINT_ENABLE_DELETE=true for delete.
7
+ */
8
+ import { outputResult, handleCliError } from '../output.js';
9
+ export function registerWriteCommands(program, ctx) {
10
+ const write = program.command('write').description('Write operations (upload, create folder, move, copy, rename, delete)');
11
+ // spo-upload-file
12
+ write
13
+ .command('upload')
14
+ .description('Upload a file to a SharePoint document library. Requires SHAREPOINT_ENABLE_WRITE=true.')
15
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
16
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
17
+ .requiredOption('--path <path>', 'Target file path relative to drive root (including filename)')
18
+ .requiredOption('--content <content>', 'File content (text string or base64-encoded binary)')
19
+ .option('--encoding <encoding>', "Content encoding: 'utf-8' for text (default), 'base64' for binary", 'utf-8')
20
+ .option('--overwrite', 'Overwrite if file exists (default: false)')
21
+ .action(async (opts) => {
22
+ try {
23
+ ctx.checkWriteEnabled();
24
+ const result = await ctx.files.uploadFile(opts.siteId, opts.driveId, opts.path, opts.content, opts.encoding || 'utf-8', opts.overwrite || false);
25
+ outputResult({
26
+ fileName: `upload-${result.name || 'file'}`,
27
+ data: result,
28
+ summary: `Uploaded: ${result.name}\nSize: ${result.size} bytes\nURL: ${result.webUrl || 'N/A'}`,
29
+ });
30
+ }
31
+ catch (error) {
32
+ handleCliError(error);
33
+ }
34
+ });
35
+ // spo-create-folder
36
+ write
37
+ .command('create-folder')
38
+ .description('Create a new folder in a SharePoint document library. Requires SHAREPOINT_ENABLE_WRITE=true.')
39
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
40
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
41
+ .requiredOption('--parent-path <parentPath>', "Parent folder path (use '/' for drive root)")
42
+ .requiredOption('--folder-name <folderName>', 'Name for the new folder')
43
+ .action(async (opts) => {
44
+ try {
45
+ ctx.checkWriteEnabled();
46
+ const result = await ctx.files.createFolder(opts.siteId, opts.driveId, opts.parentPath, opts.folderName);
47
+ outputResult({
48
+ fileName: `create-folder-${opts.folderName}`,
49
+ data: result,
50
+ summary: `Folder created: ${result.name}\nURL: ${result.webUrl || 'N/A'}`,
51
+ });
52
+ }
53
+ catch (error) {
54
+ handleCliError(error);
55
+ }
56
+ });
57
+ // spo-move-item
58
+ write
59
+ .command('move')
60
+ .description('Move a file or folder to a new location. Requires SHAREPOINT_ENABLE_WRITE=true.')
61
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
62
+ .requiredOption('--drive-id <driveId>', 'Source drive ID')
63
+ .requiredOption('--item-id <itemId>', 'ID of the file or folder to move')
64
+ .requiredOption('--target-drive-id <targetDriveId>', 'Target drive ID (can be same as source)')
65
+ .requiredOption('--target-parent-path <targetParentPath>', 'Target parent folder path in the target drive')
66
+ .action(async (opts) => {
67
+ try {
68
+ ctx.checkWriteEnabled();
69
+ const result = await ctx.files.moveItem(opts.siteId, opts.driveId, opts.itemId, opts.targetDriveId, opts.targetParentPath);
70
+ outputResult({
71
+ fileName: `move-${opts.itemId}`,
72
+ data: result,
73
+ summary: `Moved: ${result.name}\n${result.message || ''}`,
74
+ });
75
+ }
76
+ catch (error) {
77
+ handleCliError(error);
78
+ }
79
+ });
80
+ // spo-copy-item
81
+ write
82
+ .command('copy')
83
+ .description('Copy a file or folder to a new location. Requires SHAREPOINT_ENABLE_WRITE=true.')
84
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
85
+ .requiredOption('--drive-id <driveId>', 'Source drive ID')
86
+ .requiredOption('--item-id <itemId>', 'ID of the file or folder to copy')
87
+ .requiredOption('--target-drive-id <targetDriveId>', 'Target drive ID')
88
+ .requiredOption('--target-parent-path <targetParentPath>', 'Target parent folder path in the target drive')
89
+ .option('--new-name <newName>', 'Optional new name for the copy (defaults to original name)')
90
+ .action(async (opts) => {
91
+ try {
92
+ ctx.checkWriteEnabled();
93
+ const result = await ctx.files.copyItem(opts.siteId, opts.driveId, opts.itemId, opts.targetDriveId, opts.targetParentPath, opts.newName);
94
+ outputResult({
95
+ fileName: `copy-${opts.itemId}`,
96
+ data: result,
97
+ summary: `Copy initiated: ${result.name}\n${result.message || ''}`,
98
+ });
99
+ }
100
+ catch (error) {
101
+ handleCliError(error);
102
+ }
103
+ });
104
+ // spo-rename-item
105
+ write
106
+ .command('rename')
107
+ .description('Rename a file or folder in SharePoint. Requires SHAREPOINT_ENABLE_WRITE=true.')
108
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
109
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
110
+ .requiredOption('--item-id <itemId>', 'ID of the file or folder to rename')
111
+ .requiredOption('--new-name <newName>', 'New name for the file or folder (include file extension for files)')
112
+ .action(async (opts) => {
113
+ try {
114
+ ctx.checkWriteEnabled();
115
+ const result = await ctx.files.renameItem(opts.siteId, opts.driveId, opts.itemId, opts.newName);
116
+ outputResult({
117
+ fileName: `rename-${opts.itemId}`,
118
+ data: result,
119
+ summary: `Renamed to: ${result.name}\n${result.message || ''}`,
120
+ });
121
+ }
122
+ catch (error) {
123
+ handleCliError(error);
124
+ }
125
+ });
126
+ // spo-delete-item
127
+ write
128
+ .command('delete')
129
+ .description('Delete a file or folder from SharePoint. Requires SHAREPOINT_ENABLE_DELETE=true. Item is moved to recycle bin.')
130
+ .requiredOption('--site-id <siteId>', 'Site ID from configuration')
131
+ .requiredOption('--drive-id <driveId>', 'Drive ID')
132
+ .requiredOption('--item-id <itemId>', 'ID of the file or folder to delete')
133
+ .option('--confirm', 'Confirm deletion (required for safety)')
134
+ .action(async (opts) => {
135
+ try {
136
+ ctx.checkDeleteEnabled();
137
+ if (!opts.confirm) {
138
+ handleCliError(new Error('Deletion requires --confirm flag. This is a safety mechanism to prevent accidental deletions.'));
139
+ return;
140
+ }
141
+ const result = await ctx.files.deleteItem(opts.siteId, opts.driveId, opts.itemId);
142
+ outputResult({
143
+ fileName: `delete-${opts.itemId}`,
144
+ data: result,
145
+ summary: `Deleted: ${result.name}\n${result.message || ''}`,
146
+ });
147
+ }
148
+ catch (error) {
149
+ handleCliError(error);
150
+ }
151
+ });
152
+ }
153
+ //# sourceMappingURL=write-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/write-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CLI Output Helper
3
+ *
4
+ * Saves full JSON responses to `.claude/.context/.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,CAY7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAInD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * CLI Output Helper
3
+ *
4
+ * Saves full JSON responses to `.claude/.context/.mcp-spo-cache/` and prints
5
+ * a concise summary to stdout.
6
+ */
7
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
8
+ import { join, resolve } 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
+ // Resolve cache under .claude/.context/ (always gitignored)
15
+ const cacheBase = resolve(process.cwd(), '.claude', '.context', CACHE_DIR);
16
+ if (!existsSync(cacheBase)) {
17
+ mkdirSync(cacheBase, { recursive: true });
18
+ }
19
+ const filePath = join(cacheBase, `${fileName}.json`);
20
+ writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
21
+ console.log(summary);
22
+ console.log(`\nFull output: ${filePath}`);
23
+ }
24
+ /**
25
+ * Print an error message to stderr and exit with code 1.
26
+ */
27
+ export function handleCliError(error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ console.error(`Error: ${message}`);
30
+ process.exit(1);
31
+ }
32
+ //# 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,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAWnC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAiB;IACrE,4DAA4D;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC3E,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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-consultant-tools/sharepoint",
3
- "version": "28.0.0-beta.7",
3
+ "version": "28.0.0",
4
4
  "description": "MCP server for SharePoint Online - site management, document libraries, and PowerPlatform validation",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",
@@ -41,10 +41,11 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@azure/msal-node": "^3.3.0",
44
- "@mcp-consultant-tools/core": "28.0.0-beta.7",
44
+ "@mcp-consultant-tools/core": "28.0.0",
45
45
  "@microsoft/microsoft-graph-client": "^3.0.7",
46
46
  "@modelcontextprotocol/sdk": "^1.0.4",
47
47
  "axios": "^1.8.3",
48
+ "commander": "^14.0.3",
48
49
  "express": "^4.21.0",
49
50
  "zod": "^3.24.1"
50
51
  },
@@ -54,6 +55,7 @@
54
55
  "typescript": "^5.8.2"
55
56
  },
56
57
  "bin": {
57
- "mcp-spo": "build/index.js"
58
+ "mcp-spo": "build/index.js",
59
+ "mcp-spo-cli": "build/cli.js"
58
60
  }
59
61
  }