架构设计 - cso1z/Feishu-MCP GitHub Wiki
飞书 MCP 服务器是一个基于 Model Context Protocol (MCP) 的中间件服务,它连接 AI 编码工具(如 Cursor、Windsurf)和飞书文档系统,使 AI 工具能够直接访问和操作飞书文档。
- 高性能:通过缓存机制减少 API 调用,提高响应速度
- 高可用:支持多用户并发,自动处理 Token 刷新
- 易扩展:模块化设计,易于添加新功能
- 易维护:清晰的代码结构,完善的错误处理
┌─────────────────────────────────────────────────────────────┐
│ AI 编码工具层 │
│ (Cursor, Windsurf, Cline等) │
└────────────────────────┬────────────────────────────────────┘
│ MCP Protocol
│ (JSON-RPC 2.0)
▼
┌─────────────────────────────────────────────────────────────┐
│ 传输层 (Transport Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ SSE (HTTP) │ │ Stdio │ │ Streamable │ │
│ │ │ │ │ │ HTTP │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼──────────────────┼──────────────────┼────────────┘
│ │ │
└──────────────────┼──────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ MCP 服务器层 (MCP Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ FeishuMcp (McpServer) │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ 工具注册 (Tools Registration) │ │ │
│ │ │ - feishuTools │ │ │
│ │ │ - feishuBlockTools │ │ │
│ │ │ - feishuFolderTools │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────┬────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 服务层 (Service Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ FeishuApiService (单例模式) │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ BaseApiService (基础API服务) │ │ │
│ │ │ - HTTP请求封装 │ │ │
│ │ │ - 错误处理 │ │ │
│ │ │ - Token管理 │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ BlockFactory (文档块工厂) │ │ │
│ │ │ - 创建各种类型的文档块 │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────┬────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 工具层 (Utility Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Config │ │ Logger │ │ Cache │ │ Auth │ │
│ │ 配置管理 │ │ 日志 │ │ 缓存 │ │ 认证 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────┬────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 飞书开放平台 API │
│ (https://open.feishu.cn/open-apis) │
└─────────────────────────────────────────────────────────────┘
传输层负责处理与客户端的通信,支持三种传输方式:
- 用途:HTTP 模式下的长连接通信
- 特点:服务器主动推送消息,客户端通过 POST 请求响应
-
实现:
SSEServerTransport来自@modelcontextprotocol/sdk
// 文件位置: src/server.ts
app.get('/sse', async (req: Request, res: Response) => {
const sseTransport = new SSEServerTransport('/messages', res);
const server = new FeishuMcp();
await server.connect(sseTransport);
});- 用途:CLI 模式下的进程间通信
- 特点:不占用网络端口,适合嵌入式场景
-
实现:
StdioServerTransport来自@modelcontextprotocol/sdk
// 文件位置: src/index.ts
if (isStdioMode) {
const transport = new StdioServerTransport();
await server.connect(transport);
}- 用途:HTTP 模式下的双向通信
- 特点:使用标准的 HTTP POST 请求,支持会话管理
-
实现:
StreamableHTTPServerTransport来自@modelcontextprotocol/sdk
MCP 服务器层是整个系统的核心,负责:
- 注册工具函数
- 处理工具调用请求
- 管理工具执行上下文
// 文件位置: src/mcp/feishuMcp.ts
export class FeishuMcp extends McpServer {
constructor() {
super(serverInfo, serverOptions);
this.initFeishuService();
this.registerAllTools();
}
private registerAllTools(): void {
registerFeishuTools(this, this.feishuService);
registerFeishuBlockTools(this, this.feishuService);
registerFeishuFolderTools(this, this.feishuService);
}
}飞书 API 服务是单例模式,提供所有飞书 API 操作:
// 文件位置: src/services/feishuApiService.ts
export class FeishuApiService extends BaseApiService {
private static instance: FeishuApiService;
public static getInstance(): FeishuApiService {
if (!FeishuApiService.instance) {
FeishuApiService.instance = new FeishuApiService();
}
return FeishuApiService.instance;
}
}主要功能:
- 文档操作(创建、读取、更新)
- 文档块操作(创建、更新、删除)
- 文件夹管理
- 图片上传和处理
基础 API 服务提供通用的 HTTP 请求处理:
// 文件位置: src/services/baseService.ts
export abstract class BaseApiService {
protected async request<T>(
endpoint: string,
method: string = 'GET',
data?: any,
needsAuth: boolean = true
): Promise<T> {
// 获取访问令牌
const accessToken = await this.getAccessToken(userKey);
// 发送 HTTP 请求
const response = await axios(config);
// 处理响应和错误
return response.data.data;
}
}// 文件位置: src/utils/config.ts
export class Config {
// 从环境变量和命令行参数加载配置
// 支持配置验证和默认值
}// 文件位置: src/utils/logger.ts
export class Logger {
// 统一的日志接口
// 支持不同日志级别
// 集成 MCP 日志系统
}// 文件位置: src/utils/auth/tokenCacheManager.ts
export class TokenCacheManager {
// 管理用户 token 和租户 token
// 支持文件持久化
// 自动清理过期 token
}| 依赖 | 版本 | 用途 |
|---|---|---|
@modelcontextprotocol/sdk |
^1.17.5 | MCP 协议实现 |
axios |
^1.7.9 | HTTP 请求库 |
express |
^4.21.2 | HTTP 服务器 |
zod |
^3.24.2 | 参数验证 |
typescript |
^5.7.3 | 类型系统 |
-
tsx- TypeScript 执行器 -
eslint- 代码检查 -
prettier- 代码格式化 -
jest- 单元测试
1. AI 工具发起请求
↓
2. 传输层接收请求 (SSE/Stdio/HTTP)
↓
3. MCP 服务器解析请求
↓
4. 查找并调用对应工具函数
↓
5. 工具函数调用 FeishuApiService
↓
6. FeishuApiService 检查 Token
↓ (Token 不存在或过期)
7. TokenCacheManager 获取/刷新 Token
↓
8. 发送 HTTP 请求到飞书 API
↓
9. 处理响应数据
↓
10. 返回结果给 AI 工具
// 文件位置: src/services/feishuApiService.ts
protected async getAccessToken(userKey?: string): Promise<string> {
const clientKey = AuthUtils.generateClientKey(userKey);
if (authType === 'tenant') {
// 租户模式:获取租户访问令牌
return this.getTenantAccessToken(appId, appSecret, clientKey);
} else {
// 用户模式:获取用户访问令牌
return this.authService.getUserAccessToken(clientKey, appId, appSecret);
}
}多个核心服务使用单例模式,确保全局唯一实例:
// FeishuApiService
// Config
// TokenCacheManager
// CacheManager
// BlockFactoryBlockFactory 用于创建不同类型的文档块:
// 文件位置: src/services/blockFactory.ts
export class BlockFactory {
createTextBlock(options: TextBlockOptions): any;
createCodeBlock(options: CodeBlockOptions): any;
createHeadingBlock(options: HeadingBlockOptions): any;
// ...
}不同的认证策略(租户认证 vs 用户认证):
if (authType === 'tenant') {
return this.getTenantAccessToken(...);
} else {
return this.authService.getUserAccessToken(...);
}BaseApiService 定义了请求处理的模板,子类实现具体细节:
protected async request(...) {
// 1. 构建请求
// 2. 添加认证
// 3. 发送请求
// 4. 处理错误
// 5. 返回结果
}- 在对应的工具文件中添加工具函数:
// 文件位置: src/mcp/tools/feishuTools.ts
server.tool(
'new_feishu_tool',
'工具描述',
{
param1: z.string().describe('参数1'),
},
async ({ param1 }) => {
// 实现逻辑
}
);- 在
FeishuApiService中添加对应的 API 方法(如需要)
- 在
server.ts中添加新的传输层处理 - 实现对应的连接和消息处理逻辑
- 扩展
AuthService类 - 在
FeishuApiService.getAccessToken()中添加新的认证逻辑
相关文档: