UNPKG

feishu-user-token-mcp-v2

Version:

A Model Context Protocol (MCP) server for Feishu user token management and authentication

108 lines (107 loc) 4.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.readConfigFile = readConfigFile; exports.updateConfig = updateConfig; exports.getConfigValue = getConfigValue; exports.saveToken = saveToken; exports.loadConfig = loadConfig; const promises_1 = __importDefault(require("fs/promises")); const path_1 = __importDefault(require("path")); const readline_1 = __importDefault(require("readline")); // Configuration file path const configFilePath = path_1.default.join(process.cwd(), 'mcp_config.json'); // Constants for Feishu API const FEISHU_BASE_URL = 'https://open.feishu.cn/open-apis'; async function promptForInput(promptText) { const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout }); return new Promise(resolve => { rl.question(promptText, (input) => { rl.close(); resolve(input.trim()); }); }); } // Read configuration from file async function readConfigFile() { try { const data = await promises_1.default.readFile(configFilePath, 'utf-8'); return JSON.parse(data); } catch (error) { // If file doesn't exist or is invalid, return empty object return {}; } } // Write configuration to file async function writeConfigFile(config) { await promises_1.default.writeFile(configFilePath, JSON.stringify(config, null, 2)); } // Update specific config values async function updateConfig(updates) { const existingConfig = await readConfigFile(); const newConfig = { ...existingConfig, ...updates }; await writeConfigFile(newConfig); } // Get a config value, prompt if missing async function getConfigValue(key, promptText) { const config = await readConfigFile(); let value = config[key]; if (!value) { value = await promptForInput(promptText); if (!value) { throw new Error(`${key} is required`); } await updateConfig({ [key]: value }); console.log(`${key} saved to configuration`); } return value; } // Token management functions async function saveToken(accessToken, refreshToken) { await updateConfig({ user_token: accessToken, refresh_token: refreshToken }); console.log('Token saved to configuration'); } async function loadConfig(startupArgs) { // Read existing config from file const savedConfig = await readConfigFile(); // Priority: startup command line args > saved config let app_id = ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.app_id) || savedConfig.app_id); let app_secret = ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.app_secret) || savedConfig.app_secret); let user_token = ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.user_token) || savedConfig.user_token); let refresh_token = ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.refresh_token) || savedConfig.refresh_token); // Track what needs to be saved const configUpdates = {}; // Save command line args to config if they differ from saved config if ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.app_id) && startupArgs.app_id !== savedConfig.app_id) { configUpdates.app_id = app_id; } if ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.app_secret) && startupArgs.app_secret !== savedConfig.app_secret) { configUpdates.app_secret = app_secret; } if ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.user_token) && startupArgs.user_token !== savedConfig.user_token) { configUpdates.user_token = user_token; } if ((startupArgs === null || startupArgs === void 0 ? void 0 : startupArgs.refresh_token) && startupArgs.refresh_token !== savedConfig.refresh_token) { configUpdates.refresh_token = refresh_token; } // Save any updates to config file if (Object.keys(configUpdates).length > 0) { await updateConfig(configUpdates); console.log('Configuration saved to mcp_config.json'); } return { app_id, app_secret, user_token, refresh_token }; }