ucm-mcp-server 6.7.0 → 6.7.1
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.
- package/dist/clients/UcmLocalApiClient.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/tools/authorization/SignOutTool.js +3 -0
- package/dist/tools/memory-graph/GraphExploreTool.js +2 -1
- package/dist/tools/memory-graph/GraphGetRelationshipsTool.js +2 -2
- package/dist/tools/sharepoint/SharePointReadFileTool.js +1 -1
- package/dist/tools/sharepoint/SharePointSearchTool.d.ts +1 -0
- package/dist/tools/sharepoint/SharePointSearchTool.js +11 -2
- package/package.json +1 -1
|
@@ -171,6 +171,7 @@ export declare class UcmLocalApiClient {
|
|
|
171
171
|
limit?: number;
|
|
172
172
|
offset?: number;
|
|
173
173
|
fileType?: string;
|
|
174
|
+
filesOnly?: boolean;
|
|
174
175
|
}): Promise<any>;
|
|
175
176
|
/**
|
|
176
177
|
* List folders and files in SharePoint with pagination
|
|
@@ -303,6 +304,7 @@ export declare class UcmLocalApiClient {
|
|
|
303
304
|
maxDepth?: number;
|
|
304
305
|
relationshipTypes?: string[];
|
|
305
306
|
entityTypes?: string[];
|
|
307
|
+
direction?: string;
|
|
306
308
|
limit?: number;
|
|
307
309
|
}): Promise<any>;
|
|
308
310
|
/**
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ async function main() {
|
|
|
12
12
|
program
|
|
13
13
|
.name('ucm-mcp-server')
|
|
14
14
|
.description('Universal Context Manager - Read the ucm_connect tool first to avoid mistakes')
|
|
15
|
-
.version('6.7.
|
|
15
|
+
.version('6.7.1')
|
|
16
16
|
.option('-u, --ucm-url <url>', 'UCM API base URL (defaults to https://ucm.utaba.ai)')
|
|
17
17
|
.option('-p, --port <port>', 'Server port', '3001')
|
|
18
18
|
.option('--log-level <level>', 'Log level', 'ERROR')
|
|
@@ -89,6 +89,9 @@ export class SignOutTool extends BaseToolController {
|
|
|
89
89
|
if (status === 400 && errorData?.error === 'INVALID_AUTH_TYPE') {
|
|
90
90
|
throw new McpError(McpErrorCode.InvalidRequest, `Invalid operation: This connection does not use user-delegated authentication.`);
|
|
91
91
|
}
|
|
92
|
+
if (status === 400 && errorData?.error === 'SSO_SIGNOUT_NOT_SUPPORTED') {
|
|
93
|
+
throw new McpError(McpErrorCode.InvalidRequest, errorData?.message || 'This connection uses SSO authentication. Sign out of UCM to revoke access.');
|
|
94
|
+
}
|
|
92
95
|
throw new McpError(McpErrorCode.InternalError, `API error: ${errorData?.message || error.message}`);
|
|
93
96
|
}
|
|
94
97
|
throw new McpError(McpErrorCode.InternalError, `Failed to revoke authorization: ${error.message}`);
|
|
@@ -38,7 +38,7 @@ export class GraphExploreTool extends BaseToolController {
|
|
|
38
38
|
},
|
|
39
39
|
direction: {
|
|
40
40
|
type: 'string',
|
|
41
|
-
enum: ['
|
|
41
|
+
enum: ['out', 'in', 'both'],
|
|
42
42
|
description: 'Traversal direction (default: both)'
|
|
43
43
|
},
|
|
44
44
|
limitPerType: {
|
|
@@ -58,6 +58,7 @@ export class GraphExploreTool extends BaseToolController {
|
|
|
58
58
|
maxDepth: depth,
|
|
59
59
|
relationshipTypes,
|
|
60
60
|
entityTypes,
|
|
61
|
+
direction,
|
|
61
62
|
limit: limitPerType
|
|
62
63
|
});
|
|
63
64
|
return JSON.stringify(result);
|
|
@@ -7,7 +7,7 @@ export class GraphGetRelationshipsTool extends BaseToolController {
|
|
|
7
7
|
}
|
|
8
8
|
get name() { return 'ucm_graph_get_relationships'; }
|
|
9
9
|
get description() {
|
|
10
|
-
return 'Get relationships for an entity with optional type filtering and direction control (
|
|
10
|
+
return 'Get relationships for an entity with optional type filtering and direction control (out, in, or both).';
|
|
11
11
|
}
|
|
12
12
|
get schema() { return GraphGetRelationshipsSchema; }
|
|
13
13
|
get inputSchema() {
|
|
@@ -29,7 +29,7 @@ export class GraphGetRelationshipsTool extends BaseToolController {
|
|
|
29
29
|
},
|
|
30
30
|
direction: {
|
|
31
31
|
type: 'string',
|
|
32
|
-
enum: ['
|
|
32
|
+
enum: ['out', 'in', 'both'],
|
|
33
33
|
description: 'Relationship direction (default: both)'
|
|
34
34
|
},
|
|
35
35
|
limit: {
|
|
@@ -111,7 +111,7 @@ export class SharePointReadFileTool extends BaseToolController {
|
|
|
111
111
|
content: result.content,
|
|
112
112
|
conversionNotes: result.conversionNotes,
|
|
113
113
|
convertedAt: result.convertedAt,
|
|
114
|
-
|
|
114
|
+
viewUrl: result.viewUrl
|
|
115
115
|
};
|
|
116
116
|
// Add nextOffset if there's more content
|
|
117
117
|
if (result.hasMore && result.nextOffset !== undefined) {
|
|
@@ -13,7 +13,7 @@ export class SharePointSearchTool extends BaseToolController {
|
|
|
13
13
|
return 'ucm_sharepoint_search_documents';
|
|
14
14
|
}
|
|
15
15
|
get description() {
|
|
16
|
-
return 'Search SharePoint
|
|
16
|
+
return 'Search SharePoint content with a text query using Microsoft Search API. Returns metadata with snippets. Searches everything (documents and SharePoint pages — .aspx, modern or classic) by default; set filesOnly to limit to documents. Supports pagination and file type filtering via KQL.';
|
|
17
17
|
}
|
|
18
18
|
get inputSchema() {
|
|
19
19
|
return {
|
|
@@ -45,6 +45,10 @@ export class SharePointSearchTool extends BaseToolController {
|
|
|
45
45
|
type: 'string',
|
|
46
46
|
description: 'Filter by file extension (e.g., "docx", "pdf", "xlsx") - uses Microsoft Search KQL filtering',
|
|
47
47
|
maxLength: 10
|
|
48
|
+
},
|
|
49
|
+
filesOnly: {
|
|
50
|
+
type: 'boolean',
|
|
51
|
+
description: 'When true, search documents/files only. When false (default), also returns SharePoint pages (.aspx — modern or classic) alongside documents.'
|
|
48
52
|
}
|
|
49
53
|
},
|
|
50
54
|
required: ['connectionId'],
|
|
@@ -84,6 +88,10 @@ export class SharePointSearchTool extends BaseToolController {
|
|
|
84
88
|
if (params.fileType && !/^[a-zA-Z0-9]{1,10}$/.test(params.fileType)) {
|
|
85
89
|
throw new McpError(McpErrorCode.InvalidParams, 'File type must be alphanumeric and no more than 10 characters');
|
|
86
90
|
}
|
|
91
|
+
// Validate filesOnly if provided
|
|
92
|
+
if (params.filesOnly !== undefined && typeof params.filesOnly !== 'boolean') {
|
|
93
|
+
throw new McpError(McpErrorCode.InvalidParams, 'filesOnly must be a boolean');
|
|
94
|
+
}
|
|
87
95
|
}
|
|
88
96
|
async handleExecute(params) {
|
|
89
97
|
this.logger.info('SharePointSearchTool', `Searching SharePoint with query: "${params.query}"`);
|
|
@@ -93,7 +101,8 @@ export class SharePointSearchTool extends BaseToolController {
|
|
|
93
101
|
query: params.query,
|
|
94
102
|
limit: params.limit,
|
|
95
103
|
offset: params.offset,
|
|
96
|
-
fileType: params.fileType
|
|
104
|
+
fileType: params.fileType,
|
|
105
|
+
filesOnly: params.filesOnly
|
|
97
106
|
};
|
|
98
107
|
// Make API call via UCM client
|
|
99
108
|
const result = await this.ucmClient.sharePointSearch(params.connectionId, searchParams);
|