@utaba/ucm-mcp-server 6.5.0 → 6.6.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 +175 -2
- package/dist/clients/UcmLocalApiClient.js +203 -3
- package/dist/index.js +1 -1
- package/dist/mcp-server/clients/UcmLocalApiClient.d.ts +399 -0
- package/dist/mcp-server/clients/UcmLocalApiClient.js +719 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.js +68 -0
- package/dist/mcp-server/interfaces/ILogger.d.ts +8 -0
- package/dist/mcp-server/interfaces/ILogger.js +4 -0
- package/dist/mcp-server/interfaces/IMcpTool.d.ts +7 -0
- package/dist/mcp-server/interfaces/IMcpTool.js +3 -0
- package/dist/mcp-server/logging/ConsoleLogger.d.ts +16 -0
- package/dist/mcp-server/logging/ConsoleLogger.js +45 -0
- package/dist/mcp-server/logging/LoggerFactory.d.ts +9 -0
- package/dist/mcp-server/logging/LoggerFactory.js +12 -0
- package/dist/mcp-server/server/McpConfig.d.ts +26 -0
- package/dist/mcp-server/server/McpConfig.js +90 -0
- package/dist/mcp-server/server/McpHandler.d.ts +12 -0
- package/dist/mcp-server/server/McpHandler.js +84 -0
- package/dist/mcp-server/server/McpServer.d.ts +15 -0
- package/dist/mcp-server/server/McpServer.js +49 -0
- package/dist/mcp-server/server/ToolRegistry.d.ts +23 -0
- package/dist/mcp-server/server/ToolRegistry.js +169 -0
- package/dist/mcp-server/tools/authorization/ListAuthorizationsTool.d.ts +21 -0
- package/dist/mcp-server/tools/authorization/ListAuthorizationsTool.js +146 -0
- package/dist/mcp-server/tools/authorization/SignOutTool.d.ts +23 -0
- package/dist/mcp-server/tools/authorization/SignOutTool.js +128 -0
- package/dist/mcp-server/tools/base/BaseToolController.d.ts +19 -0
- package/dist/mcp-server/tools/base/BaseToolController.js +58 -0
- package/dist/mcp-server/tools/connections/AccessConnectionTool.d.ts +21 -0
- package/dist/mcp-server/tools/connections/AccessConnectionTool.js +107 -0
- package/dist/mcp-server/tools/connections/CallRemoteToolTool.d.ts +22 -0
- package/dist/mcp-server/tools/connections/CallRemoteToolTool.js +124 -0
- package/dist/mcp-server/tools/core/DeleteArtifactTool.d.ts +11 -0
- package/dist/mcp-server/tools/core/DeleteArtifactTool.js +83 -0
- package/dist/mcp-server/tools/core/EditArtifactMetadataTool.d.ts +12 -0
- package/dist/mcp-server/tools/core/EditArtifactMetadataTool.js +173 -0
- package/dist/mcp-server/tools/core/GetArtifactTool.d.ts +13 -0
- package/dist/mcp-server/tools/core/GetArtifactTool.js +124 -0
- package/dist/mcp-server/tools/core/GetArtifactVersionsTool.d.ts +11 -0
- package/dist/mcp-server/tools/core/GetArtifactVersionsTool.js +63 -0
- package/dist/mcp-server/tools/core/GetChunkTool.d.ts +11 -0
- package/dist/mcp-server/tools/core/GetChunkTool.js +56 -0
- package/dist/mcp-server/tools/core/ListArtifactsTool.d.ts +11 -0
- package/dist/mcp-server/tools/core/ListArtifactsTool.js +84 -0
- package/dist/mcp-server/tools/core/MoveArtifactTool.d.ts +12 -0
- package/dist/mcp-server/tools/core/MoveArtifactTool.js +104 -0
- package/dist/mcp-server/tools/core/PublishArtifactFromFileTool.d.ts +15 -0
- package/dist/mcp-server/tools/core/PublishArtifactFromFileTool.js +277 -0
- package/dist/mcp-server/tools/core/PublishArtifactTool.d.ts +13 -0
- package/dist/mcp-server/tools/core/PublishArtifactTool.js +218 -0
- package/dist/mcp-server/tools/core/SearchArtifactsTool.d.ts +11 -0
- package/dist/mcp-server/tools/core/SearchArtifactsTool.js +137 -0
- package/dist/mcp-server/tools/list/ListNamespaceController.d.ts +1 -0
- package/dist/mcp-server/tools/list/ListNamespaceController.js +8 -0
- package/dist/mcp-server/tools/memory-graph/GraphCreateEntitiesTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphCreateEntitiesTool.js +58 -0
- package/dist/mcp-server/tools/memory-graph/GraphCreateRelationshipsTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphCreateRelationshipsTool.js +57 -0
- package/dist/mcp-server/tools/memory-graph/GraphCreateTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphCreateTool.js +64 -0
- package/dist/mcp-server/tools/memory-graph/GraphDeleteEntitiesTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphDeleteEntitiesTool.js +45 -0
- package/dist/mcp-server/tools/memory-graph/GraphDeleteRelationshipsTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphDeleteRelationshipsTool.js +45 -0
- package/dist/mcp-server/tools/memory-graph/GraphExploreTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphExploreTool.js +73 -0
- package/dist/mcp-server/tools/memory-graph/GraphFindEntitiesTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphFindEntitiesTool.js +68 -0
- package/dist/mcp-server/tools/memory-graph/GraphFindPathsTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphFindPathsTool.js +62 -0
- package/dist/mcp-server/tools/memory-graph/GraphGetEntityTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphGetEntityTool.js +49 -0
- package/dist/mcp-server/tools/memory-graph/GraphGetRelationshipsTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphGetRelationshipsTool.js +62 -0
- package/dist/mcp-server/tools/memory-graph/GraphListTemplatesTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphListTemplatesTool.js +34 -0
- package/dist/mcp-server/tools/memory-graph/GraphListTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphListTool.js +45 -0
- package/dist/mcp-server/tools/memory-graph/GraphOpenTool.d.ts +15 -0
- package/dist/mcp-server/tools/memory-graph/GraphOpenTool.js +50 -0
- package/dist/mcp-server/tools/memory-graph/GraphProposeVocabularyTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphProposeVocabularyTool.js +108 -0
- package/dist/mcp-server/tools/memory-graph/GraphSearchTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphSearchTool.js +94 -0
- package/dist/mcp-server/tools/memory-graph/GraphTraverseTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphTraverseTool.js +114 -0
- package/dist/mcp-server/tools/memory-graph/GraphUpdateEntitiesTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/GraphUpdateEntitiesTool.js +58 -0
- package/dist/mcp-server/tools/memory-graph/KnowledgeSetListTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/KnowledgeSetListTool.js +25 -0
- package/dist/mcp-server/tools/memory-graph/KnowledgeSetOpenTool.d.ts +14 -0
- package/dist/mcp-server/tools/memory-graph/KnowledgeSetOpenTool.js +31 -0
- package/dist/mcp-server/tools/repository/CreateRepositoryTool.d.ts +12 -0
- package/dist/mcp-server/tools/repository/CreateRepositoryTool.js +116 -0
- package/dist/mcp-server/tools/repository/GetRepositoryTool.d.ts +12 -0
- package/dist/mcp-server/tools/repository/GetRepositoryTool.js +85 -0
- package/dist/mcp-server/tools/repository/UpdateRepositoryTool.d.ts +12 -0
- package/dist/mcp-server/tools/repository/UpdateRepositoryTool.js +115 -0
- package/dist/mcp-server/tools/sharepoint/SharePointListConnectionsTool.d.ts +19 -0
- package/dist/mcp-server/tools/sharepoint/SharePointListConnectionsTool.js +90 -0
- package/dist/mcp-server/tools/sharepoint/SharePointListFoldersTool.d.ts +21 -0
- package/dist/mcp-server/tools/sharepoint/SharePointListFoldersTool.js +133 -0
- package/dist/mcp-server/tools/sharepoint/SharePointReadFileTool.d.ts +22 -0
- package/dist/mcp-server/tools/sharepoint/SharePointReadFileTool.js +146 -0
- package/dist/mcp-server/tools/sharepoint/SharePointReadRelatedFileTool.d.ts +18 -0
- package/dist/mcp-server/tools/sharepoint/SharePointReadRelatedFileTool.js +108 -0
- package/dist/mcp-server/tools/sharepoint/SharePointSearchTool.d.ts +22 -0
- package/dist/mcp-server/tools/sharepoint/SharePointSearchTool.js +125 -0
- package/dist/mcp-server/tools/utility/AuthorIndexTool.d.ts +11 -0
- package/dist/mcp-server/tools/utility/AuthorIndexTool.js +49 -0
- package/dist/mcp-server/tools/utility/AuthorRecentsTool.d.ts +11 -0
- package/dist/mcp-server/tools/utility/AuthorRecentsTool.js +49 -0
- package/dist/mcp-server/tools/utility/ListRepositoriesTool.d.ts +11 -0
- package/dist/mcp-server/tools/utility/ListRepositoriesTool.js +68 -0
- package/dist/mcp-server/tools/utility/QuickstartTool.d.ts +11 -0
- package/dist/mcp-server/tools/utility/QuickstartTool.js +36 -0
- package/dist/mcp-server/types/UcmApiTypes.d.ts +40 -0
- package/dist/mcp-server/types/UcmApiTypes.js +4 -0
- package/dist/mcp-server/utils/McpErrorHandler.d.ts +25 -0
- package/dist/mcp-server/utils/McpErrorHandler.js +67 -0
- package/dist/mcp-server/utils/PathUtils.d.ts +61 -0
- package/dist/mcp-server/utils/PathUtils.js +178 -0
- package/dist/mcp-server/utils/ResponseChunker.d.ts +25 -0
- package/dist/mcp-server/utils/ResponseChunker.js +79 -0
- package/dist/mcp-server/utils/SharePointErrorHandler.d.ts +34 -0
- package/dist/mcp-server/utils/SharePointErrorHandler.js +55 -0
- package/dist/schemas/memory-graph-tool-schemas.d.ts +789 -0
- package/dist/schemas/memory-graph-tool-schemas.js +181 -0
- package/dist/server/ToolRegistry.js +42 -8
- package/dist/tools/authorization/ListAuthorizationsTool.js +2 -2
- package/dist/tools/authorization/SignOutTool.js +2 -2
- package/dist/tools/connections/AccessConnectionTool.js +8 -6
- package/dist/tools/connections/CallRemoteToolTool.js +4 -4
- 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.js +1 -1
- 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 +11 -0
- package/dist/tools/memory-graph/GraphCreateEntitiesTool.js +56 -0
- package/dist/tools/memory-graph/GraphCreateRelationshipsTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphCreateRelationshipsTool.js +55 -0
- package/dist/tools/memory-graph/GraphCreateTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphCreateTool.js +62 -0
- package/dist/tools/memory-graph/GraphDeleteEntitiesTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphDeleteEntitiesTool.js +43 -0
- package/dist/tools/memory-graph/GraphDeleteRelationshipsTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphDeleteRelationshipsTool.js +43 -0
- package/dist/tools/memory-graph/GraphExploreTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphExploreTool.js +71 -0
- package/dist/tools/memory-graph/GraphFindEntitiesTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphFindEntitiesTool.js +66 -0
- package/dist/tools/memory-graph/GraphFindPathsTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphFindPathsTool.js +60 -0
- package/dist/tools/memory-graph/GraphGetEntityTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphGetEntityTool.js +47 -0
- package/dist/tools/memory-graph/GraphGetRelationshipsTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphGetRelationshipsTool.js +60 -0
- package/dist/tools/memory-graph/GraphGetStatsTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphGetStatsTool.js +42 -0
- package/dist/tools/memory-graph/GraphListTemplatesTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphListTemplatesTool.js +32 -0
- package/dist/tools/memory-graph/GraphListTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphListTool.js +43 -0
- package/dist/tools/memory-graph/GraphOpenTool.d.ts +12 -0
- package/dist/tools/memory-graph/GraphOpenTool.js +48 -0
- package/dist/tools/memory-graph/GraphProposeVocabularyTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphProposeVocabularyTool.js +104 -0
- package/dist/tools/memory-graph/GraphRemoveRelationshipsTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphRemoveRelationshipsTool.js +47 -0
- package/dist/tools/memory-graph/GraphSearchTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphSearchTool.js +92 -0
- package/dist/tools/memory-graph/GraphTraverseTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphTraverseTool.js +112 -0
- package/dist/tools/memory-graph/GraphUpdateEntitiesTool.d.ts +11 -0
- package/dist/tools/memory-graph/GraphUpdateEntitiesTool.js +56 -0
- package/dist/tools/memory-graph/KnowledgeSetListTool.d.ts +11 -0
- package/dist/tools/memory-graph/KnowledgeSetListTool.js +23 -0
- package/dist/tools/memory-graph/KnowledgeSetOpenTool.d.ts +11 -0
- package/dist/tools/memory-graph/KnowledgeSetOpenTool.js +29 -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/HealthCheckController.js +1 -1
- 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
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { McpServer } from './server/McpServer.js';
|
|
5
|
+
import { McpConfig } from './server/McpConfig.js';
|
|
6
|
+
import { LoggerFactory } from './logging/LoggerFactory.js';
|
|
7
|
+
// Increase max listeners to prevent AbortSignal memory leak warnings
|
|
8
|
+
// This is a safety net while we also implement proper cleanup
|
|
9
|
+
EventEmitter.defaultMaxListeners = 40;
|
|
10
|
+
async function main() {
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('ucm-mcp-server')
|
|
14
|
+
.description('Universal Context Manager - Read the ucm_connect tool first to avoid mistakes')
|
|
15
|
+
.version('6.6.0')
|
|
16
|
+
.option('-u, --ucm-url <url>', 'UCM API base URL (defaults to https://ucm.utaba.ai)')
|
|
17
|
+
.option('-p, --port <port>', 'Server port', '3001')
|
|
18
|
+
.option('--log-level <level>', 'Log level', 'ERROR')
|
|
19
|
+
.option('--auth-token <token>', 'Authentication token for UCM API format is {auhtorid}:{apikey}. Get one from https://ucm.utaba.ai')
|
|
20
|
+
.option('--trusted-authors <authors>', 'Comma-separated list of trusted authors (e.g., "utaba,{anotherauthor}")', "utaba")
|
|
21
|
+
.parse();
|
|
22
|
+
const options = program.opts();
|
|
23
|
+
const config = new McpConfig({
|
|
24
|
+
ucmApiUrl: options.ucmUrl,
|
|
25
|
+
port: parseInt(options.port),
|
|
26
|
+
logLevel: options.logLevel,
|
|
27
|
+
authToken: options.authToken,
|
|
28
|
+
trustedAuthors: options.trustedAuthors ? options.trustedAuthors.split(',').map((a) => a.trim()) : ["utaba"]
|
|
29
|
+
});
|
|
30
|
+
// Set the log level in the factory before creating any loggers
|
|
31
|
+
LoggerFactory.setLogLevel(config.logLevel);
|
|
32
|
+
const logger = LoggerFactory.createLogger('MCP-Server');
|
|
33
|
+
const server = new McpServer(config, logger);
|
|
34
|
+
try {
|
|
35
|
+
await server.start();
|
|
36
|
+
logger.info('MCP-Server', 'UCM MCP Server started successfully');
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
logger.error('MCP-Server', 'Failed to start UCM MCP Server', '', error);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
// Graceful shutdown handlers
|
|
43
|
+
const gracefulShutdown = async (signal) => {
|
|
44
|
+
logger.info('MCP-Server', `Received ${signal}, shutting down UCM MCP Server...`);
|
|
45
|
+
try {
|
|
46
|
+
await server.stop();
|
|
47
|
+
logger.info('MCP-Server', 'UCM MCP Server shutdown complete');
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.error('MCP-Server', 'Error during shutdown', '', error);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
56
|
+
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
57
|
+
// Handle uncaught exceptions and unhandled rejections
|
|
58
|
+
process.on('uncaughtException', (error) => {
|
|
59
|
+
logger.error('MCP-Server', 'Uncaught exception', '', error);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
});
|
|
62
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
63
|
+
logger.error('MCP-Server', 'Unhandled rejection', '', { reason, promise });
|
|
64
|
+
process.exit(1);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
main().catch(console.error);
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ILogger {
|
|
2
|
+
debug(component: string, message: string, context?: string, metadata?: any): void;
|
|
3
|
+
info(component: string, message: string, context?: string, metadata?: any): void;
|
|
4
|
+
warn(component: string, message: string, context?: string, metadata?: any): void;
|
|
5
|
+
error(component: string, message: string, context?: string, metadata?: any): void;
|
|
6
|
+
logPerformance(component: string, operation: string, fileSize?: number, duration?: number, quota?: number): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=ILogger.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ILogger } from '../interfaces/ILogger.js';
|
|
2
|
+
type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
|
|
3
|
+
export declare class ConsoleLogger implements ILogger {
|
|
4
|
+
private defaultComponent;
|
|
5
|
+
private logLevel;
|
|
6
|
+
private logLevelPriority;
|
|
7
|
+
constructor(defaultComponent: string, logLevel?: LogLevel);
|
|
8
|
+
private shouldLog;
|
|
9
|
+
debug(component: string, message: string, context?: string, metadata?: any): void;
|
|
10
|
+
info(component: string, message: string, context?: string, metadata?: any): void;
|
|
11
|
+
warn(component: string, message: string, context?: string, metadata?: any): void;
|
|
12
|
+
error(component: string, message: string, context?: string, metadata?: any): void;
|
|
13
|
+
logPerformance(component: string, operation: string, fileSize?: number, duration?: number, quota?: number): void;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=ConsoleLogger.d.ts.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Source: Duplicated from ../core/logging/ConsoleLogger.ts for MCP Server independence
|
|
2
|
+
// Sync with Next.js app logger when updates are made
|
|
3
|
+
export class ConsoleLogger {
|
|
4
|
+
defaultComponent;
|
|
5
|
+
logLevel;
|
|
6
|
+
logLevelPriority = {
|
|
7
|
+
'DEBUG': 0,
|
|
8
|
+
'INFO': 1,
|
|
9
|
+
'WARN': 2,
|
|
10
|
+
'ERROR': 3
|
|
11
|
+
};
|
|
12
|
+
constructor(defaultComponent, logLevel = 'INFO') {
|
|
13
|
+
this.defaultComponent = defaultComponent;
|
|
14
|
+
this.logLevel = logLevel;
|
|
15
|
+
}
|
|
16
|
+
shouldLog(level) {
|
|
17
|
+
return this.logLevelPriority[level] >= this.logLevelPriority[this.logLevel];
|
|
18
|
+
}
|
|
19
|
+
debug(component, message, context, metadata) {
|
|
20
|
+
if (this.shouldLog('DEBUG')) {
|
|
21
|
+
console.debug(`[DEBUG] ${component}: ${message}`, metadata || '');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
info(component, message, context, metadata) {
|
|
25
|
+
if (this.shouldLog('INFO')) {
|
|
26
|
+
console.info(`[INFO] ${component}: ${message}`, metadata || '');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
warn(component, message, context, metadata) {
|
|
30
|
+
if (this.shouldLog('WARN')) {
|
|
31
|
+
console.warn(`[WARN] ${component}: ${message}`, metadata || '');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
error(component, message, context, metadata) {
|
|
35
|
+
if (this.shouldLog('ERROR')) {
|
|
36
|
+
console.error(`[ERROR] ${component}: ${message}`, metadata || '');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
logPerformance(component, operation, fileSize, duration, quota) {
|
|
40
|
+
if (this.shouldLog('INFO')) {
|
|
41
|
+
console.info(`[PERF] ${component}: ${operation} - Duration: ${duration}ms`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=ConsoleLogger.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ILogger } from '../interfaces/ILogger.js';
|
|
2
|
+
type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
|
|
3
|
+
export declare class LoggerFactory {
|
|
4
|
+
private static logLevel;
|
|
5
|
+
static setLogLevel(level: LogLevel): void;
|
|
6
|
+
static createLogger(component: string): ILogger;
|
|
7
|
+
}
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=LoggerFactory.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// MCP Server-specific logger factory
|
|
2
|
+
import { ConsoleLogger } from './ConsoleLogger.js';
|
|
3
|
+
export class LoggerFactory {
|
|
4
|
+
static logLevel = 'INFO';
|
|
5
|
+
static setLogLevel(level) {
|
|
6
|
+
this.logLevel = level;
|
|
7
|
+
}
|
|
8
|
+
static createLogger(component) {
|
|
9
|
+
return new ConsoleLogger(component, this.logLevel);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=LoggerFactory.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface McpServerConfig {
|
|
2
|
+
ucmApiUrl: string;
|
|
3
|
+
port: number;
|
|
4
|
+
authToken?: string;
|
|
5
|
+
authorId?: string;
|
|
6
|
+
logLevel: 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
|
|
7
|
+
requestTimeout: number;
|
|
8
|
+
trustedAuthors: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class McpConfig {
|
|
11
|
+
private config;
|
|
12
|
+
constructor(options?: Partial<McpServerConfig>);
|
|
13
|
+
private extractAuthorIdFromToken;
|
|
14
|
+
private getEnvVar;
|
|
15
|
+
private parseTrustedAuthors;
|
|
16
|
+
private validateConfig;
|
|
17
|
+
get ucmApiUrl(): string;
|
|
18
|
+
get port(): number;
|
|
19
|
+
get authToken(): string | undefined;
|
|
20
|
+
get logLevel(): 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
|
|
21
|
+
get requestTimeout(): number;
|
|
22
|
+
get trustedAuthors(): string[];
|
|
23
|
+
get authorId(): string | undefined;
|
|
24
|
+
getFullConfig(): McpServerConfig;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=McpConfig.d.ts.map
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Source: Independent MCP Server configuration management
|
|
2
|
+
// This class centralizes ALL MCP Server configuration and environment variables
|
|
3
|
+
export class McpConfig {
|
|
4
|
+
config;
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
const authToken = options.authToken || this.getEnvVar('UCM_AUTH_TOKEN', '');
|
|
7
|
+
const authorId = this.extractAuthorIdFromToken(authToken);
|
|
8
|
+
this.config = {
|
|
9
|
+
ucmApiUrl: options.ucmApiUrl || this.getEnvVar('UCM_API_URL', 'https://ucm.utaba.ai'),
|
|
10
|
+
port: options.port || parseInt(this.getEnvVar('MCP_PORT', '3001')),
|
|
11
|
+
authToken: authToken,
|
|
12
|
+
authorId: options.authorId || authorId,
|
|
13
|
+
logLevel: options.logLevel || this.getEnvVar('MCP_LOG_LEVEL', 'ERROR'),
|
|
14
|
+
requestTimeout: options.requestTimeout || parseInt(this.getEnvVar('MCP_REQUEST_TIMEOUT', '300000')),
|
|
15
|
+
trustedAuthors: options.trustedAuthors || this.parseTrustedAuthors(this.getEnvVar('MCP_TRUSTED_AUTHORS', ''))
|
|
16
|
+
};
|
|
17
|
+
this.validateConfig();
|
|
18
|
+
}
|
|
19
|
+
extractAuthorIdFromToken(authToken) {
|
|
20
|
+
if (!authToken || authToken.trim() === '') {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const parts = authToken.split(':');
|
|
24
|
+
if (parts.length >= 2 && parts[0].trim() !== '') {
|
|
25
|
+
return parts[0].trim();
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
getEnvVar(name, defaultValue) {
|
|
30
|
+
const value = process.env[name];
|
|
31
|
+
if (value !== undefined) {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
if (defaultValue !== undefined) {
|
|
35
|
+
return defaultValue;
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Required environment variable ${name} is not set`);
|
|
38
|
+
}
|
|
39
|
+
parseTrustedAuthors(authorsString) {
|
|
40
|
+
if (!authorsString || authorsString.trim() === '') {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const authors = authorsString.split(',').map(author => author.trim()).filter(Boolean);
|
|
44
|
+
const validAuthorPattern = /^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$/;
|
|
45
|
+
for (const author of authors) {
|
|
46
|
+
if (!validAuthorPattern.test(author)) {
|
|
47
|
+
throw new Error(`Invalid trusted author format: "${author}". Authors must be alphanumeric with optional hyphens (no consecutive hyphens).`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return authors;
|
|
51
|
+
}
|
|
52
|
+
validateConfig() {
|
|
53
|
+
if (!this.config.ucmApiUrl.startsWith('http')) {
|
|
54
|
+
throw new Error('UCM API URL must be a valid HTTP/HTTPS URL');
|
|
55
|
+
}
|
|
56
|
+
if (this.config.port < 1 || this.config.port > 65535) {
|
|
57
|
+
throw new Error('Port must be between 1 and 65535');
|
|
58
|
+
}
|
|
59
|
+
if (!['DEBUG', 'INFO', 'WARN', 'ERROR'].includes(this.config.logLevel)) {
|
|
60
|
+
throw new Error('Log level must be one of: DEBUG, INFO, WARN, ERROR');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Getters for configuration values
|
|
64
|
+
get ucmApiUrl() {
|
|
65
|
+
return this.config.ucmApiUrl;
|
|
66
|
+
}
|
|
67
|
+
get port() {
|
|
68
|
+
return this.config.port;
|
|
69
|
+
}
|
|
70
|
+
get authToken() {
|
|
71
|
+
return this.config.authToken;
|
|
72
|
+
}
|
|
73
|
+
get logLevel() {
|
|
74
|
+
return this.config.logLevel;
|
|
75
|
+
}
|
|
76
|
+
get requestTimeout() {
|
|
77
|
+
return this.config.requestTimeout;
|
|
78
|
+
}
|
|
79
|
+
get trustedAuthors() {
|
|
80
|
+
return this.config.trustedAuthors;
|
|
81
|
+
}
|
|
82
|
+
get authorId() {
|
|
83
|
+
return this.config.authorId;
|
|
84
|
+
}
|
|
85
|
+
// Get full configuration object (for testing and debugging)
|
|
86
|
+
getFullConfig() {
|
|
87
|
+
return { ...this.config };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=McpConfig.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ILogger } from '../interfaces/ILogger.js';
|
|
2
|
+
import { ToolRegistry } from './ToolRegistry.js';
|
|
3
|
+
export declare class McpHandler {
|
|
4
|
+
private toolRegistry;
|
|
5
|
+
private logger;
|
|
6
|
+
private authorId?;
|
|
7
|
+
constructor(toolRegistry: ToolRegistry, logger: ILogger, authorId?: string | undefined);
|
|
8
|
+
handlePing(): Promise<any>;
|
|
9
|
+
handleToolsList(): Promise<any>;
|
|
10
|
+
handleToolCall(request: any): Promise<any>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=McpHandler.d.ts.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { McpError, McpErrorCode, McpErrorHandler } from '../utils/McpErrorHandler.js';
|
|
2
|
+
export class McpHandler {
|
|
3
|
+
toolRegistry;
|
|
4
|
+
logger;
|
|
5
|
+
authorId;
|
|
6
|
+
constructor(toolRegistry, logger, authorId) {
|
|
7
|
+
this.toolRegistry = toolRegistry;
|
|
8
|
+
this.logger = logger;
|
|
9
|
+
this.authorId = authorId;
|
|
10
|
+
}
|
|
11
|
+
async handlePing() {
|
|
12
|
+
this.logger.debug('MCP-Handler', 'Received ping request');
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
async handleToolsList() {
|
|
16
|
+
this.logger.debug('MCP-Handler', 'Received tools/list request');
|
|
17
|
+
try {
|
|
18
|
+
const tools = await this.toolRegistry.listTools();
|
|
19
|
+
this.logger.info('MCP-Handler', `Returning ${tools.length} available tools`);
|
|
20
|
+
return {
|
|
21
|
+
tools: tools.map(tool => ({
|
|
22
|
+
name: tool.name,
|
|
23
|
+
description: tool.description,
|
|
24
|
+
inputSchema: tool.inputSchema
|
|
25
|
+
}))
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
this.logger.error('MCP-Handler', 'Failed to list tools', '', error);
|
|
30
|
+
throw new McpError(McpErrorCode.InternalError, 'Failed to retrieve tool list');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async handleToolCall(request) {
|
|
34
|
+
const { name, arguments: args } = request.params;
|
|
35
|
+
this.logger.debug('MCP-Handler', `Received tool call for: ${name}`);
|
|
36
|
+
try {
|
|
37
|
+
if (!name) {
|
|
38
|
+
throw new McpError(McpErrorCode.InvalidParams, 'Tool name is required');
|
|
39
|
+
}
|
|
40
|
+
const result = await this.toolRegistry.executeTool(name, args || {});
|
|
41
|
+
this.logger.info('MCP-Handler', `Tool ${name} executed successfully`);
|
|
42
|
+
// If the tool returned a pre-formatted MCP response (with content array), pass through
|
|
43
|
+
if (result && typeof result === 'object' && Array.isArray(result.content)) {
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
// Handle string results directly (e.g., markdown content)
|
|
47
|
+
if (typeof result === 'string') {
|
|
48
|
+
return {
|
|
49
|
+
content: [
|
|
50
|
+
{
|
|
51
|
+
type: 'text',
|
|
52
|
+
text: result
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// For objects/arrays, use JSON.stringify
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{
|
|
61
|
+
type: 'text',
|
|
62
|
+
text: JSON.stringify(result, null, 2)
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
this.logger.error('MCP-Handler', `Tool execution failed for ${name}`, '', error);
|
|
69
|
+
// Format the error message for Claude Desktop to display properly
|
|
70
|
+
const formattedError = McpErrorHandler.formatError(error);
|
|
71
|
+
// Instead of throwing, return the error as content so Claude Desktop displays it
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: 'text',
|
|
76
|
+
text: `Error: ${formattedError.message}`
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
isError: true
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=McpHandler.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { McpConfig } from './McpConfig.js';
|
|
2
|
+
import { ILogger } from '../interfaces/ILogger.js';
|
|
3
|
+
export declare class McpServer {
|
|
4
|
+
private config;
|
|
5
|
+
private logger;
|
|
6
|
+
private server;
|
|
7
|
+
private handler;
|
|
8
|
+
private ucmClient;
|
|
9
|
+
private toolRegistry;
|
|
10
|
+
constructor(config: McpConfig, logger: ILogger);
|
|
11
|
+
private setupHandlers;
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=McpServer.d.ts.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { McpHandler } from './McpHandler.js';
|
|
5
|
+
import { UcmLocalApiClient } from '../clients/UcmLocalApiClient.js';
|
|
6
|
+
import { ToolRegistry } from './ToolRegistry.js';
|
|
7
|
+
export class McpServer {
|
|
8
|
+
config;
|
|
9
|
+
logger;
|
|
10
|
+
server;
|
|
11
|
+
handler;
|
|
12
|
+
ucmClient;
|
|
13
|
+
toolRegistry;
|
|
14
|
+
constructor(config, logger) {
|
|
15
|
+
this.config = config;
|
|
16
|
+
this.logger = logger;
|
|
17
|
+
this.ucmClient = new UcmLocalApiClient(config.ucmApiUrl, config.authToken, config.requestTimeout, config.authorId);
|
|
18
|
+
this.toolRegistry = new ToolRegistry(this.ucmClient, this.logger, config.trustedAuthors, config.authorId, config.ucmApiUrl);
|
|
19
|
+
this.handler = new McpHandler(this.toolRegistry, this.logger, config.authorId);
|
|
20
|
+
this.server = new Server({
|
|
21
|
+
name: 'ucm-mcp-server',
|
|
22
|
+
version: '1.0.0',
|
|
23
|
+
description: 'UCM Model Context Protocol Server - https://ucm.utaba.ai'
|
|
24
|
+
}, {
|
|
25
|
+
capabilities: {
|
|
26
|
+
tools: {},
|
|
27
|
+
logging: {}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
this.setupHandlers();
|
|
31
|
+
}
|
|
32
|
+
setupHandlers() {
|
|
33
|
+
this.server.setRequestHandler(ListToolsRequestSchema, this.handler.handleToolsList.bind(this.handler));
|
|
34
|
+
this.server.setRequestHandler(CallToolRequestSchema, this.handler.handleToolCall.bind(this.handler));
|
|
35
|
+
}
|
|
36
|
+
async start() {
|
|
37
|
+
const transport = new StdioServerTransport();
|
|
38
|
+
await this.server.connect(transport);
|
|
39
|
+
this.logger.info('MCP-Server', 'MCP Server connected via stdio transport');
|
|
40
|
+
}
|
|
41
|
+
async stop() {
|
|
42
|
+
// Cleanup HTTP client to prevent memory leaks from AbortSignal listeners
|
|
43
|
+
this.ucmClient.cleanup();
|
|
44
|
+
this.logger.info('MCP-Server', 'UCM API client cleaned up');
|
|
45
|
+
await this.server.close();
|
|
46
|
+
this.logger.info('MCP-Server', 'MCP Server stopped');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=McpServer.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { UcmLocalApiClient } from '../clients/UcmLocalApiClient.js';
|
|
2
|
+
import { ILogger } from '../interfaces/ILogger.js';
|
|
3
|
+
export interface ToolInfo {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: any;
|
|
7
|
+
}
|
|
8
|
+
export declare class ToolRegistry {
|
|
9
|
+
private ucmClient;
|
|
10
|
+
private logger;
|
|
11
|
+
private trustedAuthors;
|
|
12
|
+
private authorId?;
|
|
13
|
+
private baseUrl?;
|
|
14
|
+
private tools;
|
|
15
|
+
constructor(ucmClient: UcmLocalApiClient, logger: ILogger, trustedAuthors?: string[], authorId?: string | undefined, baseUrl?: string | undefined);
|
|
16
|
+
private registerTools;
|
|
17
|
+
private registerTool;
|
|
18
|
+
listTools(): Promise<ToolInfo[]>;
|
|
19
|
+
executeTool(name: string, params: any): Promise<any>;
|
|
20
|
+
getToolCount(): number;
|
|
21
|
+
hasToolnamed(name: string): boolean;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ToolRegistry.d.ts.map
|