claude-flow-novice 2.14.14 → 2.14.16
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/.claude/commands/cfn-loop-cli.md +21 -27
- package/claude-assets/commands/cfn-loop-cli.md +21 -27
- package/claude-assets/skills/cfn-multi-coordinator-planning/map-dependencies-conflicts.sh +375 -375
- package/claude-assets/skills/cfn-multi-coordinator-planning/plan-coordinator-resources.sh +257 -257
- package/claude-assets/skills/cfn-multi-coordinator-planning/plan-multi-coordinator-work.sh +266 -266
- package/claude-assets/skills/cfn-multi-coordinator-planning/plan-risk-rollout.sh +349 -349
- package/claude-assets/skills/cfn-multi-coordinator-planning/test-multi-coordinator-planning.sh +337 -337
- package/claude-assets/skills/cfn-multi-coordinator-planning/validate-task-planning.sh +188 -188
- package/dist/agent/skill-mcp-selector.js +459 -0
- package/dist/agent/skill-mcp-selector.js.map +1 -0
- package/dist/cli/agent-token-manager.js +382 -0
- package/dist/cli/agent-token-manager.js.map +1 -0
- package/dist/cli/config-manager.js +91 -109
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/mcp/auth-middleware.js +367 -0
- package/dist/mcp/auth-middleware.js.map +1 -0
- package/dist/mcp/playwright-mcp-server-auth.js +515 -0
- package/dist/mcp/playwright-mcp-server-auth.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/config-manager.js"],"sourcesContent":["\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar fs = require(\"fs/promises\");\nvar path = require(\"path\");\nvar ajv_1 = require(\"ajv\");\nvar get_1 = require(\"lodash/get\");\nvar ConfigManager = /** @class */ (function () {\n function ConfigManager() {\n this.configPath = path.join(process.env.HOME || \"\", \".claude-flow-config.json\");\n this.schemaPath = path.join(__dirname, \"../../.claude/skills/config-management/config.json\");\n this.ajv = new ajv_1.default();\n }\n ConfigManager.getInstance = function () {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager();\n }\n return ConfigManager.instance;\n };\n ConfigManager.prototype.readConfig = function () {\n return __awaiter(this, void 0, void 0, function () {\n var configContent, error_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n return [4 /*yield*/, fs.readFile(this.configPath, \"utf-8\")];\n case 1:\n configContent = _a.sent();\n return [2 /*return*/, JSON.parse(configContent)];\n case 2:\n error_1 = _a.sent();\n // If config doesn't exist, create from schema\n return [2 /*return*/, this.resetToDefaults()];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n ConfigManager.prototype.writeConfig = function (config) {\n return __awaiter(this, void 0, void 0, function () {\n var schemaContent, schema, validate;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, fs.readFile(this.schemaPath, \"utf-8\")];\n case 1:\n schemaContent = _a.sent();\n schema = JSON.parse(schemaContent);\n validate = this.ajv.compile(schema);\n if (!validate(config)) {\n throw new Error(\"Invalid configuration: \" + this.ajv.errorsText(validate.errors));\n }\n return [4 /*yield*/, fs.writeFile(this.configPath, JSON.stringify(config, null, 2), \"utf-8\")];\n case 2:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n ConfigManager.prototype.getValue = function (keyPath) {\n return __awaiter(this, void 0, void 0, function () {\n var config, value, customConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.readConfig()];\n case 1:\n config = _a.sent();\n value = (0, get_1.default)(config, keyPath);\n if (!(value === undefined)) return [3 /*break*/, 3];\n return [4 /*yield*/, this.readCustomConfig()];\n case 2:\n customConfig = _a.sent();\n return [2 /*return*/, (0, get_1.default)(customConfig, keyPath)];\n case 3: return [2 /*return*/, value];\n }\n });\n });\n };\n ConfigManager.prototype.readCustomConfig = function () {\n return __awaiter(this, void 0, void 0, function () {\n var customConfigPath, customConfigContent, error_2;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 2, , 3]);\n customConfigPath = path.join(process.env.HOME || \"\", \".claude-flow-custom-config.json\");\n return [4 /*yield*/, fs.readFile(customConfigPath, \"utf-8\")];\n case 1:\n customConfigContent = _a.sent();\n return [2 /*return*/, JSON.parse(customConfigContent)];\n case 2:\n error_2 = _a.sent();\n // If custom config doesn't exist or can't be read, return empty object\n return [2 /*return*/, {}];\n case 3: return [2 /*return*/];\n }\n });\n });\n };\n ConfigManager.prototype.set = function (key, value) {\n return __awaiter(this, void 0, void 0, function () {\n var config;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.readConfig()];\n case 1:\n config = _a.sent();\n // Type assertion to handle both full object and nested key\n if (typeof value === \"object\" && value !== null) {\n config[key] = value;\n }\n else {\n throw new Error(\"Invalid configuration value\");\n }\n return [4 /*yield*/, this.writeConfig(config)];\n case 2:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n ConfigManager.prototype.getAll = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, this.readConfig()];\n });\n });\n };\n ConfigManager.prototype.resetToDefaults = function () {\n return __awaiter(this, void 0, void 0, function () {\n var schemaContent, schema, defaultConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, fs.readFile(this.schemaPath, \"utf-8\")];\n case 1:\n schemaContent = _a.sent();\n schema = JSON.parse(schemaContent);\n defaultConfig = {\n redis: {\n host: schema.properties.redis.properties.host.default,\n port: schema.properties.redis.properties.port.default,\n },\n agent: {\n default_strategy: schema.properties.agent.properties.default_strategy.default,\n max_concurrent_agents: schema.properties.agent.properties.max_concurrent_agents.default,\n log_level: schema.properties.agent.properties.log_level.default,\n },\n security: {\n enabled: schema.properties.security.properties.enabled.default,\n max_retry_attempts: schema.properties.security.properties.max_retry_attempts.default,\n },\n };\n return [4 /*yield*/, this.writeConfig(defaultConfig)];\n case 2:\n _a.sent();\n return [2 /*return*/, defaultConfig];\n }\n });\n });\n };\n return ConfigManager;\n}());\nexports.default = ConfigManager;\n"],"names":["__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","Promise","reject","fulfilled","step","next","e","rejected","result","done","then","apply","__generator","body","_","label","sent","t","trys","ops","f","y","g","Object","create","Iterator","prototype","verb","Symbol","iterator","n","v","op","TypeError","call","pop","length","push","defineProperty","exports","fs","require","path","ajv_1","get_1","ConfigManager","configPath","join","process","env","HOME","schemaPath","__dirname","ajv","default","getInstance","instance","readConfig","configContent","error_1","_a","readFile","JSON","parse","resetToDefaults","writeConfig","config","schemaContent","schema","validate","compile","Error","errorsText","errors","writeFile","stringify","getValue","keyPath","customConfig","undefined","readCustomConfig","customConfigPath","customConfigContent","error_2","set","key","getAll","defaultConfig","redis","host","properties","port","agent","default_strategy","max_concurrent_agents","log_level","security","enabled","max_retry_attempts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/config-manager.ts"],"sourcesContent":["import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport Ajv from \"ajv\";\nimport * as lodash from \"lodash\";\n\ninterface ConfigSchema {\n redis: {\n host: string;\n port: number;\n password?: string;\n };\n agent: {\n default_strategy: string;\n max_concurrent_agents: number;\n log_level: \"debug\" | \"info\" | \"warn\" | \"error\";\n };\n security: {\n enabled: boolean;\n max_retry_attempts: number;\n };\n}\n\nclass ConfigManager {\n private static _instance: ConfigManager | null = null;\n private configPath: string;\n private schemaPath: string;\n private ajv: Ajv;\n\n private constructor() {\n this.configPath = path.join(\n process.env.HOME || \"\",\n \".claude-flow-config.json\",\n );\n this.schemaPath = path.join(\n __dirname,\n \"../../.claude/skills/config-management/config.json\",\n );\n this.ajv = new Ajv();\n }\n\n public static getInstance(): ConfigManager {\n if (!ConfigManager._instance) {\n ConfigManager._instance = new ConfigManager();\n }\n return ConfigManager._instance;\n }\n\n private async readConfig(): Promise<ConfigSchema> {\n try {\n const configContent = await fs.readFile(this.configPath, \"utf-8\");\n return JSON.parse(configContent) as ConfigSchema;\n } catch (error) {\n // If config doesn't exist, create from schema\n return this.resetToDefaults();\n }\n }\n\n private async writeConfig(config: ConfigSchema): Promise<void> {\n const schemaContent = await fs.readFile(this.schemaPath, \"utf-8\");\n const schema = JSON.parse(schemaContent);\n\n const validate = this.ajv.compile(schema);\n if (!validate(config)) {\n throw new Error(\n \"Invalid configuration: \" + this.ajv.errorsText(validate.errors),\n );\n }\n\n await fs.writeFile(\n this.configPath,\n JSON.stringify(config, null, 2),\n \"utf-8\",\n );\n }\n\n public async getValue(keyPath: string): Promise<any> {\n const config = await this.readConfig();\n const value = lodash.get(config, keyPath);\n\n if (value === undefined) {\n // Check if it's a custom key path not in the schema\n const customConfig = await this.readCustomConfig();\n return lodash.get(customConfig, keyPath);\n }\n\n return value;\n }\n\n private async readCustomConfig(): Promise<Record<string, any>> {\n try {\n const customConfigPath = path.join(\n process.env.HOME || \"\",\n \".claude-flow-custom-config.json\",\n );\n const customConfigContent = await fs.readFile(customConfigPath, \"utf-8\");\n return JSON.parse(customConfigContent);\n } catch (error) {\n // If custom config doesn't exist or can't be read, return empty object\n return {};\n }\n }\n\n public async set(key: keyof ConfigSchema, value: ConfigSchema[keyof ConfigSchema]): Promise<void> {\n const config = await this.readConfig();\n\n // Type assertion to handle full object\n if (typeof value === \"object\" && value !== null) {\n config[key] = value;\n } else {\n throw new Error(\"Invalid configuration value\");\n }\n\n await this.writeConfig(config);\n }\n\n public async getAll(): Promise<ConfigSchema> {\n return this.readConfig();\n }\n\n public async resetToDefaults(): Promise<ConfigSchema> {\n const schemaContent = await fs.readFile(this.schemaPath, \"utf-8\");\n const schema = JSON.parse(schemaContent);\n\n // Extract default values from the schema\n const defaultConfig: ConfigSchema = {\n redis: {\n host: schema.properties.redis.properties.host.default,\n port: schema.properties.redis.properties.port.default,\n },\n agent: {\n default_strategy:\n schema.properties.agent.properties.default_strategy.default,\n max_concurrent_agents:\n schema.properties.agent.properties.max_concurrent_agents.default,\n log_level: schema.properties.agent.properties.log_level.default,\n },\n security: {\n enabled: schema.properties.security.properties.enabled.default,\n max_retry_attempts:\n schema.properties.security.properties.max_retry_attempts.default,\n },\n };\n\n await this.writeConfig(defaultConfig);\n return defaultConfig;\n }\n}\n\nexport default ConfigManager;"],"names":["fs","path","Ajv","lodash","ConfigManager","_instance","configPath","schemaPath","ajv","join","process","env","HOME","__dirname","getInstance","readConfig","configContent","readFile","JSON","parse","error","resetToDefaults","writeConfig","config","schemaContent","schema","validate","compile","Error","errorsText","errors","writeFile","stringify","getValue","keyPath","value","get","undefined","customConfig","readCustomConfig","customConfigPath","customConfigContent","set","key","getAll","defaultConfig","redis","host","properties","default","port","agent","default_strategy","max_concurrent_agents","log_level","security","enabled","max_retry_attempts"],"mappings":"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"} config = _a.sent();\n // Type assertion to handle both full object and nested key\n if (typeof value === \"object\" && value !== null) {\n config[key] = value;\n }\n else {\n throw new Error(\"Invalid configuration value\");\n }\n return [4 /*yield*/, this.writeConfig(config)];\n case 2:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n ConfigManager.prototype.getAll = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, this.readConfig()];\n });\n });\n };\n ConfigManager.prototype.resetToDefaults = function () {\n return __awaiter(this, void 0, void 0, function () {\n var schemaContent, schema, defaultConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, fs.readFile(this.schemaPath, \"utf-8\")];\n case 1:\n schemaContent = _a.sent();\n schema = JSON.parse(schemaContent);\n defaultConfig = {\n redis: {\n host: schema.properties.redis.properties.host.default,\n port: schema.properties.redis.properties.port.default,\n },\n agent: {\n default_strategy: schema.properties.agent.properties.default_strategy.default,\n max_concurrent_agents: schema.properties.agent.properties.max_concurrent_agents.default,\n log_level: schema.properties.agent.properties.log_level.default,\n },\n security: {\n enabled: schema.properties.security.properties.enabled.default,\n max_retry_attempts: schema.properties.security.properties.max_retry_attempts.default,\n },\n };\n return [4 /*yield*/, this.writeConfig(defaultConfig)];\n case 2:\n _a.sent();\n return [2 /*return*/, defaultConfig];\n }\n });\n });\n };\n return ConfigManager;\n}());\nexports.default = ConfigManager;\n"],"names":["__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","Promise","reject","fulfilled","step","next","e","rejected","result","done","then","apply","__generator","body","_","label","sent","t","trys","ops","f","y","g","Object","create","Iterator","prototype","verb","Symbol","iterator","n","v","op","TypeError","call","pop","length","push","defineProperty","exports","fs","require","path","ajv_1","get_1","ConfigManager","configPath","join","process","env","HOME","schemaPath","__dirname","ajv","default","getInstance","instance","readConfig","configContent","error_1","_a","readFile","JSON","parse","resetToDefaults","writeConfig","config","schemaContent","schema","validate","compile","Error","errorsText","errors","writeFile","stringify","getValue","keyPath","customConfig","undefined","readCustomConfig","customConfigPath","customConfigContent","error_2","set","key","getAll","defaultConfig","redis","host","properties","port","agent","default_strategy","max_concurrent_agents","log_level","security","enabled","max_retry_attempts"],"mappings":"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"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Authentication Middleware
|
|
3
|
+
* Token-based authentication and authorization for MCP containers
|
|
4
|
+
*/ const crypto = require('crypto');
|
|
5
|
+
const Redis = require('redis');
|
|
6
|
+
const fs = require('fs').promises;
|
|
7
|
+
const path = require('path');
|
|
8
|
+
let MCPAuthMiddleware = class MCPAuthMiddleware {
|
|
9
|
+
constructor(options = {}){
|
|
10
|
+
this.redis = null;
|
|
11
|
+
this.options = {
|
|
12
|
+
redisUrl: options.redisUrl || 'redis://localhost:6379',
|
|
13
|
+
tokenExpiry: options.tokenExpiry || '24h',
|
|
14
|
+
authRequired: options.authRequired !== false,
|
|
15
|
+
rateLimitWindow: options.rateLimitWindow || 60,
|
|
16
|
+
rateLimitMax: options.rateLimitMax || 100,
|
|
17
|
+
agentConfigPath: options.agentConfigPath || './config/agent-whitelist.json',
|
|
18
|
+
skillConfigPath: options.skillConfigPath || './config/skill-requirements.json',
|
|
19
|
+
...options
|
|
20
|
+
};
|
|
21
|
+
this.agentWhitelist = new Map();
|
|
22
|
+
this.skillRequirements = new Map();
|
|
23
|
+
this.rateLimitCache = new Map();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize authentication middleware
|
|
27
|
+
*/ async initialize() {
|
|
28
|
+
try {
|
|
29
|
+
// Connect to Redis
|
|
30
|
+
this.redis = Redis.createClient({
|
|
31
|
+
url: this.options.redisUrl
|
|
32
|
+
});
|
|
33
|
+
await this.redis.connect();
|
|
34
|
+
console.log('[MCPAuth] Connected to Redis for authentication');
|
|
35
|
+
// Load configuration
|
|
36
|
+
await this.loadAgentWhitelist();
|
|
37
|
+
await this.loadSkillRequirements();
|
|
38
|
+
// Start cleanup interval
|
|
39
|
+
this.startCleanupInterval();
|
|
40
|
+
console.log('[MCPAuth] Authentication middleware initialized successfully');
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error('[MCPAuth] Failed to initialize:', error);
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load agent whitelist from configuration
|
|
48
|
+
*/ async loadAgentWhitelist() {
|
|
49
|
+
try {
|
|
50
|
+
const configPath = path.resolve(this.options.agentConfigPath);
|
|
51
|
+
const config = await fs.readFile(configPath, 'utf8');
|
|
52
|
+
const whitelist = JSON.parse(config);
|
|
53
|
+
this.agentWhitelist.clear();
|
|
54
|
+
for (const agent of whitelist.agents){
|
|
55
|
+
this.agentWhitelist.set(agent.type, agent);
|
|
56
|
+
}
|
|
57
|
+
console.log(`[MCPAuth] Loaded ${this.agentWhitelist.size} agent configurations`);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.warn('[MCPAuth] Failed to load agent whitelist:', error.message);
|
|
60
|
+
// Default to empty whitelist (deny all)
|
|
61
|
+
this.agentWhitelist.clear();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load skill requirements from configuration
|
|
66
|
+
*/ async loadSkillRequirements() {
|
|
67
|
+
try {
|
|
68
|
+
const configPath = path.resolve(this.options.skillConfigPath);
|
|
69
|
+
const config = await fs.readFile(configPath, 'utf8');
|
|
70
|
+
const requirements = JSON.parse(config);
|
|
71
|
+
this.skillRequirements.clear();
|
|
72
|
+
for (const [tool, req] of Object.entries(requirements.tools)){
|
|
73
|
+
this.skillRequirements.set(tool, req);
|
|
74
|
+
}
|
|
75
|
+
console.log(`[MCPAuth] Loaded ${this.skillRequirements.size} tool skill requirements`);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.warn('[MCPAuth] Failed to load skill requirements:', error.message);
|
|
78
|
+
this.skillRequirements.clear();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Authenticate agent request
|
|
83
|
+
*/ async authenticateRequest(request, response, next) {
|
|
84
|
+
try {
|
|
85
|
+
// Skip authentication if not required
|
|
86
|
+
if (!this.options.authRequired) {
|
|
87
|
+
return next();
|
|
88
|
+
}
|
|
89
|
+
// Extract authentication headers
|
|
90
|
+
const agentToken = request.headers['x-agent-token'];
|
|
91
|
+
const agentType = request.headers['x-agent-type'];
|
|
92
|
+
const toolName = request.body?.name || request.params?.toolName;
|
|
93
|
+
// Validate required headers
|
|
94
|
+
if (!agentToken || !agentType) {
|
|
95
|
+
return this.sendErrorResponse(response, 401, 'Missing authentication headers', {
|
|
96
|
+
required: [
|
|
97
|
+
'x-agent-token',
|
|
98
|
+
'x-agent-type'
|
|
99
|
+
]
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Validate token in Redis
|
|
103
|
+
const tokenData = await this.validateToken(agentToken, agentType);
|
|
104
|
+
if (!tokenData) {
|
|
105
|
+
return this.sendErrorResponse(response, 401, 'Invalid or expired token', {
|
|
106
|
+
agentType,
|
|
107
|
+
tokenValid: false
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Validate agent type against whitelist
|
|
111
|
+
if (!this.isAgentAuthorized(agentType)) {
|
|
112
|
+
return this.sendErrorResponse(response, 403, 'Agent type not authorized', {
|
|
113
|
+
agentType,
|
|
114
|
+
allowedTypes: Array.from(this.agentWhitelist.keys())
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Validate skill-based tool access
|
|
118
|
+
if (toolName && !this.authorizeToolAccess(agentType, toolName)) {
|
|
119
|
+
const toolRequirements = this.skillRequirements.get(toolName);
|
|
120
|
+
return this.sendErrorResponse(response, 403, 'Insufficient skills for tool access', {
|
|
121
|
+
agentType,
|
|
122
|
+
toolName,
|
|
123
|
+
requiredSkills: toolRequirements?.requiredSkills || [],
|
|
124
|
+
agentSkills: tokenData.skills || []
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// Check rate limits
|
|
128
|
+
if (!this.checkRateLimit(agentType, agentToken)) {
|
|
129
|
+
return this.sendErrorResponse(response, 429, 'Rate limit exceeded', {
|
|
130
|
+
agentType,
|
|
131
|
+
window: this.options.rateLimitWindow,
|
|
132
|
+
maxRequests: this.options.rateLimitMax
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Add agent context to request
|
|
136
|
+
request.agentContext = {
|
|
137
|
+
agentType,
|
|
138
|
+
agentToken,
|
|
139
|
+
skills: tokenData.skills || [],
|
|
140
|
+
authenticated: true,
|
|
141
|
+
timestamp: Date.now()
|
|
142
|
+
};
|
|
143
|
+
// Update last activity
|
|
144
|
+
await this.updateAgentActivity(agentToken, agentType);
|
|
145
|
+
return next();
|
|
146
|
+
} catch (error) {
|
|
147
|
+
console.error('[MCPAuth] Authentication error:', error);
|
|
148
|
+
return this.sendErrorResponse(response, 500, 'Authentication error', {
|
|
149
|
+
error: error.message
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Validate token against Redis
|
|
155
|
+
*/ async validateToken(token, agentType) {
|
|
156
|
+
try {
|
|
157
|
+
const key = `mcp:agent:${agentType}:${token}`;
|
|
158
|
+
const tokenData = await this.redis.get(key);
|
|
159
|
+
if (!tokenData) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
const data = JSON.parse(tokenData);
|
|
163
|
+
// Check expiration
|
|
164
|
+
if (Date.now() > data.expiresAt) {
|
|
165
|
+
await this.redis.del(key);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
return data;
|
|
169
|
+
} catch (error) {
|
|
170
|
+
console.error('[MCPAuth] Token validation error:', error);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if agent type is authorized
|
|
176
|
+
*/ isAgentAuthorized(agentType) {
|
|
177
|
+
return this.agentWhitelist.has(agentType);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Authorize tool access based on skills
|
|
181
|
+
*/ authorizeToolAccess(agentType, toolName) {
|
|
182
|
+
const toolRequirements = this.skillRequirements.get(toolName);
|
|
183
|
+
if (!toolRequirements) {
|
|
184
|
+
// No skill requirements defined - allow access
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
const agentConfig = this.agentWhitelist.get(agentType);
|
|
188
|
+
if (!agentConfig) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
const requiredSkills = toolRequirements.requiredSkills || [];
|
|
192
|
+
const agentSkills = agentConfig.skills || [];
|
|
193
|
+
// Check if agent has all required skills
|
|
194
|
+
return requiredSkills.every((skill)=>agentSkills.includes(skill));
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Check rate limits for agent
|
|
198
|
+
*/ checkRateLimit(agentType, token) {
|
|
199
|
+
const now = Date.now();
|
|
200
|
+
const windowStart = now - this.options.rateLimitWindow * 1000;
|
|
201
|
+
const key = `${agentType}:${token}`;
|
|
202
|
+
if (!this.rateLimitCache.has(key)) {
|
|
203
|
+
this.rateLimitCache.set(key, []);
|
|
204
|
+
}
|
|
205
|
+
const requests = this.rateLimitCache.get(key);
|
|
206
|
+
// Remove old requests outside window
|
|
207
|
+
const validRequests = requests.filter((timestamp)=>timestamp > windowStart);
|
|
208
|
+
this.rateLimitCache.set(key, validRequests);
|
|
209
|
+
// Check if under limit
|
|
210
|
+
if (validRequests.length >= this.options.rateLimitMax) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
// Add current request
|
|
214
|
+
validRequests.push(now);
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Update agent activity in Redis
|
|
219
|
+
*/ async updateAgentActivity(token, agentType) {
|
|
220
|
+
try {
|
|
221
|
+
const key = `mcp:agent:${agentType}:${token}`;
|
|
222
|
+
const activity = {
|
|
223
|
+
lastActivity: Date.now(),
|
|
224
|
+
requestCount: 1
|
|
225
|
+
};
|
|
226
|
+
await this.redis.hIncrBy(key, 'requestCount', 1);
|
|
227
|
+
await this.redis.hSet(key, 'lastActivity', Date.now().toString());
|
|
228
|
+
await this.redis.expire(key, this.parseExpiry(this.options.tokenExpiry));
|
|
229
|
+
} catch (error) {
|
|
230
|
+
console.error('[MCPAuth] Failed to update activity:', error);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Generate agent token
|
|
235
|
+
*/ generateAgentToken(agentType, skills = [], expiresIn = null) {
|
|
236
|
+
const token = crypto.randomBytes(32).toString('hex');
|
|
237
|
+
const expiresAt = Date.now() + this.parseExpiry(expiresIn || this.options.tokenExpiry) * 1000;
|
|
238
|
+
return {
|
|
239
|
+
token,
|
|
240
|
+
agentType,
|
|
241
|
+
skills,
|
|
242
|
+
expiresAt,
|
|
243
|
+
createdAt: Date.now()
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Register agent token in Redis
|
|
248
|
+
*/ async registerAgentToken(tokenData) {
|
|
249
|
+
try {
|
|
250
|
+
const key = `mcp:agent:${tokenData.agentType}:${tokenData.token}`;
|
|
251
|
+
const value = JSON.stringify(tokenData);
|
|
252
|
+
await this.redis.setEx(key, this.parseExpiry(this.options.tokenExpiry), value);
|
|
253
|
+
console.log(`[MCPAuth] Registered token for agent: ${tokenData.agentType}`);
|
|
254
|
+
return tokenData;
|
|
255
|
+
} catch (error) {
|
|
256
|
+
console.error('[MCPAuth] Failed to register token:', error);
|
|
257
|
+
throw error;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Revoke agent token
|
|
262
|
+
*/ async revokeAgentToken(agentType, token) {
|
|
263
|
+
try {
|
|
264
|
+
const key = `mcp:agent:${agentType}:${token}`;
|
|
265
|
+
await this.redis.del(key);
|
|
266
|
+
console.log(`[MCPAuth] Revoked token for agent: ${agentType}`);
|
|
267
|
+
return true;
|
|
268
|
+
} catch (error) {
|
|
269
|
+
console.error('[MCPAuth] Failed to revoke token:', error);
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Send error response
|
|
275
|
+
*/ sendErrorResponse(response, statusCode, message, details = null) {
|
|
276
|
+
const errorResponse = {
|
|
277
|
+
jsonrpc: '2.0',
|
|
278
|
+
error: {
|
|
279
|
+
code: statusCode === 401 ? -32001 : statusCode === 403 ? -32002 : -32003,
|
|
280
|
+
message,
|
|
281
|
+
...details && {
|
|
282
|
+
details
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
id: response.body?.id || null
|
|
286
|
+
};
|
|
287
|
+
response.writeHead(statusCode, {
|
|
288
|
+
'Content-Type': 'application/json'
|
|
289
|
+
});
|
|
290
|
+
response.end(JSON.stringify(errorResponse));
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Parse expiry string to seconds
|
|
294
|
+
*/ parseExpiry(expiry) {
|
|
295
|
+
if (typeof expiry === 'number') {
|
|
296
|
+
return expiry;
|
|
297
|
+
}
|
|
298
|
+
const match = expiry.match(/^(\d+)([smhd])$/);
|
|
299
|
+
if (!match) {
|
|
300
|
+
return 3600; // Default to 1 hour
|
|
301
|
+
}
|
|
302
|
+
const value = parseInt(match[1]);
|
|
303
|
+
const unit = match[2];
|
|
304
|
+
const multipliers = {
|
|
305
|
+
s: 1,
|
|
306
|
+
m: 60,
|
|
307
|
+
h: 3600,
|
|
308
|
+
d: 86400
|
|
309
|
+
};
|
|
310
|
+
return value * (multipliers[unit] || 3600);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Start cleanup interval for rate limit cache
|
|
314
|
+
*/ startCleanupInterval() {
|
|
315
|
+
setInterval(()=>{
|
|
316
|
+
const now = Date.now();
|
|
317
|
+
const windowStart = now - this.options.rateLimitWindow * 1000;
|
|
318
|
+
for (const [key, requests] of this.rateLimitCache.entries()){
|
|
319
|
+
const validRequests = requests.filter((timestamp)=>timestamp > windowStart);
|
|
320
|
+
if (validRequests.length === 0) {
|
|
321
|
+
this.rateLimitCache.delete(key);
|
|
322
|
+
} else {
|
|
323
|
+
this.rateLimitCache.set(key, validRequests);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}, 60000); // Clean up every minute
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Get authentication statistics
|
|
330
|
+
*/ async getStats() {
|
|
331
|
+
try {
|
|
332
|
+
const stats = {
|
|
333
|
+
registeredAgents: this.agentWhitelist.size,
|
|
334
|
+
configuredTools: this.skillRequirements.size,
|
|
335
|
+
rateLimitedClients: this.rateLimitCache.size,
|
|
336
|
+
redisConnected: this.redis?.isOpen || false
|
|
337
|
+
};
|
|
338
|
+
// Get active tokens count
|
|
339
|
+
if (this.redis?.isOpen) {
|
|
340
|
+
const keys = await this.redis.keys('mcp:agent:*');
|
|
341
|
+
stats.activeTokens = keys.length;
|
|
342
|
+
}
|
|
343
|
+
return stats;
|
|
344
|
+
} catch (error) {
|
|
345
|
+
console.error('[MCPAuth] Failed to get stats:', error);
|
|
346
|
+
return {
|
|
347
|
+
error: error.message
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Shutdown authentication middleware
|
|
353
|
+
*/ async shutdown() {
|
|
354
|
+
try {
|
|
355
|
+
if (this.redis) {
|
|
356
|
+
await this.redis.quit();
|
|
357
|
+
this.redis = null;
|
|
358
|
+
}
|
|
359
|
+
console.log('[MCPAuth] Authentication middleware shutdown complete');
|
|
360
|
+
} catch (error) {
|
|
361
|
+
console.error('[MCPAuth] Shutdown error:', error);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
module.exports = MCPAuthMiddleware;
|
|
366
|
+
|
|
367
|
+
//# sourceMappingURL=auth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/auth-middleware.js"],"sourcesContent":["/**\r\n * MCP Authentication Middleware\r\n * Token-based authentication and authorization for MCP containers\r\n */\r\n\r\nconst crypto = require('crypto');\r\nconst Redis = require('redis');\r\nconst fs = require('fs').promises;\r\nconst path = require('path');\r\n\r\nclass MCPAuthMiddleware {\r\n constructor(options = {}) {\r\n this.redis = null;\r\n this.options = {\r\n redisUrl: options.redisUrl || 'redis://localhost:6379',\r\n tokenExpiry: options.tokenExpiry || '24h',\r\n authRequired: options.authRequired !== false,\r\n rateLimitWindow: options.rateLimitWindow || 60, // seconds\r\n rateLimitMax: options.rateLimitMax || 100,\r\n agentConfigPath: options.agentConfigPath || './config/agent-whitelist.json',\r\n skillConfigPath: options.skillConfigPath || './config/skill-requirements.json',\r\n ...options\r\n };\r\n\r\n this.agentWhitelist = new Map();\r\n this.skillRequirements = new Map();\r\n this.rateLimitCache = new Map();\r\n }\r\n\r\n /**\r\n * Initialize authentication middleware\r\n */\r\n async initialize() {\r\n try {\r\n // Connect to Redis\r\n this.redis = Redis.createClient({ url: this.options.redisUrl });\r\n await this.redis.connect();\r\n\r\n console.log('[MCPAuth] Connected to Redis for authentication');\r\n\r\n // Load configuration\r\n await this.loadAgentWhitelist();\r\n await this.loadSkillRequirements();\r\n\r\n // Start cleanup interval\r\n this.startCleanupInterval();\r\n\r\n console.log('[MCPAuth] Authentication middleware initialized successfully');\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to initialize:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Load agent whitelist from configuration\r\n */\r\n async loadAgentWhitelist() {\r\n try {\r\n const configPath = path.resolve(this.options.agentConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n const whitelist = JSON.parse(config);\r\n\r\n this.agentWhitelist.clear();\r\n for (const agent of whitelist.agents) {\r\n this.agentWhitelist.set(agent.type, agent);\r\n }\r\n\r\n console.log(`[MCPAuth] Loaded ${this.agentWhitelist.size} agent configurations`);\r\n } catch (error) {\r\n console.warn('[MCPAuth] Failed to load agent whitelist:', error.message);\r\n // Default to empty whitelist (deny all)\r\n this.agentWhitelist.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Load skill requirements from configuration\r\n */\r\n async loadSkillRequirements() {\r\n try {\r\n const configPath = path.resolve(this.options.skillConfigPath);\r\n const config = await fs.readFile(configPath, 'utf8');\r\n const requirements = JSON.parse(config);\r\n\r\n this.skillRequirements.clear();\r\n for (const [tool, req] of Object.entries(requirements.tools)) {\r\n this.skillRequirements.set(tool, req);\r\n }\r\n\r\n console.log(`[MCPAuth] Loaded ${this.skillRequirements.size} tool skill requirements`);\r\n } catch (error) {\r\n console.warn('[MCPAuth] Failed to load skill requirements:', error.message);\r\n this.skillRequirements.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate agent request\r\n */\r\n async authenticateRequest(request, response, next) {\r\n try {\r\n // Skip authentication if not required\r\n if (!this.options.authRequired) {\r\n return next();\r\n }\r\n\r\n // Extract authentication headers\r\n const agentToken = request.headers['x-agent-token'];\r\n const agentType = request.headers['x-agent-type'];\r\n const toolName = request.body?.name || request.params?.toolName;\r\n\r\n // Validate required headers\r\n if (!agentToken || !agentType) {\r\n return this.sendErrorResponse(response, 401, 'Missing authentication headers', {\r\n required: ['x-agent-token', 'x-agent-type']\r\n });\r\n }\r\n\r\n // Validate token in Redis\r\n const tokenData = await this.validateToken(agentToken, agentType);\r\n if (!tokenData) {\r\n return this.sendErrorResponse(response, 401, 'Invalid or expired token', {\r\n agentType,\r\n tokenValid: false\r\n });\r\n }\r\n\r\n // Validate agent type against whitelist\r\n if (!this.isAgentAuthorized(agentType)) {\r\n return this.sendErrorResponse(response, 403, 'Agent type not authorized', {\r\n agentType,\r\n allowedTypes: Array.from(this.agentWhitelist.keys())\r\n });\r\n }\r\n\r\n // Validate skill-based tool access\r\n if (toolName && !this.authorizeToolAccess(agentType, toolName)) {\r\n const toolRequirements = this.skillRequirements.get(toolName);\r\n return this.sendErrorResponse(response, 403, 'Insufficient skills for tool access', {\r\n agentType,\r\n toolName,\r\n requiredSkills: toolRequirements?.requiredSkills || [],\r\n agentSkills: tokenData.skills || []\r\n });\r\n }\r\n\r\n // Check rate limits\r\n if (!this.checkRateLimit(agentType, agentToken)) {\r\n return this.sendErrorResponse(response, 429, 'Rate limit exceeded', {\r\n agentType,\r\n window: this.options.rateLimitWindow,\r\n maxRequests: this.options.rateLimitMax\r\n });\r\n }\r\n\r\n // Add agent context to request\r\n request.agentContext = {\r\n agentType,\r\n agentToken,\r\n skills: tokenData.skills || [],\r\n authenticated: true,\r\n timestamp: Date.now()\r\n };\r\n\r\n // Update last activity\r\n await this.updateAgentActivity(agentToken, agentType);\r\n\r\n return next();\r\n\r\n } catch (error) {\r\n console.error('[MCPAuth] Authentication error:', error);\r\n return this.sendErrorResponse(response, 500, 'Authentication error', {\r\n error: error.message\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Validate token against Redis\r\n */\r\n async validateToken(token, agentType) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const tokenData = await this.redis.get(key);\r\n\r\n if (!tokenData) {\r\n return null;\r\n }\r\n\r\n const data = JSON.parse(tokenData);\r\n\r\n // Check expiration\r\n if (Date.now() > data.expiresAt) {\r\n await this.redis.del(key);\r\n return null;\r\n }\r\n\r\n return data;\r\n } catch (error) {\r\n console.error('[MCPAuth] Token validation error:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Check if agent type is authorized\r\n */\r\n isAgentAuthorized(agentType) {\r\n return this.agentWhitelist.has(agentType);\r\n }\r\n\r\n /**\r\n * Authorize tool access based on skills\r\n */\r\n authorizeToolAccess(agentType, toolName) {\r\n const toolRequirements = this.skillRequirements.get(toolName);\r\n if (!toolRequirements) {\r\n // No skill requirements defined - allow access\r\n return true;\r\n }\r\n\r\n const agentConfig = this.agentWhitelist.get(agentType);\r\n if (!agentConfig) {\r\n return false;\r\n }\r\n\r\n const requiredSkills = toolRequirements.requiredSkills || [];\r\n const agentSkills = agentConfig.skills || [];\r\n\r\n // Check if agent has all required skills\r\n return requiredSkills.every(skill => agentSkills.includes(skill));\r\n }\r\n\r\n /**\r\n * Check rate limits for agent\r\n */\r\n checkRateLimit(agentType, token) {\r\n const now = Date.now();\r\n const windowStart = now - (this.options.rateLimitWindow * 1000);\r\n const key = `${agentType}:${token}`;\r\n\r\n if (!this.rateLimitCache.has(key)) {\r\n this.rateLimitCache.set(key, []);\r\n }\r\n\r\n const requests = this.rateLimitCache.get(key);\r\n\r\n // Remove old requests outside window\r\n const validRequests = requests.filter(timestamp => timestamp > windowStart);\r\n this.rateLimitCache.set(key, validRequests);\r\n\r\n // Check if under limit\r\n if (validRequests.length >= this.options.rateLimitMax) {\r\n return false;\r\n }\r\n\r\n // Add current request\r\n validRequests.push(now);\r\n return true;\r\n }\r\n\r\n /**\r\n * Update agent activity in Redis\r\n */\r\n async updateAgentActivity(token, agentType) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n const activity = {\r\n lastActivity: Date.now(),\r\n requestCount: 1\r\n };\r\n\r\n await this.redis.hIncrBy(key, 'requestCount', 1);\r\n await this.redis.hSet(key, 'lastActivity', Date.now().toString());\r\n await this.redis.expire(key, this.parseExpiry(this.options.tokenExpiry));\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to update activity:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Generate agent token\r\n */\r\n generateAgentToken(agentType, skills = [], expiresIn = null) {\r\n const token = crypto.randomBytes(32).toString('hex');\r\n const expiresAt = Date.now() + (this.parseExpiry(expiresIn || this.options.tokenExpiry) * 1000);\r\n\r\n return {\r\n token,\r\n agentType,\r\n skills,\r\n expiresAt,\r\n createdAt: Date.now()\r\n };\r\n }\r\n\r\n /**\r\n * Register agent token in Redis\r\n */\r\n async registerAgentToken(tokenData) {\r\n try {\r\n const key = `mcp:agent:${tokenData.agentType}:${tokenData.token}`;\r\n const value = JSON.stringify(tokenData);\r\n\r\n await this.redis.setEx(key, this.parseExpiry(this.options.tokenExpiry), value);\r\n\r\n console.log(`[MCPAuth] Registered token for agent: ${tokenData.agentType}`);\r\n return tokenData;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to register token:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Revoke agent token\r\n */\r\n async revokeAgentToken(agentType, token) {\r\n try {\r\n const key = `mcp:agent:${agentType}:${token}`;\r\n await this.redis.del(key);\r\n\r\n console.log(`[MCPAuth] Revoked token for agent: ${agentType}`);\r\n return true;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to revoke token:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Send error response\r\n */\r\n sendErrorResponse(response, statusCode, message, details = null) {\r\n const errorResponse = {\r\n jsonrpc: '2.0',\r\n error: {\r\n code: statusCode === 401 ? -32001 : statusCode === 403 ? -32002 : -32003,\r\n message,\r\n ...(details && { details })\r\n },\r\n id: response.body?.id || null\r\n };\r\n\r\n response.writeHead(statusCode, { 'Content-Type': 'application/json' });\r\n response.end(JSON.stringify(errorResponse));\r\n }\r\n\r\n /**\r\n * Parse expiry string to seconds\r\n */\r\n parseExpiry(expiry) {\r\n if (typeof expiry === 'number') {\r\n return expiry;\r\n }\r\n\r\n const match = expiry.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n return 3600; // Default to 1 hour\r\n }\r\n\r\n const value = parseInt(match[1]);\r\n const unit = match[2];\r\n const multipliers = { s: 1, m: 60, h: 3600, d: 86400 };\r\n\r\n return value * (multipliers[unit] || 3600);\r\n }\r\n\r\n /**\r\n * Start cleanup interval for rate limit cache\r\n */\r\n startCleanupInterval() {\r\n setInterval(() => {\r\n const now = Date.now();\r\n const windowStart = now - (this.options.rateLimitWindow * 1000);\r\n\r\n for (const [key, requests] of this.rateLimitCache.entries()) {\r\n const validRequests = requests.filter(timestamp => timestamp > windowStart);\r\n if (validRequests.length === 0) {\r\n this.rateLimitCache.delete(key);\r\n } else {\r\n this.rateLimitCache.set(key, validRequests);\r\n }\r\n }\r\n }, 60000); // Clean up every minute\r\n }\r\n\r\n /**\r\n * Get authentication statistics\r\n */\r\n async getStats() {\r\n try {\r\n const stats = {\r\n registeredAgents: this.agentWhitelist.size,\r\n configuredTools: this.skillRequirements.size,\r\n rateLimitedClients: this.rateLimitCache.size,\r\n redisConnected: this.redis?.isOpen || false\r\n };\r\n\r\n // Get active tokens count\r\n if (this.redis?.isOpen) {\r\n const keys = await this.redis.keys('mcp:agent:*');\r\n stats.activeTokens = keys.length;\r\n }\r\n\r\n return stats;\r\n } catch (error) {\r\n console.error('[MCPAuth] Failed to get stats:', error);\r\n return { error: error.message };\r\n }\r\n }\r\n\r\n /**\r\n * Shutdown authentication middleware\r\n */\r\n async shutdown() {\r\n try {\r\n if (this.redis) {\r\n await this.redis.quit();\r\n this.redis = null;\r\n }\r\n console.log('[MCPAuth] Authentication middleware shutdown complete');\r\n } catch (error) {\r\n console.error('[MCPAuth] Shutdown error:', error);\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = MCPAuthMiddleware;"],"names":["crypto","require","Redis","fs","promises","path","MCPAuthMiddleware","options","redis","redisUrl","tokenExpiry","authRequired","rateLimitWindow","rateLimitMax","agentConfigPath","skillConfigPath","agentWhitelist","Map","skillRequirements","rateLimitCache","initialize","createClient","url","connect","console","log","loadAgentWhitelist","loadSkillRequirements","startCleanupInterval","error","configPath","resolve","config","readFile","whitelist","JSON","parse","clear","agent","agents","set","type","size","warn","message","requirements","tool","req","Object","entries","tools","authenticateRequest","request","response","next","agentToken","headers","agentType","toolName","body","name","params","sendErrorResponse","required","tokenData","validateToken","tokenValid","isAgentAuthorized","allowedTypes","Array","from","keys","authorizeToolAccess","toolRequirements","get","requiredSkills","agentSkills","skills","checkRateLimit","window","maxRequests","agentContext","authenticated","timestamp","Date","now","updateAgentActivity","token","key","data","expiresAt","del","has","agentConfig","every","skill","includes","windowStart","requests","validRequests","filter","length","push","activity","lastActivity","requestCount","hIncrBy","hSet","toString","expire","parseExpiry","generateAgentToken","expiresIn","randomBytes","createdAt","registerAgentToken","value","stringify","setEx","revokeAgentToken","statusCode","details","errorResponse","jsonrpc","code","id","writeHead","end","expiry","match","parseInt","unit","multipliers","s","m","h","d","setInterval","delete","getStats","stats","registeredAgents","configuredTools","rateLimitedClients","redisConnected","isOpen","activeTokens","shutdown","quit","module","exports"],"mappings":"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"}
|