Skip to main content
Glama
talipovvs

pdf-mcp

by talipovvs
README.md
# pdf-mcp

MCP-сервер для генерации PDF-отчётов по объектам недвижимости. Работает с
LibreChat, Claude Desktop и любым MCP-совместимым клиентом.

Сделан как часть дипломного проекта по автоматизации аналитической
отчётности в строительном бизнесе.

## Что умеет

- Отчёт по локации: транспорт, инфраструктура, конкуренты, оценки по блокам
- Отчёт по рынку: таблицы цен, конкуренты, динамика
- Итоговый отчёт по проекту: параметры объекта, локация, рынок,
  входные данные для финансовой модели
- Поддержка кириллицы через TTF-шрифты Arial
- Преобразование Markdown в PDF без внешних SDK

## Структура

```
pdf-mcp/
├── mcp_server.py      MCP-сервер, обрабатывает запросы от агента
├── pdf_generator.py   собирает PDF из Markdown
├── requirements.txt   зависимости
├── fonts/             шрифты Arial для кириллицы
└── README.md
```

## Установка

1. Клонируй репозиторий:

```bash
git clone https://github.com/talipovvs/pdf_mcp.git
cd pdf_mcp
```

2. Установи зависимости:

```bash
pip install -r requirements.txt
```

3. Шрифты Arial уже лежат в папке `fonts/`. Если хочешь заменить — клади
туда свои `Arial.ttf`, `ArialBold.ttf`, `ArialItalic.ttf` и
`ArialBoldItalic.ttf`.

## Подключение к LibreChat

В файле `librechat.yaml` добавь:

```yaml
mcpServers:
  pdf-reports:
    command: python3
    args:
      - "/путь/до/pdf_mcp/mcp_server.py"
    env:
      REPORTS_DIR: "/путь/до/папки/с/отчётами"
      REPORTS_URL: "http://localhost:8090"
    timeout: 60000
```

### Переменные окружения

| Переменная | Что делает | По умолчанию |
|---|---|---|
| REPORTS_DIR | Куда сохранять готовые PDF | /agent-data/reports |
| REPORTS_URL | Базовый URL для скачивания PDF | http://localhost:8090 |

## Инструменты

Сервер регистрирует четыре tools, которые видит агент:

### generate_location_report

PDF по анализу локации. В Markdown должно быть:
- таблица оценок по блокам (транспорт, инфраструктура, конкуренты, район)
- топ-3 преимуществ и рисков
- итоговый балл и вывод

### generate_market_report

PDF по исследованию рынка. В Markdown должно быть:
- таблицы цен (мин / медиана / макс / источник)
- основные конкуренты
- динамика цен и вывод

### generate_summary_report

Итоговый PDF по проекту. В Markdown должно быть:
- параметры объекта
- сжатые блоки по локации и рынку
- макропараметры и входные данные для финансовой модели

### get_current_date

Возвращает текущую дату с сервера в формате YYYY-MM-DD. Нужен, чтобы агент
не придумывал даты сам — модель не знает текущее время.

### Общие параметры (для трёх PDF-инструментов)

| Параметр | Тип | Что значит |
|---|---|---|
| object_name | string | Название объекта, например «Дом Сидорова» |
| object_address | string | Адрес или локация |
| content | string | Содержимое отчёта в формате Markdown |
| company_name | string | Название компании для шапки отчёта |
| object_type | string | «жилой» или «коммерческий», влияет на дисклеймер |

## Как это работает

```
Агент → mcp_server.py → pdf_generator.py → готовый PDF → URL для скачивания
```

1. LibreChat при старте поднимает mcp_server.py и держит его процесс живым
2. Агент вызывает один из инструментов и шлёт Markdown с содержимым отчёта
3. mcp_server.py запускает pdf_generator.py через subprocess и передаёт
   параметры в JSON
4. pdf_generator.py рендерит Markdown в PDF через fpdf2
5. Готовый файл сохраняется в REPORTS_DIR, агент получает ссылку и
   показывает её пользователю

## Что понимает в Markdown

| Что в Markdown | Как рендерится |
|---|---|
| `## Заголовок` | Синяя плашка с белым текстом |
| `### Подзаголовок` | Синий текст |
| `- пункт` | Маркированный список с буллетом |
| `1. пункт` | Нумерованный список |
| `\| таблица \|` | Таблица с чередующимися строками и шапкой |
| `**ключ:** значение` | Жирный ключ, обычное значение справа |
| `> цитата` | Серый курсив для внутренних пометок |
| `---` | Горизонтальная линия |

## Зависимости

| Пакет | Зачем |
|---|---|
| mcp | реализация MCP-протокола |
| fpdf2 | сборка PDF |
| markdown | парсинг Markdown |
| jinja2 | зарезервировано для шаблонов |

## Тест без LibreChat

Можно проверить генерацию PDF напрямую, без MCP:

```bash
echo '{"tool":"generate_summary_report","object_name":"Тест","object_address":"Москва","content":"## Заголовок\n- пункт 1","company_name":"Моя Компания"}' | python3 pdf_generator.py
```

В REPORTS_DIR появится PDF-файл, путь к нему выведется в stdout.

## Лицензия

MIT. Используй как хочешь.