@lovie-ai/formation-mcp-server 1.0.11 → 1.0.13
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAavD,eAAO,MAAM,kBAAkB,EAAE,cAQhC,CAAC;AA8BF,eAAO,MAAM,qBAAqB,EAAE,cAanC,CAAC;AAuDF,eAAO,MAAM,mBAAmB,EAAE,cAQjC,CAAC;AAsBF,eAAO,MAAM,uBAAuB,EAAE,cAQrC,CAAC;AAuCF,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAGD,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AAGD,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
|
package/dist/mcp/tools/auth.js
CHANGED
|
@@ -42,6 +42,9 @@ const errors_1 = require("../errors");
|
|
|
42
42
|
// In-memory token storage (per MCP session)
|
|
43
43
|
let authToken = null;
|
|
44
44
|
let userId = null;
|
|
45
|
+
let tokenStoredAt = null;
|
|
46
|
+
// Token persistence duration: 7 days in milliseconds
|
|
47
|
+
const TOKEN_PERSIST_DURATION_MS = 7 * 24 * 60 * 60 * 1000;
|
|
45
48
|
// formation_login tool
|
|
46
49
|
exports.formationLoginTool = {
|
|
47
50
|
name: 'formation_login',
|
|
@@ -102,23 +105,23 @@ const handleFormationSetToken = async (args, _store) => {
|
|
|
102
105
|
throw (0, errors_1.validationError)('token', 'Invalid JWT format');
|
|
103
106
|
}
|
|
104
107
|
const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString('utf-8'));
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
error: 'TOKEN_EXPIRED',
|
|
110
|
-
message: 'This token has expired. Please login again using formation_login to get a fresh token.',
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
// Store token and user info
|
|
108
|
+
// Note: We ignore the JWT's short expiry (Clerk tokens expire in ~60s)
|
|
109
|
+
// Instead, we persist the token for 7 days on our side
|
|
110
|
+
// The token is used for user identification, not for API calls that need fresh tokens
|
|
111
|
+
// Store token and user info with our own timestamp
|
|
114
112
|
authToken = token;
|
|
115
113
|
userId = payload.sub || null;
|
|
114
|
+
tokenStoredAt = Date.now();
|
|
115
|
+
// Calculate our 7-day expiry
|
|
116
|
+
const ourExpiresAt = new Date(tokenStoredAt + TOKEN_PERSIST_DURATION_MS);
|
|
117
|
+
const daysUntilExpiry = 7;
|
|
116
118
|
return {
|
|
117
119
|
success: true,
|
|
118
120
|
authenticated: true,
|
|
119
121
|
userId,
|
|
120
|
-
expiresAt:
|
|
121
|
-
|
|
122
|
+
expiresAt: ourExpiresAt.toISOString(),
|
|
123
|
+
daysUntilExpiry,
|
|
124
|
+
message: `Successfully authenticated! Your session will remain active for ${daysUntilExpiry} days. You can now use all formation tools.`,
|
|
122
125
|
};
|
|
123
126
|
}
|
|
124
127
|
catch (error) {
|
|
@@ -142,6 +145,7 @@ const handleFormationLogout = async (_args, _store) => {
|
|
|
142
145
|
const wasLoggedIn = authToken !== null;
|
|
143
146
|
authToken = null;
|
|
144
147
|
userId = null;
|
|
148
|
+
tokenStoredAt = null;
|
|
145
149
|
return {
|
|
146
150
|
success: true,
|
|
147
151
|
wasLoggedIn,
|
|
@@ -161,55 +165,44 @@ exports.formationAuthStatusTool = {
|
|
|
161
165
|
},
|
|
162
166
|
};
|
|
163
167
|
const handleFormationAuthStatus = async (_args, _store) => {
|
|
164
|
-
if (!authToken) {
|
|
168
|
+
if (!authToken || !tokenStoredAt) {
|
|
165
169
|
return {
|
|
166
170
|
authenticated: false,
|
|
167
171
|
message: 'Not logged in. Use formation_login to authenticate.',
|
|
168
172
|
};
|
|
169
173
|
}
|
|
170
|
-
// Check if
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
userId = null;
|
|
178
|
-
return {
|
|
179
|
-
authenticated: false,
|
|
180
|
-
message: 'Session expired. Use formation_login to authenticate again.',
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
return {
|
|
184
|
-
authenticated: true,
|
|
185
|
-
userId,
|
|
186
|
-
expiresAt: payload.exp ? new Date(payload.exp * 1000).toISOString() : null,
|
|
187
|
-
message: 'Authenticated and session is valid.',
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
catch {
|
|
174
|
+
// Check if our 7-day session has expired
|
|
175
|
+
const sessionExpiresAt = tokenStoredAt + TOKEN_PERSIST_DURATION_MS;
|
|
176
|
+
const isExpired = Date.now() > sessionExpiresAt;
|
|
177
|
+
if (isExpired) {
|
|
178
|
+
authToken = null;
|
|
179
|
+
userId = null;
|
|
180
|
+
tokenStoredAt = null;
|
|
191
181
|
return {
|
|
192
182
|
authenticated: false,
|
|
193
|
-
message: '
|
|
183
|
+
message: 'Session expired (7 days). Use formation_login to authenticate again.',
|
|
194
184
|
};
|
|
195
185
|
}
|
|
186
|
+
const daysRemaining = Math.ceil((sessionExpiresAt - Date.now()) / (24 * 60 * 60 * 1000));
|
|
187
|
+
return {
|
|
188
|
+
authenticated: true,
|
|
189
|
+
userId,
|
|
190
|
+
expiresAt: new Date(sessionExpiresAt).toISOString(),
|
|
191
|
+
daysRemaining,
|
|
192
|
+
message: `Authenticated and session is valid. ${daysRemaining} day(s) remaining.`,
|
|
193
|
+
};
|
|
196
194
|
};
|
|
197
195
|
// Helper function to get current auth token (for other tools to use)
|
|
198
196
|
function getAuthToken() {
|
|
199
197
|
return authToken;
|
|
200
198
|
}
|
|
201
|
-
// Helper function to check if authenticated
|
|
199
|
+
// Helper function to check if authenticated (uses our 7-day persistence)
|
|
202
200
|
function isAuthenticated() {
|
|
203
|
-
if (!authToken)
|
|
204
|
-
return false;
|
|
205
|
-
try {
|
|
206
|
-
const parts = authToken.split('.');
|
|
207
|
-
const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString('utf-8'));
|
|
208
|
-
return !(payload.exp && payload.exp * 1000 < Date.now());
|
|
209
|
-
}
|
|
210
|
-
catch {
|
|
201
|
+
if (!authToken || !tokenStoredAt)
|
|
211
202
|
return false;
|
|
212
|
-
|
|
203
|
+
// Check our 7-day session expiry, not the JWT's expiry
|
|
204
|
+
const sessionExpiresAt = tokenStoredAt + TOKEN_PERSIST_DURATION_MS;
|
|
205
|
+
return Date.now() < sessionExpiresAt;
|
|
213
206
|
}
|
|
214
207
|
// Register tools
|
|
215
208
|
function registerAuthTools() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/mcp/tools/auth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/mcp/tools/auth.ts"],"names":[],"mappings":"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"}
|