Skip to main content
Glama
denysmilimonko

Hotline Finance FAQ MCP Server

README.md
# Hotline Finance FAQ — MCP Server

MCP сервер для отримання FAQ та глосарію зі страхового сервісу [hotline.finance](https://hotline.finance/ua/).

Підтримує два режими запуску:

- **stdio** — для Cursor / Claude Desktop
- **HTTP** — для ChatGPT та інших клієнтів з підтримкою мережевого MCP

---

## Інструменти (Tools)

### `list_faq_categories`

Повертає повний список доступних категорій FAQ з їх slug-назвами (80+ категорій).
Параметрів немає. Slug потрібен для виклику `get_faq_questions`.

### `get_faq_questions`

Отримує питання та відповіді FAQ для вказаної категорії з `hotline.finance`.
У ChatGPT відображає інтерактивний UI-віджет з картками питань.

| Параметр   | Тип                 | Опис                                                                                   |
| ---------- | ------------------- | -------------------------------------------------------------------------------------- |
| `category` | `string` (required) | Slug категорії (наприклад: `автоцивілка`, `туристичне-страхування`, `виїзд-за-кордон`) |

### `find_faq` ✦ sampling

Приймає довільний текстовий запит українською, автоматично визначає категорію через LLM-класифікацію (`createMessage`) та повертає відповідні FAQ. Якщо клієнт не підтримує sampling — повертає підказку з доступними категоріями.

> Потребує підтримки `sampling` з боку клієнта (Cursor, Claude Desktop).

| Параметр | Тип                 | Опис                                                                                    |
| -------- | ------------------- | --------------------------------------------------------------------------------------- |
| `query`  | `string` (required) | Довільний текст (наприклад: `«де купити страховку в Харкові»`, `«як оформити каско»`) |

### `faq_wizard` ✦ elicitation

Інтерактивний майстер без аргументів. Показує форму з 10 найпопулярніших видів страхувань через `elicitInput`, отримує вибір користувача та повертає відповідні FAQ. Якщо клієнт не підтримує elicitation — повертає список slug для ручного виклику.

> Потребує підтримки `elicitation` з боку клієнта.

### `get_glossary_list`

Повертає список усіх термінів страхового глосарію (24 терміни) з їх slug та назвами.
Параметрів немає. Slug потрібен для виклику `get_glossary_item`.

### `get_glossary_item`

Отримує детальний опис терміну страхового глосарію: назву, пояснення та пов'язані питання.

| Параметр | Тип                 | Опис                                                         |
| -------- | ------------------- | ------------------------------------------------------------ |
| `slug`   | `string` (required) | Slug терміну (наприклад: `автоцивілка`, `франшиза`, `каско`) |

---

## Промпти (Prompts)

Промпти — це готові шаблони розмов, доступні як slash-команди в Cursor і Claude Desktop. Аргументи мають автодоповнення при наборі завдяки `completable()`.

### `faq-search`

Шаблон для пошуку FAQ по категорії страхування. Аргумент `category` автодоповнюється зі списку 80+ slug.

| Аргумент   | Тип      | Опис                                           |
| ---------- | -------- | ---------------------------------------------- |
| `category` | `string` | Slug категорії з автодоповненням по `CATEGORY_SLUGS` |

### `glossary-explain`

Шаблон для пояснення страхового терміну. Аргумент `slug` автодоповнюється зі списку термінів глосарію.

| Аргумент | Тип      | Опис                                          |
| -------- | -------- | --------------------------------------------- |
| `slug`   | `string` | Slug терміну з автодоповненням по `GLOSSARY_SLUGS` |

---

## Ресурси (Resources)

### `ui://widget/faq.html`

HTML-віджет для відображення FAQ-карток в інтерфейсі ChatGPT (ext-apps).
Підключається автоматично при виклику `get_faq_questions`, `find_faq` та `faq_wizard`.

---

## Встановлення та запуск

```bash
npm install
```

### Режим розробки (tsx)

```bash
npm start
# або з HTTP-портом:
PORT=3333 npm start
```

### Продакшн-збірка (TypeScript → JS)

```bash
npm run build         # компілює TypeScript у build/
npm run build:start   # компілює та запускає
```

---

## Режим 1 — Cursor / Claude Desktop (stdio)

Додай до конфігу MCP сервера зібраний JS після `npm run build`:

```json
{
  "mcpServers": {
    "hotline-faq": {
      "command": "node",
      "args": [
        "c:\\Users\\Denys\\Desktop\\WORK\\MCP_FAQ_Server\\build\\index.js"
      ]
    }
  }
}
```

**Cursor:** Settings → MCP → Add server

**Claude Desktop:** `%APPDATA%\Claude\claude_desktop_config.json`

В Cursor і Claude Desktop будуть доступні:
- Промпти `faq-search` та `glossary-explain` як slash-команди з автодоповненням
- Інструмент `find_faq` з LLM-класифікацією (через sampling)
- Інструмент `faq_wizard` з формою вибору (через elicitation)

---

## Режим 2 — ChatGPT / HTTP-клієнти

HTTP-сервер підтримує два протоколи одночасно:

- **Streamable HTTP** (MCP 2025-06-18) — основний протокол
- **Legacy SSE** (MCP 2024-11-05) — зворотна сумісність

MCP endpoint: `POST /mcp`

### Локальна розробка з ngrok

```bash
# Термінал 1 — запуск сервера
PORT=3333 npm start

# Термінал 2 — публічний тунель
ngrok http 3333
```

Скопіюй URL з ngrok (наприклад `https://abc123.ngrok.app`) і в ChatGPT:

- Натисни `+` → **Add connector** → вставити `https://abc123.ngrok.app/mcp`

> В ChatGPT доступні всі інструменти. Промпти та sampling/elicitation залежать від підтримки клієнта.

---

## Структура проекту

```
MCP_FAQ_Server/
├── package.json
├── tsconfig.json
├── public/
│   └── faq-widget.html           ← HTML-віджет (iframe в ChatGPT)
└── src/
    ├── index.ts                   ← Точка входу (вибір транспорту)
    ├── server.ts                  ← Створення MCP сервера, реєстрація інструментів
    ├── config.ts                  ← Категорії FAQ, терміни глосарію, константи
    ├── types.ts                   ← TypeScript типи
    ├── api/
    │   ├── faq.ts                 ← Запити до hotline.finance/api/faq-questions
    │   └── glossary.ts            ← Запити до hotline.finance/api/glossary
    ├── prompts/
    │   ├── faq-search.ts          ← Промпт faq-search + completable(CATEGORY_SLUGS)
    │   └── glossary-explain.ts    ← Промпт glossary-explain + completable(GLOSSARY_SLUGS)
    ├── tools/
    │   ├── list-categories.ts     ← Інструмент list_faq_categories
    │   ├── get-faq-questions.ts   ← Інструмент get_faq_questions
    │   ├── get-glossary-list.ts   ← Інструмент get_glossary_list
    │   ├── get-glossary-item.ts   ← Інструмент get_glossary_item
    │   ├── find-faq.ts            ← Інструмент find_faq (createMessage / sampling)
    │   └── faq-wizard.ts          ← Інструмент faq_wizard (elicitInput / elicitation)
    ├── resources/
    │   └── faq-widget.ts          ← Ресурс ui://widget/faq.html
    ├── transports/
    │   ├── http.ts                ← HTTP-транспорт (Streamable + SSE)
    │   └── stdio.ts               ← stdio-транспорт
    └── utils/
        ├── categories.ts          ← Пошук категорії за slug
        ├── glossary.ts            ← Пошук терміну за slug
        └── html.ts                ← Очищення HTML-тегів з відповідей
```

---

## Категорії FAQ

Повний список доступний через інструмент `list_faq_categories`.
Деякі з них:

| Slug                     | Назва                                 |
| ------------------------ | ------------------------------------- |
| `автоцивілка`            | Автоцивілка                           |
| `туристичне-страхування` | Туристичне страхування                |
| `каско`                  | КАСКО                                 |
| `зелена-картка`          | Зелена картка                         |
| `страхування-житла`      | Страхування житла                     |
| `виїзд-за-кордон`        | Страховка для виїзду за кордон        |
| `обліковий-запис`        | Питання Підтримка з облікового запису |
| `загальні`               | Загальні питання                      |
| `мінікаско`              | МініКАСКО                             |
| `бонуси`                 | Бонуси                                |
| `штрафи`                 | Штрафи                                |
| `реферальна-програма`    | Реферальна програма                   |

> Щоб додати нові категорії — оновіть масив `CATEGORIES` у `src/config.ts`.

---

## Терміни глосарію

Повний список доступний через інструмент `get_glossary_list`.
Деякі з них:

| Slug                     | Назва                                            |
| ------------------------ | ------------------------------------------------ |
| `автоцивілка`            | Автоцивілка (ОСЦПВ)                              |
| `зелена-картка`          | Зелена картка                                    |
| `каско`                  | КАСКО                                            |
| `франшиза`               | Франшиза                                         |
| `страховка`              | Страховка (страховий поліс, договір страхування) |
| `страховий-випадок`      | Страховий випадок                                |
| `страхова-сума`          | Страхова сума                                    |
| `туристичне-страхування` | Туристичне Страхування                           |

> Щоб додати нові терміни — оновіть масив `GLOSSARY_ENTRIES` у `src/config.ts`.

---

## Стек

- **TypeScript** + **tsx** (dev runner)
- **@modelcontextprotocol/sdk** — MCP протокол (Tools, Prompts, Resources, sampling, elicitation)
- **@modelcontextprotocol/ext-apps** — підтримка UI-ресурсів (ChatGPT ext-apps)
- **zod** + **completable()** — валідація та автодоповнення аргументів промптів
- Вбудований `node:http` — HTTP-сервер без зовнішніх фреймворків

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation4/5

The tools have distinct purposes: listing categories, getting questions by category, getting a glossary item, free-text search, and an interactive wizard. There is some overlap among get_faq_questions, find_faq, and faq_wizard, but descriptions clarify their different input modes.

Naming Consistency4/5

Most tools follow a verb_noun pattern (list_faq_categories, get_faq_questions, get_glossary_item, find_faq), but faq_wizard deviates by using a noun-only name, breaking the otherwise consistent pattern.

Tool Count5/5

With 5 tools, the server is well-scoped for an FAQ and glossary service. Each tool serves a clear and non-redundant role, and the count feels appropriate.

Completeness3/5

Core FAQ browsing and glossary lookup are covered, but there is a notable gap: get_glossary_item references a get_glossary_list tool that is not present in the set. This creates a dead end for discovering glossary terms.

Maintenance

ActivityInactive
ResponsivenessNo issues