Skip to main content
Glama
im47cn

Feishu Project MCP Server

by im47cn
tools.ts7.14 kB
import { McpServer, McpToolResponse, ProjectIdParam, TaskIdParam, CreateTaskParam, ItemParam, } from '../types/mcp.js'; import { Logger } from '../utils/logger.js'; import { FeishuIntegrator } from '../integrators/feishu.js'; import { TaskManager } from '../managers/task.js'; import { Task, TaskType, TaskStatus } from '../types/task.js'; import { v4 as uuidv4 } from 'uuid'; export function registerFeishuTools( server: McpServer, feishu: FeishuIntegrator, logger: Logger ): void { server.registerTool({ name: 'feishu.projects', description: 'Get list of Feishu projects', parameters: [], execute: async (): Promise<McpToolResponse> => { try { const projects = await feishu.getProjects(); return { success: true, data: projects, }; } catch (error) { logger.error('Failed to get Feishu projects', { error }); return { success: false, error: 'Failed to get Feishu projects', }; } }, }); server.registerTool<ProjectIdParam>({ name: 'feishu.requirements', description: 'Get requirements for a project', parameters: [ { name: 'projectId', description: 'Project ID', type: 'string', required: true, }, ], execute: async (params: ProjectIdParam): Promise<McpToolResponse> => { try { const requirements = await feishu.getRequirements(params.projectId); return { success: true, data: requirements, }; } catch (error) { logger.error('Failed to get requirements', { error, projectId: params.projectId }); return { success: false, error: 'Failed to get requirements', }; } }, }); server.registerTool<ProjectIdParam>({ name: 'feishu.bugs', description: 'Get bugs for a project', parameters: [ { name: 'projectId', description: 'Project ID', type: 'string', required: true, }, ], execute: async (params: ProjectIdParam): Promise<McpToolResponse> => { try { const bugs = await feishu.getBugs(params.projectId); return { success: true, data: bugs, }; } catch (error) { logger.error('Failed to get bugs', { error, projectId: params.projectId }); return { success: false, error: 'Failed to get bugs', }; } }, }); } export function registerTaskTools( server: McpServer, taskManager: TaskManager, logger: Logger ): void { server.registerTool<CreateTaskParam>({ name: 'task.create', description: 'Create a new task', parameters: [ { name: 'type', description: 'Task type', type: 'string', required: true, }, { name: 'itemId', description: 'Item ID', type: 'string', required: true, }, { name: 'itemType', description: 'Item type', type: 'string', required: true, }, ], execute: async (params: CreateTaskParam): Promise<McpToolResponse> => { try { const task: Task = { id: uuidv4(), type: params.type as TaskType, status: TaskStatus.PENDING, itemId: params.itemId, itemType: params.itemType, created_at: new Date().toISOString(), updated_at: new Date().toISOString(), }; const createdTask = await taskManager.createTask(task); return { success: true, data: createdTask, }; } catch (error) { logger.error('Failed to create task', { error, params }); return { success: false, error: 'Failed to create task', }; } }, }); server.registerTool<TaskIdParam>({ name: 'task.get', description: 'Get task details', parameters: [ { name: 'taskId', description: 'Task ID', type: 'string', required: true, }, ], execute: async (params: TaskIdParam): Promise<McpToolResponse> => { try { const task = await taskManager.getTask(params.taskId); if (!task) { return { success: false, error: 'Task not found', }; } return { success: true, data: task, }; } catch (error) { logger.error('Failed to get task', { error, taskId: params.taskId }); return { success: false, error: 'Failed to get task', }; } }, }); } export function registerModeTools( server: McpServer, taskManager: TaskManager, logger: Logger ): void { server.registerTool<ItemParam>({ name: 'mode.analyze', description: 'Analyze a requirement or bug', parameters: [ { name: 'itemId', description: 'Item ID', type: 'string', required: true, }, { name: 'itemType', description: 'Item type (requirement or bug)', type: 'string', required: true, }, ], execute: async (params: ItemParam): Promise<McpToolResponse> => { try { const task: Task = { id: uuidv4(), type: TaskType.REQUIREMENT_ANALYSIS, status: TaskStatus.PENDING, itemId: params.itemId, itemType: params.itemType, created_at: new Date().toISOString(), updated_at: new Date().toISOString(), }; const createdTask = await taskManager.createTask(task); return { success: true, data: createdTask, }; } catch (error) { logger.error('Failed to start analysis', { error, params }); return { success: false, error: 'Failed to start analysis', }; } }, }); server.registerTool<ItemParam>({ name: 'mode.implement', description: 'Implement a requirement or bug fix', parameters: [ { name: 'itemId', description: 'Item ID', type: 'string', required: true, }, { name: 'itemType', description: 'Item type (requirement or bug)', type: 'string', required: true, }, ], execute: async (params: ItemParam): Promise<McpToolResponse> => { try { const task: Task = { id: uuidv4(), type: TaskType.CODE_IMPLEMENTATION, status: TaskStatus.PENDING, itemId: params.itemId, itemType: params.itemType, created_at: new Date().toISOString(), updated_at: new Date().toISOString(), }; const createdTask = await taskManager.createTask(task); return { success: true, data: createdTask, }; } catch (error) { logger.error('Failed to start implementation', { error, params }); return { success: false, error: 'Failed to start implementation', }; } }, }); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/im47cn/feishu-project-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server