# Headcount Labs (remote · api.headcountlabs.com)

Job postings search: find, count and read open jobs from employer career sites, with pay and links.

- Trust score: 76/100 (medium)
- Change this week: +9
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- remote · `api.headcountlabs.com`: 38/100, [markdown](https://verifymcp.io/servers/com-headcountlabs-jobs/api.md), [page](https://verifymcp.io/servers/com-headcountlabs-jobs/api)
- remote · `api.headcountlabs.com`: 76/100 (this document), [markdown](https://verifymcp.io/servers/com-headcountlabs-jobs/mcp-public.md), [page](https://verifymcp.io/servers/com-headcountlabs-jobs/mcp-public)

## Channel facts

- Endpoint: `https://api.headcountlabs.com/mcp/public`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.2.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Endpoint Security**: 80/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3099 tokens (~238/item across 13 items; 9 tools + 4 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 83% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the Headcount Labs MCP server?

Headcount Labs is a hosted endpoint at https://api.headcountlabs.com/mcp/public, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-headcountlabs-jobs 'https://api.headcountlabs.com/mcp/public'
```

### Cursor

```json
{
  "mcpServers": {
    "com-headcountlabs-jobs": {
      "url": "https://api.headcountlabs.com/mcp/public"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-headcountlabs-jobs": {
      "type": "http",
      "url": "https://api.headcountlabs.com/mcp/public"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-headcountlabs-jobs]
url = "https://api.headcountlabs.com/mcp/public"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-headcountlabs-jobs": {
      "type": "remote",
      "url": "https://api.headcountlabs.com/mcp/public",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-headcountlabs-jobs --url 'https://api.headcountlabs.com/mcp/public' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-headcountlabs-jobs:
    url: "https://api.headcountlabs.com/mcp/public"
```

### Netclaw

```json
{
  "McpServers": {
    "com-headcountlabs-jobs": {
      "Transport": "http",
      "Url": "https://api.headcountlabs.com/mcp/public"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-headcountlabs-jobs -t streamable-http -u 'https://api.headcountlabs.com/mcp/public'
```

### Other

```json
{
  "mcpServers": {
    "com-headcountlabs-jobs": {
      "type": "http",
      "url": "https://api.headcountlabs.com/mcp/public"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-22 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-20 (score 75, +7)

- [security regression] A breaking change shipped without a version bump: still 1.0.0
- [security regression] Tool “market_insights” was removed
- [security improvement] HSTS header: fail → pass
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “count_jobs” rewrote its description, which is the text the model reads
- [security] Tool “get_job” rewrote its description, which is the text the model reads
- [security] Tool “list_fields” rewrote its description, which is the text the model reads
- [security] Tool “search_docs” rewrote its description, which is the text the model reads
- [security] Tool “search_jobs” rewrote its description, which is the text the model reads
- [functional improvement] Schema quality: 369 → 238
- [functional improvement] Tool coverage: 71% → 83%
- [functional] The server now declares the “resources” capability
- [functional] First check of Capabilities: pass
- [functional] First check of Schema quality: 100
- [functional] New resource “job_cards”
- [functional] New resource “job_cards_v1”
- [functional] New resource “job_cards_v2”
- [functional] New resource “job_cards_v3”
- [functional] New tool “market_breakdown”
- [functional] New tool “market_dimensions”
- [functional] New tool “market_lookup”
- [functional] New tool “salary_range”
- [cosmetic] “get_job” added an optional parameter “view”
- [cosmetic] “count_jobs” reworded the description of “group_by”
- [cosmetic] “search_jobs” reworded the description of “limit”
- [cosmetic] “search_jobs” reworded the description of “descriptions”

### 2026-10-19 (score 68, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “search_jobs” rewrote its description, which is the text the model reads
- [cosmetic] “search_jobs” added an optional parameter “view”

### 2026-10-18 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-16 (score 67, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [functional regression] Schema quality: 183 → 344
- [functional improvement] Tool coverage: 38% → 70%
- [functional improvement] Stability: unverified → 0.03
- [functional] New tool “market_insights”

### 2026-10-15 (score 67)

First indexed and scored.

## MCP tools (9)

### `search_docs` (~64 tokens)

Search the Headcount Labs docs

Ask a question about Headcount Labs (filters, limits, MCP setup, errors) and get the best-matching sections of the headcountlabs.com docs, each with its URL. Works without an account.

Input parameters:

- `limit` (integer)
- `question` (string, required)

### `search_jobs` (~578 tokens)

Search jobs

Search current job postings by keyword, title, company, place, pay, date and more. No account needed. Call list_fields to find the filter names. Country and employment_type accept comma-separated values or arrays and match any listed value. Pages return up to 50 jobs (limit, default 10), or up to 10 jobs when descriptions is "full"; a larger limit is refused. Pass next_cursor as cursor to see the next page. One search shows up to 250 jobs in total (the last page is shortened to fit), so narrow it with filters to find the right ones; count_jobs tells you how many jobs match without listing them. sort is relevance (best match) or updated (most recently updated). By default each job is a compact summary: rank, job_id, job_ad (the employer-written title, employer and a 200-character snippet of the description), company_id, locations, work_arrangement, pay (min, max, currency, period), posted_at, first_seen_at, posting_url and apply_url. For every field of each job pass view: "full" (descriptions cut to 400 characters, or descriptions: "full" for the whole text), name the top-level properties you need in fields (job_id is always included), or call get_job for one job. You choose how much description each job gets: descriptions: "snippet" (the default) gives a short preview and allows up to 50 jobs per page; descriptions: "full" gives the whole text but allows only 10 jobs per page. To read the full text of just a few jobs, search with snippets, then call get_job on the ones you want. Leave description out of fields to drop it entirely. For job titles, title matches the words as one phrase in that order, so "senior software engineer" misses "Software Engineer, Senior"; title_advanced matches words in any order with AND, OR and NOT, for example senior AND ("software engineer" OR "software developer"), and usually finds more.

Input parameters:

- `cursor` (string): The next_cursor from the previous result, to see the next page.
- `descriptions` (string): snippet (default): a short preview of each description, up to 50 jobs per page. full: the whole text, up to 10 jobs per page.
- `fields`: Top-level job properties as a comma-separated string or field array; job_id is always included.
- `filters` (object)
- `limit` (integer): Jobs per page, 1-50 (1-10 when descriptions is "full"). Default 10.
- `sort` (string)
- `view` (string): compact (default): one short summary per job. full: every field of every job, as the REST API returns it.

### `get_job` (~231 tokens)

Get job details

Get a job by its job_id. No account needed. By default the answer has the same compact shape search_jobs returns (rank 1, job_id, job_ad, company_id, locations, work_arrangement, pay, posted_at, first_seen_at, posting_url, apply_url) with the whole description in job_ad.description, currentness, stale and last_checked_at (is it still open, and when was it last checked), and every linked posting in postings (status, last_fetched_at, application_check). Pass view: "full" for every field as the REST API returns it. Use fields to select top-level job properties; job_id is always included.

Input parameters:

- `fields`: Top-level job properties as a comma-separated string or field array; job_id is always included.
- `job_id` (string, required)
- `view` (string): compact (default): the same summary search_jobs returns, plus the whole description, whether the job is still open, when it was last checked, and the linked postings. full: every field of the job, as…

### `count_jobs` (~353 tokens)

Count jobs

Count the current jobs matching the filters, without listing them. This is the live count: it reads the job database as it is now, so use it for "how many jobs" and "which employers are hiring" questions, and prefer its numbers over market_lookup and market_breakdown, which read a daily snapshot. No account needed. To answer "which companies are hiring for X" or "how are these jobs split by ...", pass group_by: employer (company works too), work_arrangement (remote, hybrid or in_person), title, state (US), city (metro works too), country or employment_type. The answer then also has group_by, groups (the top 25 values by number of matching jobs, each with value and jobs), groups_from_jobs (how many matching jobs were grouped, at most 1,000, taken in the default list order), groups_sampled (true when more jobs matched than were grouped, so the counts are from a sample) and groups_unknown_jobs (grouped jobs with no known value). A job with several locations or postings can count under more than one value. group_by employer keeps its own keys: employers (each with employer_name, company_id and jobs), employers_from_jobs, employers_sampled and employers_unknown_jobs. When a filter is too broad to count exactly in time, count is an estimate: the answer then has count_is_estimate: true, count_margin (the 95% range either side of count) and count_note.

Input parameters:

- `filters` (object)
- `group_by` (string): Break the matching jobs down by employer (company), work_arrangement, title, state, city (metro), country or employment_type.

### `market_lookup` (~373 tokens)

Look up a job market figure

Job count, pay percentiles, share of jobs showing pay, remote/hybrid/in-person shares, posting age, new postings or top employers for up to two of title, place, company, seniority, employment_type and remote, such as the pay range for Registered Nurses in Texas. Leave metric out for every figure. Answers come from a daily snapshot of open US jobs and give their as_of date; for current job counts or the employers hiring right now, count_jobs is the live source. Cells with fewer than 30 jobs are left out. No account needed.

Input parameters:

- `company` (string): An employer name (lookup and breakdown).
- `employment_type` (string): full_time, part_time, contract, temporary, internship or per_diem (lookup and breakdown).
- `metric` (string): lookup only: job_count, pay, pay_share, work_arrangement, posting_age, new_postings or top_employers; leave out for all of them.
- `place` (string): US (the default), a state code such as TX, a state name, a metro area such as "Austin-Round Rock-Georgetown, TX" or a city such as "Austin, TX" (cities and metros only for lookup, breakdown and negot…
- `remote` (string): remote, hybrid or in_person (lookup and breakdown).
- `role` (string): A standard job title such as "Registered Nurse" or "Software Engineer"; leave out for every job. Same as title.
- `seniority` (string): intern, entry, senior, lead, manager, director or executive, read from the job title (lookup, breakdown, negotiate).
- `title` (string): A standard job title; lookup, breakdown and negotiate match more than 6,000 titles. Same as role.

### `market_breakdown` (~429 tokens)

Rank a job market dimension

Rank the values of one dimension (by: title, state, metro, city, company, seniority, employment_type or remote) by jobs, pay or another figure, over all jobs or inside one filter, such as which states pay Software Engineers the most (by=state, title=Software Engineer, sort=pay_median). Answers come from a daily snapshot of open US jobs and give their as_of date; for current job counts or the employers hiring right now, count_jobs is the live source. Cells with fewer than 30 jobs are left out. No account needed.

Input parameters:

- `by` (string): breakdown only: what to rank (title, state, metro, city, company, seniority, employment_type or remote; place means state).
- `company` (string): An employer name (lookup and breakdown).
- `employment_type` (string): full_time, part_time, contract, temporary, internship or per_diem (lookup and breakdown).
- `limit` (integer): breakdown rows or dimension values to return.
- `place` (string): US (the default), a state code such as TX, a state name, a metro area such as "Austin-Round Rock-Georgetown, TX" or a city such as "Austin, TX" (cities and metros only for lookup, breakdown and negot…
- `remote` (string): remote, hybrid or in_person (lookup and breakdown).
- `role` (string): A standard job title such as "Registered Nurse" or "Software Engineer"; leave out for every job. Same as title.
- `seniority` (string): intern, entry, senior, lead, manager, director or executive, read from the job title (lookup, breakdown, negotiate).
- `sort` (string): breakdown only: jobs (the default), pay_median, pay_p75, pay_p90, share_with_pay, remote_share, new_7_days or new_30_days.
- `title` (string): A standard job title; lookup, breakdown and negotiate match more than 6,000 titles. Same as role.

### `salary_range` (~261 tokens)

Salary range for a role

What salary to ask for: for a title, a place (default US) and an optional seniority, the 25th, 50th, 75th and 90th percentile of posted pay, the sample size and a plain recommendation. Answers come from a daily snapshot of open US jobs and give their as_of date; for current job counts or the employers hiring right now, count_jobs is the live source. Cells with fewer than 30 jobs are left out. No account needed.

Input parameters:

- `place` (string): US (the default), a state code such as TX, a state name, a metro area such as "Austin-Round Rock-Georgetown, TX" or a city such as "Austin, TX" (cities and metros only for lookup, breakdown and negot…
- `role` (string): A standard job title such as "Registered Nurse" or "Software Engineer"; leave out for every job. Same as title.
- `seniority` (string): intern, entry, senior, lead, manager, director or executive, read from the job title (lookup, breakdown, negotiate).
- `title` (string): A standard job title; lookup, breakdown and negotiate match more than 6,000 titles. Same as role.

### `market_dimensions` (~101 tokens)

List market dimensions

List what market_lookup, market_breakdown and salary_range accept: the dimensions, how many values each has and the metrics; with dimension (and optionally q) the values of that dimension, such as the metro names. No account needed.

Input parameters:

- `dimension` (string): dimensions only: list the values of this dimension.
- `limit` (integer): breakdown rows or dimension values to return.
- `q` (string): dimensions only: search the values of dimension.

### `list_fields` (~116 tokens)

List job fields and filters

Find the search_jobs filters and the job fields that match some keywords, with each one's type and a short description. Pass words such as ["pay", "remote"]; no keywords lists everything. kind is filter (pass it in search_jobs filters) or field (a property of each returned job; postings[].x is a property of each linked posting). A field state is an object whose state says whether the source published the value (known), Atlas derived it, the source omitted it, or extraction failed.

Input parameters:

- `keywords` (array)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-headcountlabs-jobs/mcp-public#diagnostics

## Score history

- 2026-10-23: 76
- 2026-10-22: 76
- 2026-10-21: 75
- 2026-10-20: 75
- 2026-10-19: 68
- 2026-10-18: 68
- 2026-10-17: 67
- 2026-10-16: 67
- 2026-10-15: 67

## Common questions

### What is the Headcount Labs MCP server?

Headcount Labs is an MCP server listed in the public MCP registry as com.headcountlabs/jobs. Job postings search: find, count and read open jobs from employer career sites, with pay and links. This page covers its hosted endpoint (https://api.headcountlabs.com/mcp/public).

### Is the Headcount Labs MCP server safe to use?

Headcount Labs scores 76 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Headcount Labs MCP server expose?

Headcount Labs exposes 9 tools: search_docs, search_jobs, get_job, count_jobs, market_lookup, and 4 more. Their descriptions and schemas cost roughly 2,506 tokens of context every time the server is loaded.

### Does the Headcount Labs MCP server require authentication?

No. We connected to Headcount Labs without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Headcount Labs MCP server still maintained?

Headcount Labs is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://api.headcountlabs.com/mcp/public
- Repository: https://github.com/HeadcountLabs/headcountlabs-mcp
- Website: https://headcountlabs.com/mcp/
- Changelog RSS feed: https://verifymcp.io/servers/com-headcountlabs-jobs/mcp-public.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-headcountlabs-jobs/mcp-public.json
- HTML version of this page: https://verifymcp.io/servers/com-headcountlabs-jobs/mcp-public
