HH MCP Server — план реализации

artifacts/hh-mcp-only-blueprint-2026.html · hr-tech · 2026-05-27

Что строим: форк mardanaltynbekov1104/hh-mcp — TypeScript MCP-сервер для HH (employer-side, multi-site hh.kz/hh.ru). Пользователи подключают к Claude Code / Desktop / Cursor, используют со своими credentials.
Три уровня доступа к HH API на май 2026:
  1. Anonymous — без авторизации, нужен только User-Agent header. Доступны: справочники, suggests, поиск вакансий, публичная инфа о работодателях.
  2. Application token — self-service из dev.hh.ru/admin после одобрения app. Без OAuth flow. Расширенный read + application-context actions.
  3. User token (employer-менеджер) — полный OAuth flow от имени менеджера верифицированной компании. Все employer-методы (резюме, приглашения, переписка, статистика).
Содержание
  1. Пайплайн
  2. Источник для форка
  3. Что можно тестировать без компании
  4. Блокеры для прода
  5. Tool-set
  6. Скелет кода (TypeScript)
  7. README для пользователей

1. Пайплайн

1 Recruiter пишет команду на естественном языке 2 Claude Code читает MCP tools, решает какой вызвать stdio 3 hh-mcp-server (TS) диспатчит action в group-tool, подставляет OAuth-токен наш форк HTTPS 4 api.hh.ru /resumes, /negotiations, ... JSON ответ → Claude формирует текст → recruiter видит в чате Пример одного запроса: [1] «найди резюме senior python в Москве, покажи топ-5» [2] Claude видит hh_employer_resumes, выбирает action=search с text/area/limit [3] MCP-сервер: GET https://api.hh.ru/resumes?text=...&area=1 с Bearer-токеном [4] HH возвращает JSON с кандидатами [→] Claude форматирует список, recruiter видит в чате

2. Источник для форка

🏆

mardanaltynbekov1104/hh-mcp

https://github.com/mardanaltynbekov1104/hh-mcp

TypeScript MCP-сервер, employer-only с рождения. 9 group-tools покрывают 70+ HH-actions. v0.1.1, обновлён 6 дней назад.

MIT TypeScript Node 18+ stdio + HTTP multi-site hh.kz/hh.ru OAuth auto-refresh

Почему именно этот проект — см. hh-mcp-landscape-comparison-2026.html (полное сравнение 7 MCP-серверов).

Что делаем в форке:

3. Что можно тестировать без компании

Главный вывод: большую часть архитектуры и значительную часть функциональности можно проверить без юр.лица и employer-аккаунта. Полноценный employer-MVP требует компанию только на финальной стадии.
Sandbox / тестового окружения у HH нет. Подтверждено проверкой актуальной документации (май 2026): ни в одном источнике sandbox не упоминается. Все разработчики тестируют на боевом api.hh.ru. Для упрощения разработки HH предоставляет self-service Application token через UI в dev.hh.ru/admin (см. tier 2 ниже).

Проверенные источники (нет упоминаний sandbox):

✅ Tier 1 — Сразу, без ничего

Anonymous endpoints работают только с корректным User-Agent или HH-User-Agent header:

Что проверяем: вся MCP-инфраструктура — регистрация tools, stdio transport, dispatch group-tools, error handling, User-Agent header. Smoke-тест архитектуры за 1 день.

🟡 Tier 2 — Application token (после регистрации app, без юр.лица и без OAuth flow)

Регистрация приложения на dev.hh.ru/admin не требует юр.лица — нужен обычный hh.ru аккаунт. После одобрения заявки в личном кабинете доступна self-service генерация application token — копи-паста токена из UI без OAuth-flow вообще.

Цитата из официальной документации:

«Владелец приложения может посмотреть актуальный access_token для приложения на сайте https://dev.hh.ru/admin. Токен приложения необходимо сгенерировать 1 раз»

Что получаем:

Что НЕ доступно на этом уровне:

Стоимость: 0 ₽. Срок: модерация заявки — обычно 4 дня, в редких случаях до 15 рабочих дней. Подаём заявку в день 1, параллельно работаем над Tier 1.

❌ Tier 3 — Только с компанией + employer-подпиской + полным OAuth flow

Все «полезные» employer-методы требуют user-token от имени employer-менеджера. Application token не подходит — нужен именно user-token с user-context, получаемый только через authorization_code grant с redirect на hh.ru. Плюс требует:

Официальные прайсы HH:

Без этого не проверить: бизнес-логика employer-сценариев, реальные данные в воронке, поведение с настоящими кандидатами.

