Skip to main content
Glama

개요

MCP-Resume-Tailor는 LibreOffice의 UNO API를 통해 문서 편집을 자동화하는 모델 컨텍스트 프로토콜(MCP) 서버 시스템입니다. 문서 편집기작업 설명 키워드 추출기라는 두 개의 MCP 서버가 Claude Desktop에 연결되어 자연스러운 대화를 통해 AI 기반 이력서 맞춤 설정을 가능하게 합니다.

이 편집기는 중간 형식으로 변환하는 대신 LibreOffice의 내부 문서 객체 모델을 통해 .odt 파일을 직접 조작하여 문서의 완전한 무결성을 유지합니다. 책갈피로 구분된 섹션이 편집 가능한 영역을 정의하며, 템플릿의 서식, 스타일 및 레이아웃을 유지하면서 콘텐츠가 교체됩니다. 키워드 추출기는 Claude API를 통해 작업 설명을 분석하고, 맞춤 설정 과정을 안내하는 5단계 순위가 매겨진 구조화된 출력을 반환합니다.

기술 스택

설계 원칙

1. 네이티브 API를 통한 문서 무결성

목표: 모든 편집 과정에서 템플릿의 전체 서식, 스타일 및 레이아웃을 보존합니다.

문서를 Markdown이나 HTML로 변환하는 손실이 많은 변환 대신, 편집기는 로컬 소켓을 통해 LibreOffice의 UNO 브리지에 연결하여 라이브 문서 모델에서 작동합니다. 책갈피 쌍이 편집 가능한 영역을 구분합니다. 콘텐츠 교체는 문서 객체 수준에서 이루어지므로 글꼴, 단락 스타일, 간격 및 페이지 구조가 템플릿 작성자가 설계한 그대로 보존됩니다.

2. MCP 네이티브 도구 설계

목표: 문서 편집 및 키워드 추출을 REST 래퍼가 아닌 일급 MCP 도구로 노출합니다.

두 서버 모두 유형이 지정된 도구 스키마를 사용하여 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

Skills_StartSkills_End

Summary

Summary_StartSummary_End

WorkExperience1

WorkExperience1_StartWorkExperience1_End

WorkExperience2

WorkExperience2_StartWorkExperience2_End

WorkExperience3

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는 원시 XML이 아닌 LibreOffice의 라이브 문서 객체 모델에서 작동합니다. 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 구성

최적화된 워크플로우

2단계 파이프라인: 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