resume-parser-mcp
Version:
To install dependencies:
72 lines (64 loc) • 2.21 kB
text/typescript
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;