@utaba/ucm-mcp-server 6.5.1 → 6.7.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.
- package/dist/clients/UcmLocalApiClient.d.ts +221 -2
- package/dist/clients/UcmLocalApiClient.js +211 -3
- package/dist/index.js +1 -1
- package/dist/interfaces/IMcpTool.d.ts +2 -2
- package/dist/server/ToolRegistry.js +44 -8
- package/dist/tools/authorization/ListAuthorizationsTool.js +2 -2
- package/dist/tools/authorization/SignOutTool.js +2 -2
- package/dist/tools/base/BaseToolController.d.ts +7 -4
- package/dist/tools/base/BaseToolController.js +28 -11
- package/dist/tools/connections/AccessConnectionTool.js +2 -2
- package/dist/tools/connections/CallRemoteToolTool.js +3 -3
- package/dist/tools/core/DeleteArtifactTool.js +5 -4
- package/dist/tools/core/EditArtifactMetadataTool.js +1 -1
- package/dist/tools/core/GetArtifactTool.js +1 -1
- package/dist/tools/core/GetArtifactVersionsTool.js +1 -1
- package/dist/tools/core/GetChunkTool.js +1 -1
- package/dist/tools/core/ListArtifactsTool.js +1 -1
- package/dist/tools/core/MoveArtifactTool.d.ts +1 -1
- package/dist/tools/core/MoveArtifactTool.js +2 -2
- package/dist/tools/core/PublishArtifactFromFileTool.js +1 -1
- package/dist/tools/core/PublishArtifactTool.js +2 -2
- package/dist/tools/core/SearchArtifactsTool.js +7 -6
- package/dist/tools/memory-graph/GraphCreateEntitiesTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphCreateEntitiesTool.js +58 -0
- package/dist/tools/memory-graph/GraphCreateRelationshipsTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphCreateRelationshipsTool.js +57 -0
- package/dist/tools/memory-graph/GraphCreateTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphCreateTool.js +64 -0
- package/dist/tools/memory-graph/GraphDeleteEntitiesTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphDeleteEntitiesTool.js +45 -0
- package/dist/tools/memory-graph/GraphDeleteRelationshipsTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphDeleteRelationshipsTool.js +45 -0
- package/dist/tools/memory-graph/GraphExploreTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphExploreTool.js +73 -0
- package/dist/tools/memory-graph/GraphFindEntitiesTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphFindEntitiesTool.js +68 -0
- package/dist/tools/memory-graph/GraphFindPathsTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphFindPathsTool.js +62 -0
- package/dist/tools/memory-graph/GraphGetEntityTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphGetEntityTool.js +49 -0
- package/dist/tools/memory-graph/GraphGetRelationshipsTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphGetRelationshipsTool.js +62 -0
- package/dist/tools/memory-graph/GraphListTemplatesTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphListTemplatesTool.js +34 -0
- package/dist/tools/memory-graph/GraphListTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphListTool.js +45 -0
- package/dist/tools/memory-graph/GraphOpenTool.d.ts +15 -0
- package/dist/tools/memory-graph/GraphOpenTool.js +50 -0
- package/dist/tools/memory-graph/GraphProposeVocabularyTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphProposeVocabularyTool.js +149 -0
- package/dist/tools/memory-graph/GraphSearchTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphSearchTool.js +94 -0
- package/dist/tools/memory-graph/GraphTraverseTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphTraverseTool.js +114 -0
- package/dist/tools/memory-graph/GraphUpdateEntitiesTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphUpdateEntitiesTool.js +58 -0
- package/dist/tools/memory-graph/GraphUpdateTool.d.ts +14 -0
- package/dist/tools/memory-graph/GraphUpdateTool.js +59 -0
- package/dist/tools/memory-graph/KnowledgeSetListTool.d.ts +14 -0
- package/dist/tools/memory-graph/KnowledgeSetListTool.js +25 -0
- package/dist/tools/memory-graph/KnowledgeSetOpenTool.d.ts +14 -0
- package/dist/tools/memory-graph/KnowledgeSetOpenTool.js +31 -0
- package/dist/tools/repository/CreateRepositoryTool.js +10 -9
- package/dist/tools/repository/GetRepositoryTool.js +15 -15
- package/dist/tools/repository/UpdateRepositoryTool.js +10 -9
- package/dist/tools/sharepoint/SharePointListConnectionsTool.js +1 -1
- package/dist/tools/sharepoint/SharePointListFoldersTool.js +1 -1
- package/dist/tools/utility/AuthorIndexTool.js +6 -5
- package/dist/tools/utility/AuthorRecentsTool.js +6 -5
- package/dist/tools/utility/ListRepositoriesTool.js +5 -4
- package/dist/utils/McpErrorHandler.js +1 -1
- package/package.json +1 -1
- package/package.json.backup +1 -1
- package/dist/clients/UcmApiClient.d.ts +0 -157
- package/dist/clients/UcmApiClient.js +0 -443
- package/dist/publish/package.json +0 -37
- package/dist/tools/artifacts/GetArtifactController.d.ts +0 -34
- package/dist/tools/artifacts/GetArtifactController.js +0 -397
- package/dist/tools/artifacts/GetLatestController.d.ts +0 -39
- package/dist/tools/artifacts/GetLatestController.js +0 -469
- package/dist/tools/artifacts/ListVersionsController.d.ts +0 -43
- package/dist/tools/artifacts/ListVersionsController.js +0 -530
- package/dist/tools/artifacts/PublishArtifactController.d.ts +0 -37
- package/dist/tools/artifacts/PublishArtifactController.js +0 -605
- package/dist/tools/discovery/BrowseCategoriesController.d.ts +0 -25
- package/dist/tools/discovery/BrowseCategoriesController.js +0 -400
- package/dist/tools/discovery/FindByPurposeController.d.ts +0 -12
- package/dist/tools/discovery/FindByPurposeController.js +0 -131
- package/dist/tools/discovery/ListAuthorsController.d.ts +0 -20
- package/dist/tools/discovery/ListAuthorsController.js +0 -274
- package/dist/tools/discovery/SearchArtifactsController.d.ts +0 -14
- package/dist/tools/discovery/SearchArtifactsController.js +0 -226
- package/dist/tools/navigation/ExploreNamespaceController.d.ts +0 -35
- package/dist/tools/navigation/ExploreNamespaceController.js +0 -548
- package/dist/tools/repository/DeleteRepositoryGuidanceTool.d.ts +0 -13
- package/dist/tools/repository/DeleteRepositoryGuidanceTool.js +0 -93
- package/dist/tools/sharepoint/SharePointSignOutTool.d.ts +0 -22
- package/dist/tools/sharepoint/SharePointSignOutTool.js +0 -114
- package/dist/tools/utility/HealthCheckController.d.ts +0 -11
- package/dist/tools/utility/HealthCheckController.js +0 -60
- package/dist/tools/utility/SubmitFeedbackTool.d.ts +0 -16
- package/dist/tools/utility/SubmitFeedbackTool.js +0 -68
- package/dist/tools/utility/ValidatePathController.d.ts +0 -30
- package/dist/tools/utility/ValidatePathController.js +0 -465
- package/dist/utils/HttpsAgentFactory.d.ts +0 -21
- package/dist/utils/HttpsAgentFactory.js +0 -50
- package/dist/utils/ValidationUtils.d.ts +0 -10
- package/dist/utils/ValidationUtils.js +0 -50
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
export class UcmLocalApiClient {
|
|
3
|
-
baseUrl;
|
|
4
|
-
authToken;
|
|
5
|
-
authorId;
|
|
6
|
-
organizationId;
|
|
7
|
-
client;
|
|
8
|
-
constructor(baseUrl, authToken, timeout = 600000, authorId, organizationId) {
|
|
9
|
-
this.baseUrl = baseUrl;
|
|
10
|
-
this.authToken = authToken;
|
|
11
|
-
this.authorId = authorId;
|
|
12
|
-
this.organizationId = organizationId;
|
|
13
|
-
this.client = axios.create({
|
|
14
|
-
baseURL: this.baseUrl,
|
|
15
|
-
timeout,
|
|
16
|
-
headers: {
|
|
17
|
-
'Content-Type': 'application/json',
|
|
18
|
-
...(authToken && { 'Authorization': `Bearer ${authToken}` })
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
this.setupInterceptors();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Get organizationId from constructor or throw error
|
|
25
|
-
* For local MCP server, organizationId should be provided during initialization
|
|
26
|
-
*/
|
|
27
|
-
async getOrganizationId() {
|
|
28
|
-
if (!this.organizationId) {
|
|
29
|
-
throw new Error('Organization ID not configured. Please provide organizationId when initializing the MCP client.');
|
|
30
|
-
}
|
|
31
|
-
return this.organizationId;
|
|
32
|
-
}
|
|
33
|
-
setupInterceptors() {
|
|
34
|
-
this.client.interceptors.response.use((response) => response, (error) => {
|
|
35
|
-
// Extract error details from API response if available
|
|
36
|
-
const apiError = error.response?.data;
|
|
37
|
-
const status = error.response?.status;
|
|
38
|
-
const url = error.config?.url;
|
|
39
|
-
const errorMessage = apiError?.message || apiError?.error || error.message || JSON.stringify(apiError);
|
|
40
|
-
if (status === 404) {
|
|
41
|
-
return Promise.reject(new Error(`Resource not found at ${url}: ${errorMessage}`));
|
|
42
|
-
}
|
|
43
|
-
if (status >= 500) {
|
|
44
|
-
// For 5xx errors, include API error details if available
|
|
45
|
-
return Promise.reject(new Error(`UCM API server error: ${errorMessage}`));
|
|
46
|
-
}
|
|
47
|
-
if (status >= 400 && status < 500) {
|
|
48
|
-
// For 4xx errors, extract validation details from API response
|
|
49
|
-
if (apiError?.message) {
|
|
50
|
-
return Promise.reject(new Error(apiError.message));
|
|
51
|
-
}
|
|
52
|
-
if (apiError?.error) {
|
|
53
|
-
return Promise.reject(new Error(apiError.error));
|
|
54
|
-
}
|
|
55
|
-
if (apiError?.errors && Array.isArray(apiError.errors)) {
|
|
56
|
-
return Promise.reject(new Error(apiError.errors.join(', ')));
|
|
57
|
-
}
|
|
58
|
-
// Fallback to JSON stringify the entire API error response
|
|
59
|
-
return Promise.reject(new Error(errorMessage));
|
|
60
|
-
}
|
|
61
|
-
// For other errors, preserve original error
|
|
62
|
-
return Promise.reject(error);
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
ensureClient() {
|
|
66
|
-
if (!this.client) {
|
|
67
|
-
throw new Error('UcmApiClient has been cleaned up and is no longer available');
|
|
68
|
-
}
|
|
69
|
-
return this.client;
|
|
70
|
-
}
|
|
71
|
-
async getAuthors() {
|
|
72
|
-
const client = this.ensureClient();
|
|
73
|
-
const response = await client.get('/api/v1/authors');
|
|
74
|
-
return response.data;
|
|
75
|
-
}
|
|
76
|
-
async getAuthor(authorId) {
|
|
77
|
-
// No individual author endpoint - get from authors list
|
|
78
|
-
const authors = await this.getAuthors();
|
|
79
|
-
return authors.find(author => author.id === authorId) || null;
|
|
80
|
-
}
|
|
81
|
-
buildApiPath(api, author, repository, category, subcategory, filename, version) {
|
|
82
|
-
let path = `/api/v1/${api}`;
|
|
83
|
-
if (author) {
|
|
84
|
-
path += `/${author}`;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
return path;
|
|
88
|
-
}
|
|
89
|
-
if (repository) {
|
|
90
|
-
path += `/${repository}`;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
return path;
|
|
94
|
-
}
|
|
95
|
-
if (category) {
|
|
96
|
-
path += `/${category}`;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
return path;
|
|
100
|
-
}
|
|
101
|
-
if (subcategory) {
|
|
102
|
-
path += `/${subcategory}`;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
return path;
|
|
106
|
-
}
|
|
107
|
-
if (filename) {
|
|
108
|
-
path += `/${filename}`;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return path;
|
|
112
|
-
}
|
|
113
|
-
if (version) {
|
|
114
|
-
path += `@${version}`;
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
return path;
|
|
118
|
-
}
|
|
119
|
-
return path;
|
|
120
|
-
}
|
|
121
|
-
async getArtifact(author, repository, category, subcategory, filename, version) {
|
|
122
|
-
// Default repository to 'main' for MVP
|
|
123
|
-
const repo = repository || 'main';
|
|
124
|
-
let metadataApiPath = this.buildApiPath('authors', author, repo, category, subcategory, filename, version);
|
|
125
|
-
// First get metadata from authors endpoint
|
|
126
|
-
const client = this.ensureClient();
|
|
127
|
-
const metadataResponse = await client.get(metadataApiPath);
|
|
128
|
-
const metadata = metadataResponse.data;
|
|
129
|
-
if (filename) {
|
|
130
|
-
let fileApiPath = this.buildApiPath('files', author, repo, category, subcategory, filename, version);
|
|
131
|
-
// Then get actual file content from files endpoint
|
|
132
|
-
let contentResponse = await client.get(fileApiPath, {
|
|
133
|
-
headers: { 'accept': metadataResponse.data }
|
|
134
|
-
});
|
|
135
|
-
return {
|
|
136
|
-
...metadata.data,
|
|
137
|
-
content: contentResponse.data
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
// Combine metadata and content
|
|
141
|
-
return {
|
|
142
|
-
...metadata.data,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
async getLatestArtifact(author, repository, category, subcategory, filename) {
|
|
146
|
-
// Default repository to 'main' for MVP
|
|
147
|
-
const repo = repository || 'main';
|
|
148
|
-
let metadataApiPath = this.buildApiPath('authors', author, repo, category, subcategory, filename);
|
|
149
|
-
const client = this.ensureClient();
|
|
150
|
-
const response = await client.get(metadataApiPath);
|
|
151
|
-
return response.data;
|
|
152
|
-
}
|
|
153
|
-
async listArtifacts(author, repository, category, subcategory, offset, limit) {
|
|
154
|
-
const params = new URLSearchParams();
|
|
155
|
-
if (offset !== undefined)
|
|
156
|
-
params.append('offset', offset.toString());
|
|
157
|
-
if (limit !== undefined)
|
|
158
|
-
params.append('limit', limit.toString());
|
|
159
|
-
const queryString = params.toString();
|
|
160
|
-
// Build URL based on provided parameters for exploratory browsing
|
|
161
|
-
// Default repository to 'main' for MVP
|
|
162
|
-
const repo = repository;
|
|
163
|
-
let metadataApiPath = this.buildApiPath('authors', author, repo, category, subcategory);
|
|
164
|
-
metadataApiPath += queryString ? `?${queryString}` : '';
|
|
165
|
-
const client = this.ensureClient();
|
|
166
|
-
const response = await client.get(metadataApiPath);
|
|
167
|
-
return response.data; // response.data contains the full structured response with pagination
|
|
168
|
-
}
|
|
169
|
-
async searchArtifacts(filters = {}) {
|
|
170
|
-
const params = new URLSearchParams();
|
|
171
|
-
// Default repository to 'main' for MVP if not specified
|
|
172
|
-
if (!filters.repository) {
|
|
173
|
-
filters.repository = 'main';
|
|
174
|
-
}
|
|
175
|
-
Object.entries(filters).forEach(([key, value]) => {
|
|
176
|
-
if (value !== undefined)
|
|
177
|
-
params.append(key, value.toString());
|
|
178
|
-
});
|
|
179
|
-
const client = this.ensureClient();
|
|
180
|
-
const response = await client.get(`/api/v1/artifacts?${params}`);
|
|
181
|
-
return response.data;
|
|
182
|
-
}
|
|
183
|
-
async searchArtifactsByText(searchParams) {
|
|
184
|
-
const params = new URLSearchParams();
|
|
185
|
-
// Add all parameters to URL
|
|
186
|
-
Object.entries(searchParams).forEach(([key, value]) => {
|
|
187
|
-
if (value !== undefined)
|
|
188
|
-
params.append(key, value.toString());
|
|
189
|
-
});
|
|
190
|
-
const client = this.ensureClient();
|
|
191
|
-
const response = await client.get(`/api/v1/search/artifacts?${params}`);
|
|
192
|
-
return response.data;
|
|
193
|
-
}
|
|
194
|
-
async publishArtifact(author, repository, category, subcategory, data) {
|
|
195
|
-
// Default repository to 'main' for MVP
|
|
196
|
-
const repo = repository || 'main';
|
|
197
|
-
// Build query parameters from the data object
|
|
198
|
-
const params = new URLSearchParams();
|
|
199
|
-
if (data.queryParams) {
|
|
200
|
-
// New API structure with query params
|
|
201
|
-
Object.entries(data.queryParams).forEach(([key, value]) => {
|
|
202
|
-
// Skip if value is undefined, null, empty string, or string "null"/"undefined"
|
|
203
|
-
if (value !== undefined && value !== null && value !== '' && value !== 'null' && value !== 'undefined') {
|
|
204
|
-
// Handle arrays (e.g., tags) by JSON stringifying them
|
|
205
|
-
if (Array.isArray(value)) {
|
|
206
|
-
params.append(key, JSON.stringify(value));
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
params.append(key, String(value));
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
// Send raw content as text/plain body
|
|
214
|
-
const client = this.ensureClient();
|
|
215
|
-
const response = await client.post(`/api/v1/authors/${author}/${repo}/${category}/${subcategory}?${params.toString()}`, data.content, {
|
|
216
|
-
headers: {
|
|
217
|
-
'Content-Type': 'text/plain'
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
return response.data;
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
// Legacy API structure (for backward compatibility)
|
|
224
|
-
const client = this.ensureClient();
|
|
225
|
-
const response = await client.post(`/api/v1/authors/${author}/${repo}/${category}/${subcategory}`, data);
|
|
226
|
-
return response.data;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
async updateArtifact(author, repository, category, subcategory, filename, version, data) {
|
|
230
|
-
// Default repository to 'main' for MVP
|
|
231
|
-
const repo = repository || 'main';
|
|
232
|
-
// Build query parameters from the data object
|
|
233
|
-
const params = new URLSearchParams();
|
|
234
|
-
if (data.queryParams) {
|
|
235
|
-
// New API structure with query params
|
|
236
|
-
Object.entries(data.queryParams).forEach(([key, value]) => {
|
|
237
|
-
// Skip if value is undefined, null, empty string, or string "null"/"undefined"
|
|
238
|
-
if (value !== undefined && value !== null && value !== '' && value !== 'null' && value !== 'undefined') {
|
|
239
|
-
// Handle arrays (e.g., tags) by JSON stringifying them
|
|
240
|
-
if (Array.isArray(value)) {
|
|
241
|
-
params.append(key, JSON.stringify(value));
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
params.append(key, String(value));
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
|
-
// Send raw content as text/plain body
|
|
249
|
-
const client = this.ensureClient();
|
|
250
|
-
const response = await client.put(`/api/v1/authors/${author}/${repo}/${category}/${subcategory}/${filename}@${version}?${params.toString()}`, data.content, {
|
|
251
|
-
headers: {
|
|
252
|
-
'Content-Type': 'text/plain'
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
return response.data;
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
// Legacy API structure (for backward compatibility)
|
|
259
|
-
const client = this.ensureClient();
|
|
260
|
-
const response = await client.put(`/api/v1/authors/${author}/${repo}/${category}/${subcategory}/${filename}@${version}`, data);
|
|
261
|
-
return response.data;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
async deleteArtifact(author, repository, category, subcategory, filename, version) {
|
|
265
|
-
// Default repository to 'main' for MVP
|
|
266
|
-
const repo = repository || 'main';
|
|
267
|
-
const url = version
|
|
268
|
-
? `/api/v1/authors/${author}/${repo}/${category}/${subcategory}/${filename}@${version}`
|
|
269
|
-
: `/api/v1/authors/${author}/${repo}/${category}/${subcategory}/${filename}`;
|
|
270
|
-
const client = this.ensureClient();
|
|
271
|
-
const response = await client.delete(url);
|
|
272
|
-
return response.data;
|
|
273
|
-
}
|
|
274
|
-
async getArtifactVersions(author, repository, category, subcategory, filename) {
|
|
275
|
-
// Default repository to 'main' for MVP
|
|
276
|
-
const repo = repository || 'main';
|
|
277
|
-
const client = this.ensureClient();
|
|
278
|
-
const response = await client.get(`/api/v1/authors/${author}/${repo}/${category}/${subcategory}/${filename}/versions`);
|
|
279
|
-
return response.data;
|
|
280
|
-
}
|
|
281
|
-
async getCategories() {
|
|
282
|
-
// Categories are derived from artifacts since there's no dedicated endpoint
|
|
283
|
-
// Return the standard UCM categories
|
|
284
|
-
return ['commands', 'services', 'patterns', 'implementations', 'contracts', 'guidance', 'project'];
|
|
285
|
-
}
|
|
286
|
-
async healthCheck() {
|
|
287
|
-
const client = this.ensureClient();
|
|
288
|
-
const response = await client.get('/api/v1/health');
|
|
289
|
-
return response.data;
|
|
290
|
-
}
|
|
291
|
-
async getQuickstart() {
|
|
292
|
-
const client = this.ensureClient();
|
|
293
|
-
const response = await client.get('/api/v1/quickstart', {
|
|
294
|
-
headers: { 'accept': 'text/markdown' }
|
|
295
|
-
});
|
|
296
|
-
return response.data;
|
|
297
|
-
}
|
|
298
|
-
async getAuthorIndex(author, repository) {
|
|
299
|
-
const client = this.ensureClient();
|
|
300
|
-
let url;
|
|
301
|
-
if (repository) {
|
|
302
|
-
// Repository-specific index (future use)
|
|
303
|
-
url = `/api/v1/authors/${author}/${repository}/index`;
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
// Author-level index
|
|
307
|
-
url = `/api/v1/authors/${author}/index`;
|
|
308
|
-
}
|
|
309
|
-
const response = await client.get(url, {
|
|
310
|
-
headers: { 'accept': 'text/markdown' }
|
|
311
|
-
});
|
|
312
|
-
return response.data;
|
|
313
|
-
}
|
|
314
|
-
async getAuthorRecents(author) {
|
|
315
|
-
const client = this.ensureClient();
|
|
316
|
-
// Author-level recent activity (using new resources API structure)
|
|
317
|
-
const url = `/api/v1/resources/author/${author}/recents`;
|
|
318
|
-
const response = await client.get(url, {
|
|
319
|
-
headers: { 'accept': 'text/markdown' }
|
|
320
|
-
});
|
|
321
|
-
return response.data;
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Cleanup method to properly dispose of HTTP client resources
|
|
325
|
-
* This helps prevent memory leaks from accumulated AbortSignal listeners
|
|
326
|
-
*/
|
|
327
|
-
cleanup() {
|
|
328
|
-
if (this.client) {
|
|
329
|
-
// Clear interceptors to remove event listeners
|
|
330
|
-
this.client.interceptors.request.clear();
|
|
331
|
-
this.client.interceptors.response.clear();
|
|
332
|
-
// Set client to null to let GC handle cleanup
|
|
333
|
-
this.client = null;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Check if the client is still available for use
|
|
338
|
-
*/
|
|
339
|
-
isAvailable() {
|
|
340
|
-
return this.client !== null;
|
|
341
|
-
}
|
|
342
|
-
// Repository Management Methods
|
|
343
|
-
async createRepository(author, data) {
|
|
344
|
-
const client = this.ensureClient();
|
|
345
|
-
const response = await client.post(`/api/v1/authors/${author}`, data);
|
|
346
|
-
return response.data;
|
|
347
|
-
}
|
|
348
|
-
async getRepository(author, repository) {
|
|
349
|
-
const client = this.ensureClient();
|
|
350
|
-
const response = await client.get(`/api/v1/authors/${author}/${repository}`);
|
|
351
|
-
return response.data;
|
|
352
|
-
}
|
|
353
|
-
async updateRepository(author, repository, data) {
|
|
354
|
-
const client = this.ensureClient();
|
|
355
|
-
const response = await client.put(`/api/v1/authors/${author}/${repository}`, data);
|
|
356
|
-
return response.data;
|
|
357
|
-
}
|
|
358
|
-
async deleteRepository(author, repository) {
|
|
359
|
-
const client = this.ensureClient();
|
|
360
|
-
const response = await client.delete(`/api/v1/authors/${author}/${repository}`);
|
|
361
|
-
return response.data;
|
|
362
|
-
}
|
|
363
|
-
async listRepositories(author, offset, limit) {
|
|
364
|
-
const params = new URLSearchParams();
|
|
365
|
-
if (offset !== undefined)
|
|
366
|
-
params.append('offset', offset.toString());
|
|
367
|
-
if (limit !== undefined)
|
|
368
|
-
params.append('limit', limit.toString());
|
|
369
|
-
const queryString = params.toString();
|
|
370
|
-
const url = `/api/v1/authors/${author}${queryString ? `?${queryString}` : ''}`;
|
|
371
|
-
const client = this.ensureClient();
|
|
372
|
-
const response = await client.get(url);
|
|
373
|
-
return response.data;
|
|
374
|
-
}
|
|
375
|
-
async submitFeedback(data) {
|
|
376
|
-
const client = this.ensureClient();
|
|
377
|
-
const response = await client.post('/api/v1/feedback', data);
|
|
378
|
-
return response.data;
|
|
379
|
-
}
|
|
380
|
-
async editArtifactMetadata(author, repository, category, subcategory, filename, data) {
|
|
381
|
-
const client = this.ensureClient();
|
|
382
|
-
const url = this.buildApiPath('authors', author, repository, category, subcategory, filename) + '/edit';
|
|
383
|
-
// Transform updateTags from comma-separated string to array for API
|
|
384
|
-
const requestData = { ...data };
|
|
385
|
-
if (data.updateTags && typeof data.updateTags === 'string') {
|
|
386
|
-
// Parse comma-separated tags into array, trim whitespace, filter empty strings
|
|
387
|
-
requestData.updateTags = data.updateTags
|
|
388
|
-
.split(',')
|
|
389
|
-
.map(tag => tag.trim())
|
|
390
|
-
.filter(tag => tag.length > 0);
|
|
391
|
-
}
|
|
392
|
-
const response = await client.post(url, requestData);
|
|
393
|
-
return response.data;
|
|
394
|
-
}
|
|
395
|
-
// SharePoint API methods
|
|
396
|
-
/**
|
|
397
|
-
* Generate markdown for SharePoint connections (safe, non-sensitive data only)
|
|
398
|
-
*/
|
|
399
|
-
async sharePointGenerateConnectionsMarkdown(organizationId, params) {
|
|
400
|
-
const client = this.ensureClient();
|
|
401
|
-
const response = await client.post(`/api/org/${organizationId}/sharepoint/connections/markdown`, params);
|
|
402
|
-
return response.data;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* List SharePoint connections for an organization (includes sensitive data - use with caution)
|
|
406
|
-
*/
|
|
407
|
-
async sharePointListConnections(organizationId, params) {
|
|
408
|
-
const client = this.ensureClient();
|
|
409
|
-
const queryParams = new URLSearchParams();
|
|
410
|
-
if (params.limit)
|
|
411
|
-
queryParams.set('limit', params.limit.toString());
|
|
412
|
-
if (params.offset)
|
|
413
|
-
queryParams.set('offset', params.offset.toString());
|
|
414
|
-
const url = `/api/org/${organizationId}/sharepoint/connections${queryParams.toString() ? '?' + queryParams.toString() : ''}`;
|
|
415
|
-
const response = await client.get(url);
|
|
416
|
-
return response.data;
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Search SharePoint documents using Microsoft Search API
|
|
420
|
-
*/
|
|
421
|
-
async sharePointSearch(organizationId, connectionId, params) {
|
|
422
|
-
const client = this.ensureClient();
|
|
423
|
-
const response = await client.post(`/api/org/${organizationId}/sharepoint/connections/${connectionId}/search`, params);
|
|
424
|
-
return response.data;
|
|
425
|
-
}
|
|
426
|
-
/**
|
|
427
|
-
* List folders and files in SharePoint with pagination
|
|
428
|
-
*/
|
|
429
|
-
async sharePointListFolders(organizationId, connectionId, params) {
|
|
430
|
-
const client = this.ensureClient();
|
|
431
|
-
const response = await client.post(`/api/org/${organizationId}/sharepoint/connections/${connectionId}/folders`, params);
|
|
432
|
-
return response.data;
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Read SharePoint file content with support for both fileUrl and legacy fileId
|
|
436
|
-
*/
|
|
437
|
-
async sharePointReadFile(organizationId, connectionId, params) {
|
|
438
|
-
const client = this.ensureClient();
|
|
439
|
-
const response = await client.post(`/api/org/${organizationId}/sharepoint/connections/${connectionId}/read`, params);
|
|
440
|
-
return response.data;
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
//# sourceMappingURL=UcmApiClient.js.map
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "ucm-mcp-server",
|
|
3
|
-
"version": "1.1.5",
|
|
4
|
-
"description": "Universal Context Manager MCP Server - AI-native artifact management",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"bin": {
|
|
8
|
-
"ucm-mcp-server": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"keywords": [
|
|
11
|
-
"mcp",
|
|
12
|
-
"model-context-protocol",
|
|
13
|
-
"ucm",
|
|
14
|
-
"universal-context-manager",
|
|
15
|
-
"context-engineering",
|
|
16
|
-
"ai",
|
|
17
|
-
"context-manager",
|
|
18
|
-
"utaba"
|
|
19
|
-
],
|
|
20
|
-
"author": {
|
|
21
|
-
"name": "Utaba AI",
|
|
22
|
-
"url": "https://utaba.ai"
|
|
23
|
-
},
|
|
24
|
-
"license": "BSD-3-Clause",
|
|
25
|
-
"homepage": "https://ucm.utaba.ai",
|
|
26
|
-
"dependencies": {
|
|
27
|
-
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
28
|
-
"commander": "^14.0.0",
|
|
29
|
-
"axios": "^1.10.0"
|
|
30
|
-
},
|
|
31
|
-
"engines": {
|
|
32
|
-
"node": ">=18.0.0"
|
|
33
|
-
},
|
|
34
|
-
"publishConfig": {
|
|
35
|
-
"access": "public"
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { BaseToolController } from '../base/BaseToolController.js';
|
|
2
|
-
import { UcmApiClient } from '../../clients/UcmLocalApiClient.js';
|
|
3
|
-
import { ILogger } from '../../interfaces/ILogger.js';
|
|
4
|
-
export declare class GetArtifactController extends BaseToolController {
|
|
5
|
-
constructor(ucmClient: UcmApiClient, logger: ILogger);
|
|
6
|
-
get name(): string;
|
|
7
|
-
get description(): string;
|
|
8
|
-
get inputSchema(): any;
|
|
9
|
-
protected handleExecute(params: any): Promise<any>;
|
|
10
|
-
private buildArtifactResponse;
|
|
11
|
-
private enrichMetadata;
|
|
12
|
-
private processExamples;
|
|
13
|
-
private enrichDependencies;
|
|
14
|
-
private getVersionHistory;
|
|
15
|
-
private getRelatedArtifacts;
|
|
16
|
-
private detectContentType;
|
|
17
|
-
private detectLanguage;
|
|
18
|
-
private getIncludedSections;
|
|
19
|
-
private isLatestVersion;
|
|
20
|
-
private calculateQualityScore;
|
|
21
|
-
private estimateComplexity;
|
|
22
|
-
private assessMaturityLevel;
|
|
23
|
-
private sanitizeExternalDependencies;
|
|
24
|
-
private checkDependencyResolution;
|
|
25
|
-
private findMissingDependencies;
|
|
26
|
-
private detectDependencyConflicts;
|
|
27
|
-
private generateChangesSummary;
|
|
28
|
-
private isBreakingChange;
|
|
29
|
-
private getDownloadCount;
|
|
30
|
-
private calculateRating;
|
|
31
|
-
private getLastAccessTime;
|
|
32
|
-
private calculateSimilarity;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=GetArtifactController.d.ts.map
|