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
JavaScript
;
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
};
}