Skip to main content
Glama

概述

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

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

技术栈

设计原则

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_StartSkills_End

总结

Summary_StartSummary_End

工作经历1

WorkExperience1_StartWorkExperience1_End

工作经历2

WorkExperience2_StartWorkExperience2_End

工作经历3

WorkExperience3_StartWorkExperience3_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

-
security - not tested
F
license - not found
-
quality - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

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/adi2355/File-Editor-MCP'

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