UNPKG

resume-parser-mcp

Version:

To install dependencies:

72 lines (64 loc) 2.21 kB
import fs from 'fs'; import path from 'path'; import { Tool } from 'fastmcp'; import { z } from 'zod'; import { downloadFile } from '../parser/downloadFileFromUrl'; import { extractTextFromDocx, extractTextFromPdf, } from '../parser/extractFileText'; import { parseTextToResume } from '../parser/parseTextToResume'; import { useLogger } from '../utils/logger'; const fsPromises = fs.promises; const name = 'resume_parser'; const description = 'Parses a resume and returns a JSON object'; const parameters = z.object({ resume_url: z.string(), }); const ResumeParser: Tool<any, z.ZodType<typeof parameters._type>> = { name, description, parameters, execute: async ({ resume_url }, { log }) => { const logger = useLogger(log); let tempFilePath = null; try { // 1. 下载文件到临时目录 tempFilePath = await downloadFile(resume_url); logger.info('文件下载成功:', tempFilePath); // 2. 根据文件扩展名提取文本 let text = ''; const fileExtension = path.extname(tempFilePath).toLowerCase(); if (fileExtension === '.pdf') { text = await extractTextFromPdf(tempFilePath); } else if (fileExtension === '.docx') { text = await extractTextFromDocx(tempFilePath); } else { throw new Error( `不支持的文件格式: ${fileExtension}。请使用PDF或DOCX格式。` ); } if (!text) { throw new Error('无法从文件中提取文本内容'); } // 3. 解析文本为JSONResume格式 const resume = parseTextToResume(text); return resume; } catch (error: any) { logger.error('简历解析失败:', error?.message); throw error; } finally { // 4. 清理临时文件 if (tempFilePath) { try { await fsPromises.unlink(tempFilePath); logger.info('临时文件已清理'); } catch (cleanupError: any) { logger.warn('临时文件清理失败:', cleanupError?.message); } } } }, }; export { name, description, parameters, ResumeParser }; export default ResumeParser;