@larksuiteoapi/lark-mcp
Version:
Feishu/Lark OpenAPI MCP
89 lines (88 loc) • 4.03 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 mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
const recall_1 = require("./mcp-tool/document-tool/recall");
const constants_1 = require("./utils/constants");
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('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>', 'Feishu/Lark Domain (default: "https://open.feishu.cn")')
.option('-t, --tools <tools>', 'Allowed Tools List, separated by commas')
.option('-c, --tool-name-case <toolNameCase>', 'Tool Name Case, snake or camel or kebab or dot (default: "snake")')
.option('-l, --language <language>', 'Tools Language, zh or en (default: "en")')
.option('-u, --user-access-token <userAccessToken>', 'User Access Token (beta)')
.option('--token-mode <tokenMode>', 'Token Mode, auto or user_access_token or tenant_access_token (default: "auto")')
.option('-m, --mode <mode>', 'Transport Mode, stdio or sse (default: "stdio")')
.option('--host <host>', 'Host to listen (default: "localhost")')
.option('-p, --port <port>', 'Port to listen in sse mode (default: "3000")')
.option('--config <configPath>', 'Config file path (JSON)')
.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) {
console.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 };
const { mcpServer } = (0, mcp_server_1.initMcpServer)(mergedOptions);
if (mergedOptions.mode === 'stdio') {
(0, mcp_server_1.initStdioServer)(mcpServer);
}
else if (mergedOptions.mode === 'sse') {
(0, mcp_server_1.initSSEServer)(mcpServer, mergedOptions);
}
else {
console.error('Invalid mode:', mergedOptions.mode);
process.exit(1);
}
});
program
.command('recall-developer-documents')
.description('Start Feishu/Lark Open Platform Recall MCP Service')
.option('-d, --domain <domain>', 'Feishu Open Platform Domain', 'https://open.feishu.cn')
.option('-m, --mode <mode>', 'Transport Mode, stdio or sse', 'stdio')
.option('--host <host>', 'Host to listen', 'localhost')
.option('-p, --port <port>', 'Port to listen in sse mode', '3001')
.action((options) => {
const server = new mcp_js_1.McpServer({
id: 'lark-recall-mcp-server',
name: 'Lark Recall MCP Service',
version: version_1.currentVersion,
});
server.tool(recall_1.RecallTool.name, recall_1.RecallTool.description, recall_1.RecallTool.schema, (params) => recall_1.RecallTool.handler(params, options));
if (options.mode === 'stdio') {
(0, mcp_server_1.initStdioServer)(server);
}
else if (options.mode === 'sse') {
(0, mcp_server_1.initSSEServer)(server, options);
}
else {
console.error('Invalid mode:', options.mode);
process.exit(1);
}
});
if (process.argv.length === 2) {
program.help();
}
program.parse(process.argv);