@larksuiteoapi/lark-mcp
Version:
Feishu/Lark OpenAPI MCP
123 lines (122 loc) • 6.47 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.program = void 0;
const fs_1 = __importDefault(require("fs"));
const dotenv_1 = __importDefault(require("dotenv"));
const commander_1 = require("commander");
const version_1 = require("./utils/version");
const mcp_server_1 = require("./mcp-server");
const constants_1 = require("./utils/constants");
const login_handler_1 = require("./cli/login-handler");
const parser_string_array_1 = require("./utils/parser-string-array");
const logger_1 = require("./utils/logger");
dotenv_1.default.config();
const program = new commander_1.Command();
exports.program = program;
program.name('lark-mcp').description('Feishu/Lark MCP Tool').version(version_1.currentVersion);
program
.command('whoami')
.description('Print All User Sessions')
.action(() => {
login_handler_1.LoginHandler.handleWhoAmI();
});
program
.command('login')
.description('Login using OAuth and get user access token')
.option('-a, --app-id <appId>', 'Feishu/Lark App ID')
.option('-s, --app-secret <appSecret>', 'Feishu/Lark App Secret')
.option('-d, --domain <domain>', '(Optional) Feishu/Lark Domain (default: "https://open.feishu.cn")')
.option('--host <host>', '(Optional) Host to listen (default: "localhost")')
.option('-p, --port <port>', '(Optional) Port to listen (default: "3000")')
.option('--scope <scope>', '(Optional) Specify OAuth scope for user access token, default is all permissions granted to the app, separated by spaces or commas')
.option('--debug', '(Optional) Enable debug mode')
.action(async (options) => {
if (constants_1.NODE_VERSION_MAJOR < 20) {
logger_1.logger.error(`❌ This CLI requires Node.js >= 20. You are using v${process.versions.node}.\n\n` +
`👉 Please upgrade Node.js: https://nodejs.org/`);
process.exit(1);
}
const mergedOptions = { ...constants_1.OAPI_MCP_DEFAULT_ARGS, ...constants_1.OAPI_MCP_ENV_ARGS, ...options };
if (mergedOptions.debug) {
logger_1.logger.setLevel(logger_1.LogLevel.DEBUG);
}
await login_handler_1.LoginHandler.handleLogin({ ...mergedOptions, scope: (0, parser_string_array_1.parseStringArray)(mergedOptions.scope) });
});
program
.command('logout')
.description('Logout and clear stored user access token')
.option('-a, --app-id <appId>', '(Optional) Feishu/Lark App ID, if not specified, logout all apps')
.option('--debug', '(Optional) Enable debug mode')
.action(async (options) => {
if (options.debug) {
logger_1.logger.setLevel(logger_1.LogLevel.DEBUG);
}
await login_handler_1.LoginHandler.handleLogout(options.appId);
});
program
.command('mcp')
.description('Start Feishu/Lark MCP Service')
.option('-a, --app-id <appId>', 'Feishu/Lark App ID')
.option('-s, --app-secret <appSecret>', 'Feishu/Lark App Secret')
.option('-d, --domain <domain>', '(Optional) Feishu/Lark Domain (default: "https://open.feishu.cn")')
.option('-t, --tools <tools>', '(Optional) List of API tools to enable, separated by commas or spaces (default: "preset.default")')
.option('-c, --tool-name-case <toolNameCase>', '(Optional) Tool Name Case, snake or camel or kebab or dot (default: "snake")')
.option('-l, --language <language>', '(Optional) Tools Language, zh or en (default: "en")')
.option('--token-mode <tokenMode>', '(Optional) Token Mode, auto or user_access_token or tenant_access_token (default: "auto")')
.option('-u, --user-access-token <userAccessToken>', '(Optional) User Access Token (beta)')
.option('--oauth', '(Optional) Enable MCP Auth Server to get user_access_token and auto request user login when token expires (Beta) (default: false)')
.option('--scope <scope>', '(Optional) Specify OAuth scope for user access token, default is all permissions granted to the app, separated by spaces or commas')
.option('-m, --mode <mode>', '(Optional) Transport Mode, stdio or sse or streamable (default: "stdio")')
.option('--host <host>', '(Optional) Host to listen (default: "localhost")')
.option('-p, --port <port>', '(Optional) Port to listen (default: "3000")')
.option('--config <configPath>', '(Optional) Config file path (JSON)')
.option('--debug', '(Optional) Enable debug mode')
.action(async (options) => {
let fileOptions = {};
if (options.config) {
try {
const configContent = fs_1.default.readFileSync(options.config, 'utf-8');
fileOptions = JSON.parse(configContent);
}
catch (err) {
logger_1.logger.error(`Failed to read config file: ${err}`);
process.exit(1);
}
}
const mergedOptions = { ...constants_1.OAPI_MCP_DEFAULT_ARGS, ...constants_1.OAPI_MCP_ENV_ARGS, ...fileOptions, ...options };
if (constants_1.NODE_VERSION_MAJOR < 20 && mergedOptions.oauth) {
logger_1.logger.error(`❌ This CLI requires Node.js >= 20. You are using v${process.versions.node}.\n\n` +
`👉 Please upgrade Node.js: https://nodejs.org/`);
process.exit(1);
}
if (mergedOptions.debug) {
logger_1.logger.setLevel(logger_1.LogLevel.DEBUG);
}
await (0, mcp_server_1.initMcpServerWithTransport)('oapi', {
...mergedOptions,
scope: (0, parser_string_array_1.parseStringArray)(mergedOptions.scope),
tools: (0, parser_string_array_1.parseStringArray)(mergedOptions.tools),
});
});
program
.command('recall-developer-documents')
.description('Start Feishu/Lark Open Platform Recall MCP Service')
.option('-d, --domain <domain>', '(Optional) Feishu Open Platform Domain', 'https://open.feishu.cn')
.option('-m, --mode <mode>', '(Optional) Transport Mode, stdio or sse or streamable', 'stdio')
.option('--host <host>', '(Optional) Host to listen', 'localhost')
.option('-p, --port <port>', '(Optional) Port to listen in sse mode', '3001')
.option('--debug', '(Optional) Enable debug mode')
.action(async (options) => {
if (options.debug) {
logger_1.logger.setLevel(logger_1.LogLevel.DEBUG);
}
await (0, mcp_server_1.initMcpServerWithTransport)('recall', options);
});
if (process.argv.length === 2) {
program.help();
}
program.parse(process.argv);