facebook-ads-mcp-server
Version:
Universal Facebook Ads Server - Supports MCP, OpenAI Function Calling, and Gemini Function Calling
83 lines (71 loc) • 2.31 kB
JavaScript
import keytar from 'keytar';
const SERVICE_NAME = 'facebook-ads-mcp';
const ACCOUNT_NAME = 'facebook-access-token';
export class TokenStorage {
static async storeToken(accessToken, expiresIn = null) {
try {
const tokenData = {
accessToken,
expiresAt: expiresIn ? Date.now() + (expiresIn * 1000) : null,
storedAt: Date.now()
};
await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, JSON.stringify(tokenData));
console.error('✅ Facebook token stored securely');
return true;
} catch (error) {
console.error('❌ Failed to store token:', error.message);
return false;
}
}
static async getToken() {
try {
const tokenJson = await keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);
if (!tokenJson) {
return null;
}
const tokenData = JSON.parse(tokenJson);
// Check if token is expired
if (tokenData.expiresAt && Date.now() > tokenData.expiresAt) {
console.error('⚠️ Stored token has expired');
await this.clearToken();
return null;
}
return tokenData.accessToken;
} catch (error) {
console.error('❌ Failed to retrieve token:', error.message);
return null;
}
}
static async clearToken() {
try {
await keytar.deletePassword(SERVICE_NAME, ACCOUNT_NAME);
console.error('🗑️ Facebook token cleared');
return true;
} catch (error) {
console.error('❌ Failed to clear token:', error.message);
return false;
}
}
static async hasValidToken() {
const token = await this.getToken();
return token !== null;
}
static async getTokenInfo() {
try {
const tokenJson = await keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);
if (!tokenJson) {
return { hasToken: false };
}
const tokenData = JSON.parse(tokenJson);
const isExpired = tokenData.expiresAt && Date.now() > tokenData.expiresAt;
return {
hasToken: true,
isExpired,
storedAt: new Date(tokenData.storedAt).toISOString(),
expiresAt: tokenData.expiresAt ? new Date(tokenData.expiresAt).toISOString() : 'Never'
};
} catch (error) {
return { hasToken: false, error: error.message };
}
}
}