asm-mcp-proxy 2.0.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.
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Token Manager - Auto-refresh JWT tokens
3
+ */
4
+ export declare class TokenManager {
5
+ private tokenInfo;
6
+ private refreshTimer;
7
+ private gatewayUrl;
8
+ private envFilePath;
9
+ constructor(gatewayUrl: string, envFilePath?: string);
10
+ /**
11
+ * Inicializar com token existente
12
+ */
13
+ initialize(token: string, email?: string, password?: string): void;
14
+ /**
15
+ * Obter token atual
16
+ */
17
+ getToken(): string;
18
+ /**
19
+ * Verificar se token está próximo de expirar (< 1 hora)
20
+ */
21
+ isExpiringSoon(): boolean;
22
+ /**
23
+ * Verificar se token expirou
24
+ */
25
+ isExpired(): boolean;
26
+ /**
27
+ * Refresh manual do token
28
+ */
29
+ refresh(): Promise<boolean>;
30
+ /**
31
+ * Agendar refresh automático
32
+ */
33
+ private scheduleRefresh;
34
+ /**
35
+ * Decodificar JWT (sem validação de assinatura)
36
+ */
37
+ private decodeJWT;
38
+ /**
39
+ * Atualizar .env file com novo token
40
+ */
41
+ private updateEnvFile;
42
+ /**
43
+ * Parar refresh automático
44
+ */
45
+ stop(): void;
46
+ /**
47
+ * Obter informações do token
48
+ */
49
+ getTokenInfo(): {
50
+ expiresAt: Date;
51
+ isExpiringSoon: boolean;
52
+ isExpired: boolean;
53
+ } | null;
54
+ }
55
+ //# sourceMappingURL=token-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;gBAEhB,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAKpD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAgBlE;;OAEG;IACH,QAAQ,IAAI,MAAM;IAOlB;;OAEG;IACH,cAAc,IAAI,OAAO;IAMzB;;OAEG;IACH,SAAS,IAAI,OAAO;IAKpB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IA0CjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAejB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,YAAY,IAAI;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;CASxF"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * Token Manager - Auto-refresh JWT tokens
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.TokenManager = void 0;
40
+ const gateway_client_1 = require("./gateway-client");
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ class TokenManager {
44
+ constructor(gatewayUrl, envFilePath) {
45
+ this.tokenInfo = null;
46
+ this.refreshTimer = null;
47
+ this.gatewayUrl = gatewayUrl;
48
+ this.envFilePath = envFilePath || path.join(process.cwd(), '.env');
49
+ }
50
+ /**
51
+ * Inicializar com token existente
52
+ */
53
+ initialize(token, email, password) {
54
+ // Decodificar JWT para obter expiração
55
+ const payload = this.decodeJWT(token);
56
+ const expiresAt = payload.exp ? payload.exp * 1000 : Date.now() + 24 * 60 * 60 * 1000;
57
+ this.tokenInfo = {
58
+ token,
59
+ expiresAt,
60
+ email,
61
+ password,
62
+ };
63
+ // Agendar refresh automático (1 hora antes de expirar)
64
+ this.scheduleRefresh();
65
+ }
66
+ /**
67
+ * Obter token atual
68
+ */
69
+ getToken() {
70
+ if (!this.tokenInfo) {
71
+ throw new Error('Token not initialized');
72
+ }
73
+ return this.tokenInfo.token;
74
+ }
75
+ /**
76
+ * Verificar se token está próximo de expirar (< 1 hora)
77
+ */
78
+ isExpiringSoon() {
79
+ if (!this.tokenInfo)
80
+ return true;
81
+ const oneHour = 60 * 60 * 1000;
82
+ return Date.now() + oneHour >= this.tokenInfo.expiresAt;
83
+ }
84
+ /**
85
+ * Verificar se token expirou
86
+ */
87
+ isExpired() {
88
+ if (!this.tokenInfo)
89
+ return true;
90
+ return Date.now() >= this.tokenInfo.expiresAt;
91
+ }
92
+ /**
93
+ * Refresh manual do token
94
+ */
95
+ async refresh() {
96
+ if (!this.tokenInfo?.email || !this.tokenInfo?.password) {
97
+ console.error('[TokenManager] Cannot refresh: email/password not available');
98
+ return false;
99
+ }
100
+ try {
101
+ const result = await (0, gateway_client_1.refreshToken)(this.tokenInfo.email, this.tokenInfo.password, this.gatewayUrl);
102
+ if (result.success && result.token) {
103
+ const payload = this.decodeJWT(result.token);
104
+ const expiresAt = payload.exp ? payload.exp * 1000 : Date.now() + 24 * 60 * 60 * 1000;
105
+ this.tokenInfo = {
106
+ token: result.token,
107
+ expiresAt,
108
+ email: this.tokenInfo.email,
109
+ password: this.tokenInfo.password,
110
+ };
111
+ // Atualizar .env file
112
+ this.updateEnvFile(result.token);
113
+ // Reagendar próximo refresh
114
+ this.scheduleRefresh();
115
+ console.error('[TokenManager] Token refreshed successfully');
116
+ return true;
117
+ }
118
+ console.error('[TokenManager] Token refresh failed:', result.error);
119
+ return false;
120
+ }
121
+ catch (error) {
122
+ console.error('[TokenManager] Token refresh error:', error);
123
+ return false;
124
+ }
125
+ }
126
+ /**
127
+ * Agendar refresh automático
128
+ */
129
+ scheduleRefresh() {
130
+ if (this.refreshTimer) {
131
+ clearTimeout(this.refreshTimer);
132
+ }
133
+ if (!this.tokenInfo)
134
+ return;
135
+ // Calcular quando fazer refresh (1 hora antes de expirar)
136
+ const oneHour = 60 * 60 * 1000;
137
+ const refreshAt = this.tokenInfo.expiresAt - oneHour;
138
+ const delay = Math.max(0, refreshAt - Date.now());
139
+ this.refreshTimer = setTimeout(async () => {
140
+ console.error('[TokenManager] Auto-refreshing token...');
141
+ await this.refresh();
142
+ }, delay);
143
+ const refreshDate = new Date(refreshAt);
144
+ console.error(`[TokenManager] Next refresh scheduled for: ${refreshDate.toISOString()}`);
145
+ }
146
+ /**
147
+ * Decodificar JWT (sem validação de assinatura)
148
+ */
149
+ decodeJWT(token) {
150
+ try {
151
+ const parts = token.split('.');
152
+ if (parts.length !== 3) {
153
+ throw new Error('Invalid JWT format');
154
+ }
155
+ const payload = Buffer.from(parts[1], 'base64').toString('utf-8');
156
+ return JSON.parse(payload);
157
+ }
158
+ catch (error) {
159
+ console.error('[TokenManager] Failed to decode JWT:', error);
160
+ return {};
161
+ }
162
+ }
163
+ /**
164
+ * Atualizar .env file com novo token
165
+ */
166
+ updateEnvFile(newToken) {
167
+ try {
168
+ if (!fs.existsSync(this.envFilePath)) {
169
+ console.error('[TokenManager] .env file not found, skipping update');
170
+ return;
171
+ }
172
+ let content = fs.readFileSync(this.envFilePath, 'utf-8');
173
+ // Substituir token
174
+ if (content.includes('MCP_JWT_TOKEN=')) {
175
+ content = content.replace(/MCP_JWT_TOKEN=.*/, `MCP_JWT_TOKEN=${newToken}`);
176
+ }
177
+ else {
178
+ content += `\nMCP_JWT_TOKEN=${newToken}\n`;
179
+ }
180
+ fs.writeFileSync(this.envFilePath, content, 'utf-8');
181
+ console.error('[TokenManager] .env file updated with new token');
182
+ }
183
+ catch (error) {
184
+ console.error('[TokenManager] Failed to update .env file:', error);
185
+ }
186
+ }
187
+ /**
188
+ * Parar refresh automático
189
+ */
190
+ stop() {
191
+ if (this.refreshTimer) {
192
+ clearTimeout(this.refreshTimer);
193
+ this.refreshTimer = null;
194
+ }
195
+ }
196
+ /**
197
+ * Obter informações do token
198
+ */
199
+ getTokenInfo() {
200
+ if (!this.tokenInfo)
201
+ return null;
202
+ return {
203
+ expiresAt: new Date(this.tokenInfo.expiresAt),
204
+ isExpiringSoon: this.isExpiringSoon(),
205
+ isExpired: this.isExpired(),
206
+ };
207
+ }
208
+ }
209
+ exports.TokenManager = TokenManager;
210
+ //# sourceMappingURL=token-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../src/token-manager.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "asm-mcp-proxy",
3
+ "version": "2.0.0",
4
+ "description": "Stdio to HTTP proxy for ASM MCP Gateway with local tools and intelligent routing",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "asm-mcp-proxy": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist/**/*",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "start": "node dist/index.js",
16
+ "dev": "tsc && node dist/index.js",
17
+ "test": "node test.js",
18
+ "clean": "rm -rf dist",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "model-context-protocol",
24
+ "proxy",
25
+ "stdio",
26
+ "http",
27
+ "asm",
28
+ "cloudflare",
29
+ "workers",
30
+ "local-tools",
31
+ "router"
32
+ ],
33
+ "author": "ASM Platform",
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/vitor606/ASM-MCP.git",
38
+ "directory": "asm-platform/mcp-proxy"
39
+ },
40
+ "engines": {
41
+ "node": ">=18.0.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^20.0.0",
45
+ "typescript": "^5.3.0"
46
+ }
47
+ }