resume-repo-sync
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@resume-repo-syncGenerate resume bullet points from my GitHub repos"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
resume-repo-sync
基于 官方 Python MCP SDK(FastMCP) 的本地 MCP Server:
根据 GitHub 仓库的客观信号自动生成简历「项目经历」bullet,合并进已有 PDF 简历的结构化数据,并用 HTML 模板 + WeasyPrint 导出新 PDF。
设计原则
工具逻辑与 MCP 协议层分离(核心函数可脱离 MCP 单测)
依赖自包含:直接
requests调 GitHub REST,不套第三方 GitHub MCP只写可验证事实,禁止虚构「性能提升 50%」类指标
不持久化用户简历 / token;临时文件可过期清理
功能一览
# | Tool | 说明 |
1 |
| PDF → 结构化 |
2 |
| GitHub REST → |
3 |
| 客观技术要点 + |
4 |
| 按贡献级别 / 绝对提交量收敛措辞;negligible 可跳过整段项目 |
5 |
| 插入/覆盖项目(冲突 → |
6 |
| 项目粒度人类可读 diff |
7 |
| Jinja2 模板 + WeasyPrint → PDF( |
推荐调用顺序:
parse_resume
→ fetch_repo_info(github_username?)
→ analyze_repo_for_resume(github_username?, target_role?)
→ generate_bullet_points # 若 skip_project_entry 则不要 merge
→ merge_into_resume
→ diff_resume_versions
→ render_pdf(template=modern|compact)Related MCP server: cvmaker-mcp
架构
┌─────────────────────────────────────┐
│ MCP Client (Claude Desktop / │
│ Inspector / 其他 LLM Host) │
└─────────────────┬───────────────────┘
│ stdio
┌─────────────────▼───────────────────┐
│ server.py (FastMCP Tool 注册) │
│ 仅做参数校验 + envelope 序列化 │
└─────────────────┬───────────────────┘
│ 调用纯 Python 函数
┌──────────────┬──────────────┼──────────────┬──────────────┐
▼ ▼ ▼ ▼ ▼
resume/ github/ generation/ cleanup.py config.py
parser fetcher bullet_writer TTL / rmtree GITHUB_TOKEN
merge analyzer
diff
renderer ──► templates/{modern,compact}.html ──► WeasyPrint PDF分层收益:业务模块无 mcp import → pytest 直接测;换 transport(未来 HTTP)不必动分析/渲染逻辑。
项目结构
resume-repo-sync/
├── src/resume_repo_sync/
│ ├── server.py # FastMCP + Tool 注册(stdio)
│ ├── config.py # 环境变量 / TTL
│ ├── cleanup.py # 临时文件清理
│ ├── resume/
│ │ ├── schema.py # Pydantic 模型 + ToolErrorCode
│ │ ├── parser.py # pdfplumber 解析
│ │ ├── merge.py / diff.py
│ │ └── renderer.py # Jinja2 + WeasyPrint
│ ├── github/
│ │ ├── fetcher.py # REST:meta / languages / README /
│ │ │ # commits / contributors / deps
│ │ └── analyzer.py # 客观分析 + 贡献分级
│ └── generation/
│ └── bullet_writer.py # bullet 措辞(含 negligible 跳过)
├── templates/
│ ├── modern.html # 单栏宽松
│ └── compact.html # 双栏紧凑
├── scripts/e2e_demo.py
├── tests/
├── pyproject.toml
├── .env.example
└── README.md快速开始
1. 安装
需要 Python ≥ 3.11,推荐 uv:
cd resume-repo-sync
uv sync --extra devWeasyPrint(Windows)
winget install --id tschoonj.GTKForWindows --accept-package-agreements
# bin 通常在: C:\Program Files\GTK3-Runtime Win64\bin
# renderer 会自动探测;也可设 WEASYPRINT_GTK_BIN中文字体栈(两套模板共用):Microsoft YaHei / Noto Sans SC / SimSun。
本机验证:PDF 嵌入 Microsoft YaHei,pdfplumber 可提取「张三」「清华大学」等中文。
2. 配置
cp .env.example .env变量 | 说明 |
| 私有仓 / 提高 API 限额(可选) |
| managed 临时 PDF 根目录 |
| managed PDF 过期小时数(默认 24; |
| Windows GTK |
| 默认 |
3. 测试 / 演示 / 启动
uv run pytest -q
# 端到端(内置样例简历 + 真实公开仓)
uv run python scripts/e2e_demo.py
# MCP stdio
uv run resume-repo-sync
# Inspector
uv run mcp dev src/resume_repo_sync/server.py4. Claude Desktop(可选)
%APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"resume-repo-sync": {
"command": "uv",
"args": [
"--directory",
"C:\\Users\\admin\\Desktop\\resume-repo-sync",
"run",
"resume-repo-sync"
],
"env": { "GITHUB_TOKEN": "ghp_xxxxxxxx" }
}
}
}PDF 模板对比
两套模板都是 Jinja2 + 中文字体栈,通过 render_pdf(..., template="...") 切换;
未知名称返回 template_not_found(列出可用模板),不会静默回退默认模板。
维度 |
|
|
布局 | 单栏纵向流式 | 双栏:左轨(联系/技能/教育)+ 右主栏(工作/项目) |
页边距 | 约 1.6–1.8cm,留白较多 | 约 1.0–1.1cm,信息密度更高 |
字号层级 | 姓名 ~20pt,章节 ~12pt,正文 ~10.5pt | 姓名 ~16pt,章节小写标题 ~8.5pt,正文 ~8.5–9pt |
章节样式 | 粗下划线 | 大写细线 |
项目展示 | 每条 bullet 间距宽松,技术栈单独一行 |
|
适合场景 | 一页内项目不多、希望阅读舒适 | 内容多、希望压到一页 / ATS 友好密集版 |
调用示例:
render_pdf(resume_data, template="modern")
render_pdf(resume_data, template="compact")
render_pdf(resume_data, template="nope") → error_code=template_not_found在 templates/ 下新增 *.html 即可扩展;list_templates() / 错误详情会自动发现。
端到端示例
1) parse_resume(pdf_path)
2) fetch_repo_info(repo_url, github_username?)
3) analyze_repo_for_resume(repo_info, github_username?, target_role?)
→ contribution_level + absolute_contribution_signal
4) generate_bullet_points(analysis)
→ 若 skip_project_entry=true:不要 merge,按 recommendation 处理
5) merge_into_resume(...)
6) diff_resume_versions(old, new) # 人工确认
7) render_pdf(..., template="compact") # 或 modern实测(样例简历 + modelcontextprotocol/python-sdk)会在 diff 中看到类似:
+ 新增项目 [0] python-sdk
• 参与… / 使用 Python… / 项目获得 N GitHub Stars贡献分级(简历诚信)
占比 → contribution_level:
level | 条件 |
| ≥ 50% listed contributions |
| 20% – <50% |
| < 20% |
| 无数据 |
绝对次数 → absolute_contribution_signal(用于细分 minor 措辞):
signal | 绝对 listed contributions | minor 时 bullet |
| < 3 | 不生成完整项目条; |
| 3–19 | 「参与贡献 / 协助」 |
| ≥ 20 | 写明具体提交次数;仍禁止「主导/独立完成」 |
| 无数据 | 中性措辞 |
大仓里「占比低但提交多」与「几乎没贡献」不再混为一谈。
隐私与数据保留
数据 | 落盘? | 保留 |
用户简历 PDF | 只读,不复制 | 用户自管 |
解析 workdir | 系统 temp 私有目录 | 返回前必删(含异常 |
| 仅内存 / MCP 响应 | 进程结束即消失 |
|
| TTL(默认 24h)自动删 |
显式 | 调用方路径 | 永不自动删 |
| 环境变量 / | 不写日志 |
日志只记 ok/fail、basename、计数——不记简历正文、bullet、token。.gitignore 已屏蔽 .env、*.pdf、uploads/、output/、tmp/ 等。
设计决策(展示 / 面试)
自包含 GitHub REST,而不是嵌一层 GitHub MCP
错误语义可控(私有仓 / 限流 / 404 → 稳定ToolErrorCode),部署少一个进程。业务不写在
@mcp.tool里
普通函数可pytest;MCP 层只做 IO envelope。解析用启发式,不调 LLM
行为可预测、零额外 API 成本;极端版式用parse_warnings/raw_text交给上层模型兜底。WeasyPrint + Jinja2
排版与逻辑分离;加模板 = 加 HTML 文件,无需改 Python 分支。贡献分级驱动措辞
避免把「大仓里提过几个 PR」写成「独立主导」,保证可验证与诚信。
MCP Inspector 速查
uv run mcp dev src/resume_repo_sync/server.py模板切换:
render_pdf的template分别试modern、compact;再试does-not-exist→template_not_found。negligible:公开大仓 + 不存在的
github_username→skip_project_entry=true。冲突:
merge_into_resume同名且overwrite=false→project_already_exists。
License
MIT
Available Tools
7 toolsanalyze_repo_for_resumeA
从仓库客观数据提炼可用于简历的技术要点(不编造量化指标)。
什么时候该调用
fetch_repo_info 成功之后、generate_bullet_points 之前。
传入 github_username 以判定 contribution_level
(primary ≥50% / contributor 20–50% / minor <20% / unknown)。
| Name | Required | Description | Default |
|---|---|---|---|
| repo_info | Yes | ||
| target_role | No | ||
| github_username | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses the key behavioral constraint (不编造量化指标 - does not fabricate quantitative metrics), which is valuable honesty about what the tool will NOT do. However, it doesn't disclose output structure, error behavior, or what happens when repo_info is incomplete, leaving some gaps for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably succinct with a clear header line followed by a brief 'when to call' section. The structure with the explicit 什么时候该调用 (when to call) header makes the pipeline context scannable. Minor waste exists in restating thresholds in the usage section, but overall it's efficient and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and a well-defined pipeline position, the description covers the key decision context. It explains the github_username contribution logic, the ordering relative to siblings, and the honesty constraint. It's not exhaustive (doesn't explain repo_info handling or fallbacks), but given the output schema exists and the tool has a clear niche in a documented workflow, it's adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the github_username parameter's role (judging contribution_level with thresholds) but doesn't describe repo_info or target_role beyond what the schema trivially shows. The contribution_level thresholds (primary ≥50% / contributor 20–50% / minor <20%) are genuinely useful semantics not in the schema, though two of three params remain unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose ('从仓库客观数据提炼可用于简历的技术要点' - extract resume technical points from repo data) with a clear constraint (不编造量化指标 - don't fabricate metrics). It distinguishes somewhat from siblings by its position in the pipeline (between fetch_repo_info and generate_bullet_points), though it doesn't deeply contrast with generate_bullet_points which could overlap in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call it ('fetch_repo_info 成功之后、generate_bullet_points 之前' - after fetch_repo_info succeeds, before generate_bullet_points). It also explains usage of the github_username parameter to determine contribution level, providing clear pipeline ordering guidance that differentiates it from sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_resume_versionsA
对比新旧 ResumeData,生成人类可读的变更摘要(项目粒度,类 git diff 风格)。
什么时候该调用
merge_into_resume 之后、render_pdf 之前,让用户确认改动。
覆盖
基本信息、项目经历(新增/删除/修改/重排)、工作/教育条目数、技能组变化。
| Name | Required | Description | Default |
|---|---|---|---|
| new | Yes | ||
| old | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the output is a human-readable change summary at the project granularity, and lists covered areas. However, it doesn't clarify whether this is a read-only operation (it reads two data objects), what happens with invalid/mismatched data structures, or performance implications. Given no annotation coverage, this is acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with clear headers ('什么时候该调用' and '覆盖'). Every line earns its place: the purpose, the usage timing, and the coverage scope. Could be slightly more concise by removing the literal backslash escapes in the code formatting, but it's efficient overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 2 parameters with 0% schema description coverage, has nested objects, and an output schema exists. Given the complexity and that an output schema handles return values, the description adequately covers purpose, timing, and coverage scope. The only minor gap is not specifying the exact data shape expected for old/new beyond 'ResumeData' context, but since the output schema documents returns, overall completeness is solid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The description implies 'old' and 'new' are ResumeData objects by context (the tool diffs resume versions), even though the schema only types them as generic objects with additionalProperties:true. The description doesn't document parameter format or constraints beyond what's inferred, so it meets the baseline but doesn't excel given the 0% coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('diff'), the resource ('ResumeData versions'), and the specific output type ('human-readable change summary, project-level, like git diff'). It distinguishes itself from siblings by focusing on comparing old vs new resume versions, which is distinct from merge_into_resume and render_pdf in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states WHEN to use it: 'after merge_into_resume, before render_pdf, to let the user confirm changes.' This direct call-stack positioning names the specific siblings it relates to and the temporal ordering. The coverage section further clarifies what it examines (basic info, projects, work/education counts, skill group changes).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_repo_infoA
通过 GitHub REST API 抓取仓库元数据、README、语言占比、近期 commit、依赖文件与贡献者统计。
什么时候该调用
用户给出 GitHub 仓库 URL(或 owner/repo)后调用。输出的 RepoInfo 供
analyze_repo_for_resume 使用。若已知用户的 GitHub login,一并传入
github_username,以便 contributor_stats 直接带上该用户的占比。
| Name | Required | Description | Default |
|---|---|---|---|
| repo_url | Yes | ||
| github_username | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose what the tool fetches and that output is a RepoInfo object. However, it doesn't disclose behavioral details like API rate-limiting implications, network dependency/failure modes, or how much data it returns. For a network-fetching tool with zero annotation coverage, more disclosure about potential failure or cost would be valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and compact. The description uses a clear header ('什么时候该调用') to separate the what from the when. Every sentence earns its place: the first sentence lists the fetched data, the section explains invocation timing and output flow. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (RepoInfo), which reduces the need to explain return values. With only 2 parameters and a clear downstream consumer (analyze_repo_for_resume) plus conditional github_username behavior, the description covers the essential use cases well. Minor gap: doesn't mention failure handling when the repo doesn't exist or is private, but this is acceptable given the output schema and clear purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains github_username's purpose ('以便 contributor_stats 直接带上该用户的占比' - so contributor_stats can directly include that user's percentage), adding meaning the bare 'Github Username' schema title lacks. repo_url is implicitly clear given the description's framing. However, it doesn't enumerate that repo_url could also accept owner/repo shorthand in the parameter details, though the usage section mentions this.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource set ('抓取仓库元数据、README、语言占比、近期 commit、依赖文件与贡献者统计' - fetch repo metadata, README, language stats, recent commits, dependency files, and contributor stats). It clearly distinguishes what data is gathered but doesn't explicitly contrast with siblings; however, the sibling tools (parse_resume, analyze_repo_for_resume, generate_bullet_points) are clearly downstream resume-processing steps, so the data-fetching purpose is well differentiated in context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '什么时候该调用' section explicitly states when to use it: after the user provides a GitHub repo URL (or owner/repo). It also states the output feeds into analyze_repo_for_resume, providing clear downstream context. It even gives conditional guidance on passing github_username for contributor_stats. This is explicit when-to-use guidance with integration context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_bullet_pointsA
基于分析结果生成 2–3 条简历风格 bullet point。
什么时候该调用
analyze_repo_for_resume 成功之后、merge_into_resume 之前。
严格根据 analysis.contribution_level 选择动词强度;
minor 再按 absolute_contribution_signal 细分:
negligible → bullets 为空,
skip_project_entry=true,见 recommendationmoderate → 「参与贡献 / 协助」
substantial → 可写具体 commit 数,仍禁止「主导 / 独立完成」
| Name | Required | Description | Default |
|---|---|---|---|
| analysis | Yes | ||
| resume_style | No | concise | |
| style_reference | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The description discloses behavioral rules (empty bullets with skip_project_entry=true for negligible contributions, prohibition on certain verbs), which is useful behavioral context. However, it doesn't disclose the return format beyond mentioning bullets and skip_project_entry, and an output schema exists which presumably documents the return structure. Decent but not exhaustive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the essential purpose in the opening sentence. The usage section is well-structured with clear headers and bullet points. Every sentence earns its place with actionable information, no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool sits in a complex multi-step pipeline with rich input (nested analysis object) and an output schema. The description covers the pipeline position, the decision logic for verb selection, and edge cases (negligible contributions). Given the output schema exists and handles return-value documentation, the description is reasonably complete. Minor gaps: no guidance on style_reference behavior or how resume_style affects output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the compensation burden. The description explains the 'analysis' parameter's internal fields (contribution_level, absolute_contribution_signal), which adds real meaning. However, resume_style and style_reference are entirely undocumented—resume_style has a default 'concise' but no explanation of options, and style_reference's purpose is unspecified. Partial compensation for a 3-param schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'generate 2-3 resume-style bullet points based on analysis results'. It distinguishes from siblings by referencing the pipeline position (after analyze_repo_for_resume, before merge_into_resume), though the core purpose itself is clear enough that sibling differentiation is somewhat light on the actual generation semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Excellent explicit guidance: states exactly when to call (after analyze_repo_for_resume succeeds, before merge_into_resume), and provides a decision tree on verb intensity based on analysis.contribution_level, with specific breakdowns for minor contributions (negligible/modest/substantial) and explicit prohibitions ('still forbidden to use 主导/独立完成'). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_into_resumeA
把新生成的项目经历插入到简历的 projects 列表(支持指定位置与覆盖)。
什么时候该调用
已有 ResumeData 和 bullet 列表之后,diff_resume_versions / render_pdf 之前。
行为
默认
position=0插到项目列表最前。若
project_name已存在且overwrite=false,返回error_code=project_already_exists,不会静默重复插入。overwrite=true时替换同名项目内容,并按position重新落位。
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | ||
| position | No | ||
| overwrite | No | ||
| tech_stack | No | ||
| new_bullets | Yes | ||
| project_url | No | ||
| resume_data | Yes | ||
| project_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations provided, so the description carries the full behavioral burden. It discloses key mutation behaviors: default insertion at position 0, the error_code=project_already_exists behavior instead of silent duplicate insertion, and replacement semantics with re-positioning when overwrite=true. This is meaningful behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-organized with clear section headers ('when to call', 'behavior'), concise bullet points, and zero filler. Every sentence adds functional information. The structure makes scanning and comprehension efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters, nested objects, and an output schema, the description covers the critical behavioral paths (insert, overwrite, dedup) and pipeline placement well. Since an output schema exists, return value documentation isn't required from the description. The only minor gap is no guidance on how resume_data/new_bullets specifically interact, though these are reasonably inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains position (defaults to 0, front of list), overwrite semantics, and project_name dedup logic — adding meaning to at least 3 key parameters that influence behavior. It doesn't cover role/tech_stack/project_url/new_bullets explicitly, but these are intuitively self-describing from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('insert new project experience into resume's projects list'), names the resource (resume projects), and specifies the mechanism (supports position and overwrite). It also implicitly distinguishes from siblings — diff_resume_versions and render_pdf are clearly the pre/post steps, establishing this tool's unique role in the pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'when to call' section explicitly places this tool between generation (generate_bullet_points/analyze) and output (diff_resume_versions/render_pdf), giving clear pipeline context. It doesn't explicitly mention when NOT to use it versus an alternative, but the timing guidance is strong enough to orient the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_resumeA
解析本地 PDF 简历为结构化 JSON(姓名/联系方式/教育/工作/项目/技能)。
什么时候该调用
工作流的第一步:用户给出简历 PDF 路径后立刻调用。后续的 merge / render 都依赖这里产出的 ResumeData。
参数
pdf_path: 本地 PDF 的绝对或相对路径。
返回
成功: {"ok": true, "data": ResumeData, "error": null}
失败: {"ok": false, "data": null, "error": {error_code, message, details}}
| Name | Required | Description | Default |
|---|---|---|---|
| pdf_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose success/failure return structures clearly, which is useful. However, it doesn't describe edge cases (invalid PDFs, encrypted files, multilingual text), error scenarios beyond error_code/message/details, or whether the tool is purely local/stateless. Some behavioral transparency is present but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with headings (什么时候该调用/参数/返回) and front-loads the core purpose. The success/failure return format examples are clearly valuable. Minor redundancy: the return section formatting is somewhat verbose for what could be a compact statement, but overall the structure is efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists (the ResumeData structure), so return-value explanation isn't strictly required, though the description does give a helpful failure schema. The tool has only 1 parameter, reducing complexity burden. The description adequately covers workflow position, parameter semantics, and return format — reasonable completeness given the tool's modest complexity, though error-message details are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description must compensate, and it does explain the single pdf_path parameter as '本地 PDF 的绝对或相对路径'. This adds the absolute-or-relative distinction not in the schema. However, it doesn't clarify constraints like file extension requirements or disk-access permissions, leaving the description only marginally more informative than the schema's bare 'Pdf Path' title.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('解析本地 PDF 简历为结构化 JSON') and enumerates the output fields (姓名/联系方式/教育/工作/项目/技能). It clearly distinguishes from sibling tools by being the designated first-step parsing tool, while siblings handle repo analysis, merging, and rendering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states WHEN to use it ('工作流的第一步') and the dependency relationship ('后续的 merge / render 都依赖这里产出的 ResumeData'), making the workflow position and alternatives clear. It specifies the trigger condition of receiving the PDF path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_pdfA
用 Jinja2 HTML 模板 + WeasyPrint 把结构化简历渲染为 PDF,返回文件绝对路径。
什么时候该调用
用户确认 merge 结果(可用 diff_resume_versions)之后,作为工作流最后一步。
模板
modern:单栏宽松(默认)compact:双栏紧凑(左轨联系/技能/教育,右栏工作/项目)未知名称 →
error_code=template_not_found(列出可用模板,不静默回退)
注意
中文字体栈含微软雅黑 / Noto Sans SC。
默认写到 managed 临时目录(TTL 清理);显式
output_path不自动删除。Windows 上 WeasyPrint 依赖 GTK/Pango/Cairo;导入失败 →
render_failed。
| Name | Required | Description | Default |
|---|---|---|---|
| template | No | modern | |
| output_path | No | ||
| resume_data | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses several behavioral traits: Chinese font stack details, default write location (managed temp dir with TTL cleanup) vs explicit output_path (not auto-deleted), and the Windows GTK/Pango/Cairo dependency with a render_failed error. This is strong disclosure, though it doesn't describe output structure/return format beyond the path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear section headers (When to call, Template, Notes) and front-loaded purpose. It's moderately long but every section earns its place — behavioral notes, error codes, and template variants are all meaningful. A slight trim could tighten it but organization is strong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 parameters with 0% schema coverage, nested objects, an output schema, and no annotations. The description compensates well by covering template options, output path semantics, dependencies, fonts, and error codes. It could be stronger on resume_data shape expectations, but it otherwise provides a complete picture for this workflow-final tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It explains the template parameter's options (modern default, compact, unknown → template_not_found) and the output_path lifetime semantics (managed temp vs explicit). However, it doesn't detail the resume_data structure/expected shape, relying on the generic object schema. Given 0% coverage, this is solid compensation, just missing resume_data specifics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource — Jinja2 HTML template + WeasyPrint to render a structured resume into PDF and return the absolute file path. It explicitly mentions the template options and error behaviors, and its role as the final workflow step clearly distinguishes it from siblings like parse_resume, generate_bullet_points, and merge_into_resume.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to call' section explicitly states to invoke this after the user confirms the merge result (optionally via diff_resume_versions), as the final step of the workflow. It also clarifies template selection behavior and error codes, giving clear when-to-use guidance against the sibling pipeline tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose and phase in the pipeline: parse extracts from PDF, fetch/analyze/generate handle repo→bullet transformation, merge inserts into resume, render outputs PDF, diff compares versions. The workflow is linear and each step is unambiguous.
All tools follow a clear verb_noun snake_case pattern (parse_resume, fetch_repo_info, analyze_repo_for_resume, generate_bullet_points, merge_into_resume, render_pdf, diff_resume_versions). The only minor deviation is that some verbs are single words (parse, fetch, render) while others are multi-word or conceptual (analyze_repo_for_resume, generate_bullet_points), but the pattern is otherwise highly consistent.
Seven tools is well-scoped for a resume-to-repo-sync pipeline. Each tool represents a distinct and necessary stage of the workflow, and none feel redundant or padding. The count is comfortably within the ideal range.
The pipeline covers the full lifecycle: parse input (parse_resume), external data ingestion (fetch_repo_info), analysis (analyze_repo_for_resume), content generation (generate_bullet_points), merging (merge_into_resume), verification (diff_resume_versions), and output (render_pdf). Minor gaps include no way to edit other resume sections (education/work) or remove projects, but the core sync workflow is complete.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Generate tailored, ATS-optimized resume PDFs and cover letters from a job description, over MCP.
A MCP server built for developers enabling Git based project management with project and personal…
Free open-source resume builder with remote MCP tools for resumes and job applications.
An MCP server that gives your AI access to the source code and docs of all public github repos
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceFrom markdown resume to formatted PDF, a MCP server that generates single-page PDF resumes with smart overflow detection and layered content reduction strategies
- AlicenseAqualityDmaintenanceA local MCP server that bridges AI assistants with the CV Maker app to generate pixel-perfect CV PDFs.512MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for processing Markdown resumes into multiple formats (PDF, LinkedIn templates) with AI analysis and Claude integration.MIT
- AlicenseAqualityCmaintenanceLocal MCP server that shapes tailored resume PDFs with live browser preview.5MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Fusingsheep/resume-repo-sync'
If you have feedback or need assistance with the MCP directory API, please join our Discord server