UNPKG

@aiondadotcom/mcp-salesforce

Version:

Model Context Protocol (MCP) server for Salesforce integration using OAuth authentication

135 lines (110 loc) โ€ข 4.36 kB
#!/usr/bin/env node import { config } from 'dotenv'; import { TokenManager } from '../src/auth/token-manager.js'; import { FileStorageManager } from '../src/auth/file-storage.js'; // Load environment variables config(); class StatusChecker { constructor() { this.fileStorage = new FileStorageManager(); } async checkStatus() { console.log('๐Ÿ” MCP Salesforce Server Status Check'); console.log('=====================================\n'); // Check configuration console.log('๐Ÿ“‹ Configuration Status:'); const configStatus = await this.checkConfiguration(); if (!configStatus.valid) { console.log('\nโŒ Configuration incomplete. Please run salesforce_setup tool first.'); return; } // Check authentication console.log('\n๐Ÿ” Authentication Status:'); await this.checkAuthentication(configStatus.credentials); console.log('\n๐Ÿ’ก Next Steps:'); console.log('- If authentication failed, run: npm run setup'); console.log('- If successful, add to Claude Desktop configuration'); console.log('- Use npm run config-help for Connected App setup'); } async checkConfiguration() { try { const credentials = await this.fileStorage.getCredentials(); if (!credentials) { console.log('โŒ No credentials found in ~/.mcp-salesforce.json'); console.log(' Run the salesforce_setup tool to configure credentials'); return { valid: false }; } const { clientId, clientSecret, instanceUrl } = credentials; if (!clientId || !clientSecret || !instanceUrl) { console.log('โŒ Incomplete credentials in ~/.mcp-salesforce.json'); console.log(' Run the salesforce_setup tool to reconfigure credentials'); return { valid: false }; } console.log(`โœ… Client ID: ${this.maskSensitive('CLIENT_ID', clientId)}`); console.log(`โœ… Client Secret: ${this.maskSensitive('CLIENT_SECRET', clientSecret)}`); console.log(`โœ… Instance URL: ${instanceUrl}`); // Check API config const apiConfig = await this.fileStorage.getApiConfig(); console.log(`โœ… API Version: ${apiConfig.apiVersion}`); console.log(`โœ… Callback Port: ${apiConfig.callbackPort}`); return { valid: true, credentials }; } catch (error) { console.log(`โŒ Configuration check failed: ${error.message}`); return { valid: false }; } } async checkAuthentication(credentials) { try { const tokenManager = new TokenManager( credentials.clientId, credentials.clientSecret, credentials.instanceUrl ); const hasTokens = await tokenManager.initialize(); if (!hasTokens) { console.log('โŒ No authentication tokens found'); console.log(' Run: npm run setup'); return false; } const tokenInfo = tokenManager.getTokenInfo(); console.log('โœ… Tokens found in ~/.mcp-salesforce.json'); console.log(` Instance: ${tokenInfo.instance_url}`); if (tokenInfo.expires_at) { const expiresIn = Math.round((tokenInfo.expires_at - Date.now()) / (1000 * 60)); console.log(` Expires: ${expiresIn} minutes`); } // Test the tokens console.log('๐Ÿงช Testing token validity...'); const testResult = await tokenManager.testTokens(); if (testResult.valid) { console.log('โœ… Authentication successful!'); console.log(` API versions available: ${testResult.apiVersions}`); return true; } else { console.log(`โŒ Token validation failed: ${testResult.error}`); console.log(' Run: npm run setup'); return false; } } catch (error) { console.log(`โŒ Authentication check failed: ${error.message}`); return false; } } maskSensitive(key, value) { if (key.includes('SECRET')) { return value.substring(0, 8) + '***'; } if (key.includes('CLIENT_ID')) { return value.substring(0, 12) + '***'; } return value; } } // Run status check if called directly if (import.meta.url === `file://${process.argv[1]}`) { const checker = new StatusChecker(); checker.checkStatus().catch(error => { console.error('โŒ Status check failed:', error.message); process.exit(1); }); }