UNPKG

twenty-mcp-server

Version:

Easy-to-install Model Context Protocol server for Twenty CRM. Try instantly with 'npx twenty-mcp-server setup' or install globally for permanent use.

97 lines 3.39 kB
import { createClerkClient } from '@clerk/clerk-sdk-node'; export class ClerkClient { clerk; enabled; constructor() { this.enabled = process.env.AUTH_ENABLED === 'true'; if (this.enabled) { const secretKey = process.env.CLERK_SECRET_KEY; const publishableKey = process.env.CLERK_PUBLISHABLE_KEY; if (!secretKey) { throw new Error('CLERK_SECRET_KEY is required when AUTH_ENABLED=true'); } this.clerk = createClerkClient({ secretKey, publishableKey, }); } else { // Create a dummy client for when auth is disabled this.clerk = null; } } isEnabled() { return this.enabled; } async validateToken(token) { if (!this.enabled) { return { valid: false, error: 'Authentication is not enabled' }; } try { // Remove 'Bearer ' prefix if present const cleanToken = token.replace(/^Bearer\s+/i, ''); // Verify the session using the session ID from the token // First, we need to decode the JWT to get the session ID const tokenParts = cleanToken.split('.'); if (tokenParts.length !== 3) { return { valid: false, error: 'Invalid token format' }; } // Decode the payload (base64url decode) const payload = JSON.parse(Buffer.from(tokenParts[1], 'base64url').toString()); if (!payload.sid) { return { valid: false, error: 'No session ID in token' }; } // Verify the session exists and is active const session = await this.clerk.sessions.getSession(payload.sid); if (!session || session.status !== 'active') { return { valid: false, error: 'Invalid or inactive session' }; } return { valid: true, userId: session.userId, sessionId: session.id, }; } catch (error) { console.error('Token validation error:', error); return { valid: false, error: error instanceof Error ? error.message : 'Token validation failed', }; } } async getUserMetadata(userId) { if (!this.enabled) { return null; } try { const user = await this.clerk.users.getUser(userId); return user.privateMetadata || {}; } catch (error) { console.error('Failed to get user metadata:', error); return null; } } async updateUserMetadata(userId, metadata) { if (!this.enabled) { throw new Error('Authentication is not enabled'); } try { await this.clerk.users.updateUser(userId, { privateMetadata: metadata, }); } catch (error) { console.error('Failed to update user metadata:', error); throw new Error('Failed to update user configuration'); } } getClerkDomain() { return process.env.CLERK_DOMAIN || ''; } getPublishableKey() { return process.env.CLERK_PUBLISHABLE_KEY || ''; } } //# sourceMappingURL=clerk-client.js.map