4. Блокеры для прода

Нужны только для полноценного employer-MVP, не для разработки

  1. Компания для employer-аккаунта. Нужно юр.лицо (ИНН/ОГРН) для верификации работодателя на HH. С 01.03.2026 добавилась идентификация через Госуслуги/ЕСИА по 41-ФЗ.
    Используем существующее юр.лицо или регистрируем ИП. Не блокер для старта разработки — anonymous и application-tools тестируем без этого.
  2. Модерация заявки на app — обычно 4 рабочих дня, в редких случаях до 15. После заполнения формы на dev.hh.ru/admin.
    Заполняем заявку в день 1. Пока модерируется — пишем Tier 1 anonymous tools. На момент готовности app-токена код архитектурно готов под Bearer auth.
  3. Employer-подписка с пакетом контактов. Для hh_employer_resumes (поиск в базе резюме).
    От 25 000 ₽/мес (базовый региональный пакет) до 120 000 ₽/мес для крупных рекрутинговых нужд. Контакты в активном поиске оплачиваются пакетами (120-300 ₽ за контакт). Покупаем на финальной стадии — когда нужно протестировать live employer-flow. Источники: hh.ru/price/dbaccess, prorecruitment.ru/blog.

5. Tool-set

9 group-tools mardanaltynbekov-форка покрывают 70+ HH-actions через dispatch-параметр.

ToolЧто внутриУровень доступа
hh_auth Загрузка app-token из env / OAuth flow для user-token / token refresh Tier 1
hh_dictionaries Справочники (industries, professional_roles, languages, locales, areas, metro, districts) Tier 1 anonymous
hh_suggests Подсказки (skill_set, positions, areas, professional_roles, etc.) Tier 1 anonymous
hh_salary Оценка зарплаты по параметрам вакансии Tier 2 app token
hh_employer_info Информация о текущем работодателе (managers, addresses, departments) Tier 3 user token
hh_employer_vacancies CRUD вакансий: create, read, list active/archived/hidden, prolongate, stats Tier 3 user token
hh_employer_negotiations Список откликов, статистика воронки, переписка с кандидатами, приглашения Tier 3 user token
hh_employer_resumes Поиск в базе резюме, просмотр конкретного резюме Tier 3 user token + подписка
hh_webhooks Подписки на события (новый отклик, изменение статуса) Tier 3 user token

Tier 1 — anonymous (только User-Agent). Tier 2 — application token (self-service из dev.hh.ru/admin, без OAuth). Tier 3 — user token employer-менеджера (OAuth + юр.лицо + подписка для базы резюме).

Что добавить в форке (опционально):

6. Скелет кода (TypeScript)

6.1 Структура проекта (форк mardanaltynbekov)

hh-mcp/
├── src/
│   ├── index.ts            # MCP entrypoint + stdio transport
│   ├── http-server.ts      # HTTP-server (port 3400)
│   ├── tools/
│   │   ├── auth.ts         # hh_auth (OAuth flow)
│   │   ├── dictionaries.ts # hh_dictionaries
│   │   ├── suggests.ts     # hh_suggests
│   │   ├── salary.ts       # hh_salary
│   │   ├── employer-info.ts
│   │   ├── employer-vacancies.ts
│   │   ├── employer-negotiations.ts
│   │   ├── employer-resumes.ts
│   │   └── webhooks.ts
│   ├── hh-client.ts        # HTTP-клиент HH с auto-refresh
│   └── config.ts           # tokens.json + env
├── tests/
├── package.json
├── tsconfig.json
├── README.md
└── LICENSE                 # MIT (наследуем + добавляем свой copyright)

6.2 package.json (ключевое)

{
  "name": "@your-org/hh-mcp",
  "version": "0.2.0",
  "type": "module",
  "engines": { "node": ">=18" },
  "bin": { "hh-mcp": "./dist/index.js" },
  "scripts": {
    "build": "tsc",
    "dev": "tsx src/index.ts",
    "test": "vitest",
    "lint": "eslint src",
    "auth": "tsx src/cli/auth.ts"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.0.0",
    "axios": "^1.7.0",
    "zod": "^3.24.0"
  }
}

6.3 Group-tool pattern (пример из форка)

// src/tools/employer-resumes.ts
import { z } from 'zod'

const ActionSchema = z.discriminatedUnion('action', [
  z.object({
    action: z.literal('search'),
    text: z.string(),
    area: z.number().optional(),
    per_page: z.number().min(1).max(100).default(20),
  }),
  z.object({
    action: z.literal('get'),
    resume_id: z.string(),
  }),
])

