Skip to main content
Glama
jnot807

recruitee-mcp

by jnot807

Recruitee MCP

Работайте со своим конвейером Recruitee / Tellent прямо из Claude. Найдите вакансию, прочитайте кандидата и всё, что о нём уже записано, добавьте найденного вами человека и напишите свою оценку по интервью — не покидая разговор.

Он работает на вашей собственной машине под вашим собственным API-токеном Recruitee, поэтому всё, что он записывает, оформляется от вашего имени, точно так же, как если бы вы сделали это сами.


Что он умеет

Четырнадцать инструментов. Девять на чтение, пять на запись, и каждый записывающий инструмент показывает вам, что именно он собирается сделать, прежде чем сделает.

Чтение

Инструмент

Что вы получаете

rt_list_offers

Ваши вакансии с их id, статусом и количеством кандидатов. Опционально фильтруется по названию.

rt_get_stages

Этапы конвейера одной вакансии с актуальным количеством на каждом.

rt_offer_candidates

Все кандидаты на одной вакансии — их этап, были ли они отклонены, и любые оценки. Действительно ограничено этой вакансией, а не всей компанией.

rt_get_candidate

Полная запись: контактные данные, теги, все вакансии, на которых он состоит, и его ответы на вопросы анкеты.

rt_search_candidates

Найти человека по имени.

rt_source_candidates

Поиск по всей вашей базе, включая текст резюме — см. ниже.

rt_get_rating_scale

Шкала оценок, настроенная для вашего аккаунта, чтобы вердикт никогда не был угадан.

rt_get_evaluations

Все оценки по кандидату — оценка, заметка, этап, рецензент и дата — сведённые в один список.

rt_get_notes

Заметки, уже имеющиеся у кандидата, сначала новые.

Ответы на вопросы анкеты заслуживают отдельного слова: ожидания по зарплате и тому подобное возвращаются для каждой вакансии, потому что человек, подавший заявку на три должности, ответил на вопрос трижды, и плоский список не может различить эти ответы.

Запись

Инструмент

Что он делает

rt_create_candidate

Создаёт человека и размещает его на вакансии одним шагом. Принимает email, телефон, ссылки, теги, блок сопроводительного письма, источник, откуда он пришёл, и файл для прикрепления. По умолчанию помещает его в Sourced.

rt_submit_evaluation

Записывает оценку «палец вверх» и ваши обоснования на кандидата для одной вакансии — вкладка «Оценки» его профиля.

rt_set_stage

Перемещает кандидата на другой этап одной из его вакансий. Отказывает в перемещении на отклонённую позицию, поэтому не может вернуть кого-либо в строй.

rt_attach_file

Прикрепляет локальный файл к существующему кандидату, опционально делая его резюме.

rt_add_note

Добавляет заметку, публичную или приватную. Для контекста, который не является вердиктом — резюме звонка, обоснование поиска, сводка.

Как ведут себя записи

Они принимают имена, а не id. «Дэна Уитфилд», «Региональный менеджер по продажам». Если имя совпадает с двумя людьми, он останавливается и перечисляет их, а не выбирает одного — записать вердикт не тому человеку — это именно тот сбой, который здесь действительно важен.

Каждая запись сначала показывает предпросмотр. Первый вызов возвращает ровно то, что было бы записано, и ничего не записывает. Только после вашего одобрения что-либо сохраняется. Для нового кандидата предпросмотр также выполняет проверку на дубликаты и сообщает, какие детали отсутствуют, так что вы узнаёте об этом до создания записи, а не после.

Оценки фиксируются относительно реального текущего этапа кандидата, что и означает оценка. Вы можете намеренно переопределить это, но вам никогда не придётся вычислять это самостоятельно.

Ваши абзацы сохраняются. Поле заметок в Recruitee принимает обычный текст, но его интерфейс отображает этот текст как HTML, поэтому заметка, написанная абзацами, иначе пришла бы одним сплошным блоком. Переносы строк преобразуются на лету, а текст сначала экранируется, чтобы случайный < в вашем тексте не был проглочен или отображён.

