Indeed MCP Server
Indeed MCP Server
Un servidor de Model Context Protocol (MCP) alojado que ofrece a Claude, Cursor, Windsurf y cualquier otro cliente MCP dos herramientas de solo lectura de Indeed. Busca ofertas de empleo por palabra clave y ubicación, y lee una oferta completa, todo como JSON estructurado, sin cuenta de desarrollador de Indeed ni aprobación de socio.
Lee ofertas de empleo públicas que un visitante sin sesión iniciada puede ver.
https://mcp.hasdata.com/api/mcp?apis=indeed
Contenido
Related MCP server: Indeed Skills
Qué necesitas
Un cliente MCP y una clave de API de HasData desde el panel de control, que se crea gratis sin tarjeta, y la prueba cubre unas 200 llamadas a la tarifa de 5 créditos. Es un servidor remoto, así que el camino más sencillo es una URL y una cabecera x-api-key, sin contenedor que ejecutar y sin cuenta de desarrollador de Indeed en ningún paso. Un cliente que solo hable stdio lo alcanza a través de un lanzador ligero, publicado como @hasdata/indeed-mcp en npm y hasdata-indeed-mcp en PyPI, como se muestra abajo.
Inicio rápido
La URL del servidor es la misma para todos los clientes. Lo probamos directamente en Claude Code y Claude Desktop. Los demás bloques siguen el formato documentado de cada cliente para un servidor remoto.
Campo | Valor |
URL |
|
Transporte | HTTP, streamable |
Cabecera de auth |
|
Los clientes con soporte para OAuth pueden añadir la misma URL como conector e iniciar sesión sin poner una clave en un archivo de configuración.
claude mcp add --transport http indeed "https://mcp.hasdata.com/api/mcp?apis=indeed" \
--header "x-api-key: HASDATA_API_KEY"Configuración, luego Conectores, luego Añadir conector personalizado, y pega https://mcp.hasdata.com/api/mcp?apis=indeed e inicia sesión.
Para la ruta del archivo de configuración, Claude Desktop solo carga servidores locales (stdio), así que alcanza un servidor remoto a través de un lanzador stdio. El paquete @hasdata/indeed-mcp es ese lanzador, y lee la clave del entorno. Añade esto a claude_desktop_config.json:
{
"mcpServers": {
"indeed": {
"command": "npx",
"args": ["-y", "@hasdata/indeed-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}Para Python en lugar de Node, cambia el lanzador por el paquete de PyPI, que uvx ejecuta sin instalación manual:
{
"mcpServers": {
"indeed": {
"command": "uvx",
"args": ["hasdata-indeed-mcp"],
"env": { "HASDATA_API_KEY": "YOUR_KEY" }
}
}
}~/.cursor/mcp.json para cada proyecto, o .cursor/mcp.json para uno solo:
{
"mcpServers": {
"indeed": {
"url": "https://mcp.hasdata.com/api/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}~/.codeium/windsurf/mcp_config.json. Windsurf llama al campo serverUrl, no url:
{
"mcpServers": {
"indeed": {
"serverUrl": "https://mcp.hasdata.com/api/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}.vscode/mcp.json en el espacio de trabajo:
{
"servers": {
"indeed": {
"type": "http",
"url": "https://mcp.hasdata.com/api/mcp?apis=indeed",
"headers": { "x-api-key": "HASDATA_API_KEY" }
}
}
}Ejemplos de prompts
Son prompts, no código. Pega uno y el agente elige la herramienta por sí mismo. Cada uno indica las llamadas que requiere, porque cada llamada correcta cuesta 5 créditos.
Busca en Indeed ofertas de “python developer” en Nueva York ordenadas por fecha y dame las diez más recientes con empresa y salario.
Una llamada, 5 créditos. Una página de listado ya incluye empresa, salario y fecha de publicación.
Toma la primera oferta de esa búsqueda y extrae su descripción completa y sus requisitos.
Una llamada, 5 créditos. El listado incluye una URL de empleo, que la herramienta de detalles acepta directamente.
Busca ofertas de “data analyst” en Austin y luego extrae los detalles completos de las tres que indican salario.
Cuatro llamadas, 20 créditos. Un listado y, después, una llamada de detalles por cada una de las tres.
Compara los salarios publicados para “registered nurse” en Chicago con los de Houston.
Dos llamadas, 10 créditos, un listado por ciudad.
El salario aparece en un listado solo cuando la oferta lo indica, así que un prompt de “empleos con salario” filtra por ese campo en lugar de darlo por hecho. Paginar cuesta una llamada cada vez, mediante el desplazamiento start.
Herramientas
Dos herramientas, de solo lectura. Los ejemplos siguientes están recortados de llamadas reales, y las cifras cambian según Indeed se actualiza. Interprétalos como estructuras. El nombre de cada herramienta enlaza a su referencia de endpoint, que incluye la lista completa de campos.
Las muestras son el payload, no la respuesta completa. Un resultado de tools/call contiene un bloque de texto, y ese texto es a su vez JSON con url, status, text y json, con los datos extraídos en json. Desde una respuesta JSON-RPC cruda, la ruta es result.content[0].text, que se parsea, y luego .json. Un cliente de chat desenvuelve eso por ti; el código que habla directamente con el endpoint, no.
Obtener listados de empleo de Indeed
hasdata_indeed_listing_getJobListings
Una página de resultados de búsqueda por palabra clave y ubicación.
Parámetro | Tipo | Requerido | Notas |
| string | sí | El término de búsqueda, tal como lo escribiría un candidato |
| string | sí | Ciudad y estado, o cualquier cadena de ubicación que Indeed acepte |
| string |
| |
| string | Un sitio de país como | |
| number | Desplazamiento de resultados para la siguiente página, un número y no una URL. Lee el desplazamiento de |
Devuelve searchInformation, un array jobs, peopleAlsoSearchFor y pagination, cuyo nextPage es la URL de la página siguiente. Cada empleo incluye title, company, location, url, una description breve, sponsored, la date relativa y la isoDate absoluta, un array details con etiquetas como Full-time y Hybrid work, un array benefits y un objeto salary cuando la oferta indica uno.
Un listado trae
detailscomo un array de cadenas simples. La herramienta de detalles de empleo, más abajo, devuelvedetailscomo un objeto con arraysjobTypeyworkSetting. Mismo nombre, distinta forma, así que lee cada uno según su propia herramienta.
{
"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" }
}Obtener detalles de empleo de Indeed
hasdata_indeed_job_getJobDetails
Una oferta completa, a partir de su URL de empleo.
Parámetro | Tipo | Requerido | Notas |
| string | sí | Una URL de oferta, el campo |
Devuelve title, company, location, sponsored, un objeto details con arrays jobType y workSetting, un objeto salary cuando está presente, y el cuerpo de la oferta tanto en description (texto plano) como en descriptionHtml (el mismo contenido con su marcado de listas y párrafos conservado). Usa descriptionHtml cuando quieras la estructura y description cuando quieras pasar texto limpio a un modelo.
{
"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>"
}Errores y rutas de fallo
Tu cliente casi nunca ve un código de error HTTP en una llamada de herramienta. La capa MCP responde con 200 y coloca el fallo dentro del resultado, con isError establecido en true y el motivo como texto. El agente lee un mensaje donde cabría esperar una línea de estado.
Una clave incorrecta aparece como salida de herramienta, no como una conexión fallida. tools/list acepta cualquier clave no vacía y devuelve ambas herramientas, así que el cliente completa el handshake y se muestra en verde. La primera llamada a una herramienta responde entonces con isError: true y el texto HasData API error: 401 Unauthorized. Presta atención a esa cadena, porque nada antes en el flujo informa del problema.
Una clave ausente es el único error HTTP real. La autorización se ejecuta antes que cualquier herramienta, y la propia conexión falla con 401. Las cabeceras CORS están presentes, y un cliente de navegador lee el estado y no un fallo de red opaco.
Un argumento que rompe el esquema de una herramienta se rechaza antes de convertirse en un scraping. El servidor responde con isError: true y el texto MCP error -32602: Input validation error, indicando el campo problemático. No se obtiene nada y no se cobra nada.
Una búsqueda sin coincidencias devuelve un resultado correcto con un array jobs vacío, no un error. Una combinación de palabra clave y ubicación sin vacantes sigue volviendo con requestMetadata.status establecido en ok. Comprueba la longitud del array antes de iterar.
Una oferta que se ha retirado devuelve 400 con requestMetadata.status establecido en error. Indeed caduca los listados rápidamente, así que una URL de una búsqueda antigua puede haber desaparecido.
Los resultados que contienen datos también incluyen un requestMetadata.id que conviene citar en el soporte.
Precios, plan gratuito y límites
Cada herramienta de Indeed cuesta 5 créditos por llamada correcta. El tamaño de la respuesta no cambia el precio. Una página de listado con cincuenta ofertas cuesta lo mismo que una con dos.
La prueba gratuita es de 1.000 créditos durante 30 días sin tarjeta, lo que equivale a 200 llamadas a Indeed. Después, una cuenta activa sigue recibiendo 100 créditos cada día cuando su saldo baja de 100, así que un agente de bajo volumen funciona indefinidamente en el plan gratuito.
Los planes de pago empiezan en 49 $ al mes por 200.000 créditos, es decir, 40.000 llamadas. El precio unitario baja con el volumen, desde 1,23 $ por 1.000 llamadas en el plan inicial hasta 0,50 $ en Business, 0,42 $ en Growth y 0,37 $ en los planes de alto volumen más grandes.
Tu plan también fija la concurrencia. La prueba gratuita permite 1 solicitud a la vez, Startup 15, Business 30, Growth 50, y los planes de alto volumen van de 200 a 1.500. Maneja el caso de desbordamiento de forma defensiva en cualquier proceso desatendido.
Una solicitud que responde con un código distinto de 200 no se factura. Una llamada correcta que no encuentra nada sigue siendo una llamada.
Selección de herramientas
El parámetro de consulta apis decide qué herramientas ve tu agente. Menos herramientas significa menos contexto dedicado a las definiciones de herramientas y menos probabilidades de que el modelo elija la equivocada.
?apis=indeed the two tools in this repo
?apis=indeed,glassdoor add Glassdoor jobs
?apis=indeed,google_serp add Google searchEl parámetro acepta nombres de proveedor como indeed y nombres de API individuales como indeed_listing. Los nombres mal escritos se ignoran. Si todos los nombres son incorrectos, la solicitud falla con 400 y el cuerpo enumera tanto lo que no reconoció como todos los valores válidos. Si se omite el parámetro, el mismo endpoint expone las 57 herramientas de HasData.
Cómo se compara
Indeed retiró sus API públicas de Publisher y Job Search, y el acceso programático ahora pasa por asociaciones aprobadas e integraciones de ATS en lugar de una clave de autoservicio. Para leer listados y ofertas públicas en búsquedas arbitrarias, no existe una vía oficial abierta.
Acceso oficial de Indeed | Este servidor | |
Acceso | Aprobación de socio o de ATS | Una clave y una URL |
Alcance | Lo que conceda la asociación | Cualquier búsqueda u oferta pública |
Configuración | Revisión empresarial | Ninguna |
Salida | Depende de la integración | JSON estructurado, salario preprocesado |
Escritura | Flujos de solicitud para socios aprobados | Solo lectura, solo datos públicos |
Lo que este servidor no hace. Sin envío de solicitudes, sin panel de empleador, sin datos de candidatos, sin ofertas privadas. Lee lo que puede ver un visitante que no ha iniciado sesión.
FAQ
¿Existe un servidor MCP oficial de Indeed?
Indeed no publica uno. Este está mantenido por HasData y lee páginas públicas, por lo que no necesita una cuenta de desarrollador de Indeed.
¿Qué es un servidor MCP de Indeed?
Un servidor que expone los datos de empleo de Indeed como herramientas que un cliente de IA puede llamar. El cliente envía una llamada de herramienta a través del Model Context Protocol, el servidor obtiene los datos y devuelve JSON estructurado, y el modelo trabaja con el resultado. Este expone dos herramientas y se ejecuta de forma remota.
¿Necesito una clave de API de Indeed o una cuenta de socio?
No. La única credencial es tu clave de HasData. No hay ninguna cuenta de Publisher que solicitar, porque las herramientas leen páginas públicas de Indeed.
¿Cómo navego por más de una pantalla de resultados?
Pasa el desplazamiento start a la herramienta de listados como un número, no como una URL. La respuesta devuelve pagination.nextPage, cuyo propio valor start es el desplazamiento para la siguiente página, así que lee ese número y pásalo de vuelta en lugar de introducir la URL.
¿Por qué a veces falta el salario?
Porque la oferta no indica uno. El objeto salary solo está presente cuando Indeed muestra una cifra. Léelo de forma defensiva.
¿Puedo usar esto junto con otras APIs de HasData?
Sí. El parámetro apis acepta una lista, y ?apis=indeed,glassdoor le da a tu agente Indeed más Glassdoor. Elimina el parámetro y obtienes todo.
Cumplimiento y datos personales
HasData accede únicamente a datos disponibles públicamente. Los términos de una plataforma pueden restringir el acceso automatizado, y tú eres responsable de tu propio cumplimiento. Cuando los datos que recopiles incluyan información personal, asegúrate de tener una base jurídica conforme al GDPR, el CCPA o las normas equivalentes de tu jurisdicción.
Enlaces de HasData
Página del producto y generador de solicitudes | |
Documentación del servidor | |
Las 57 herramientas en un solo servidor | |
Tutoriales de clientes | |
Todo lo demás que extraemos | |
Planes y costes de créditos | |
Claves y uso | |
Lanzador de Node en npm | |
Lanzador de Python en PyPI |
Desarrollo
Este repositorio es configuración y documentación para un servidor remoto. No hay paso de compilación ni nada que contenerizar.
Las pruebas en test/ verifican el contrato de las herramientas, la parte que puede romperse sin un commit aquí. Comprueban que ?apis=indeed devuelve exactamente dos herramientas, que cada herramienta sigue declarando sus parámetros requeridos, que ningún nombre ha cambiado y que la clave en uso es efectivamente aceptada. Esa última comprobación llama a una herramienta de verdad y cuesta 5 créditos, que es el precio de un canario que puede fallar por la razón correcta.
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm testLa misma suite se ejecuta en CI en cada push y una vez a la semana de forma programada, porque la lista de herramientas upstream puede cambiar sin que nadie toque este repositorio. Un fallo significa que la lista de herramientas cambió, que la clave dejó de funcionar o que el endpoint era inaccesible, y el mensaje de la aserción indica cuál.
Contribuciones
Las correcciones de las tablas de herramientas y de las muestras de respuesta son la contribución más útil, porque son las partes que se desactualizan. Incluye la llamada que hiciste y la respuesta que obtuviste. Las pull requests de forks ejecutan la suite sin clave, y las comprobaciones en vivo se omiten en lugar de ponerse en rojo.
Licencia
MIT. Consulta 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