Skip to main content
Glama

generate_resume_from_text

Convert resume text into professional PDF resumes with customizable templates. Provide your resume content to generate formatted PDF files without manual JSON processing.

Instructions

一键将简历文本转换为精美PDF简历,支持多种模板。只需提供简历文本内容,系统会自动进行格式转换并生成专业PDF文件,无需手动处理JSON数据。可选择不同简历模板和定制选项。

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
resumeTextYes
templateNameNo
optionsNo

Implementation Reference

  • Main handler function for 'generate_resume_from_text' tool. Converts resume text to JSON Resume format using NovaCVService, extracts the data, then generates PDF resume, and returns the result.
    async ({ resumeText, templateName = "elite", options = {} }, extra) => {
      if (!resumeText) {
        throw new Error("简历文本是必需的");
      }
      
      try {
        // 第一步:将文本转换为JSON Resume格式
        const convertResult = await novaCVService.convertTextToJsonResume(resumeText);
        
        // 调试输出API响应结构
        console.log("转换API响应:", JSON.stringify(convertResult, null, 2));
        
        if (!convertResult || convertResult.error) {
          return {
            content: [
              {
                type: "text",
                text: `转换简历文本失败: ${convertResult?.error?.message || convertResult?.message || "未知错误"}`
              }
            ],
          };
        }
        
        // 根据实际API响应结构获取简历数据
        // 尝试多种可能的路径
        let resumeData = null;
        if (convertResult.data && convertResult.data.resumeData) {
          resumeData = convertResult.data.resumeData;
        } else if (convertResult.data && convertResult.data.jsonResume) {
          // 处理API返回的jsonResume路径
          resumeData = convertResult.data.jsonResume;
        } else if (convertResult.resumeData) {
          resumeData = convertResult.resumeData;
        } else if (convertResult.jsonResume) {
          resumeData = convertResult.jsonResume;
        } else if (typeof convertResult === 'object' && Object.keys(convertResult).length > 0) {
          // 如果响应本身就是简历数据对象
          if (convertResult.basics || convertResult.work || convertResult.education) {
            resumeData = convertResult;
          }
        }
        
        // 检查是否获取到简历数据
        if (!resumeData) {
          // 输出完整响应以帮助调试
          return {
            content: [
              {
                type: "text",
                text: `转换成功但无法获取简历数据。API响应:\n${JSON.stringify(convertResult, null, 2)}`
              }
            ],
          };
        }
        
        // 第二步:使用JSON Resume数据生成PDF
        console.log("使用以下数据生成PDF:", JSON.stringify(resumeData, null, 2));
        const generateResult = await novaCVService.generateResume(resumeData, templateName, options);
        
        return {
          content: [
            {
              type: "text",
              text: safeStringify(generateResult)
            }
          ],
        };
      } catch (error: any) {
        return {
          content: [
            {
              type: "text",
              text: `错误: ${error.message || "未知错误"}`
            }
          ],
        };
      }
    }
  • Zod input schema for the tool: resumeText (required string), optional templateName (string), optional options (object).
    {
      resumeText: z.string(),
      templateName: z.string().optional(),
      options: z.object({}).optional()
    },
  • src/index.ts:113-199 (registration)
    Registration of the 'generate_resume_from_text' tool using server.tool(), including description, schema, and inline handler.
    server.tool(
      "generate_resume_from_text",
      "一键将简历文本转换为精美PDF简历,支持多种模板。只需提供简历文本内容,系统会自动进行格式转换并生成专业PDF文件,无需手动处理JSON数据。可选择不同简历模板和定制选项。",
      {
        resumeText: z.string(),
        templateName: z.string().optional(),
        options: z.object({}).optional()
      },
      async ({ resumeText, templateName = "elite", options = {} }, extra) => {
        if (!resumeText) {
          throw new Error("简历文本是必需的");
        }
        
        try {
          // 第一步:将文本转换为JSON Resume格式
          const convertResult = await novaCVService.convertTextToJsonResume(resumeText);
          
          // 调试输出API响应结构
          console.log("转换API响应:", JSON.stringify(convertResult, null, 2));
          
          if (!convertResult || convertResult.error) {
            return {
              content: [
                {
                  type: "text",
                  text: `转换简历文本失败: ${convertResult?.error?.message || convertResult?.message || "未知错误"}`
                }
              ],
            };
          }
          
          // 根据实际API响应结构获取简历数据
          // 尝试多种可能的路径
          let resumeData = null;
          if (convertResult.data && convertResult.data.resumeData) {
            resumeData = convertResult.data.resumeData;
          } else if (convertResult.data && convertResult.data.jsonResume) {
            // 处理API返回的jsonResume路径
            resumeData = convertResult.data.jsonResume;
          } else if (convertResult.resumeData) {
            resumeData = convertResult.resumeData;
          } else if (convertResult.jsonResume) {
            resumeData = convertResult.jsonResume;
          } else if (typeof convertResult === 'object' && Object.keys(convertResult).length > 0) {
            // 如果响应本身就是简历数据对象
            if (convertResult.basics || convertResult.work || convertResult.education) {
              resumeData = convertResult;
            }
          }
          
          // 检查是否获取到简历数据
          if (!resumeData) {
            // 输出完整响应以帮助调试
            return {
              content: [
                {
                  type: "text",
                  text: `转换成功但无法获取简历数据。API响应:\n${JSON.stringify(convertResult, null, 2)}`
                }
              ],
            };
          }
          
          // 第二步:使用JSON Resume数据生成PDF
          console.log("使用以下数据生成PDF:", JSON.stringify(resumeData, null, 2));
          const generateResult = await novaCVService.generateResume(resumeData, templateName, options);
          
          return {
            content: [
              {
                type: "text",
                text: safeStringify(generateResult)
              }
            ],
          };
        } catch (error: any) {
          return {
            content: [
              {
                type: "text",
                text: `错误: ${error.message || "未知错误"}`
              }
            ],
          };
        }
      }
    );
  • Helper method in NovaCVService that calls the API to convert plain resume text to structured JSON Resume format.
    async convertTextToJsonResume(resumeText: string): Promise<any> {
      try {
        console.log("开始转换简历文本为JSON格式");
        const response = await this.client.post('/api/v1/resumes/convert-text', {
          resumeText
        });
        console.log("转换API响应状态码:", response.status);
        console.log("转换API响应头:", JSON.stringify(response.headers, null, 2));
        console.log("转换API响应数据类型:", typeof response.data);
        
        // 如果直接返回简历数据,自动包装为标准格式
        if (response.data && typeof response.data === 'object') {
          // 检查是否缺少标准响应结构
          if (!response.data.success && !response.data.data && !response.data.error) {
            // 检查是否是简历数据结构
            if (response.data.basics || response.data.work || response.data.education) {
              return {
                success: true,
                data: {
                  jsonResume: response.data
                }
              };
            }
          } 
          // 标准化响应 - 确保jsonResume数据在一致的位置
          else if (response.data.success && response.data.data) {
            // 如果有data.resumeData但没有data.jsonResume,复制数据
            if (response.data.data.resumeData && !response.data.data.jsonResume) {
              response.data.data.jsonResume = response.data.data.resumeData;
            }
            // 如果有data.jsonResume但没有data.resumeData,复制数据
            else if (response.data.data.jsonResume && !response.data.data.resumeData) {
              response.data.data.resumeData = response.data.data.jsonResume;
            }
          }
        }
        
        return response.data;
      } catch (error) {
        console.error("转换简历文本失败:", error);
        this._handleError(error);
        throw error;
      }
    }
  • Helper method in NovaCVService that calls the API to generate PDF resume from JSON Resume data using specified template.
    async generateResume(
      resumeData: any, 
      templateName: string = 'elite', 
      options: any = {}
    ): Promise<any> {
      try {
        // 基本检查,确保数据不为空
        if (!resumeData) {
          throw new Error("resumeData 不能为空");
        }
        
        // 确保resumeData是对象格式
        let processedResumeData: any;
        if (typeof resumeData === 'string') {
          try {
            processedResumeData = JSON.parse(resumeData);
          } catch (e: any) {
            throw new Error(`无法解析resumeData字符串为JSON: ${e.message}`);
          }
        } else {
          processedResumeData = resumeData;
        }
        
        // 构建请求数据对象
        const requestData = {
          resumeData: processedResumeData,
          templateName,
          options
        };
        
        // 发送请求到NovaCV API
        const response = await this.client.post('/api/v1/resumes/generate', requestData);
        
        return response.data;
      } catch (error) {
        this._handleError(error);
        throw error;
      }
    }

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/HireTechUpUp/mcp-server-novacv'

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