Оценки проверяются, а не округляются. Допустимые значения зависят от вашей настроенной шкалы — в 4-балльной шкале с «пальцами» нет «нейтрально», в 5-балльной есть. Значение, которого нет в шкале, отклоняется, а не тихо превращается в соседнее.


Related MCP server: Recruitee MCP Server

Поиск по вашей собственной базе

rt_source_candidates выполняет тот же поиск, что и экран «Кандидаты», и это отличается от rt_search_candidates: тот сопоставляет имена, а этот сопоставляет всё, включая текст резюме, с булевыми операторами.

query: "renewals AND churn"
query: "(SaaS OR B2B) AND \"net revenue retention\" NOT \"vice president\""

Это важно, потому что названия должностей не согласованы между компаниями, а то, что человек действительно делал, написано в его резюме. Поиск по доказательствам лучше, чем поиск по названию.

Фильтры комбинируются: offer, excludeOffer, jobStatus, stage, status, tags, sources. excludeOffer — это то, что превращает его в инструмент поиска, а не в поисковую строку: он исключает людей, уже находящихся на вакансии, из результатов, когда вы пополняете её.

Каждый результат несёт почему он совпал — фактические предложения, с удалённым HTML — и каждую вакансию, на которой человек уже состоит, с этапом и, если его отклонили, причиной. Последнее — не украшение: большинство людей в устоявшейся ATS были отклонены хотя бы раз. «Неверное местоположение» два года назад может не относиться к сегодняшнему дню; «не прошёл оценку» — всё ещё относится. Никого нельзя представлять как новую находку без этого.

Почему построение фильтров выглядит параноидальным

/search/new/candidates молча игнорирует всё, что не распознаёт, и возвращает нефильтрованный результат вместо ошибки. Четыре способа получить правдоподобный, сильно неверный ответ, все подтверждены на живом аккаунте:

Ошибка

Что делает API

Неизвестное имя сущности

возвращает всю базу данных

nin вместо not_in

возвращает всю базу данных

Неизвестная сортировка

молча откатывается к релевантности

Два объекта фильтра для одной сущности

второй заменяет первый

Последнее — самое коварное: вакансия и статус работы, отправленные как два объекта, возвращают всех с этим статусом работы, и нигде не сказано, что фильтр по вакансии был отброшен. Поэтому каждое ограничение на сущность объединяется в один объект, и ни один ключ, предоставленный вызывающим, никогда не достигает API — имена сопоставляются со словарём, проверенным на живом API, и всё, что вне его, вызывает ошибку.

Неверное значение безопасно, напротив: оно возвращает ноль, что очевидно неверно для того, кто это читает. Нулевой результат также возвращается с вашими реальными названиями этапов, так что опечатку в этапе можно отличить от пустого.

node sourcing-test.js проверяет всё это, включая то, что клиент отказывается от каждой из четырёх ошибок выше.

Настройка

Пять минут, один раз. Вам нужен Node 18 или новее (node -v для проверки) и Claude Code или настольное приложение Claude.

1. Установка

npm install

2. Создайте свой собственный API-токен

В Recruitee: Настройки → Приложения и плагины → API-токены, оставайтесь на вкладке Личные API-токены и нажмите + Добавить токен. Он запросит ваш пароль, затем покажет значение один раз.

Пока вы на этом экране, обратите внимание на вашу компанию на панели Текущие реквизиты компании вверху. Подойдёт либо числовой ID, либо поддомен.

Это должен быть ваш токен, а не общий. Токен Recruitee действует как человек, который его создал, поэтому оценка, написанная с вашим токеном, отображается как ваша — в этом и суть. Никогда не вставляйте его в чат, электронное письмо или тикет.

3. Сохраните его

npm run set-token -- <paste-your-token-here> <your-company>

Ротация токена позже — это просто npm run set-token -- <новый-токен> — компания запоминается.

