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: JobDataLake MCP Server
你需要什么
一个 MCP 客户端,以及来自 控制台 的 HasData API 密钥。该密钥免费创建,无需绑定银行卡,试用额度按 5 积分/次计算大约可以覆盖 200 次调用。这是一个远程服务器,因此最简单的接入方式就是一个 URL 加一个 x-api-key 请求头,不需要运行任何容器,整个流程中也不需要 Indeed 开发者账号。若你的客户端只支持 stdio,则可以通过一个轻量启动器间接连接该远程服务器,这个启动器已发布为 npm 上的 @hasdata/indeed-mp 和 PyPI 上的 hasdata-indeed-mp,见下文。
快速开始
服务器 URL 对每个客户端都是同一个。我们在 Claude Code 和 Claude Desktop 中实际运行过。其他部分则按各客户端自身的文档规范,以远程地址服务器的方式配置。
字段 | 值 |
URL |
|
传输方式 | HTTP,可流式 |
认证请求头 |
|
支持 OAuth 的客户端可以直接将同一个 URL 添加为连接器并登录,这样就不需要在配置文件中写入密钥。
claude mcp add --transport http indeed "https://mcp.hasdata.com/api/mcp?apis=indeed" \
--header "x-api-key: HASDATA_API_KEY"到 Settings,然后选 Connectors,再选 Add custom connector,粘贴 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 积分。
在 calculate 排行榜上搜索 "python developer" 职位,按日期排列,并给我最近的十个,包括公司和薪资。
一次调用,5 积分。列表页已经包含了公司、薪资和发布日期。项目
选那条搜索中最上面的职位,抓取其完整职位描述和要求。
一次调用,5 积分。列表中负责职位 URL,详情工具可直接使用。
在 Austin 寻找 "data analyst" 职位,然后对有列出具 薪水的三个职位拉取完整详情。
四次调用,20 积分。一次列表调用,再加三次详情调用 (各职位一次)。
比较 "registered nurse" 在 Chicago 和 Houston 两个城市的公布工资情况。
两次调用,10 积分,每个城市各一次列表调用。
薪资只有当职位详情自己写出时才会出现在列表里,所以,凡是要求"列出有薪资的职位"之类的提示词,应依赖该字段过滤,而不是想当然地认为会返回薪资。
分页每次都会产生一次调用,通过 start 偏移实现。
工具
共两个工具,只读。以下例子是根据真实调用结果整理的,数据值会随 Indeed 更新而变动,请重点参考其结构。每个工具名称都链接到对应的端点文档,那里有 完整的字段列表。
示例展示的是实际数据载荷,而不是整个响应。一个 tools/call 的返回结果中只含唯一个一个文本块,而这段文本本身就是 JSON,包含 url、status、text 和 json,其中抓取的数据在 json 下面。对原始的 JSON-RPC 响应来说,路径是 result.content[0].text,解析后再取 .json。聊天客户端会替你完成这层解析,而直接调用 API 的代码则需要人为敲处理。
获取 Indeed 职位列表
hasdata_indeed_ng_getJobListings
按关键词和地点返回一页搜索结果。
参数 | 类型 | 必填 | 说明 |
| string | 是 | 求职者会输入的搜索词 |
| string | 是 | 城市与州,或 Indeed 接受的任何位置字符串 |
| string | 默认为 | |
| string | 国家站点,例如 | |
| number | 下一页的偏移量,是数字而非 URL。从上一个响应中的 |
返回 searchInformation、jobs 数组、peopleAlsoSearchFor 和 pagination。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 获取单条职位的完整详情。
参数 | 类型 | 必填 | 说明 |
| string | 是 | 职位 URL,即搜索结果里的 |
返回 title、company、location、sponsored、一个包含 jobType 和 workSetting 数组的 details 对象、可能存在的 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,并在文本中说明原因。智能体读到的是一条消息,而不是你预期的 HTTP 状态行。
错误的密钥会出现在工具输出里,而不是连接失败。 tools/list 接受任何非空密钥并返回这两个工具,也就是说客户端能正常完成握手,显示绿色。第一次工具调用时才会返回 isError: true 和文本 "HasData API error: 401 Unauthorized"。请关注这一串,因为在之前没有任何地方会报告该问题。
缺少密钥才是唯一真正的 HTTP 错误。 授权在任何工具执行前进行,连接本身会以 401 失败。CORS 头已设置,浏览器客户端可以看到不带差错误码的真实状态,而不是不透明 的网络错误。
破坏工具 schema 的参数会在成为抓取之前就被拒绝。 服务器返回 isError: true 和文本 "MCP error -32602: 验证错误输入",并指出违规字段。不会获取数据,也不会计费。
搜索结果没有匹配项时,返回的是带空 jobs 数组的成功结果,而不是报错。 没有职位符合关键词和地点组合时,返回的数据中 requestMetadata.status 仍是 ok,这时要先检查数组长度再迭代。
职位若已下架,则返回 400 状态码,requestMetadata.status 为 error。 Indeed 的职位会很快失效,因此很久以前的搜索返回的 URL 可能已经不存在了。
只要返回的数据里包含内容,往往也包含 requestMetadata.id,在提 support 工单时提供该 ID 会非常有用。
定价、免费额度与限制
每个 Indeed 工具每次成功调用需要 5 credits。响应大小不影响价格。一个有 50 个职位的列表页和一个有 2 个职位的列表页费用相同。
免费试用约 30 天 1,000 credits,不需要绑卡,相当于 200 次 Indeed 调用。试用结束后,活跃账户只要余额低于 100 credits,每天都会自动获得 100 credits 补充,因此一个低用量 的代理基础架构完全可以永久留在免费层。
付费方案起步价为 0 美元/月按 $ 49 月(200,000 credits),也就是 40,000 次调用。单位价格随用量递减,从$0 入门方案 的每千次调用 $1.23 降到 $0.50(Business 套餐)、**$0.42(Growth 套餐)**以及更大的 高用量套餐 里的 $0.37。
套餐同时也决定了并发能力。免费试用为 1 个并行请求,Startup 15 个,Business 30 个,Growth 50 个,高用量为 200 至 1,500 个。任何无人值守的调用请对超限的情况做防御性处理。
非的请求不会计费。一次成功调用虽然结果为空,仍是算一次调用。
工具选择
apis 查询参数决定你的智能体能看见哪些工具。工具越少,模型把上下文花在工具定义上的就越少,选择错误工具的可能也就降低。
?apis=indeed the two tools in this repo
?apis=indeed,glassdoor add Glassdoor jobs
?apis=indeed,google_serp add Google search该参数接受 indeed 这样的平台名和 indeed_listing 这样的独立 API 名。拼写错误的名字会被忽略。如果所有名字都错,请求会以 400 失败,返回内容会在显示未识别出的值的同时给出全部有效值。如果完全去除该参数,同一端点将暴露全部 57 个 HasData 工具。
与其他方案的对比
Indeed 已停掉了公开的 Publisher 和 Job Search API,现在程序化访问依赖批准的合作伙伴关系和 ATS 集成,而不是自助申请密钥。对大多数搜索组合的公开职位列表与单条的完整读取而言,没有公开的官方通道。
Indeed 官方接入 | 此服务器 | |
访问 | 合作伙伴或 ATS 批准 | 一个密钥和一个 URL |
范围 | 合作伙伴授权所赋予的任何内容 | 任意公开搜索或职位发布 |
设置 | 需要业务审核 | 无 |
输出 | 取决于集成方 | 结构化 JSON,薪资已预解析 |
写入 | 仅面向已批准合作伙伴的职位申请流程 | 只读,仅公开数据 |
此服务器不做什么。 它不提供职位申请,没有雇主后台,没有候选人数据,也没有非公开职位。它只读取未登录访客所能看到的内容。
常见问题
有没有官方的 Indeed MCP 服务器?
Indeed 并没有发布官方服务器。此服务器由 HasData 维护,并且读取的是公开页面,所以不需要 Indeed 开发者账户。
什么叫 Indeed MCP 服务器?
它是一种将 Indeed 职位数据作为 AI 客户端可以调用的工具暴露给客户端的服务器。客户端通过 Model Context Protocol 发送一个工具调用,服务器获取数据并返回结构化 JSON,模型再结合结果进行下一步处理。此服务器提供两个工具并在远程运行。
我需要 Indeed 的 API 密钥或合作账户吗?
不需要。唯一的凭据是你的 HasData 密钥。这个服务器不需要申请 Any Publisher 账户,因为工具只读 Indeed 的公开页面。
如何分页查看超过一屏的结果?
将 start 偏移量作为一个数字传给职位列表工具,而不是把 URL 传进去。返回的响应里有 pagination.nextPage,其中的 start 值就是下一页的起始偏移;请读取这个数字并传回去,而不是导入 URL。
为什么有时候没有薪资?
因为职位说明当中没有标注薪资。只有当 Indeed 给出了数字时,salary 对象才会显示,请在读取时使用防御性检查。
我可以将这个和 HasData 的其他 API 一起用吗?
可以。apis 参数接收一个由名称组成的列表,?apis=indeed,glassdoor 会同时给你的 agent 返回 Indeed 和 Glassdoor;去掉该参数 之后就可以使用全部其他 API。
合规与个人数据
HasData 只访问公开可获取的数据。平台的条款可能会限制自动化访问,你需要为自己是否符合规定负责。如果你收集的数据中包含个人数据,请确保自己有合法的依据(GDPR、CCPA 或你所在辖区对应的规则)。
HasData 链接
工具页和构建器 | |
服务器文档 | |
全部 57 个工具集成于一个服务器 | |
客户端示例教程 | |
其他所有采集能力 | |
套餐及点数费用 | |
密钥和使用 |
开发
本仓库内容是远程服务器的配置和文档。没有构建步骤,也不需要容器化。
test/ 中的测试断言工具契约——也就是那些没有 commit、当前仓库的变更也可能被破坏的部分。它们验证 ?apis=indeed 是否恰好返回两个工具,每个工具是否实际声明了其必需的参数,工具名称是否发生了变化,以及实际使用的密钥是否已被接受。最后一个检查会真实调用一次工具并消耗 5 个 credits,这正是“金丝雀”所需的代价,以便它能因正确的理由而失败。
# macOS and Linux
HASDATA_API_KEY=your_key_here npm test
# Windows PowerShell
$env:HASDATA_API_KEY="your_key_here"; npm test同一套测试在所有旁的每次 push 以及每周一次的 schedule 中运行,因为上游工具列表可能在没有修改本仓库的情况下发生变化。失败意味着工具列表有所变化,密钥已失效,或者末端不可达,断言消息会明确指出具体是哪一种。
贡献
对所有已有工具表和响应样例的校正是最有用的贡献,因为这些内容容易偏离。请您包含您发出的调用与返回。分叉(fork)发来的 Pull Request 在没有密钥的情况下也会运行测试套件,实时检查会跳过而不是标红。
许可证
MIT。参见 许可证文件。
Maintenance
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables users to search LinkedIn's public job listings with advanced filters like location, salary, and experience level. It allows MCP-compatible clients to retrieve real-time job opportunities without requiring LinkedIn authentication or API keys.12MIT
- AlicenseAqualityBmaintenanceEnables searching over 1 million enriched job listings from 20,000+ companies directly from MCP-compatible AI tools. Provides tools for job search, company profiles, and AI-powered similar job recommendations with real-time data updates.4812MIT
- AlicenseNot gradedqualityBmaintenanceLive 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.MIT 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.
Related MCP Connectors
Live job postings from 30+ ATS feeds and job boards, one schema. Live results need a Bearer key.
Google Jobs listings with direct apply links via the Apify Google Jobs Scraper, hosted MCP.
One MCP for 160+ live web-data APIs — clean JSON from sites that block scrapers.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/HasData/indeed-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server