#!/usr/bin/env node
import { FastMCP } from "fastmcp";
import { exportResume } from "./generate_resume.js";
import { uploadResume } from "./upload.js";
import { z } from "zod";
const server = new FastMCP({
name: "resume-mcp",
version: "1.0.0",
});
server.addTool({
name: "generate_resume",
description: "根据给定简历信息生成 PDF 并返回可访问的 URL",
parameters: z.object({
fullName: z
.string()
.describe("用户的全名,将显示在简历顶部作为主标题。"),
email: z
.string()
.optional()
.describe("电子邮箱地址,用于联系方式。"),
phone: z
.string()
.optional()
.describe("手机号,用于联系方式。"),
location: z
.string()
.optional()
.describe("所在城市或地区,如:北京 / 上海 / 广州。"),
website: z
.string()
.optional()
.describe("个人网站、博客或 GitHub 链接。"),
education: z
.array(
z.object({
institution: z
.string()
.describe("教育机构名称,例如:清华大学。"),
degree: z
.string()
.describe("所获学位或专业名称,例如:计算机科学与技术。"),
startDate: z
.string()
.describe("入学时间,例如:2020-09。"),
endDate: z
.string()
.describe("毕业时间,例如:2024-06。"),
summary: z
.string()
.optional()
.describe("教育经历补充描述,如主修课程、成绩或参与活动等。")
})
)
.describe("教育经历列表,按时间倒序排列。"),
experience: z
.array(
z.object({
company: z
.string()
.describe("公司名称,例如:阿里巴巴。"),
department: z
.string()
.optional()
.describe("部门,例如:云计算事业部。"),
position: z
.string()
.describe("职位名称,例如:后端开发工程师。"),
startDate: z
.string()
.describe("开始工作时间,例如:2022-03。"),
endDate: z
.string()
.describe("结束工作时间,或使用“至今”。"),
highlights: z
.array(z.string())
.optional()
.describe("该职位下的亮点成就,例如解决的关键问题、创造的价值等。")
})
)
.describe("职业工作经历数组,至少包含一个工作项目。"),
projects: z
.array(
z.object({
name: z
.string()
.describe("项目名称,例如:内容推荐系统。"),
role: z
.string()
.optional()
.describe("项目角色,例如:后端负责人。"),
url: z
.string()
.optional()
.describe("项目链接或 GitHub 链接(如果有)。"),
summary: z
.string()
.optional()
.describe("项目简介,例如项目背景、目标或你负责的模块。"),
highlights: z
.array(z.string())
.optional()
.describe("项目亮点,如使用的技术、解决的关键难题、性能提升等。")
})
)
.optional()
.describe("项目经历列表,用于展示技术能力。"),
skills: z
.array(z.string())
.optional()
.describe("技能列表(字符串数组),如 ['React', 'TypeScript']。"),
honors: z
.array(z.string())
.optional()
.describe("荣誉奖项列表,例如:'ACM 区域赛铜牌'。"),
order: z
.array(z.string())
.optional()
.describe("简历中各模块的渲染顺序,例如:['education', 'experience', 'projects']。"),
}),
execute: async (args) => {
const out = `resume.pdf`;
await exportResume(args, out);
const url = await uploadResume(out);
return url;
},
});
server.start({ transportType: "stdio" });