Он записывается в session/token.json, доступный только вам, и игнорируется git. RECRUITEE_API_TOKEN в окружении переопределяет файл, если вы предпочитаете хранить его в менеджере паролей.

4. Докажите, что это работает

npm run check

Вам нужно authenticated: true и несколько ваших вакансий.

5. Подключите его к Claude

Запустите это из этой папки, затем перезапустите Claude:

claude mcp add recruitee -- node "$PWD/server.js"

Используете настольное приложение Claude? Откройте Настройки → Разработчик → Изменить конфигурацию и добавьте это, с вашим реальным абсолютным путём (pwd выведет его):

{
  "mcpServers": {
    "recruitee": {
      "command": "node",
      "args": ["/absolute/path/to/recruitee-mcp/server.js"]
    }
  }
}

Затем спросите Claude: «перечисли открытые вакансии в Recruitee».


Как это выглядит в использовании

Вы: Кто в конвейере на должность регионального менеджера по продажам?

Вы: Открой Дэну Уитфилд — что она указала по зарплате, и какие оценки уже есть?

Вы: Напиши оценку для неё по этой вакансии. Да: сильна в продлениях и расширении, руководила командой из девяти человек, нет опыта в PLG.

Claude показывает вам оценку, заметку, вакансию и этап, и ничего не записывает.

Вы: Да, отправляй.


Что он намеренно не может делать

Токен API Recruitee несёт ровно те же права, что и человек, который его создал — в документации явно сказано, что он может «выполнять те же действия, что и в веб- или мобильном приложении, от имени этого пользователя». Нет возможности выдать токен только для чтения.

Поэтому сдержанность живёт в этом коде. Отклонение, возврат в строй, удаление, скрытие и анонимизация — все это реальные, документированные конечные точки, которые этот сервер не реализует. Не спрятанные за флагом, не закомментированные — отсутствующие, так что никакая инструкция, подсказка или ошибка не могут до них добраться. Отклонение кандидата остаётся решением, которое вы принимаете в интерфейсе.

Перемещение по этапам — единственное, что разрешено. rt_set_stage продвигает кандидата по конвейеру одной вакансии, потому что это учёт, а не суждение, и конвейер, который нельзя продвигать отсюда, рассинхронизируется с тем, где вы его отслеживаете ещё. Линия проведена на отклонении, и она enforced, а не просто задокументирована: перемещение отказывает в размещении, которое уже было отклонено, поскольку изменение его этапа вернуло бы человека в строй — отменяя чьё-то отклонение как побочный эффект учётного вызова.

npm run smoke проверяет эти свойства при каждом запуске: что не раскрыт ни один деструктивный инструмент, что перемещатель этапов отказывает в отклонённом размещении и ограничен одной вакансией, и что каждая запись рекламирует свой экран подтверждения. Последняя проверка выводит записи из схем инструментов, а не из списка шаблонов имён — более ранняя версия молча переставала покрывать новые инструменты и пропускала rt_set_stage без тестирования вообще.


Что стоит знать

Новые кандидаты попадают в "Sourced". Эндпоинт создания Recruitee всегда помещает людей в "Applied", что отправило бы всех, кого вы нашли сами, в число настоящих соискателей, поэтому их сразу же перемещают после создания, и вы узнаете, если это не удалось. Передайте stage, чтобы переопределить это — "Applied" для того, кто действительно подал заявку, или любой более поздний этап для того, кто уже в процессе. Чтобы переместить их позже, используйте rt_set_stage.

Установка резюме заменяет уже имеющееся. set_as_cv в Recruitee не добавляет резюме, а меняет слот и понижает предыдущий файл до обычного вложения. Поэтому rt_attach_file отказывается устанавливать резюме кандидату, у которого оно уже есть, если вы не передадите replaceCv — резюме в файле — это чьё-то решение, и единственный след его перезаписи — лишняя строка в списке вложений.

Оценки сохраняются под вашим именем. Они отображаются как "Вы оценили", неотличимо от оценки, проставленной вручную. Никогда не пишите оценку за разговор, которого у вас не было или который вы не читали, а если суждение пришло от коллеги, укажите это в примечании.

