Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Indeed job listings by keyword and location, and full postings, as structured JSON.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
HASDATA_API_KEY, x-api-key标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"indeed": {
"command": "npx",
"args": [
"-y",
"@hasdata/indeed-mcp"
],
"env": {
"HASDATA_API_KEY": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add --transport http indeed 'https://mcp.hasdata.com/mcp?apis=indeed' --header 'x-api-key: your-value'claude mcp add indeed --env HASDATA_API_KEY=your-value -- npx -y @hasdata/indeed-mcp运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"indeed": {
"url": "https://mcp.hasdata.com/mcp?apis=indeed",
"headers": {
"x-api-key": "your-value"
}
}
}
}粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"indeed": {
"command": "npx",
"args": [
"-y",
"@hasdata/indeed-mcp"
],
"env": {
"HASDATA_API_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"indeed": {
"type": "http",
"url": "https://mcp.hasdata.com/mcp?apis=indeed",
"headers": {
"x-api-key": "your-value"
}
}
}
}粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"indeed": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@hasdata/indeed-mcp"
],
"env": {
"HASDATA_API_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个地址需要在请求的 header 中放入密钥,而添加连接器的菜单无法设置。请改用 Claude Code、Cursor 或 VS Code。
你的选择通过 Cookie 保存在这台设备上,无需账户。
x-api-key 机密 必填 HTTP header这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
我们还没有读取这个服务器的工具列表;我们会轮流检查各个端点。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月6日
注册名称已通过域名 hasdata.com 验证(注册中心会核实域名所有权)
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
尚未检查;我们会轮流检查各个端点
尚未检查;我们会轮流检查各个端点
尚未检查;我们会在检查端点时读取工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:HASDATA_API_KEY, x-api-key
两种方式都可以:安装在你的电脑上,或者连接云端版本。
GitHub 仓库最后更新于–,最新版本(1.0.8)于43天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,所以接受远程 MCP 服务器的应用也可以使用,例如开启开发者模式的 ChatGPT。
同一分类中有:Spec Driven Development, Remote Desktop Commander, LickityClick
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Create, edit and track LickityClick short links, campaigns and click stats from your AI assistant.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A hosted Indeed MCP server that gives Claude, Cursor, Windsurf and any other MCP client two read-only Indeed tools. Search job listings by keyword and location, and read a single posting in full, all as structured JSON, with no Indeed developer account and no partner approval.
It reads public job postings that a signed-out visitor can see.
1,000 free credits every month, no card required, which is 100 Indeed calls.
https://mcp.hasdata.com/mcp?apis=indeed
An MCP client and a HasData API key from the dashboard, free to create with no card, and the free tier covers about 100 calls a month at the 10-credit rate. This is a remote server, so the simplest path is a URL and an x-api-key header, with no container to run and no Indeed developer account anywhere in the flow. A client that only speaks stdio reaches it through a thin launcher, published as @hasdata/indeed-mcp on npm and hasdata-indeed-mcp on PyPI, shown below.
The server URL is the same for every client. We run it hands-on in Claude Code and Claude Desktop. The other blocks follow each client's own documented format for a remote server.
| Field | Value |
|---|---|
| URL | https://mcp.hasdata.com/mcp?apis=indeed |
| Transport | HTTP, streamable |
| Auth header | x-api-key: HASDATA_API_KEY |
Clients with OAuth support can add the same URL as a connector and sign in without putting a key in a config file.
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, then Connectors, then Add custom connector, then paste https://mcp.hasdata.com/mcp?apis=indeed and sign in.
For the config-file route, Claude Desktop loads only local (stdio) servers, so it reaches a remote server through a stdio launcher. The @hasdata/indeed-mcp package is that launcher, and it reads the key from the environment. Add this to claude_desktop_config.json:
{
"mcpServers": { "indeed": { "command": "npx", "args": ["-y", "@hasdata/indeed-mcp"], "env": { "HASDATA_API_KEY": "YOUR_KEY" } } } }
For Python instead of Node, swap the launcher for the PyPI package, which uvx runs without a manual install:
{
"mcpServers": { "indeed": { "command": "uvx", "args": ["hasdata-indeed-mcp"], "env": { "HASDATA_API_KEY": "YOUR_KEY" } } } }
Cursor
~/.cursor/mcp.json for every project, or .cursor/mcp.json for one:
{
"mcpServers": { "indeed": { "url": "https://mcp.hasdata.com/mcp?apis=indeed", "headers": { "x-api-key": "HASDATA_API_KEY" } } } }
Windsurf
~/.codeium/windsurf/mcp_config.json. Windsurf calls the field serverUrl, not url:
{
"mcpServers": { "indeed": { "serverUrl": "https://mcp.hasdata.com/mcp?apis=indeed", "headers": { "x-api-key": "HASDATA_API_KEY" } } } }
VS Code
.vscode/mcp.json in the workspace:
{
"servers": { "indeed": { "type": "http", "url": "https://mcp.hasdata.com/mcp?apis=indeed", "headers": { "x-api-key": "HASDATA_API_KEY" } } } }
Prompts, not code. Paste one in and the agent picks the tool itself. Each is annotated with the calls it takes, because every successful call costs 10 credits.
Search Indeed for "python developer" jobs in New York sorted by date, and give me the ten most recent with company and salary.
*One call, 10 credits. A listing page carries company, salary and posted date already.*
Take the top posting from that search and pull its full description and requirements.
*One call, 10 credits. The listing carries a job URL, which the details tool takes directly.*
Find "data analyst" jobs in Austin, then pull full details on the three that list a salary.
*Four calls, 40 credits. One listing, then one details call for each of the three.*
Compare the salaries posted for "registered nurse" in Chicago against Houston.
*Two calls, 20 credits, one listing per city.*
Salary is on a listing only when the posting states one, so a "jobs with salary" prompt filters on the field rather than assuming it. Paging costs a call each time, through the start offset.
| Tool | What it returns |
|---|---|
hasdata_indeed_job_getJobDetails | Job title, company, location, salary/compensation, employment type, posted date, full description, requirements/benefits, and apply URL. 10 credits a call |
hasdata_indeed_listing_getJobListings | An array of jobs with title, company, location, salary, posted date, job URL, and jobKey for the requested page. 10 credits a call |
Two tools, read-only. Samples below are trimmed from real calls, and the numbers move as Indeed updates. Read them as shapes. Each tool name links to its endpoint reference, which carries the full field list.
The samples are the payload, not the whole response. A tools/call result carries one text block, and that text is itself JSON holding url, status, text and json, with the scraped data under json. From a raw JSON-RPC response the path is result.content[0].text, parsed, then .json. A chat client unwraps that for you and code talking to the endpoint directly does not.
hasdata_indeed_listing_getJobListings
A page of search results by keyword and location.
| Parameter | Type | Required | Notes |
|---|---|---|---|
keyword | string | yes | The search term, as a candidate would type it |
location | string | yes | City and state, or any location string Indeed accepts |
sort | string | relevance by default, or date for newest first | |
domain | string | A country site such as au.indeed.com. Defaults to the US site | |
start | number | Result offset for the next page, a number and not a URL. Read the offset from pagination.nextPage in the previous response |
Returns searchInformation, a jobs array, peopleAlsoSearchFor, and pagination whose nextPage is the URL of the following page. Each job carries title, company, location, url, a short description, sponsored, the relative date and the absolute isoDate, a details array of labels like Full-time and Hybrid work, a benefits array, and a salary object when the posting states one.
A listing carries
detailsas an array of plain strings. The job-details tool below returnsdetailsas an object withjobTypeandworkSettingarrays. Same name, different shape, so read each per its own tool.
{
"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" } }
hasdata_indeed_job_getJobDetails
One posting in full, by its job URL.
| Parameter | Type | Required | Notes |
|---|---|---|---|
url | string | yes | A posting URL, the url field from a listing result |
Returns title, company, location, sponsored, a details object with jobType and workSetting arrays, a salary object when present, and the posting body in both description (plain text) and descriptionHtml (the same content with its list and paragraph markup kept). Use descriptionHtml when you want the structure and description when you want to feed clean text to a model.
{
"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": " Overview We are seeking a Python Developer... " }
The server ships one prompt, a ready-made workflow a client can offer instead of making the user compose a tool call.
| Prompt | What it does |
|---|---|
indeed_hiring_map | See where a role is being hired for and at what salary. |
Alongside them the server exposes 4 resources, one per parameter whose accepted values are a fixed list. Reading one is cheaper than learning the vocabulary from a rejected call, and it costs no credits. Each URI is hasdata://indeed/ .
| Parameter | Values | What it selects |
|---|---|---|
sort | 2 | The sorting option for the search results. |
domain | 62 | The domain of the Indeed site (optional). |
datePosted | 4 | Returns only jobs posted within the given number of days. |
remoteType | 2 | Returns only remote (remote) or hybrid (hybrid) jobs. In the US, Indeed ties fully remote jobs to the country rather than a city, so use a country-wide location such as United States: with a city, Indeed returns few or no remote jobs. |
Both lists are served without an API key, so a client can read them before a user has signed up.
Your client almost never sees an HTTP error code from a tool call. The MCP layer answers 200 and puts the failure inside the result, with isError set to true and the reason as text. The agent reads a message where you might expect a status line.
A wrong key surfaces as tool output, not as a failed connection. tools/list accepts any non-empty key and returns both tools, so the client completes its handshake and shows green. The first tool call then comes back with `isError: tr
只显示了开头部分;其余内容请在仓库中阅读