Skip to main content
Glama

Обзор

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

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

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

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

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_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

Проблема: 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

-
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