feishu-mcp
Version:
Model Context Protocol server for Feishu integration
95 lines (94 loc) • 3.13 kB
JavaScript
/**
* 飞书各功能模块所需权限 Scope 定义
* 按模块拆分,通过 getRequiredScopes 动态计算最小权限集
*/
export const MODULE_SCOPES = {
document: {
tenant: [
"docx:document.block:convert",
"base:app:read",
"bitable:app",
"bitable:app:readonly",
"board:whiteboard:node:create",
"board:whiteboard:node:read",
"contact:user.employee_id:readonly",
"docs:document.content:read",
"docx:document",
"docx:document:create",
"docx:document:readonly",
"drive:drive",
"drive:drive:readonly",
"drive:file",
"drive:file:upload",
"sheets:spreadsheet",
"sheets:spreadsheet:readonly",
"space:document:retrieve",
"space:folder:create",
"wiki:space:read",
"wiki:space:retrieve",
"wiki:wiki",
"wiki:wiki:readonly",
],
userOnly: [
"search:docs:read",
"offline_access",
],
},
task: {
tenant: [
"task:task:write",
],
userOnly: [],
},
calendar: {
tenant: [],
userOnly: [],
},
member: {
tenant: [
// 调用批量获取用户信息 API 所需(任选其一即可)
"contact:contact.base:readonly",
// 字段权限:返回完整用户信息
// "contact:user.assign_info:read",
"contact:user.base:readonly",
// "contact:user.department:readonly",
// "contact:user.department_path:readonly",
// "contact:user.dotted_line_leader_info.read",
// "contact:user.employee:readonly",
// "contact:user.employee_id:readonly",
// "contact:user.employee_number:read",
// "contact:user.gender:readonly",
// "contact:user.user_geo",
// "contact:user.phone:readonly",
// "contact:user.email:readonly",
// "contact:user.job_family:readonly",
// "contact:user.job_level:readonly",
],
userOnly: [
"contact:user:search",
"contact:contact.base:readonly",
"contact:user.employee_id:readonly",
],
},
};
/**
* 根据已启用模块和认证类型,计算所需的最小 Scope 集合
* @param enabledModules 已启用的模块 ID 列表(含 'all' 则返回全量)
* @param authType 认证类型
*/
export function getRequiredScopes(enabledModules, authType) {
const moduleIds = enabledModules.includes('all')
? Object.keys(MODULE_SCOPES)
: enabledModules;
const scopes = new Set();
for (const moduleId of moduleIds) {
const moduleScopes = MODULE_SCOPES[moduleId];
if (!moduleScopes)
continue;
moduleScopes.tenant.forEach(s => scopes.add(s));
if (authType === 'user') {
moduleScopes.userOnly.forEach(s => scopes.add(s));
}
}
return Array.from(scopes);
}