ResumeTailor
Обзор
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 APIClaude 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
Инструмент | Сервер | Описание |
| Редактор документов | Замена содержимого в одном разделе, ограниченном закладками |
| Редактор документов | Атомарное обновление нескольких разделов за один проход |
| Редактор документов | Список всех доступных областей с закладками в текущем шаблоне |
| Экстрактор ключевых слов | Анализ описания вакансии и возврат структурированного рейтинга ключевых слов |
Редактируемые разделы
Редактор документов работает с областями, ограниченными парами закладок. Текущий шаблон предоставляет:
Раздел | Диапазон закладок |
Навыки |
|
Резюме |
|
Опыт работы 1 |
|
Опыт работы 2 |
|
Опыт работы 3 |
|
Вывод экстракции ключевых слов
Инструмент 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 Desktop с примерами промптов | |
Настройка контейнеров, проброс портов и управление сервисами | |
Установка для конкретной платформы и конфигурация UNO | |
Двухэтапный конвейер: извлечение ключевых слов вакансии с последующей целевой адаптацией | |
Как добавить области с парами закладок в шаблон |
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 guideThis server cannot be installed
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