Skip to main content
Glama
dsoziev1

Ticket Support MCP Server

by dsoziev1
README.md
# День 33 — AI-ассистент поддержки пользователей

Мини-сервис поддержки: отвечает на вопросы о продукте (sso-auth0), используя
**RAG (FAQ + документация)** и **контекст тикета/пользователя**, который берёт
**через MCP** (локальный JSON тикетов или **ServiceNow**). Веб-чат на FastAPI,
генерация — DeepSeek, retrieval — локальный fastembed (офлайн).

```
вопрос + выбранный тикет
   ├─ MCP ticket_get / user_get      (контекст тикета и пользователя)
   ├─ RAG retrieve (FAQ + docs)      (база знаний, локально)
   └─ DeepSeek                       → ответ с цитатами [Sn], адаптированный под тикет
```

Пример из задания: тикет **T-1001** («Callback URL mismatch», SPA) + вопрос
«Почему не работает авторизация?» → ассистент отвечает про пустой Allowed Callback
URLs **для этого приложения**, со ссылками на FAQ.

**Эскалация:** если ответа в базе знаний нет, ассистент честно говорит об этом и
**автоматически создаёт тикет** для инженера (через MCP-тул `ticket_create`, в JSON
или ServiceNow). Также есть ручная кнопка «Создать тикет».

## Быстрый старт

```bash
cp .env.example .env          # впиши DEEPSEEK_API_KEY
pip install -r requirements.txt
python3 ingest.py             # собрать базу знаний (FAQ + docs sso-auth0)
bash run.sh                   # http://localhost:8050  (или: python3 support.py "вопрос" --ticket T-1001)
```

## Компоненты

| Файл | Роль |
|---|---|
| `data/faq.md` | support-FAQ по подключению к Auth0 (источник RAG) |
| `data/tickets.json`, `users.json` | сид-тикеты и пользователи (JSON-бэкенд) |
| `ticketstore.py` | интерфейс `TicketStore` + `JsonStore` + `ServiceNowStore` |
| `crm_servicenow.py` | адаптер ServiceNow Table API (Incident → тикет) |
| `ticket_server.py` | **MCP-сервер**: `ticket_list/ticket_get/ticket_search/user_get` |
| `ingest.py`, `rag.py` | индекс базы знаний + retrieve |
| `support.py` | ядро: контекст тикета (MCP) + RAG + DeepSeek → ответ |
| `web.py`, `run.sh` | веб-чат support-desk |

## Бэкенд тикетов (через MCP)

Доступ к тикетам идёт **только через MCP** (`ticket_server.py` поднимается
stdio-подпроцессом). Бэкенд выбирается `TICKET_BACKEND`:
- `json` (по умолчанию) — `data/tickets.json` + `users.json`, работает офлайн;
- `servicenow` — живые Incident из ServiceNow (см. `docs/USAGE.md` по регистрации
  бесплатного Personal Developer Instance и `.env`).

## Безопасность

`DEEPSEEK_API_KEY` (и при использовании — `SERVICENOW_*`) в `.env` (gitignored),
публикуется только `.env.example`. `index/`+`cache/` gitignored (пересобираются
`ingest.py`). Ассистент только читает тикеты (write в CRM не делает).

## Документация

- [Руководство и настройка ServiceNow](docs/USAGE.md)