@larksuiteoapi/lark-mcp
Version:
Feishu/Lark OpenAPI MCP
96 lines (95 loc) • 3.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LarkMcpTool = void 0;
const node_sdk_1 = require("@larksuiteoapi/node-sdk");
const types_1 = require("./types");
const tools_1 = require("./tools");
const filter_tools_1 = require("./utils/filter-tools");
const constants_1 = require("./constants");
const handler_1 = require("./utils/handler");
const case_transf_1 = require("./utils/case-transf");
const get_should_use_uat_1 = require("./utils/get-should-use-uat");
/**
* Feishu/Lark MCP
*/
class LarkMcpTool {
/**
* Feishu/Lark MCP
* @param options Feishu/Lark Client Options
*/
constructor(options) {
var _a;
// Lark Client
this.client = null;
// Token Mode
this.tokenMode = types_1.TokenMode.AUTO;
// All Tools
this.allTools = [];
if (options.client) {
this.client = options.client;
}
else if (options.appId && options.appSecret) {
this.client = new node_sdk_1.Client({
appId: options.appId,
appSecret: options.appSecret,
...options,
});
}
this.tokenMode = options.tokenMode || types_1.TokenMode.AUTO;
const isZH = ((_a = options.toolsOptions) === null || _a === void 0 ? void 0 : _a.language) === 'zh';
const filterOptions = {
allowTools: constants_1.defaultToolNames,
tokenMode: this.tokenMode,
...options.toolsOptions,
};
this.allTools = (0, filter_tools_1.filterTools)(isZH ? tools_1.AllToolsZh : tools_1.AllTools, filterOptions);
}
/**
* Update User Access Token
* @param userAccessToken User Access Token
*/
updateUserAccessToken(userAccessToken) {
this.userAccessToken = userAccessToken;
}
/**
* Get MCP Tools
* @returns MCP Tool Definition Array
*/
getTools() {
return this.allTools;
}
/**
* Register Tools to MCP Server
* @param server MCP Server Instance
*/
registerMcpServer(server, options) {
for (const tool of this.allTools) {
server.tool((0, case_transf_1.caseTransf)(tool.name, options === null || options === void 0 ? void 0 : options.toolNameCase), tool.description, tool.schema, (params) => {
try {
if (!this.client) {
return {
isError: true,
content: [{ type: 'text', text: 'Client not initialized' }],
};
}
const handler = tool.customHandler || handler_1.larkOapiHandler;
if (this.tokenMode == types_1.TokenMode.USER_ACCESS_TOKEN && !this.userAccessToken) {
return {
isError: true,
content: [{ type: 'text', text: 'Invalid UserAccessToken' }],
};
}
const shouldUseUAT = (0, get_should_use_uat_1.getShouldUseUAT)(this.tokenMode, this.userAccessToken, params === null || params === void 0 ? void 0 : params.useUAT);
return handler(this.client, { ...params, useUAT: shouldUseUAT }, { userAccessToken: this.userAccessToken, tool });
}
catch (error) {
return {
isError: true,
content: [{ type: 'text', text: `Error: ${JSON.stringify(error === null || error === void 0 ? void 0 : error.message)}` }],
};
}
});
}
}
}
exports.LarkMcpTool = LarkMcpTool;