Атрибуция ненадёжна при обратном чтении. Всё, что записано через любой токен API, приписывается владельцу этого токена, поэтому рецензентом в оценке, которую кто-то синхронизировал, может быть тот, кто её синхронизировал, а не тот, кто проводил собеседование. В примечании обычно указан настоящий.

Оценочные карточки опросов не поддерживаются. Только обычная карточка рейтинга. API документирует ответы на каждый вопрос в каждом ответе, но никогда в теле запроса, поэтому формат записи пришлось бы наблюдать на реальной отправке. Это может не иметь значения и для вашего аккаунта: если /results/scorecards возвращает пустой результат для людей, прошедших этапы собеседования, значит, используются обычные карточки рейтинга, и ничего не отсутствует. Стоит проверить, прежде чем кто-то вложится в путь опросов.


Где это работает

Это локальный stdio MCP-сервер — Claude запускает его как процесс на вашей машине, и ваш токен никогда его не покидает.

  • Claude Code (терминал, десктопное приложение, расширения IDE) ✅

  • Десктопное приложение Claude ✅

  • claude.ai в браузере ❌ — он подключается только к удалённым MCP-серверам, доступным по HTTPS, что означало бы размещение этого сервера и хранение токенов Recruitee всех пользователей на этом хосте.


Конфигурация

Переменная

Назначение

RECRUITEE_API_TOKEN

Использовать токен из окружения вместо сохранённого

RECRUITEE_COMPANY_ID

Использовать компанию из окружения вместо сохранённой

Устранение неполадок

Что вы видите

Что делать

"No Recruitee API token"

Шаг 3 не выполнен или выполнен в другой папке. Вернитесь сюда и попробуйте npm run check.

"authenticated": false

Токен введён с ошибкой или отозван. Создайте новый и повторите шаг 3.

Claude не видит инструменты

Перезапустите Claude правильно — завершите работу, а не просто закройте окно. Проверьте, что шаг 5 выполнен из этой папки.

"That name matches two candidates"

Работает как задумано. Откройте человека в Recruitee и дайте Claude номер из конца URL.

Что-либо ещё

npm run smoke и отправьте то, что он выведет.

Разработка

npm run smoke     # self-check: tool list, no destructive tools, confirm gates, one live read
npm run sourcing  # 20 checks on the search filters, including the four silent-failure modes
npm run check     # prove the token
npm start         # run the server directly (it speaks JSON-RPC on stdin/stdout)

Две заметки о реализации, обе найдены методом проб, а не из документации:

  • Загрузка файлов не документирована. В справочнике описан JSON-тело с серверным path, который не объясняется, как получить. Обычный multipart POST работает, с частью файла с именем attachment[file] — просто file возвращает 500, а передача идентификатора кандидата как параметра запроса создаёт вложение, не привязанное ни к кому. Продвижение файла в слот резюме заменяет его новым идентификатором и сгенерированным именем, поэтому загрузки проверяются по URL резюме кандидата, а не по идентификатору, который только что был загружен.

  • /search/new/candidates игнорирует собственный параметр запроса и возвращает все записи в компании, поэтому поиск по имени идёт через /candidates?query= вместо этого. Этапы конвейера берутся из /offers/{id}/placements, сгруппированные по этапам, а не из /offers/{id}/pipeline_templates, который перечисляет шаблоны, доступные роли, без их этапов.

Install Server
F
license - not found
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables extraction and analysis of candidate profiles from Recruitee recruitment pipelines, optimized for LLM evaluation with clean, bias-free data.
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Connects your Ashby recruiting data to Claude, enabling natural language queries and management of candidates, applications, jobs, interviews, offers, and team information.
    36
    MIT
  • F
    license
    B
    quality
    C
    maintenance
    Enables Claude to manage Zoho Recruit ATS operations including candidates, jobs, interviews, analytics, email, and AI-assist through natural language.
    20

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

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/jnot807/recruitee-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server