Skip to main content
Glama

Обзор

MCP-Resume-Tailor — это серверная система протокола Model Context Protocol (MCP), которая автоматизирует редактирование документов через API UNO LibreOffice. Два MCP-сервера — редактор документов и экстрактор ключевых слов из описания вакансии — подключаются к Claude Desktop, обеспечивая настройку резюме с помощью ИИ в ходе естественного диалога.

Редактор сохраняет полную точность документа, работая непосредственно с файлами .odt через внутреннюю объектную модель документа LibreOffice, а не преобразуя их в промежуточные форматы. Разделы, ограниченные закладками, определяют редактируемые области, а содержимое заменяется с сохранением форматирования, стилей и макета шаблона. Экстрактор ключевых слов анализирует описания вакансий через API Claude и возвращает структурированные данные, ранжированные по 5 уровням, которые направляют процесс адаптации.

Related MCP server: Resume Tailor MCP Server

Технологический стек

Принципы проектирования

1. Точность документа через нативный API

Цель: Сохранить полное форматирование, стили и макет шаблона при каждом редактировании.

Вместо преобразования документов в Markdown или HTML — что является трансформацией с потерями — редактор подключается к мосту UNO LibreOffice через локальный сокет и работает с «живой» моделью документа. Пары закладок ограничивают редактируемые области. Замена содержимого происходит на уровне объектной модели документа, поэтому шрифты, стили абзацев, интервалы и структура страниц сохраняются в точности так, как их задумал автор шаблона.

2. Дизайн инструментов на базе MCP

Цель: Представить редактирование документов и извлечение ключевых слов как инструменты MCP первого класса, а не как REST-обертки.

Оба сервера построены непосредственно на FastMCP с типизированными схемами инструментов. Claude Desktop вызывает их через протокол Model Context Protocol — без связующего кода, без инъекций промптов, без сложной хореографии API. ИИ сам решает, когда и как вызывать каждый инструмент на основе контекста разговора, объединяя вывод экстрактора ключевых слов с редактированием документа в рамках одной интерактивной сессии.

3. Транспортно-независимое развертывание

Цель: Запуск локально для разработки, в контейнерах для надежности — при одинаковом интерфейсе инструментов MCP в обоих случаях.

Локальный режим использует транспорт stdio: Claude Desktop запускает процесс Python напрямую. Режим Docker запускает оба сервера за Nginx, используя прокси-скрипты, которые связывают протокол stdio Claude Desktop с 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-сервер как дочерний процесс. Редактор документов подключается к headless-экземпляру LibreOffice через мост UNO на порту 2002. Экстрактор ключевых слов вызывает API Anthropic напрямую.

Контейнеризация / 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 транслируют данные между протоколом MCP stdio Claude Desktop и контейнеризированными HTTP/SSE-эндпоинтами, управляя идентификаторами сессий MCP и парсингом потока событий сервера (SSE). 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

Проблема: API UNO LibreOffice требует запущенного headless-экземпляра с открытым сокетом на порту 2002. Разрывы соединений, блокировки документов и утечки состояния процесса — частые проблемы в длительных сессиях.

Решение: Редактор управляет полным жизненным циклом соединения — установкой моста UNO, загрузкой документов через протокол URL, обработкой состояний открытия/закрытия и записью в выходные файлы с временными метками, чтобы избежать повреждения шаблона. Развертывание в Docker использует специальную последовательность запуска, чтобы гарантировать, что LibreOffice принимает соединения до того, как MCP-сервер начнет обрабатывать запросы.

2. Связывание транспорта MCP (stdio в HTTP)

Проблема: Claude Desktop поддерживает только транспорт MCP на основе stdio. Контейнеризированные сервисы предоставляют HTTP-эндпоинты. Это принципиально разные модели протоколов с несовместимой семантикой потоков.

Решение: Пользовательские прокси-скрипты (mac_proxy_resume_editor.py, mac_proxy_jd_extractor.py) устраняют этот разрыв: они считывают сообщения JSON-RPC из stdin, пересылают их как HTTP-запросы в контейнер, парсят ответный поток SSE обратно в сообщения MCP и управляют идентификаторами сессий на протяжении всего жизненного цикла соединения. Claude Desktop видит локальный stdio-сервер; контейнер видит стандартных HTTP-клиентов.

3. Замена содержимого с сохранением закладок

Проблема: Замена текста между закладками в документе .odt должна сохранять окружающую структуру документа — стили абзацев, форматирование символов, макет страницы — без повреждения базового XML.

Решение: API UNO работает с «живой» объектной моделью документа LibreOffice, а не с «сырым» XML. replace_bookmark_range_text() перебирает текстовый диапазон между парными закладками (Section_Start / Section_End), удаляет существующее содержимое по абзацам и вставляет новое, наследуя стили абзацев и символов по умолчанию из шаблона.


Предварительные требования

  • Python 3.10+

  • LibreOffice с поддержкой UNO (libreoffice-script-provider-python)

  • Шаблон резюме .odt с парами закладок (см. Руководство по настройке закладок)

  • Для контейнеризированного развертывания: Docker и Docker Compose

  • Для извлечения ключевых слов: API-ключ Anthropic

Локальная настройка

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

Оптимизированный рабочий процесс

Двухэтапный конвейер: извлечение ключевых слов вакансии с последующей целевой адаптацией

Настройка закладок

Как добавить области с парами закладок в шаблон .odt в LibreOffice


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