Feishu MCP服务器基于Model Context Protocol。该服务提供Feishu API集成,使AI模型能够轻松与Feishu服务交互。
/src
/client # API客户端实现(底层API请求封装)
/documents # 文档相关API客户端
/bots # 机器人API客户端
/chats # 聊天相关API客户端
/services # 服务层实现(业务逻辑和错误处理)
/documents # 文档相关服务
/bots # 机器人相关服务
/chats # 聊天相关服务
/server # MCP服务器实现
/tools # MCP工具注册和实现
/typings # 类型定义
/utils # 通用工具函数
/http # HTTP服务器实现
/logger # 日志服务
/consts # 常量定义
config.ts # 配置管理
index.ts # 入口点
该项目采用分层架构设计,确保关注点分离和职责清晰:
客户端层
服务层
工具层
FeiShuApiError统一处理API错误git clone https://github.com/yourusername/feishu-mcp-server.git
cd feishu-mcp-server
pnpm install
.env文件# 飞书应用凭证(必填)
FEISHU_APP_ID=your_app_id
FEISHU_APP_SECRET=your_app_secret
# 服务器配置(可选)
PORT=3344
LOG_LEVEL=info
# 开发模式(自动重启)
pnpm dev
# 或使用普通启动
pnpm start
# 构建项目
pnpm build
# 运行编译后的代码
node dist/index.js
# 方法1:使用环境变量
NODE_ENV=cli node dist/index.js
# 方法2:使用命令行参数
node dist/index.js --stdio
| 选项 | 环境变量 | 命令行参数 | 默认值 | 描述 |
|---|---|---|---|---|
| Feishu应用ID | FEISHU_APP_ID | --feishu-app-id | - | Feishu自建应用的App ID |
| Feishu应用密钥 | FEISHU_APP_SECRET | --feishu-app-secret | - Feishu自建应用的App Secret | |
| 服务器端口 | PORT | --port | 3344 | HTTP服务器端口号 |
| 日志级别 | LOG_LEVEL | --log-level | info | 日志级别 (debug/info/warn/error) |
| 令牌缓存时间 | TOKEN_CACHE_DURATION | - | 7100 | 访问令牌缓存时间(秒) |
get_feishu_doc_raw获取Feishu文档的原始内容。
参数
docId -文档ID,通常在URL中找到(例如feishu.cn/docx)/<documentId>)返回:
get_feishu_doc_info获取Feishu文档的元数据信息。
参数
docId -文档ID返回:
send_feishu_text_message向Feishu聊天发送文本消息。
参数
chatId -聊天IDtext -要发送的文本内容返回:
send_feishu_card向Feishu聊天发送互动卡片。
参数
chatId -聊天IDcardContent -卡片内容(JSON字符串)返回:
get_feishu_chat_info获取Feishu聊天的基本信息。
参数
chatId -聊天ID返回:
get_feishu_sheet_meta从Feishu多维表格中获取元数据信息。
参数
appToken -多维表格ID,通常在URL中找到(例如feishu.cn/base)/<appToken> 或 feishu.cn/app/<appToken>)返回:
get_feishu_sheet_tables从Feishu多维表格中获取数据表列表。
参数
appToken -多维表格ID,通常在URL中找到(例如feishu.cn/base)/<appToken> 或 feishu.cn/app/<appToken>)pageSize -每页返回的数据表数量,可选,默认为20,最大为100pageToken -分页标签,可选,用于从下一页检索数据返回:
get_feishu_sheet_views从Feishu多维表格中获取数据表视图列表。
参数
appToken -多维表格ID,通常在URL中找到(例如feishu.cn/base)/<appToken> 或 feishu.cn/app/<appToken>)tableId -数据表IDpageSize -每页返回的视图数量,可选,默认为20,最大为100pageToken -分页标签,可选,用于从下一页检索数据返回:
get_feishu_sheet_view获取Feishu多维表格中数据表的具体视图详细信息。
参数
appToken -多维表格ID,通常在URL中找到(例如feishu.cn/base)/<appToken> 或 feishu.cn/app/<appToken>)tableId -数据表IDviewId -视图ID,需要获取详细信息的视图返回:
get_feishu_sheet_records从Feishu多维表格中获取数据表记录。
参数
appToken -多维表格ID,通常在URL中找到(例如feishu.cn/base)/<appToken> 或 feishu.cn/app/<appToken>)tableId -数据表IDviewId -视图ID,可选,未指定时使用默认视图fieldIds -字段ID列表,可选,指定要返回哪些字段filter -过滤条件,可选,使用FQL格式sort -排序条件,可选,使用JSON格式pageSize -每页返回的记录数,可选,默认为20,最大为100pageToken -分页标签,可选,用于从下一页检索数据返回:
get_feishu_sheet_record从Feishu多维表格中获取单个记录。
参数
appToken -多维表格ID,通常在URL中找到(例如feishu.cn/base)/<appToken> 或 feishu.cn/app/<appToken>)tableId -数据表IDrecordId -记录IDfieldIds -字段ID列表,可选,指定要返回哪些字段返回:
项目使用严格的TypeScript规范和ESLint配置:
any类型Record<string, unknown>代替object类型运行代码检查:
# 运行代码检查
pnpm lint
# 运行代码检查并修复
pnpm lint:fix
# 运行代码格式化
pnpm format
所有与Feishu API相关的错误应使用FeiShuApiError类进行处理:
try {
// API操作
} catch (error) {
if (error instanceof FeiShuApiError) {
// 处理特定的API错误
logger.error(`FeiShu API Error (${error.code}): ${error.message}`);
} else {
// 处理通用错误
logger.error('Unexpected error:', error);
}
// 转换为用户友好的消息
throw new FeiShuApiError('操作失败', { cause: error });
}
提交的消息必须遵循以下格式:
<type>(<scope>): <subject>
例如:
feat(bot): 添加发送卡片功能fix(documents): 修复文档内容获取错误支持的类型:
feat: 新功能fix: 修复错误docs: 文档更改style: 代码格式调整refactor: 代码重构perf: 性能优化test: 测试相关chore: 构建过程或辅助工具的变化添加新功能的步骤:
创建客户端类
src/client/<feature>/目录下创建ApiClient基类// src/client/feature/feature-client.ts
export class FeatureClient extends ApiClient {
async getFeatureData(id: string): Promise<FeatureData> {
return this.request<FeatureResponse>('/feature/get', { id });
}
}
创建服务类
src/services/<feature>/目录下创建// src/services/feature/feature-service.ts
export class FeatureService {
private client: FeatureClient;
constructor(config: ApiClientConfig) {
this.client = new FeatureClient(config);
}
async getFeature(id: string): Promise<Feature> {
try {
const data = await this.client.getFeatureData(id);
return this.transformData(data);
} catch (error) {
handleError(error);
}
}
}
注册服务
src/services/index.ts导出新的服务FeiShuServices类中创建MCP工具
src/server/tools/feature-tools.ts中间创建// src/server/tools/feature-tools.ts
export function registerFeatureTools(params: ToolRegistryParams): void {
const { server, services, logger } = params;
server.tool(
'get_feishu_feature',
'从FeiShu获取特性',
{
id: z.string().describe('特性ID'),
},
async ({ id }) => {
try {
const feature = await services.feature.getFeature(id);
return { content: [{ type: 'text', text: JSON.stringify(feature) }] };
} catch (error) {
return handleToolError(error, logger);
}
}
);
}
注册工具
src/server/tools/index.ts引入并注册新的工具问题API请求返回认证错误
解决方案:
问题令牌刷新失败
解决方案:
MIT
欢迎贡献!请按照以下步骤操作:
git checkout -b feature/amazing-feature)git commit -m 'feat: 添加一些惊人的功能')git push origin feature/amazing-feature)在提交PR之前,请确保: