Skip to main content
Glama

概述

MCP-Resume-Tailor 是一个模型上下文协议 (MCP) 服务器系统,通过 LibreOffice 的 UNO API 实现文档编辑自动化。两个 MCP 服务器——文档编辑器和职位描述关键词提取器——连接到 Claude Desktop,实现基于自然语言对话的 AI 驱动简历定制。

编辑器通过 LibreOffice 的内部文档对象模型直接操作 .odt 文件,而不是转换为中间格式,从而保持了文档的完整性。书签分隔的部分定义了可编辑区域,在替换内容的同时保留了模板的格式、样式和布局。关键词提取器通过 Claude API 分析职位描述,并返回结构化的 5 级排名输出,从而指导调整过程。

Related MCP server: Resume Tailor MCP Server

技术栈

设计原则

1. 通过原生 API 实现文档保真

目标: 在每次编辑中保留模板的完整格式、样式和布局。

编辑器不将文档转换为 Markdown 或 HTML(这是一种有损转换),而是通过本地套接字连接到 LibreOffice 的 UNO 桥接器,并直接操作实时文档模型。书签对定义了可编辑区域。内容替换在文档对象级别进行,因此字体、段落样式、间距和页面结构都完全按照模板作者的设计保留下来。

2. MCP 原生工具设计

目标: 将文档编辑和关键词提取作为一等 MCP 工具公开,而不是 REST 包装器。

两个服务器都直接构建在 FastMCP 之上,并带有类型化的工具模式。Claude Desktop 通过模型上下文协议调用它们——没有胶水代码,没有提示注入,没有 API 编排。AI 根据对话上下文决定何时以及如何调用每个工具,在一次交互会话中将关键词提取输出与文档编辑结合起来。

3. 与传输无关的部署

目标: 本地运行以进行开发,容器化以实现可靠性——无论哪种方式,MCP 工具界面都相同。

本地模式使用 stdio 传输:Claude Desktop 直接启动 Python 进程。Docker 模式在 Nginx 后运行两个服务器,代理脚本将 Claude Desktop 的 stdio 协议桥接到容器内的 HTTP/SSE 端点。MCP 工具界面在两种模式下完全相同——无需更改代码,没有功能差异。


架构

本地 / stdio

Claude Desktop ──stdio──▶ resume_editor_server.py ──UNO──▶ LibreOffice (port 2002) ──▶ .odt
Claude Desktop ──stdio──▶ jd_keyword_extractor_mcp.py ──API──▶ Claude API

Claude Desktop 将每个 MCP 服务器作为子进程启动。文档编辑器通过端口 2002 上的 UNO 桥接器连接到无头 LibreOffice 实例。关键词提取器直接调用 Anthropic API。

容器化 / HTTP

Claude Desktop ──stdio──▶ macOS proxy ──HTTP──▶ Docker (Nginx)
                                                  ├─ :5001 → Resume Editor MCP (port 8000, streamable-http)
                                                  ├─ :5002 → JD Extractor MCP (port 9000, streamable-http)
                                                  └─ LibreOffice headless (port 2002, internal)

macOS 代理脚本在 Claude Desktop 的 stdio MCP 协议和容器化的 HTTP/SSE 端点之间进行转换,处理 MCP 会话 ID 管理和服务器发送事件流解析。Nginx 将流量路由到正确的内部服务。


MCP 工具界面

工具

服务器

描述

update_resume_section

文档编辑器

替换单个书签分隔部分中的内容

update_multiple_resume_sections

文档编辑器

一次性原子更新多个部分

get_available_sections

文档编辑器

列出当前模板中所有可编辑的书签区域

extract_jd_keywords

关键词提取器

分析职位描述并返回结构化的关键词排名

可编辑部分

文档编辑器在书签对分隔的区域上运行。当前模板公开了:

部分

书签范围

技能

Skills_Start → Skills_End

总结

Summary_Start → Summary_End

工作经历1

WorkExperience1_Start → WorkExperience1_End

工作经历2

WorkExperience2_Start → WorkExperience2_End

工作经历3

WorkExperience3_Start → WorkExperience3_End

关键词提取输出

extract_jd_keywords 工具返回结构化的 JSON,包含:

  • 5 级排名关键词 — 关键、高、中、低和可选

  • 要求总结和角色背景

  • 从职位发布中提取的工具、技术和方法论

  • 核心职责和期望成果

  • 角色级别、范围和公司背景


解决的最困难问题

1. LibreOffice UNO 桥接器的可靠性

问题: LibreOffice 的 UNO API 需要一个正在运行的无头实例,并在端口 2002 上打开套接字。连接中断、文档锁定和进程状态泄漏是长期运行会话中的常见故障模式。

解决方案: 编辑器管理完整的连接生命周期——建立 UNO 桥接器、通过 URL 协议加载文档、处理打开/关闭状态,并写入带时间戳的输出文件以避免覆盖模板。Docker 部署使用专门的启动序列,以确保在 MCP 服务器开始处理请求之前,LibreOffice 正在接受连接。

2. MCP 传输桥接(stdio 到 HTTP)

问题: Claude Desktop 仅支持基于 stdio 的 MCP 传输。容器化服务公开 HTTP 端点。这些是根本不同的协议模型,具有不兼容的流语义。

解决方案: 自定义代理脚本 (mac_proxy_resume_editor.py, mac_proxy_jd_extractor.py) 弥补了这一差距:它们从 stdin 读取 JSON-RPC 消息,将其作为 HTTP 请求转发到容器,将 SSE 响应流解析回 MCP 消息,并在连接生命周期内管理会话 ID。Claude Desktop 看到的是一个本地 stdio 服务器;容器看到的是标准 HTTP 客户端。

3. 保留书签的内容替换

问题: 替换 .odt 文档中书签之间的文本必须保留周围的文档结构——段落样式、字符格式、页面布局——而不能破坏底层的 XML。

解决方案: UNO API 在 LibreOffice 的实时文档对象模型上运行,而不是原始 XML。replace_bookmark_range_text() 枚举成对书签 (Section_Start / Section_End) 之间的文本范围,逐段删除现有内容,并插入新内容,同时继承模板的默认段落和字符样式。


先决条件

  • Python 3.10+

  • 支持 UNO 的 LibreOffice (libreoffice-script-provider-python)

  • 带有书签对的 .odt 简历模板(参见 书签设置指南)

  • 对于容器化部署:Docker 和 Docker Compose

  • 对于关键词提取:Anthropic API 密钥

本地设置

git clone https://github.com/adi2355/MCP-Resume-Tailor.git
cd MCP-Resume-Tailor

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

# Link system UNO modules into venv
ln -s /usr/lib/python3/dist-packages/uno.py .venv/lib/python3.*/site-packages/uno.py
ln -s /usr/lib/python3/dist-packages/unohelper.py .venv/lib/python3.*/site-packages/unohelper.py

启动 LibreOffice

soffice --accept="socket,host=localhost,port=2002;urp;" --headless --norestore --nologo --nodefault &

Claude Desktop 配置 (stdio)

添加到您的 Claude Desktop 配置中:

{
  "mcpServers": {
    "LibreOfficeResumeEditor": {
      "command": "/path/to/MCP-Resume-Tailor/.venv/bin/python",
      "args": ["resume_editor_server.py"],
      "cwd": "/path/to/MCP-Resume-Tailor"
    },
    "JDKeywordExtractor": {
      "command": "/path/to/MCP-Resume-Tailor/.venv/bin/python",
      "args": ["jd_keyword_extractor_mcp.py"],
      "cwd": "/path/to/MCP-Resume-Tailor"
    }
  }
}

Docker 部署

docker compose up --build

为容器化使用配置 Claude Desktop:

{
  "mcpServers": {
    "LibreOfficeResumeEditor": {
      "url": "http://localhost:5001"
    },
    "JDKeywordExtractor": {
      "url": "http://localhost:5002"
    }
  }
}

有关特定平台的详细信息,请参阅 Docker 部署指南 和 macOS 设置指南。


文档

文档

描述

Claude MCP 使用指南

带有示例提示词的 Claude Desktop 集成步骤

Docker 部署

容器化设置、端口映射和服务管理

macOS 设置

特定平台的安装和 UNO 配置

优化工作流

两阶段流水线:JD 关键词提取,随后进行针对性调整

书签设置

如何在 LibreOffice 中向 .odt 模板添加书签对区域


MCP-Resume-Tailor/
├── resume_editor_server.py            # MCP server: document section editing via UNO
├── jd_keyword_extractor_mcp.py        # MCP server: JD keyword extraction via Claude API
├── edit_resume_uno.py                 # Core LibreOffice UNO API operations
├── container_api.py                   # Flask REST wrapper for container mode
├── mac_proxy_resume_editor.py         # stdio → HTTP proxy (document editor)
├── mac_proxy_jd_extractor.py          # stdio → HTTP proxy (keyword extractor)
├── docker-compose.yml                 # Multi-service container orchestration
├── Dockerfile                         # Ubuntu 22.04 + LibreOffice + Python
├── start_container_service.sh         # Docker entrypoint script
├── start_resume_tailor_services.sh    # Start both MCP services locally
├── requirements.txt                   # Python dependencies
├── claude_desktop_config.json         # Claude Desktop config (stdio mode)
├── claude_desktop_config_docker.json  # Claude Desktop config (HTTP/Docker mode)
├── CLAUDE_MCP_USAGE.md                # Integration guide
├── DOCKER_README.md                   # Docker documentation
├── MACOS_SETUP.md                     # macOS setup guide
├── OPTIMIZED_SYSTEM_USAGE.md          # Workflow documentation
└── setup_resume_bookmarks.md          # Template bookmark guide

Related MCP Connectors

Related MCP Servers