export const hh_employer_resumes = {
  name: 'hh_employer_resumes',
  description: 'Поиск и просмотр резюме в базе HH (employer + подписка).',
  inputSchema: ActionSchema,

  async handler(args: z.infer<typeof ActionSchema>, client: HHClient) {
    if (args.action === 'search') {
      return client.get('/resumes', {
        text: args.text,
        area: args.area,
        per_page: args.per_page,
      })
    }
    if (args.action === 'get') {
      return client.get(`/resumes/${args.resume_id}`)
    }
  }
}

6.4 OAuth flow в CLI (hh-mcp auth)

// src/cli/auth.ts
import http from 'http'
import open from 'open'
import axios from 'axios'
import { writeFileSync, mkdirSync } from 'fs'
import { homedir } from 'os'
import { join } from 'path'

const CREDS = join(homedir(), '.hh-mcp', 'tokens.json')
const REDIRECT = 'http://localhost:8080/callback'

async function authFlow(clientId: string, clientSecret: string) {
  const code: { value?: string } = {}

  const server = http.createServer((req, res) => {
    const url = new URL(req.url!, REDIRECT)
    code.value = url.searchParams.get('code') || undefined
    res.end('OK, close this window.')
    server.close()
  })

  server.listen(8080)
  await open(`https://hh.ru/oauth/authorize?response_type=code&client_id=${clientId}&redirect_uri=${REDIRECT}`)

  // ждём callback
  await new Promise(r => server.on('close', r))

  const { data } = await axios.post('https://api.hh.ru/token', {
    grant_type: 'authorization_code',
    code: code.value,
    client_id: clientId,
    client_secret: clientSecret,
    redirect_uri: REDIRECT,
  })

  mkdirSync(join(homedir(), '.hh-mcp'), { recursive: true })
  writeFileSync(CREDS, JSON.stringify({ ...data, client_id: clientId, client_secret: clientSecret }))
  console.log(`✅ Saved to ${CREDS}`)
}

7. README для пользователей

# hh-mcp

MCP-сервер для HH.ru (employer-side). Поиск резюме, приглашения кандидатов,
переписка, статистика воронки — через Claude Code / Desktop / Cursor.

Multi-site: работает с hh.ru, hh.kz, rabota.by, hh.uz, headhunter.ge/kg, hh1.az.

## Tools

- `hh_employer_resumes` — поиск и просмотр кандидатов
- `hh_employer_vacancies` — CRUD вакансий
- `hh_employer_negotiations` — переписка, приглашения, статистика воронки
- `hh_employer_info` — данные работодателя
- `hh_webhooks` — подписки на события
- `hh_dictionaries`, `hh_suggests`, `hh_salary` — справочники и подсказки
- `hh_auth` — OAuth flow

## Требования

- Employer-аккаунт HH.ru + employer-подписка (для базы резюме)
- Node.js ≥ 18
- Claude Code (или Desktop / Cursor / Continue)

## Установка

```bash
npm install -g @your-org/hh-mcp
```

## Onboarding

### 1. Зарегистрировать приложение на dev.hh.ru/admin

Заявка (модерация 5-15 рабочих дней):
- Название
- Redirect URI: `http://localhost:8080/callback`
- Контактное лицо
- Тип: «только сотрудники работодателя»
- Описание и функциональные возможности

После одобрения — `CLIENT_ID` и `CLIENT_SECRET`.

### 2. Получить access_token

```bash
hh-mcp auth --client-id "..." --client-secret "..."
```

Откроется браузер на hh.ru, после логина токены сохранятся
в `~/.hh-mcp/tokens.json` (с автоматическим refresh при 401).

### 3. Подключить к Claude Code

В `~/.claude.json`:

```json
{
  "mcpServers": {
    "hh": {
      "type": "stdio",
      "command": "hh-mcp",
      "env": {
        "HH_AUTH_BASE": "hh.ru"
      }
    }
  }
}
```

Для hh.kz/rabota.by/etc. — поменять `HH_AUTH_BASE`.

### 4. Использовать

```bash
claude
> Найди резюме senior python в Москве, покажи топ-5
> Покажи статистику откликов по моим вакансиям за неделю
> Пригласи кандидата {resume_id} на вакансию {vacancy_id}
```

## Troubleshooting

- **401** — токен истёк; auto-refresh должен сработать; если нет — `hh-mcp auth` заново
- **403** — нет employer-подписки для базы резюме
- **429** — превышен лимит (~3000/сутки)

## License

MIT. Форк https://github.com/mardanaltynbekov1104/hh-mcp.