Skip to main content
Glama
config.ts3.51 kB
import dotenv from 'dotenv'; import { type Dict } from '../types.js'; // Load environment variables from .env file dotenv.config(); /** * Parse command line arguments to find a specific flag and its value * @param flag The flag to search for (e.g., '--token') * @returns The value of the flag or undefined if not found */ export function getCommandLineArg(flag: string): string | undefined { const args = process.argv.slice(2); for (let i = 0; i < args.length; i++) { if (args[i] === flag && i + 1 < args.length) { return args[i + 1]; } } return undefined; } /** * Get credentials from Nango * @returns The credentials object from Nango */ export async function getConnectionCredentials(): Promise<Dict> { const connectionId = process.env.NANGO_CONNECTION_ID; const integrationId = process.env.NANGO_INTEGRATION_ID; const baseUrl = process.env.NANGO_BASE_URL; const secretKey = process.env.NANGO_SECRET_KEY; if (!connectionId || !integrationId || !baseUrl || !secretKey) { throw new Error( 'Missing required Nango environment variables: NANGO_CONNECTION_ID, NANGO_INTEGRATION_ID, NANGO_BASE_URL, NANGO_SECRET_KEY' ); } const url = `${baseUrl}/connection/${connectionId}`; const params = new URLSearchParams({ provider_config_key: integrationId, refresh_token: 'true', }); const headers = { 'Authorization': `Bearer ${secretKey}`, 'Content-Type': 'application/json', }; try { const response = await fetch(`${url}?${params}`, { method: 'GET', headers, }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); return data; } catch (error) { console.error('Error fetching Nango credentials:', error); throw error; } } /** * Get access token from Nango credentials * @returns The access token */ export async function getAccessToken(): Promise<string> { const credentials = await getConnectionCredentials(); const accessToken = credentials?.credentials?.access_token; if (!accessToken) { throw new Error('Access token not found in Nango credentials'); } return accessToken; } /** * Get the Linear API token from Nango or fallback to environment variable * @returns The API token or undefined if not found */ export async function getLinearApiToken(): Promise<string | undefined> { try { // First try to get the token from Nango const nangoToken = await getAccessToken(); if (nangoToken) { return nangoToken; } } catch (error) { console.warn('Failed to get token from Nango, falling back to environment variables:', error); } // Fallback to command line arguments const tokenFromArgs = getCommandLineArg('--token'); if (tokenFromArgs) { return tokenFromArgs; } // Log for debugging console.error('API token not found in Nango or command line args'); console.error( 'Environment variables:', Object.keys(process.env).filter((key) => key.includes('NANGO')), ); return undefined; } /** * Log initialization information * @param message The message to log */ export function logInfo(message: string): void { console.error(message); } /** * Log error information * @param message The error message * @param error The error object (optional) */ export function logError(message: string, error?: unknown): void { if (error) { console.error(message, error); } else { console.error(message); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ampcome-mcps/linear-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server