Сервер Indeed MCP
Размещённый сервер Model Context Protocol (MCP), который предоставляет Claude, Cursor, Windsurf и другим MCP-клиентам два инструмента для чтения данных Indeed. Ищите вакансии по ключевым словам и местоположению, а также просматривайте полное описание отдельной вакансии. Все данные возвращаются в формате структурированного JSON. Учётная запись разработчика Indeed и одобрение партнёрской программы не требуются.
Сервер получает данные из общедоступных вакансий, которые видны посетителям без входа в систему.
1 000 бесплатных кредитов каждый месяц, банковская карта не нужна — этого хватит на 200 вызовов Indeed.
https://mcp.hasdata.com/mcp?apis=indeed
**
Содержание
-
Требования
-
Быстрый старт
-
Примеры запросов
-
Инструменты
-
Ошибки и сценарии сбоев
-
Цены, бесплатный тариф и ограничения
-
Выбор инструмента
-
Сравнение
-
Часто задаваемые вопросы
-
Ссылки HasData
-
Разработка
-
Участие в проекте
-
Лицензия
Требования
Вам понадобится MCP-клиент и API-ключ HasData. Его можно бесплатно создать в панели управления, банковская карта не нужна. Бесплатного тарифа хватит примерно на 200 вызовов в месяц при стоимости 5 кредитов за вызов. Сервер удалённый, поэтому для подключения достаточно URL и заголовка x-api-key: запускать контейнер не нужно, учётная запись разработчика Indeed в процессе также не потребуется. Клиентам, которые поддерживают только stdio, поможет лёгкий запускатель, опубликованный как @hasdata/indeed-mcp в npm и hasdata-indeed-mcp в PyPI. Примеры приведены ниже.
Быстрый старт
URL сервера одинаков для всех клиентов. Мы проверили подключение в Claude Code и Claude Desktop. Остальные примеры приведены в формате удалённых серверов, описанном в документации соответствующих клиентов.
| Поле | Значение |
|---|---|
| URL | https://mcp.hasdata.com/mcp?apis=indeed |
| Транспорт | HTTP, потоковый |
| Заголовок авторизации | x-api-key: HASDATA_API_KEY |
Клиенты с поддержкой OAuth позволяют добавить тот же URL как коннектор и войти в систему, не указывая ключ в файле конфигурации.
Claude Code
claude mcp add --transport http indeed "https://mcp.hasdata.com/mcp?apis=indeed" \
--header "x-api-key: HASDATA_API_KEY"
Claude Desktop
Откройте Settings, затем Connectors, выберите Add custom connector, вставьте https://mcp.hasdata.com/mcp?apis=indeed и войдите в систему.
При настройке через файл конфигурации учтите, что Claude Desktop загружает только локальные серверы (stdio). Поэтому для подключения к удалённому серверу нужен запускатель stdio. Эту роль выполняет пакет @hasdata/indeed-mcp; он получает ключ из переменной окружения. Добавьте следующий блок в claude_desktop_config.json:
{
"mcpServers": {
"indeed": {
"command": "npx",
"args": ["-y", "@hasdata/indeed-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Вместо Node можно использовать Python и пакет из PyPI. Команда uvx запускает его без предварительной установки:
{
"mcpServers": {
"indeed": {
"command": "uvx",
"args": ["hasdata-indeed-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}
Cursor
Используйте ~/.cursor/mcp.json, чтобы настроить сервер для всех проектов, или .cursor/mcp.json — для одного проекта:
{
"mcpServers": {
"indeed": {
"url": "https://mcp.hasdata.com/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Windsurf
Файл конфигурации: ~/.codeium/windsurf/mcp_config.json. В Windsurf поле называется serverUrl, а не url:
{
"mcpServers": {
"indeed": {
"serverUrl": "https://mcp.hasdata.com/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
VS Code
Добавьте конфигурацию в файл .vscode/mcp.json в рабочей области:
{
"servers": {
"indeed": {
"type": "http",
"url": "https://mcp.hasdata.com/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}
Примеры запросов
Это запросы, а не код. Вставьте любой из них — агент самостоятельно выберет инструмент. Для каждого указано количество вызовов: один успешный вызов стоит 5 кредитов.
Найди на Indeed вакансии «python developer» в Нью-Йорке, отсортируй по дате и покажи десять самых новых с указанием компании и зарплаты.
Один вызов, 5 кредитов. В объявлении уже есть компания, зарплата и дата публикации.
Открой первую вакансию из результатов поиска и получи полное описание и требования.
Один вызов, 5 кредитов. В результатах поиска есть URL вакансии, который можно напрямую передать инструменту получения сведений.
Найди вакансии «data analyst» в Остине, а затем получи полные сведения о трёх вакансиях, в которых указана зарплата.
Четыре вызова, 20 кредитов: один для поиска и по одному для получения сведений о каждой из трёх вакансий.
Сравни указанную зарплату для вакансий «registered nurse» в Чикаго и Хьюстоне.
Два вызова, 10 кредитов: по одному поиску для каждого города.
Зарплата есть в результатах только в том случае, если она указана в объявлении. Поэтому запрос «вакансии с зарплатой» отбирает результаты по этому полю, а не предполагает, что оно заполнено. Переход к каждой следующей странице требует отдельного вызова; для этого используется смещение start.
Инструменты
| Инструмент | Возвращаемые данные |
|---|---|
hasdata_indeed_job_getJobDetails | Название вакансии, компания, местоположение, зарплата/компенсация, тип занятости, дата публикации, полное описание, требования и преимущества, URL для отклика. 5 кредитов за вызов |
hasdata_indeed_listing_getJobListings | Массив вакансий с названием, компанией, местоположением, зарплатой, датой публикации, URL вакансии и jobKey для запрошенной страницы. 5 кредитов за вызов |
Доступны два инструмента только для чтения. Примеры ниже сокращены и взяты из реальных вызовов; значения меняются по мере обновления Indeed. Используйте их, чтобы понять структуру данных. Название каждого инструмента ведёт на справочную страницу соответствующего API с полным перечнем полей.
В примерах показана только полезная нагрузка, а не полный ответ. Результат tools/call содержит один текстовый блок, в котором находится JSON с полями url, status, text и json. Собранные данные находятся в json. В необработанном ответе JSON-RPC путь к ним такой: result.content[0].text; сначала разберите его, затем обратитесь к .json. Чат-клиент выполнит это преобразование за вас, а при прямом обращении к endpoint оно не выполняется.
Получение списка вакансий Indeed
hasdata_indeed_listing_getJobListings
Страница результатов поиска по ключевым словам и местоположению.
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
keyword | string | да | Поисковый запрос — так его мог бы сформулировать кандидат |
location | string | да | Город и штат или любое другое местоположение, которое принимает Indeed |
sort | string | По умолчанию используется relevance; значение date сортирует результаты от новых к старым | |
domain | string | Сайт для нужной страны, например au.indeed.com. По умолчанию используется сайт для США | |
start | number | Смещение для следующей страницы результатов — число, а не URL. Возьмите смещение из pagination.nextPage предыдущего ответа |
Возвращает searchInformation, массив jobs, peopleAlsoSearchFor и объект pagination, в котором nextPage содержит URL следующей страницы. Для каждой вакансии возвращаются поля title, company, location, url, краткое описание description, признак sponsored, относительная дата date и абсолютная дата isoDate, массив details с такими обозначениями, как Full-time и Hybrid work, массив benefits и объект salary, если зарплата указана в объявлении.
В результатах поиска
details— это массив обычных строк. Инструмент получения сведений о вакансии ниже возвращаетdetailsкак объект с массивамиjobTypeиworkSetting. Название одинаковое, но структура разная, поэтому ориентируйтесь на формат, указанный для каждого инструмента.
{
"title": "Hedge Fund Application Developer",
"company": "TBA",
"location": "Stamford, CT 06901",
"url": "https://www.indeed.com/pagead/clk?...",
"sponsored": true,
"date": "30+ days ago",
"isoDate": "2025-06-03T17:22:54.869Z",
"details": ["Full-time", "Hybrid work"],
"benefits": ["Health insurance", "401(k)", "401(k) matching"],
"salary": { "min": 80000, "max": 150000, "type": "YEARLY" }
}
Получение сведений о вакансии Indeed
hasdata_indeed_job_getJobDetails
Полная информация об одной вакансии по её URL.
| Параметр | Тип | Обязательный | Примечания |
|---|---|---|---|
url | string | да | URL вакансии — значение поля url из результатов поиска |
Возвращает поля title, company, location, sponsored, объект details с массивами jobType и workSetting, а также объект salary, если данные о зарплате доступны. Текст вакансии передаётся в полях description (обычный текст) и descriptionHtml (тот же текст с сохранённой HTML-разметкой списков и абзацев). Используйте descriptionHtml, если нужно сохранить структуру, и description, если нужно передать модели обычный текст.
Обзор**
Мы ищем разработчика Python...
" }">
{
"title": "Python Developer",
"company": "Think IT Technologies",
"location": "New York, NY 10114",
"sponsored": false,
"details": { "jobType": ["Contract"], "workSetting": ["In-person"] },
"salary": { "min": 60.5, "max": 65, "type": "HOURLY" },
"description": "Overview\nWe are seeking a Python Developer...",
"descriptionHtml": "<p><b>Overview</b></p><p>We are seeking a Python Developer...</p>"
}
Ошибки и сценарии сбоев
Клиент почти никогда не получает HTTP-код ошибки от вызова инструмента. Уровень MCP отвечает с кодом 200 и передаёт сведения о сбое внутри результата: устанавливает isError в true и указывает причину текстом. Агент получает сообщение там, где можно было бы ожидать строку со статусом.
Неверный ключ отображается в результате вызова инструмента, а не как ошибка подключения. tools/list принимает любой непустой ключ и возвращает оба инструмента, поэтому клиент завершает рукопожатие и показывает зелёный статус. Первый вызов инструмента возвращает isError: true и текст HasData API error: 401 Unauthorized. Обратите внимание на эту строку: на более ранних этапах проблема никак не проявляется.
Отсутствующий ключ — единственный случай настоящей HTTP-ошибки. Проверка авторизации выполняется до вызова любого инструмента, поэтому само подключение завершается с кодом 401. Заголовки CORS присутствуют, и браузерный клиент считывает статус, а не сообщает об общей сетевой ошибке.
Аргумент, не соответствующий схеме инструмента, отклоняется до начала сбора данных. Сервер возвращает isError: true и текст MCP error -32602: Input validation error, указывая поле с неверным значением. Данные не запрашиваются, списания не происходит.
Если поиск ничего не нашёл, он возвращает успешный результат с пустым массивом jobs, а не ошибку. Даже если по сочетанию ключевого слова и местоположения нет подходящих вакансий, значение requestMetadata.status в ответе будет ok. Перед перебором массива проверяйте его длину.
Если вакансия удалена, сервер возвращает код 400 и устанавливает requestMetadata.status в error. Indeed быстро удаляет объявления, поэтому страница по URL из старого поиска может быть уже недоступна.
В результатах с данными также указывается requestMetadata.id. Его стоит приводить при обращении в службу поддержки.
Тарифы, бесплатный план и ограничения
Каждый успешный вызов инструмента Indeed стоит 5 кредитов. Размер ответа на стоимость не влияет: страница с пятьюдесятью вакансиями обходится столько же, сколько страница с двумя.
Бесплатный план предоставляет 1 000 кредитов в месяц без привязки карты — этого хватит на 200 вызовов Indeed. Кредиты обновляются с началом нового расчётного периода, поэтому агент с небольшим объёмом запросов может пользоваться бесплатным планом постоянно.
Платные планы начинаются с $59 в месяц за 200 000 кредитов, то есть за 40 000 вызовов. Чем больше объём, тем ниже цена: от $1.48 за 1 000 вызовов на начальном плане до $0.60 на Basic и $0.41 на планах Growth. Актуальные цены указаны на странице тарифов.
Тариф также определяет допустимое количество одновременных запросов. Бесплатный план допускает 1 запрос за раз, Startup — 5, Basic — 15, а планы Growth — от 50 до 500. В автоматизированных сценариях обязательно предусмотрите обработку превышения лимита.
Запрос, завершившийся не кодом 200, не тарифицируется. Успешный вызов, который ничего не нашёл, всё равно считается вызовом.
Выбор инструментов
Параметр запроса apis определяет, какие инструменты будут доступны агенту. Чем их меньше, тем меньше контекста расходуется на описания инструментов и тем ниже вероятность, что модель выберет неподходящий инструмент.
?apis=indeed the two tools in this repo
?apis=indeed,glassdoor add Glassdoor jobs
?apis=indeed,google_serp add Google search
В качестве значения параметра можно указать имя поставщика, например indeed, или имя отдельного API, например indeed_listing. Неправильно указанные имена игнорируются. Если все имена указаны неверно, запрос завершается с кодом 400. В теле ответа перечислены нераспознанные имена и все допустимые значения. Если не указывать параметр, та же конечная точка предоставит доступ ко всем 57 инструментам HasData.
Сравнение
Indeed прекратила поддержку публичных API Publisher и Job Search. Теперь программный доступ предоставляется через одобренные партнёрства и интеграции с ATS, а не по ключу, который можно получить самостоятельно. Для чтения общедоступных вакансий и объявлений по произвольным поисковым запросам открытого официального способа нет.
| Официальный доступ Indeed | Этот сервер | |
|---|---|---|
| Доступ | Одобрение партнёра или ATS | Один ключ и один URL |
| Область применения | Возможности, предусмотренные партнёрством | Любой публичный поиск или объявление |
| Настройка | Проверка бизнеса | Не требуется |
| Результат | Зависит от интеграции | Структурированный JSON, данные о зарплате предварительно обработаны |
| Изменение данных | Отправка заявок для одобренных партнёров | Только чтение общедоступных данных |
Что этот сервер не поддерживает. Подачу заявок, панели работодателей, данные кандидатов и непубличные объявления. Сервер получает только те данные, которые доступны посетителю без входа в аккаунт.
Часто задаваемые вопросы
Есть ли у Indeed официальный MCP-сервер?
Indeed не публикует такой сервер. Этот сервер поддерживает HasData; он получает данные с публичных страниц, поэтому учётная запись разработчика Indeed не требуется.
Что такое MCP-сервер Indeed?
Это сервер, который предоставляет данные о вакансиях Indeed в виде инструментов для вызова из AI-клиента. Клиент отправляет вызов инструмента через Model Context Protocol, сервер получает данные и возвращает структурированный JSON, а модель работает с результатом. Этот сервер предоставляет два инструмента и работает удалённо.
Нужен ли мне ключ API Indeed или учётная запись партнёра?
Нет. Вам понадобится только ключ HasData. Подавать заявку на учётную запись Publisher не нужно: инструменты получают данные с публичных страниц Indeed.
Как просмотреть результаты, если они не помещаются на одной странице?
Передайте инструменту поиска вакансий смещение start в виде числа, а не URL. В ответе есть поле pagination.nextPage, в котором содержится значение start для следующей страницы. Передайте это число в следующем запросе, а не URL.
Почему иногда отсутствуют данные о зарплате?
Потому что в объявлении не указана зарплата. Объект salary присутствует только тогда, когда Indeed показывает соответствующее значение. Обрабатывайте его с учётом того, что он может отсутствовать.
Можно ли использовать этот сервер вместе с другими API HasData?
Да. Параметр apis принимает список значений: например, ?apis=indeed,glassdoor предоставит агенту доступ к Indeed и Glassdoor. Если не указывать параметр, будут доступны все инструменты.
Соблюдение требований и персональные данные
HasData получает только общедоступные данные. Условия использования платформы могут ограничивать автоматизированный доступ, и вы самостоятельно отвечаете за соблюдение требований. Если собранные данные содержат персональную информацию, убедитесь, что у вас есть законное основание для её обработки в соответствии с GDPR, CCPA или аналогичными правилами вашей юрисдикции.
Ссылки HasData
| Страница продукта и конструктор запросов | Indeed Scraper API |
| Документация сервера | Документация MCP-сервера |
| Все 57 инструментов на одном сервере | HasData/hasdata-mcp |
| Руководства для клиентов | MCP-клиенты и интеграции |
| Другие источники данных | Indeed Scraper API и ещё 54 API |
| Тарифы и стоимость кредитов | Тарифы и стоимость кредитов |
| Ключи и статистика использования | Панель HasData |
| Запуск Node из npm | @hasdata/indeed-mcp |
| Запуск Python из PyPI | hasdata-indeed-mcp |
Разработка
Этот репозиторий содержит конфигурацию и документацию удалённого сервера. Сборка не требуется, как и упаковка в контейнер.
Тесты в test/ проверяют контракт инструментов — именно эту часть можно изменить, не внося коммит в репозиторий. Они проверяют, что запрос ?apis=indeed возвращает ровно два инструмента, каждый инструмент по-прежнему объявляет обязательные параметры, имена не изменились, а используемый ключ принимается сервером. Последняя проверка действительно вызывает инструмент и стоит 5 кредитов — такова цена контрольного запроса, который должен завершиться ошибкой, если обнаружит проблему.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test
Та же тестовая система запускается в CI при каждом отправлении изменений и раз в неделю по расписанию: список инструментов на стороне поставщика может измениться без каких-либо обновлений в этом репозитории. Ошибка означает, что изменился список инструментов, перестал работать ключ или конечная точка недоступна. Сообщение проверки указывает, что именно произошло.
Вклад в проект
Наиболее полезны исправления таблиц инструментов и примеров ответов — именно эти части чаще всего устаревают. Укажите вызов, который вы выполнили, и полученный ответ. Для pull request из форков тесты запускаются без ключа, а проверки, требующие реального вызова, пропускаются, поэтому сборка не завершается ошибкой.
Лицензия
MIT. См. файл LICENSE.