nexus-mcp-agent 0.1.2 → 0.1.4
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/core/logger.d.ts +2 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +64 -40
- package/dist/core/logger.js.map +1 -1
- package/dist/core/server.d.ts +1 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +32 -35
- package/dist/core/server.js.map +1 -1
- package/dist/tools/system/index.d.ts.map +1 -1
- package/dist/tools/system/index.js +15 -5
- package/dist/tools/system/index.js.map +1 -1
- package/mcp-config.json +5 -1
- package/package.json +1 -1
- package/src/core/logger.ts +67 -43
- package/src/core/server.ts +35 -40
- package/src/tools/system/index.ts +15 -5
package/dist/core/logger.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import pino from 'pino';
|
|
2
|
+
export declare function initLogger(): void;
|
|
2
3
|
export declare const logger: pino.Logger<never, boolean>;
|
|
3
|
-
export type Logger =
|
|
4
|
+
export type Logger = pino.Logger;
|
|
4
5
|
export declare function createContextLogger(context: string): Logger;
|
|
5
6
|
export declare const auditLogger: pino.Logger<never, boolean>;
|
|
6
7
|
export declare function logAudit(event: string, details: Record<string, any>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,wBAAgB,UAAU,IAAI,IAAI,CAyCjC;AAsBD,eAAO,MAAM,MAAM,6BAAqB,CAAC;AACzC,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AACjC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AACD,eAAO,MAAM,WAAW,6BAAoB,CAAC;AAE7C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI1E"}
|
package/dist/core/logger.js
CHANGED
|
@@ -2,53 +2,77 @@ import pino from 'pino';
|
|
|
2
2
|
import { resolve } from 'path';
|
|
3
3
|
import { mkdirSync, existsSync } from 'fs';
|
|
4
4
|
import { nexusConfig } from './config.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
5
|
+
const state = {
|
|
6
|
+
logger: pino({ level: 'silent' }),
|
|
7
|
+
audit: pino({ level: 'silent' }),
|
|
8
|
+
};
|
|
9
|
+
export function initLogger() {
|
|
10
|
+
const logsDir = resolve(nexusConfig.paths.logs);
|
|
11
|
+
if (!existsSync(logsDir)) {
|
|
12
|
+
mkdirSync(logsDir, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
const logFile = resolve(logsDir, `nexus-${new Date().toISOString().split('T')[0]}.log`);
|
|
15
|
+
state.logger = pino({
|
|
16
|
+
level: nexusConfig.logging.level,
|
|
17
|
+
transport: {
|
|
18
|
+
targets: [
|
|
19
|
+
{
|
|
20
|
+
target: 'pino-pretty',
|
|
21
|
+
options: {
|
|
22
|
+
colorize: true,
|
|
23
|
+
translateTime: 'SYS:standard',
|
|
24
|
+
ignore: 'pid,hostname',
|
|
25
|
+
destination: 2,
|
|
26
|
+
},
|
|
22
27
|
},
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
{
|
|
29
|
+
target: 'pino/file',
|
|
30
|
+
options: {
|
|
31
|
+
destination: logFile,
|
|
32
|
+
mkdir: true,
|
|
33
|
+
},
|
|
29
34
|
},
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
state.audit = pino({
|
|
39
|
+
level: 'info',
|
|
40
|
+
transport: {
|
|
41
|
+
target: 'pino/file',
|
|
42
|
+
options: {
|
|
43
|
+
destination: resolve(logsDir, 'audit.log'),
|
|
44
|
+
mkdir: true,
|
|
30
45
|
},
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
// Create child logger with context
|
|
35
|
-
export function createContextLogger(context) {
|
|
36
|
-
return logger.child({ context });
|
|
46
|
+
},
|
|
47
|
+
});
|
|
37
48
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
options: {
|
|
44
|
-
destination: resolve(logsDir, 'audit.log'),
|
|
45
|
-
mkdir: true,
|
|
49
|
+
function bind(obj) {
|
|
50
|
+
return new Proxy(obj, {
|
|
51
|
+
get(target, prop) {
|
|
52
|
+
const val = target[prop];
|
|
53
|
+
return typeof val === 'function' ? val.bind(target) : val;
|
|
46
54
|
},
|
|
47
|
-
}
|
|
48
|
-
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function lazyChild(context) {
|
|
58
|
+
let child = null;
|
|
59
|
+
return new Proxy({}, {
|
|
60
|
+
get(_target, prop) {
|
|
61
|
+
if (!child)
|
|
62
|
+
child = state.logger.child({ context });
|
|
63
|
+
const val = child[prop];
|
|
64
|
+
return typeof val === 'function' ? val.bind(child) : val;
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
export const logger = bind(state.logger);
|
|
69
|
+
export function createContextLogger(context) {
|
|
70
|
+
return lazyChild(context);
|
|
71
|
+
}
|
|
72
|
+
export const auditLogger = bind(state.audit);
|
|
49
73
|
export function logAudit(event, details) {
|
|
50
74
|
if (nexusConfig.security.auditLogEnabled) {
|
|
51
|
-
|
|
75
|
+
state.audit.info({ event, ...details, timestamp: new Date().toISOString() }, event);
|
|
52
76
|
}
|
|
53
77
|
}
|
|
54
78
|
//# sourceMappingURL=logger.js.map
|
package/dist/core/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/core/server.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAMA,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,GAAG,CAA0C;;IAW/C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCjC,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,eAAe;IAsCjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}
|
package/dist/core/server.js
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
-
import { createContextLogger } from './logger.js';
|
|
3
|
+
import { createContextLogger, initLogger } from './logger.js';
|
|
4
4
|
import { nexusConfig, validateConfig } from './config.js';
|
|
5
5
|
import { ToolRegistry } from './registry.js';
|
|
6
|
-
// Import tool modules
|
|
7
|
-
import { registerWebTools } from '../tools/web/index.js';
|
|
8
|
-
import { registerFilesystemTools } from '../tools/filesystem/index.js';
|
|
9
|
-
import { registerTerminalTools } from '../tools/terminal/index.js';
|
|
10
|
-
import { registerGitTools } from '../tools/git/index.js';
|
|
11
|
-
import { registerMemoryTools } from '../tools/memory/index.js';
|
|
12
|
-
import { registerAutomationTools } from '../tools/automation/index.js';
|
|
13
|
-
import { registerAgentTools } from '../tools/agents/index.js';
|
|
14
|
-
import { registerSystemTools } from '../tools/system/index.js';
|
|
15
|
-
const log = createContextLogger('server');
|
|
16
6
|
export class NexusServer {
|
|
17
7
|
server;
|
|
18
8
|
registry;
|
|
19
9
|
transport = null;
|
|
10
|
+
log;
|
|
20
11
|
constructor() {
|
|
21
12
|
this.server = new McpServer({
|
|
22
13
|
name: 'NEXUS',
|
|
@@ -26,29 +17,36 @@ export class NexusServer {
|
|
|
26
17
|
this.registry = new ToolRegistry();
|
|
27
18
|
}
|
|
28
19
|
async initialize() {
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
initLogger();
|
|
21
|
+
this.log = createContextLogger('server');
|
|
22
|
+
this.log.info('Initializing NEXUS server...');
|
|
31
23
|
const warnings = validateConfig();
|
|
32
|
-
warnings.forEach(w => log.warn(w));
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
24
|
+
warnings.forEach(w => this.log.warn(w));
|
|
25
|
+
this.log.info('Registering tools...');
|
|
26
|
+
const { registerWebTools } = await import('../tools/web/index.js');
|
|
27
|
+
const { registerFilesystemTools } = await import('../tools/filesystem/index.js');
|
|
28
|
+
const { registerTerminalTools } = await import('../tools/terminal/index.js');
|
|
29
|
+
const { registerGitTools } = await import('../tools/git/index.js');
|
|
30
|
+
const { registerMemoryTools } = await import('../tools/memory/index.js');
|
|
31
|
+
const { registerAutomationTools } = await import('../tools/automation/index.js');
|
|
32
|
+
const { registerAgentTools } = await import('../tools/agents/index.js');
|
|
33
|
+
const { registerSystemTools } = await import('../tools/system/index.js');
|
|
34
|
+
await Promise.all([
|
|
35
|
+
registerWebTools(this.server, this.registry),
|
|
36
|
+
registerFilesystemTools(this.server, this.registry),
|
|
37
|
+
registerTerminalTools(this.server, this.registry),
|
|
38
|
+
registerGitTools(this.server, this.registry),
|
|
39
|
+
registerMemoryTools(this.server, this.registry),
|
|
40
|
+
registerAutomationTools(this.server, this.registry),
|
|
41
|
+
registerAgentTools(this.server, this.registry),
|
|
42
|
+
registerSystemTools(this.server, this.registry),
|
|
43
|
+
]);
|
|
43
44
|
const toolCount = this.registry.getToolCount();
|
|
44
|
-
log.info(`Registered ${toolCount} tools`);
|
|
45
|
-
// Register resources
|
|
45
|
+
this.log.info(`Registered ${toolCount} tools`);
|
|
46
46
|
this.registerResources();
|
|
47
|
-
// Register prompts
|
|
48
47
|
this.registerPrompts();
|
|
49
48
|
}
|
|
50
49
|
registerResources() {
|
|
51
|
-
// System info resource
|
|
52
50
|
this.server.resource('system-info', 'nexus://system/info', async (uri) => ({
|
|
53
51
|
contents: [{
|
|
54
52
|
uri: uri.href,
|
|
@@ -67,10 +65,9 @@ export class NexusServer {
|
|
|
67
65
|
}, null, 2),
|
|
68
66
|
}],
|
|
69
67
|
}));
|
|
70
|
-
log.info('Registered resources');
|
|
68
|
+
this.log.info('Registered resources');
|
|
71
69
|
}
|
|
72
70
|
registerPrompts() {
|
|
73
|
-
// System prompt for autonomous agent
|
|
74
71
|
this.server.prompt('autonomous-agent', 'System prompt for autonomous operation', () => ({
|
|
75
72
|
messages: [{
|
|
76
73
|
role: 'user',
|
|
@@ -100,21 +97,21 @@ Allowed directories: ${nexusConfig.security.allowedDirs.join(', ')}`,
|
|
|
100
97
|
},
|
|
101
98
|
}],
|
|
102
99
|
}));
|
|
103
|
-
log.info('Registered prompts');
|
|
100
|
+
this.log.info('Registered prompts');
|
|
104
101
|
}
|
|
105
102
|
async start() {
|
|
106
|
-
log.info('Starting MCP server on stdio...');
|
|
103
|
+
this.log.info('Starting MCP server on stdio...');
|
|
107
104
|
this.transport = new StdioServerTransport();
|
|
108
105
|
await this.server.connect(this.transport);
|
|
109
|
-
log.info('NEXUS server is running');
|
|
106
|
+
this.log.info('NEXUS server is running');
|
|
110
107
|
}
|
|
111
108
|
async stop() {
|
|
112
|
-
log.info('Stopping NEXUS server...');
|
|
109
|
+
this.log.info('Stopping NEXUS server...');
|
|
113
110
|
if (this.transport) {
|
|
114
111
|
await this.transport.close();
|
|
115
112
|
}
|
|
116
113
|
await this.server.close();
|
|
117
|
-
log.info('NEXUS server stopped');
|
|
114
|
+
this.log.info('NEXUS server stopped');
|
|
118
115
|
}
|
|
119
116
|
}
|
|
120
117
|
//# sourceMappingURL=server.js.map
|
package/dist/core/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA8GtD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAqCnF"}
|
|
@@ -2,7 +2,13 @@ import { z } from 'zod/v3';
|
|
|
2
2
|
import { createContextLogger } from '../../core/logger.js';
|
|
3
3
|
import { nexusConfig } from '../../core/config.js';
|
|
4
4
|
const log = createContextLogger('tools/system');
|
|
5
|
-
const
|
|
5
|
+
const SENSITIVE_PATTERNS = [
|
|
6
|
+
/api[_-]?key/i, /token/i, /secret/i, /password/i, /auth/i,
|
|
7
|
+
/key$/i, /credential/i, /private/i, /session/i,
|
|
8
|
+
];
|
|
9
|
+
function isSensitiveKey(key) {
|
|
10
|
+
return SENSITIVE_PATTERNS.some(p => p.test(key));
|
|
11
|
+
}
|
|
6
12
|
async function systemInfoFull() {
|
|
7
13
|
const os = await import('os');
|
|
8
14
|
return {
|
|
@@ -71,15 +77,19 @@ async function configSet(params) {
|
|
|
71
77
|
async function envRead(params) {
|
|
72
78
|
if (!params.key) {
|
|
73
79
|
const env = {};
|
|
80
|
+
const filtered = [];
|
|
74
81
|
for (const [k, v] of Object.entries(process.env)) {
|
|
75
|
-
if (
|
|
82
|
+
if (isSensitiveKey(k)) {
|
|
83
|
+
filtered.push(k);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
76
86
|
env[k] = v;
|
|
77
87
|
}
|
|
78
88
|
}
|
|
79
|
-
return { success: true, env, filteredKeys:
|
|
89
|
+
return { success: true, env, filteredKeys: filtered };
|
|
80
90
|
}
|
|
81
|
-
if (
|
|
82
|
-
return { success: false, error: `Access denied: ${params.key}
|
|
91
|
+
if (isSensitiveKey(params.key)) {
|
|
92
|
+
return { success: false, error: `Access denied: ${params.key} matches sensitive pattern` };
|
|
83
93
|
}
|
|
84
94
|
return { success: true, key: params.key, value: process.env[params.key] };
|
|
85
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/system/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,GAAG,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;AAEhD,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/system/index.ts"],"names":[],"mappings":"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"}
|
package/mcp-config.json
CHANGED
package/package.json
CHANGED
package/src/core/logger.ts
CHANGED
|
@@ -3,59 +3,83 @@ import { resolve } from 'path';
|
|
|
3
3
|
import { mkdirSync, existsSync } from 'fs';
|
|
4
4
|
import { nexusConfig } from './config.js';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
const state: { logger: pino.Logger; audit: pino.Logger } = {
|
|
7
|
+
logger: pino({ level: 'silent' }),
|
|
8
|
+
audit: pino({ level: 'silent' }),
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export function initLogger(): void {
|
|
12
|
+
const logsDir = resolve(nexusConfig.paths.logs);
|
|
13
|
+
if (!existsSync(logsDir)) {
|
|
14
|
+
mkdirSync(logsDir, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
const logFile = resolve(logsDir, `nexus-${new Date().toISOString().split('T')[0]}.log`);
|
|
11
17
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
ignore: 'pid,hostname',
|
|
18
|
+
state.logger = pino({
|
|
19
|
+
level: nexusConfig.logging.level,
|
|
20
|
+
transport: {
|
|
21
|
+
targets: [
|
|
22
|
+
{
|
|
23
|
+
target: 'pino-pretty',
|
|
24
|
+
options: {
|
|
25
|
+
colorize: true,
|
|
26
|
+
translateTime: 'SYS:standard',
|
|
27
|
+
ignore: 'pid,hostname',
|
|
28
|
+
destination: 2,
|
|
29
|
+
},
|
|
25
30
|
},
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
{
|
|
32
|
+
target: 'pino/file',
|
|
33
|
+
options: {
|
|
34
|
+
destination: logFile,
|
|
35
|
+
mkdir: true,
|
|
36
|
+
},
|
|
32
37
|
},
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
});
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
});
|
|
37
41
|
|
|
38
|
-
|
|
42
|
+
state.audit = pino({
|
|
43
|
+
level: 'info',
|
|
44
|
+
transport: {
|
|
45
|
+
target: 'pino/file',
|
|
46
|
+
options: {
|
|
47
|
+
destination: resolve(logsDir, 'audit.log'),
|
|
48
|
+
mkdir: true,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
39
53
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
54
|
+
function bind<T extends object>(obj: T): T {
|
|
55
|
+
return new Proxy(obj, {
|
|
56
|
+
get(target, prop) {
|
|
57
|
+
const val = (target as any)[prop];
|
|
58
|
+
return typeof val === 'function' ? val.bind(target) : val;
|
|
59
|
+
},
|
|
60
|
+
});
|
|
43
61
|
}
|
|
44
62
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
mkdir: true,
|
|
63
|
+
function lazyChild(context: string): pino.Logger {
|
|
64
|
+
let child: pino.Logger | null = null;
|
|
65
|
+
return new Proxy({} as pino.Logger, {
|
|
66
|
+
get(_target, prop) {
|
|
67
|
+
if (!child) child = state.logger.child({ context });
|
|
68
|
+
const val = (child as any)[prop];
|
|
69
|
+
return typeof val === 'function' ? val.bind(child) : val;
|
|
53
70
|
},
|
|
54
|
-
}
|
|
55
|
-
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export const logger = bind(state.logger);
|
|
75
|
+
export type Logger = pino.Logger;
|
|
76
|
+
export function createContextLogger(context: string): Logger {
|
|
77
|
+
return lazyChild(context);
|
|
78
|
+
}
|
|
79
|
+
export const auditLogger = bind(state.audit);
|
|
56
80
|
|
|
57
81
|
export function logAudit(event: string, details: Record<string, any>): void {
|
|
58
82
|
if (nexusConfig.security.auditLogEnabled) {
|
|
59
|
-
|
|
83
|
+
state.audit.info({ event, ...details, timestamp: new Date().toISOString() }, event);
|
|
60
84
|
}
|
|
61
85
|
}
|
package/src/core/server.ts
CHANGED
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
-
import { createContextLogger } from './logger.js';
|
|
3
|
+
import { createContextLogger, initLogger } from './logger.js';
|
|
4
4
|
import { nexusConfig, validateConfig } from './config.js';
|
|
5
5
|
import { ToolRegistry } from './registry.js';
|
|
6
6
|
|
|
7
|
-
// Import tool modules
|
|
8
|
-
import { registerWebTools } from '../tools/web/index.js';
|
|
9
|
-
import { registerFilesystemTools } from '../tools/filesystem/index.js';
|
|
10
|
-
import { registerTerminalTools } from '../tools/terminal/index.js';
|
|
11
|
-
import { registerGitTools } from '../tools/git/index.js';
|
|
12
|
-
import { registerMemoryTools } from '../tools/memory/index.js';
|
|
13
|
-
import { registerAutomationTools } from '../tools/automation/index.js';
|
|
14
|
-
import { registerAgentTools } from '../tools/agents/index.js';
|
|
15
|
-
import { registerSystemTools } from '../tools/system/index.js';
|
|
16
|
-
|
|
17
|
-
const log = createContextLogger('server');
|
|
18
|
-
|
|
19
7
|
export class NexusServer {
|
|
20
8
|
private server: McpServer;
|
|
21
9
|
private registry: ToolRegistry;
|
|
22
10
|
private transport: StdioServerTransport | null = null;
|
|
11
|
+
private log!: ReturnType<typeof createContextLogger>;
|
|
23
12
|
|
|
24
13
|
constructor() {
|
|
25
14
|
this.server = new McpServer({
|
|
@@ -27,40 +16,47 @@ export class NexusServer {
|
|
|
27
16
|
version: '0.1.0',
|
|
28
17
|
description: 'Autonomous AI Agent Ecosystem - Self-empowered MCP Server',
|
|
29
18
|
});
|
|
30
|
-
|
|
31
19
|
this.registry = new ToolRegistry();
|
|
32
20
|
}
|
|
33
21
|
|
|
34
22
|
async initialize(): Promise<void> {
|
|
35
|
-
|
|
23
|
+
initLogger();
|
|
24
|
+
this.log = createContextLogger('server');
|
|
25
|
+
this.log.info('Initializing NEXUS server...');
|
|
36
26
|
|
|
37
|
-
// Validate configuration
|
|
38
27
|
const warnings = validateConfig();
|
|
39
|
-
warnings.forEach(w => log.warn(w));
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
registerWebTools(
|
|
44
|
-
registerFilesystemTools(
|
|
45
|
-
registerTerminalTools(
|
|
46
|
-
registerGitTools(
|
|
47
|
-
registerMemoryTools(
|
|
48
|
-
registerAutomationTools(
|
|
49
|
-
registerAgentTools(
|
|
50
|
-
registerSystemTools(
|
|
28
|
+
warnings.forEach(w => this.log.warn(w));
|
|
29
|
+
|
|
30
|
+
this.log.info('Registering tools...');
|
|
31
|
+
|
|
32
|
+
const { registerWebTools } = await import('../tools/web/index.js');
|
|
33
|
+
const { registerFilesystemTools } = await import('../tools/filesystem/index.js');
|
|
34
|
+
const { registerTerminalTools } = await import('../tools/terminal/index.js');
|
|
35
|
+
const { registerGitTools } = await import('../tools/git/index.js');
|
|
36
|
+
const { registerMemoryTools } = await import('../tools/memory/index.js');
|
|
37
|
+
const { registerAutomationTools } = await import('../tools/automation/index.js');
|
|
38
|
+
const { registerAgentTools } = await import('../tools/agents/index.js');
|
|
39
|
+
const { registerSystemTools } = await import('../tools/system/index.js');
|
|
40
|
+
|
|
41
|
+
await Promise.all([
|
|
42
|
+
registerWebTools(this.server, this.registry),
|
|
43
|
+
registerFilesystemTools(this.server, this.registry),
|
|
44
|
+
registerTerminalTools(this.server, this.registry),
|
|
45
|
+
registerGitTools(this.server, this.registry),
|
|
46
|
+
registerMemoryTools(this.server, this.registry),
|
|
47
|
+
registerAutomationTools(this.server, this.registry),
|
|
48
|
+
registerAgentTools(this.server, this.registry),
|
|
49
|
+
registerSystemTools(this.server, this.registry),
|
|
50
|
+
]);
|
|
51
51
|
|
|
52
52
|
const toolCount = this.registry.getToolCount();
|
|
53
|
-
log.info(`Registered ${toolCount} tools`);
|
|
53
|
+
this.log.info(`Registered ${toolCount} tools`);
|
|
54
54
|
|
|
55
|
-
// Register resources
|
|
56
55
|
this.registerResources();
|
|
57
|
-
|
|
58
|
-
// Register prompts
|
|
59
56
|
this.registerPrompts();
|
|
60
57
|
}
|
|
61
58
|
|
|
62
59
|
private registerResources(): void {
|
|
63
|
-
// System info resource
|
|
64
60
|
this.server.resource(
|
|
65
61
|
'system-info',
|
|
66
62
|
'nexus://system/info',
|
|
@@ -84,11 +80,10 @@ export class NexusServer {
|
|
|
84
80
|
})
|
|
85
81
|
);
|
|
86
82
|
|
|
87
|
-
log.info('Registered resources');
|
|
83
|
+
this.log.info('Registered resources');
|
|
88
84
|
}
|
|
89
85
|
|
|
90
86
|
private registerPrompts(): void {
|
|
91
|
-
// System prompt for autonomous agent
|
|
92
87
|
this.server.prompt(
|
|
93
88
|
'autonomous-agent',
|
|
94
89
|
'System prompt for autonomous operation',
|
|
@@ -123,22 +118,22 @@ Allowed directories: ${nexusConfig.security.allowedDirs.join(', ')}`,
|
|
|
123
118
|
})
|
|
124
119
|
);
|
|
125
120
|
|
|
126
|
-
log.info('Registered prompts');
|
|
121
|
+
this.log.info('Registered prompts');
|
|
127
122
|
}
|
|
128
123
|
|
|
129
124
|
async start(): Promise<void> {
|
|
130
|
-
log.info('Starting MCP server on stdio...');
|
|
125
|
+
this.log.info('Starting MCP server on stdio...');
|
|
131
126
|
this.transport = new StdioServerTransport();
|
|
132
127
|
await this.server.connect(this.transport);
|
|
133
|
-
log.info('NEXUS server is running');
|
|
128
|
+
this.log.info('NEXUS server is running');
|
|
134
129
|
}
|
|
135
130
|
|
|
136
131
|
async stop(): Promise<void> {
|
|
137
|
-
log.info('Stopping NEXUS server...');
|
|
132
|
+
this.log.info('Stopping NEXUS server...');
|
|
138
133
|
if (this.transport) {
|
|
139
134
|
await this.transport.close();
|
|
140
135
|
}
|
|
141
136
|
await this.server.close();
|
|
142
|
-
log.info('NEXUS server stopped');
|
|
137
|
+
this.log.info('NEXUS server stopped');
|
|
143
138
|
}
|
|
144
139
|
}
|
|
@@ -6,7 +6,14 @@ import { nexusConfig } from '../../core/config.js';
|
|
|
6
6
|
|
|
7
7
|
const log = createContextLogger('tools/system');
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const SENSITIVE_PATTERNS = [
|
|
10
|
+
/api[_-]?key/i, /token/i, /secret/i, /password/i, /auth/i,
|
|
11
|
+
/key$/i, /credential/i, /private/i, /session/i,
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
function isSensitiveKey(key: string): boolean {
|
|
15
|
+
return SENSITIVE_PATTERNS.some(p => p.test(key));
|
|
16
|
+
}
|
|
10
17
|
|
|
11
18
|
async function systemInfoFull(): Promise<any> {
|
|
12
19
|
const os = await import('os');
|
|
@@ -83,15 +90,18 @@ async function configSet(params: ConfigSetParams): Promise<any> {
|
|
|
83
90
|
async function envRead(params: EnvReadParams): Promise<any> {
|
|
84
91
|
if (!params.key) {
|
|
85
92
|
const env: Record<string, string | undefined> = {};
|
|
93
|
+
const filtered: string[] = [];
|
|
86
94
|
for (const [k, v] of Object.entries(process.env)) {
|
|
87
|
-
if (
|
|
95
|
+
if (isSensitiveKey(k)) {
|
|
96
|
+
filtered.push(k);
|
|
97
|
+
} else {
|
|
88
98
|
env[k] = v;
|
|
89
99
|
}
|
|
90
100
|
}
|
|
91
|
-
return { success: true, env, filteredKeys:
|
|
101
|
+
return { success: true, env, filteredKeys: filtered };
|
|
92
102
|
}
|
|
93
|
-
if (
|
|
94
|
-
return { success: false, error: `Access denied: ${params.key}
|
|
103
|
+
if (isSensitiveKey(params.key)) {
|
|
104
|
+
return { success: false, error: `Access denied: ${params.key} matches sensitive pattern` };
|
|
95
105
|
}
|
|
96
106
|
return { success: true, key: params.key, value: process.env[params.key] };
|
|
97
107
|
}
|