Indeed MCP Server
Indeed MCP Server
Размещённый на хостинге сервер Model Context Protocol (MCP), который предоставляет Claude, Cursor, Windsurf и любому другому MCP-клиенту два инструмента Indeed в режиме только для чтения. Ищите объявления о вакансиях по ключевому слову и месоположению и чиайте отдельную вакансию полностю — всё в виде сруктурированного JSON, без аккаунта разработчика Indeed и без одобрения партнёра.
Он чиает публичные вакансии, коорые види посетиель без входа в сисему.
https://mcp.hasdata.com/api/mcp?apis=indeed
Содержание
Related MCP server: Indeed Skills
Что вам нужно
Вам понадобятся 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 |
|
Транспорт | HTTP, streamable |
Заголовок авторизации |
|
Клиенты с поддержкой OAuth могут добавить тот же URL как коннектор и войти, не указывая ключ в конфигурационном файле.
claude mcp add --transport http indeed "https://mcp.hasdata.com/api/mcp?apis=indeed" \
--header "x-api-key: HASDATA_API_KEY"Настройки, затем «Коннекторы», затем «Добавить пользовательский коннектор», вставьте https://mcp.hasdata.com/api/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" }
}
}
}Для Python вместо Node замените лаунчер на пакет PyPI, который uvx запускает без ручной установки:
{
"mcpServers": {
"indeed": {
"command": "uvx",
"args": ["hasdata-indeed-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}~/.cursor/mcp.json для каждого проекта или .cursor/mcp.json для одного:
{
"mcpServers": {
"indeed": {
"url": "https://mcp.hasdata.com/api/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.codeium/windsurf/mcp_config.json. Windsurf называе поле serverUrl, а не url:
{
"mcpServers": {
"indeed": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}.vscode/mcp.json в рабочей области:
{
"servers": {
"indeed": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}Примеры запросов
Это запросы, а не код. Вставьте один — и агент сам выберет инструмент. Каждый помечен количеством вызовов, потому что каждый успешный вызов стоит 5 кредитов.
Найди на Indeed вакансии «pуhon develope» в Нью-Йорке, отсорированные по дае, и покажи десят самых свежих с команией и зарплаой.
Один вызо, 5 кредиов. Сраница сиска уже содери команию, зарплау и дау убликации.
Возьми первую вакансию из этого поиска и покажи её полное описание и требования.
Один вызов, 5 кредитов. В списке есть URL вакансии, который инструмент деталей принимает напрямую.
Найди вакансии «data analyst» в Остине, затем покажи полные детали по трём, где указана зарплата.
Четыре вызоа, 20 кредиов: один сисок и по одному вызоу деалей для кажой из рёх.
Сравни зарплаы, оубликованные для «egistered nurse» в Чикаго и Хьюсоне.
Два вызоа, 10 кредиов, по одному сису на ород.
Зарплаа указна в сиске только огда, когда она ес в самой вакансии, поэтому зарос «вакансии с зарплаой» фильруе по олю, а не предолаге её наличие. Перелисыеание сраниц сои по одному вызоу за раз и выолняеся через смещение start.
Инструменты
Два инструмента, только для чтения. Примеры ниже сокращены из реальных вызовов, и числа меняются по мере обновления Indeed. Воспринимайте их как структуру. Имя каждого инструмента ведёт к справочнику эндпоинта, в котором приведён полный список полей.
Примеры — это полезная нагрузка, а не весь ответ. Результат tools/call содержит один текстовый блок, и этот текст сам является JSON с полями url, status, text и json; извлечённые данные находятся в json. В сыром JSON-RPC-ответе путь выглядит как result.content[0].text, который нужно распарсить, а затем взять .json. Чат-клиент разворачивает это автоматически, а код, обращающийся к эндпоинту напрямую, — нет.
Получение сиска вакансий Indeed
hasdata_indeed_listing_getJobListings
Страница результатов поиска по ключевому слову и местоположению.
Параметр | Тип | Обязательно | Примечания |
| string | да | Поисковый запрос, как его ввёл бы соискатель |
| string | да | Город и штат или любая строка местоположения, которую принимает Indeed |
| string | По умолчанию | |
| string | Сайт для страны, например | |
| number | Смещение результата для следующей страницы; это число, а не URL. Смещение берётся из |
В списке
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.
Параметр | Тип | Обязательно | Примечания |
| string | да | URL вакансии, поле |
Возвращает title, company, location, sponsored, объект details с массивами jobType и workSetting, объект salary (если есть) и тело вакансии в двух вариантах: description (обычный текст) и descriptionHtml (то же содержимое с сохранённой разметкой списков и абзацев). Используйте descriptionHtml, когда нужна структура, и description, когда нужно передать модели чистый текст.
{
"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 кредитов на 30 дней без карты, то есть 200 вызовов Indeed. После этого активный аккаунт продолжает ежедневно получать пополнение в 100 кредитов, когда баланс опускается ниже 100, поэтому агент с небольшим объёмом запросов может работать на бесплатном тарифе бессрочно.
Платные тарифы начинаются от $49 в месяц за 200 000 кредитов, то есть 40 000 вызовов. Цена за единицу снижается с ростом объёма: от $1.23 за 1 000 вызовов на начальном тарифе до $0.50 на Business, $0.42 на Growth и $0.37 на крупнейших тарифах с высоким объёмом.
Ваш тариф также определяет уровень конкурентности. Бесплатный пробный период допускает 1 запрос одновременно, Startup — 15, Business — 30, Growth — 50, а тарифы с высоким объёмом — от 200 до 1 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.
How it compares
Indeed прекратил поддержку своих публичных Publisher и Job Search API, и теперь программный доступ осуществляется через одобренные партнёрства и интеграции с ATS, а не через ключ, выдаваемый самостоятельно. Для чтения публичных объявлений и вакансий по произвольным запросам открытого официального пути не существует.
Официальный доступ Indeed | Этот сервер | |
Доступ | Одобрение партнёра или ATS | Один ключ и один URL |
Охват | Что предоставляет партнёрство | Любой публичный поиск или вакансия |
Настройка | Бизнес-проверка | Не требуется |
Вывод | Зависит от интеграции | Структурированный JSON, зарплата уже извлечена |
Запись | Потоки подачи заявок для одобренных партнёров | Только чтение, только публичные данные |
Чего этот сервер не делает. Никакой подачи заявок, никакой панели работодателя, никаких данных кандидатов, никаких закрытых вакансий. Он читает только то, что видит посетитель, не выполнивший вход.
FAQ
Существует ли официальный MCP-сервер Indeed?
Indeed не публикует такого. Этот поддерживается HasData и читает публичные страницы, поэтому ему не нужен аккаунт разработчика Indeed.
Что такое MCP-сервер Indeed?
Это сервер, который предоставляет данные Indeed о вакансиях в виде инструментов, которые может вызывать ИИ-клиент. Клиент отправляет вызов инструмента через протокол Model Context Protocol, сервер получает данные и возвращает структурированный JSON, а модель работает с результатом. Этот сервер предоставляет два инструмента и работает удалённо.
Нужен ли мне ключ Indeed API или партнёрский аккаунт?
Нет. Единственные учётные данные — это ваш ключ HasData. Никакой Publisher-аккаунт оформлять не нужно, потому что инструменты читают публичные страницы Indeed.
Как пролистывать результаты, если их больше одного экрана?
Передайте смещение start инструменту списка как число, а не как URL. В ответе возвращается pagination.nextPage, и значение start внутри него — это смещение для следующей страницы; возьмите это число и передайте его обратно, а не подставляйте URL.
Почему зарплата иногда отсутствует?
Потому что в вакансии она не указана. Объект salary присутствует только тогда, когда Indeed показывает сумму. Обрабатывайте его защитно.
Можно ли использовать это вместе с другими HasData API?
Да. Параметр apis принимает список, а ?apis=indeed,glassdoor даёт вашему агенту Indeed плюс Glassdoor. Уберите параметр — и вы получите всё.
Комплаенс и персональные данные
HasData обращается только к общедоступным данным. Условия платформы могут ограничивать автоматический доступ, и вы сами отвечаете за своё соответствие требованиям. Если собранные вами данные включают персональную информацию, убедитесь, что у вас есть законное основание для их обработки в соответствии с GDPR, CCPA или аналогичными правилами вашей юрисдикции.
Ссылки HasData
Страница продукта и конструктор запросов | |
Документация сервера | |
Все 57 инструментов в одном сервере | |
Инструкции по клиентам | |
Всё остальное, что мы парсим | |
Тарифы и стоимость кредитов | |
Ключи и использование | |
Node-лаунчер на npm | |
Python-лаунчер на PyPI |
Разработка
Этот репозиторий — конфигурация и документация для удалённого сервера. Здесь нет шага сборки и нечего контейнеризовать.
Тесты в 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-реквесты из форков запускают набор тестов без ключа, а живые проверки пропускаются, а не становятся красными.
Лицензия
MIT. См. LICENSE.
Available Tools
2 toolshasdata_indeed_job_getJobDetailsindeed_job: GET /AInspect
Get Indeed Job Details
Fetches a single Indeed job posting by its viewjob URL. Returns job title, company, location, salary/compensation, employment type, posted date, full description, requirements/benefits, and apply URL. Use for ATS/CRM enrichment, compensation benchmarking, resume-to-JD matching with LLMs, and structured archival of postings discovered via the Indeed Listing endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL of the job vacancy to retrieve details for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states what is returned but does not mention side effects, error handling, rate limits, or any read-only guarantees. The 'Fetches' wording implies a safe GET, but transparency is limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: first states the core function, second lists return fields and use cases. It is concise, well-structured, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (one parameter, no output schema), the description fully covers what the tool does, what it returns, and when to use it. The relationship to the listing sibling is clarified, and no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'url' is clearly described in the schema as 'The URL of the job vacancy to retrieve details for.' The tool description reinforces this with 'viewjob URL,' leaving no ambiguity about what input is expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it fetches a single Indeed job posting by viewjob URL, lists the returned fields, and distinguishes itself from the listing sibling by focusing on a single posting. The verb 'Fetches' and resource 'Indeed job posting' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases (ATS/CRM enrichment, compensation benchmarking, resume-to-JD matching, structured archival) and references the Indeed Listing endpoint as the discovery source, implying this tool is for postings already found. Does not explicitly contrast with Glassdoor job details, but the context is sufficient for most agents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hasdata_indeed_listing_getJobListingsindeed_listing: GET /AInspect
Get Indeed Job Listings
Searches Indeed job listings by keyword and location with sort (relevance/date), country domain targeting, and offset-based pagination (start). Returns an array of jobs with title, company, location, salary, posted date, job URL, and jobKey for the requested page. Use for job-market dashboards, role/geo hiring-trend analysis, sourcing pipelines, and generating URL lists to feed into the Indeed Job endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | The sorting option for the search results. | |
| start | No | The starting index of the results to retrieve (optional). | |
| domain | No | The domain of the Indeed site (optional). Provide one exact documented value (62 allowed), e.g. `ar.indeed.com`, `au.indeed.com`. | |
| keyword | Yes | The keyword used to search for job listings. | |
| location | Yes | The location to search for job listings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It implies a read-only search operation (GET) but does not explicitly state side effects, rate limits, or authentication requirements. The behavior is mostly transparent but lacks explicit safety language.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and readable but contains slight redundancy, repeating the search criteria and return format in consecutive sentences. It remains concise and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description adequately explains the return format (array of jobs with listed fields). It also covers pagination and domain selection, giving sufficient context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All five parameters have descriptions, covering required and optional fields. The description adds context by explaining sort options, domain examples, and offset-based pagination, which goes beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves Indeed job listings by keyword and location, with sorting and pagination options. It also distinguishes from the sibling tool by mentioning generating URL lists for the Indeed Job endpoint, implying a listing vs. detail perspective.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases such as job-market dashboards, hiring-trend analysis, and sourcing pipelines. It doesn't explicitly contrast with the sibling tool, but the intended scenarios are clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.0.0- First observed
hasdata_indeed_job_getJobDetails - First observed
hasdata_indeed_listing_getJobListings
TDQS
Scored across 2 tools
The two tools have clearly distinct roles: one searches/fetchs the listing index while the other fetches full details for a specific job. There is no meaningful overlap or ambiguity in selecting between them.
Both tool names follow the same hasdata_indeed_<resource>_get<Action> pattern, with consistent snake_case prefixing and camelCase action suffixes. The naming is predictable and coherent across the set.
Two tools is on the low end for an MCP server, though the pair covers the essential list-and-detail retrieval flow for Indeed job data. The server feels minimal but not unreasonable for its focused purpose.
The server provides the core job-search workflow: get listings, then fetch details for a chosen URL. Minor gaps exist, such as no direct fetch by jobKey and no batch/company-level tools, but agents can accomplish the primary intended use case without dead ends.
Maintenance
Related MCP Connectors
Search job postings across Indeed, LinkedIn, and more from one request - titles, companies
DISCONTINUED 2026-05-23. Indeed.com Cloudflare + DataDome anti-bot returns HTTP 403 on all scraping
Hibrit iş ilanı arama MCP sunucusu — anahtarsız resmî ATS board API'leri (Greenhouse, Lever,…
Job search for Switzerland. Searches current listings on funkyjobs.ch by keyword, place with radius, workload, category and publishing date, and fetches a single listing with employer, location, workload and salary where stated. Read-only, no account needed. Docs: https://www.funkyjobs.ch/mcp-connector
Related MCP Servers
AlicenseAqualityAmaintenanceDirect access to 40+ scraping and search tools. Extract structured data from Google (Search, Maps, Trends), Amazon, Airbnb, Social Media, and any web page directly into your AI agent.6320MIT- AlicenseNot gradedqualityDmaintenanceLive Indeed job-postings data for AI agents via the RolesAPI REST API: search listings by keyword and location, and fetch role details, salary, description, company, and benefits. Available as drop-in agent skills or a hosted remote MCP server.1MIT No Attribution
- FlicenseNot gradedqualityBmaintenanceEnables searching real job listings from multiple job boards (Indeed, LinkedIn, Glassdoor, Google Jobs, etc.) through a single MCP tool, designed for use as a custom connector in Claude Cowork.-
- AlicenseAqualityAmaintenanceEnables MCP clients to perform live Google searches and retrieve structured SERP data including organic results, AI Overviews, People Also Ask, AI Mode answers, news, shopping, and short-video results via eight read-only tools.1031 npm64 PyPI17MIT