UNPKG

feishu-mcp

Version:

Model Context Protocol server for Feishu integration

74 lines (73 loc) 2.93 kB
import { Logger } from '../../../utils/logger.js'; import { formatErrorMessage } from '../../../utils/error.js'; /** * 获取飞书根文件夹信息、知识空间列表和我的知识库 */ export async function getRootFolderInfo(api) { Logger.info('getRootFolderInfo invoked'); const result = { root_folder: null, wiki_spaces: [], my_library: null, }; try { const folderInfo = await api.getRootFolderInfo(); result.root_folder = folderInfo?.data ?? folderInfo; } catch (error) { Logger.error(`获取飞书根文件夹信息失败:`, error); result.root_folder = { error: formatErrorMessage(error, '获取根文件夹信息失败') }; } try { result.wiki_spaces = (await api.getAllWikiSpacesList(20)) ?? []; } catch (error) { Logger.error(`获取知识空间列表失败:`, error); result.wiki_spaces = []; } try { const myLibrary = await api.getWikiSpaceInfo('my_library', 'en'); const libraryData = myLibrary?.data ?? myLibrary; result.my_library = libraryData?.space ?? libraryData; } catch (error) { Logger.error(`获取我的知识库失败:`, error); result.my_library = { error: formatErrorMessage(error, '获取我的知识库失败') }; } return result; } /** * 获取文件夹或知识空间节点下的文件列表 */ export async function getFolderFiles(params, api) { const { folderToken, wikiContext } = params; if (folderToken && wikiContext) { throw new Error('错误:不能同时提供 folderToken 和 wikiContext 参数,请选择其中一种模式。\n' + '- 使用 folderToken 在飞书文档目录中操作\n' + '- 使用 wikiContext 在知识库中操作'); } if (!folderToken && !wikiContext) { throw new Error('错误:必须提供 folderToken(飞书文档目录模式)或 wikiContext(知识库节点模式)参数之一。'); } if (folderToken) { Logger.info(`getFolderFiles invoked: folder mode, folderToken=${folderToken}`); return api.getFolderFileList(folderToken); } if (!wikiContext) throw new Error('错误:内部参数状态异常。'); const { spaceId, parentNodeToken } = wikiContext; if (!spaceId) { throw new Error('错误:使用 wikiContext 模式时,必须提供 spaceId。'); } Logger.info(`getFolderFiles invoked: wiki mode, spaceId=${spaceId}`); const nodeList = await api.getAllWikiSpaceNodes(spaceId, parentNodeToken); return { nodes: nodeList ?? [] }; } /** * 在指定文件夹下创建子文件夹 */ export async function createFolder(params, api) { const { folderToken, folderName } = params; Logger.info(`createFolder invoked: folderToken=${folderToken}, folderName=${folderName}`); return api.createFolder(folderToken, folderName); }