# Resume Booster Job Board (remote · bwhdazbotpblihdxcmho.supabase.co)

Job search over employers' own hiring systems. Search with no key; a free key opens every read tool.

- Trust score: 66/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `bwhdazbotpblihdxcmho.supabase.co`: 66/100 (this document), [markdown](https://verifymcp.io/servers/work-resumebooster-jobs/functions-v1-agent-mcp.md), [page](https://verifymcp.io/servers/work-resumebooster-jobs/functions-v1-agent-mcp)

## Channel facts

- Endpoint: `https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.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-09-20.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (request_application).
  - 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**: 78/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4322 tokens (~240/item across 18 items; 15 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 7/100
  - Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 94% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the Resume Booster Job Board MCP server?

Resume Booster Job Board is a hosted endpoint at https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp, 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 work-resumebooster-jobs 'https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "work-resumebooster-jobs": {
      "url": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "work-resumebooster-jobs": {
      "type": "http",
      "url": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.work-resumebooster-jobs]
url = "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "work-resumebooster-jobs": {
      "type": "remote",
      "url": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add work-resumebooster-jobs --url 'https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  work-resumebooster-jobs:
    url: "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "work-resumebooster-jobs": {
      "Transport": "http",
      "Url": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add work-resumebooster-jobs -t streamable-http -u 'https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp'
```

### Other

```json
{
  "mcpServers": {
    "work-resumebooster-jobs": {
      "type": "http",
      "url": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp"
    }
  }
}
```

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-09-19 (score 66, 0)

- [security] Tool “employer_hiring_record” rewrote its description, which is the text the model reads
- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 2026-09-04.7 → 2026-09-04.8

### 2026-09-18 (score 66)

First indexed and scored.

## MCP tools (15)

### `search_jobs` (~778 tokens)

Search jobs

Search the live job board (postings pulled directly from employers' own hiring systems, 30-day freshness cap; board_stats carries the live totals). Returns compact job cards — including the board's own parsed pay (salaryMinAnnual/salaryMaxAnnual/salaryPeriod), experience band and minYears, so pay and seniority never have to be re-read out of prose — plus the board's honesty disclosures: exact totals when knowable (countUnavailable otherwise), filters it could not honour (ignoredFilters), words it read as filters (intentFilters), and spelling suggestions. Set agentReadyOnly=true to see only jobs the apply agent can submit to directly.

Input parameters:

- `agentReadyOnly` (boolean): Only jobs the apply agent can submit to on the user's behalf.
- `category` (string): Comma list of category slugs (see board_stats for the live set), max 3.
- `companies` (string): Scope to specific employers: a comma list of companyToken values from job cards (or from the site's employer pages). An employer the board does not carry simply matches nothing; tokens the board drop…
- `country` (string): ISO-2 codes, comma-separated, max 5. E.g. 'US,GB'.
- `department` (string): Substring match on the employer's own department/team text.
- `employmentType` (string): Comma list of: full_time, part_time, contract, temporary, internship.
- `excludeAgencies` (boolean): Hide postings from staffing/recruiting agencies (their job cards carry agency:true). Agencies are served by default; this is an opt-in narrowing.
- `experience` (string): Comma list of seniority bands the POSTING asks for: entry, mid, senior, expert. Rows whose band could not be read are excluded — use maxYears for the candidate's own side of the question.
- `hasStatedPay` (boolean): Only postings that state a salary (excludes the ~87% that don't).
- `includeUnstatedPay` (boolean): WIDENS an active salaryMin/salaryMax band to also admit postings that state no pay at all. Inert with no band set (unpriced rows are already included). The response says salaryStatedOnly when a band…
- `limit` (number): Rows per page, 1-60. Default 20.
- `location` (string): City/state/metro, e.g. 'texas', 'NYC', 'berlin'.
- `maxAgeDays` (number): Only postings from the last N days (1-30).
- `maxYears` (number): Only roles asking for at most N years of experience.
- `offset` (number): Paging offset — pass back the previous response's nextOffset.
- `payBasis` (string): Restrict to hourly or salaried pay.
- `postedAfter` (string): ISO-8601 instant; only postings the EMPLOYER dated after it. Undated rows fall out of this window (unlike maxAgeDays, which falls back to when the board first saw a posting), so this is the strict fo…
- `query` (string): Search terms. Supports exclusions: 'engineer -senior'.
- `remote` (boolean): Only remote-friendly roles.
- `salaryMax` (number): Annual USD-equivalent salary ceiling.
- `salaryMin` (number): Annual USD-equivalent salary floor. Note: only ~13% of postings state pay.
- `sort` (string): Default relevance.
- `vendor` (string): Comma list of hiring-system vendors (greenhouse, lever, ashby, …), max 8.
- `workMode` (string): Comma list of: remote, hybrid, onsite.

Output parameters:

- `agenciesExcluded` (boolean): Row-selecting: disclosed agency inventory is hidden from this page.
- `countUnavailable` (boolean): The board could not count this query exactly — do not report a total.
- `didYouMean` (string)
- `excludedTerms` (array)
- `hasMore` (boolean)
- `ignoredFilters` (array): Filters the board could NOT apply. Results answer a wider question than was asked.
- `intentFilters` (array): Words read out of the query as filters.
- `jobs` (array)
- `nextOffset` (integer): Pass back as `offset` for the next page.
- `salaryStatedOnly` (boolean): Row-selecting: this page excludes the ~87% of postings with no stated pay.
- `total` (integer|null): Exact match count. ABSENT with countUnavailable:true when the board refuses to guess.

### `get_job` (~131 tokens)

Get one job

Full detail for one job id (from search_jobs), including the complete description text and when the employer's feed last confirmed it open. A resumebooster.work/jobs?job=<id> link's id is this argument (and fetch's, check_apply_support's and request_application's). For several ids at once, use get_jobs — it costs ONE call against the daily quota instead of one per posting. Needs a key or a sign-in. With neither, call fetch with the same id.

Input parameters:

- `id` (string, required): The job id, e.g. 'greenhouse:acme:12345'.

Output parameters:

- `agedOut` (object): Past the 30-day freshness cap.
- `agency` (boolean): Present and true when the posting comes from a staffing/recruiting agency.
- `agentReady` (boolean): True when request_application can submit to this hiring system.
- `applyUrl` (string|null)
- `category` (string|null)
- `closed` (object): The board watched this posting come down: title, company, closedAt.
- `company` (string|null)
- `companyToken` (string|null): The employer handle; pass it back in search_jobs `companies`.
- `country` (string|null): ISO-2.
- `department` (string): The employer's own team name. ABSENT when the posting carries none.
- `description` (string): The posting's full text, truncated at 24,000 characters with a [truncated] marker.
- `employmentType` (string|null)
- `experienceBand` (string): ABSENT when the posting's seniority could not be read.
- `id` (string): vendor:employer:externalId — the id every other tool takes.
- `job` (null): Present and null when there is no posting to return; read `closed` / `agedOut` / `notFound` beside it.
- `location` (string|null)
- `minYears` (integer): Years of experience the posting asks for. ABSENT when it names none (~71%).
- `notFound` (boolean): No posting with this id — never on this board, or gone long enough that nothing is remembered.
- `note` (string)
- `postedAt` (string|null): The employer's own date, ISO-8601. Null when the feed carries none — never the date we first saw it.
- `recheckedAt` (string): When the employer's feed was last fetched and still carried this employer's board.
- `salary` (string|null): The employer's own pay text, verbatim and unparsed.
- `salaryCurrency` (string): ISO-4217, as stated. ABSENT when unstated.
- `salaryMaxAnnual` (number): Annual USD-equivalent ceiling. ABSENT when unstated.
- `salaryMinAnnual` (number): Annual USD-equivalent floor, parsed by the board. ABSENT when the posting states no pay — absence is not zero.
- `salaryPeriod` (string): The period the employer stated: hour, month, year. ABSENT when unstated (~89% of the board).
- `title` (string|null)
- `workMode` (string|null): Stated or inferred from title/location; null when neither says.

### `get_jobs` (~165 tokens)

Get several jobs

Full detail for up to 10 job ids in ONE call — the shortlist form of get_job. Each id answers with a card plus its description; ids that closed, aged out or were never on this board come back in `unavailable` with the reason named, so one dead id never costs you the other nine. Set includeDescription=false for cards and freshness only (much smaller, and no vendor fetch). Needs a key or a sign-in.

Input parameters:

- `ids` (array, required): Job ids from search_jobs. Up to 10 per call — each one is a separate detail read that may fetch the employer's page.
- `includeDescription` (boolean): Default true. Descriptions are capped at 8,000 characters here; call get_job for the whole text of one.

Output parameters:

- `jobs` (array)
- `notFetched` (array): Ids past the per-call cap — sent, not read. Call again with these.
- `requested` (integer)
- `returned` (integer)
- `unavailable` (array)

### `check_jobs_open` (~164 tokens)

Check which jobs are still open

Are these postings still on the board? Answers up to 200 ids in one call — the tool for re-verifying a saved shortlist before acting on it, instead of spending a metered get_job per posting. Returns open:{id:boolean} plus the closed ids, and names the basis of the answer: it reads the board's index (a closed posting is one the employer's feed stopped listing), not the employer's site at this instant, and it is a weaker test than get_job's — read `basis` before reporting a posting as live to a person. Needs a key or a sign-in.

Input parameters:

- `ids` (array, required): Job ids from search_jobs. Up to 200 per call; anything past that is named in notChecked rather than silently dropped.

Output parameters:

- `basis` (string): What 'open' means in this answer.
- `checked` (integer)
- `closed` (array): The ids that are no longer on the board.
- `closedCount` (integer)
- `notChecked` (array)
- `open` (object): One entry per id checked.
- `openCount` (integer)

### `check_apply_support` (~86 tokens)

Check apply support

Whether the apply agent can submit an application for this job on the user's behalf, and what that requires. Jobs on non-supported systems still return their direct applyUrl for the human to use. For whether THIS KEY may apply at all, call key_status — this tool answers about the job, not the key. Needs a key or a sign-in.

Input parameters:

- `id` (string, required)

Output parameters:

- `agentReady` (boolean): True when the posting's hiring system is one the apply agent can submit to.
- `applyUrl` (string): The employer's own apply page. ABSENT when the board could not read the posting.
- `jobId` (string)
- `requirements` (array): What applying through the agent needs — or, on a non-supported system, the one line saying the human applies at applyUrl.
- `vendor` (string|null): The hiring-system prefix of the id, e.g. 'greenhouse'. Null when the id carries none.

### `request_application` (~192 tokens)

Request an application

Ask the board's apply agent to submit an application to this job on behalf of the key's owner. Needs an account key (mint one at https://resumebooster.work/agents), an active Agent plan OR a live Agent Pass (bought signed-in at https://resumebooster.work/agents/pass), and a mandate set in Account — call key_status first: it says which of the three is missing, and on a pass how many applications and how much time are left. Every application passes the same gates as the signed-in flow, including the honesty classifier: answers are drawn from the owner's own profile and never invented. Ask the person for a yes on this specific job id before calling. Needs a key or a sign-in.

Input parameters:

- `jobId` (string, required): The job id from search_jobs.
- `note` (string): Optional note stored with the request (not sent to the employer).

Output parameters:

- `accepted` (boolean): False when a gate refused; true when the request is in the agent's queue (or already was).
- `alreadyQueued` (boolean): Accepted only: this job was already in the queue — nothing duplicated, and on a pass nothing spent.
- `company` (string)
- `error` (string): Refused only: what the gate said.
- `fitPct` (number|null): Keyword fit of the résumé on file to this posting, 0-100; null when the posting has no text to score.
- `fix` (string): Refused only: what would change the answer.
- `jobId` (string)
- `note` (string)
- `passApplicationsLeft` (integer|null): Accepted on a pass: applications left on it after this one. Null when a subscription funded the request.
- `queueStatus` (string): With alreadyQueued: the existing row's status.
- `refusedBy` (string): Refused only: the gate — key, jobId, mandate, resume, plan (no Agent plan and no live pass), pass (the pass has no applications left or its clock ended), posting, scope-country, scope-category, scope…
- `title` (string)
- `warning` (string): Accepted but flagged: below the release floor, or a system the agent prepares for rather than submits to.
- `whatHappensNext` (string)

### `application_status` (~59 tokens)

Application status

Status of applications the key owner's agent has requested — queued, submitted, refused (with the refusing gate named), or failed. Needs a key or a sign-in.

Input parameters:

- `limit` (number): Most recent N, default 20, max 50.

Output parameters:

- `applications` (array): Prepared packets and their outcome, newest first.
- `error` (string): Only when this key is not linked to an account.
- `fix` (string)
- `queued` (array): Requests waiting for the hourly preparer, newest first.
- `statusKey` (object): What each status word means.

### `fit_resume` (~233 tokens)

Score a résumé against the board

Score a résumé against open jobs, for an agent holding a CV: reads the occupation out of resumeText (or uses `query` if given), searches the board for it, and scores up to 20 results 0-100 with the matched and missing terms per job. PAID — needs a paid API key, exactly like POST /v1/fit on the data API, or a live Agent Pass on the key's account; a free key gets an in-band refusal naming where to upgrade. A null fit means the posting has no stored description to score. Returns the terms it read from the CV so the agent can pick a different one and call again with `query`. Needs a key or a sign-in.

Input parameters:

- `country` (string)
- `limit` (integer): Jobs to score, 1-20 (default 20).
- `location` (string)
- `query` (string): Optional job title to search instead of the one read from the résumé.
- `remote` (boolean)
- `resumeText` (string, required): The candidate's résumé as plain text (100+ characters).

Output parameters:

- `agenciesExcluded` (boolean): Row-selecting: disclosed agency inventory is hidden from this page.
- `countUnavailable` (boolean): The board could not count this query exactly — do not report a total.
- `didYouMean` (string)
- `excludedTerms` (array)
- `hasMore` (boolean)
- `ignoredFilters` (array): Filters the board could NOT apply. Results answer a wider question than was asked.
- `intentFilters` (array): Words read out of the query as filters.
- `jobs` (array)
- `nextOffset` (integer): Pass back as `offset` for the next page.
- `note` (string)
- `query` (string|null): What was actually searched. Null when no occupation was recognised.
- `salaryStatedOnly` (boolean): Row-selecting: this page excludes the ~87% of postings with no stated pay.
- `terms` (array): The occupations read out of the résumé, best first.
- `total` (integer|null): Exact match count. ABSENT with countUnavailable:true when the board refuses to guess.

### `board_stats` (~71 tokens)

Board statistics

Live board statistics from cache (cheap to call): servable and tracked posting totals, the count of company job boards with open roles (boards, not employers — one employer can run several), the category set, freshness stamp. Answers with no key too, with a withKey block saying what a free key adds.

Output parameters:

- `categories` (array): The category slugs search_jobs accepts.
- `freshnessWindowDays` (integer)
- `note` (string)
- `openCompanyBoards` (integer|null): Company job boards with at least one servable posting. BOARDS, not employers — read openCompanyBoardsBasis.
- `openCompanyBoardsBasis` (string)
- `refreshedAt` (string|null): When the cache these figures come from was last written.
- `servablePostings` (integer|null): Postings the board serves right now: not withdrawn, dated within the freshness window. Null when the pass did not compute it.
- `trackedPostings` (integer|null): Every posting the board holds, including ones outside the serving rules.
- `withKey` (object): Present on an unkeyed call: where a free key comes from and what it adds.

### `employer_hiring_record` (~433 tokens)

An employer's hiring record on this board

For each employer handle (companyToken, up to 20 per call), that employer's own record on this board: open_roles now, closed_90d (postings we watched come off this board in the last 90 days, re-lists excluded), superseded_90d (the re-lists, a floor), the two medians from the employer's own stated dates (lower bounds), tracking_days (how long we have watched THIS board, capped at 90) and feed_total (what its feed advertised at the last check). A takedown is not a hire — a filled role, a cancelled one and a withdrawn one look identical from here — and it is a record of one BOARD, never summed across an employer's boards, never a headcount. A board with no closure observed answers record:'unknown' with the reason, never a verdict about the employer: on a board bigger than one visit can read, no closure is observable to us until we complete a provable full pass and then watch a role go after it, so silence there is about our instrument. Every row carries its basis. Every row also carries layoff_filing — the newest layoff filing joined to that employer by a hand-curated alias or an exact multi-token name match, a US state WARN notice or an SEC 8-K Item 2.05 disclosure, printed as a filing (filer verbatim, its dates with their bases, count, state or form, link), read hourly from SEC EDGAR and nightly from state notices, null when none qualifies within 90 days, and no part of record or any verdict; layoff_basis on the response says what it is and is not. Pair with employer_growth for the other half of what the site calls "Actively hiring". Needs a key or a sign-in.

Input parameters:

- `companyTokens` (array, required): companyToken values from job cards or search_jobs (a vendor tenant, e.g. 'acme' or 'gici~wd5~Careers'). Up to 20; more is refused with the count named.

Output parameters:

- `asked` (integer)
- `basis` (string)
- `employers` (array): One row per token asked, in the order asked. A token the board does not carry still answers, as unknown.
- `layoff_basis` (string): What layoff_filing is and is not, beside every row's record.
- `layoff_read` (string): "ok" when the filing reader answered for every employer; otherwise "unread: <fault>" and every layoff_filing on this response is null for that reason, never because nothing qualified. The record is u…
- `window_days` (integer)

### `employer_growth` (~266 tokens)

Did this employer's board grow?

Did this employer's board serve more roles than it did 7 days earlier? One row per companyToken (up to 20 per call), judged by the board itself from our own daily observation and passed through untouched: grew, no-growth, or unknown — and unknown ALWAYS carries unknown_reason (a feed bigger than one visit can read, a board too new or too small for a rate, a gap in our own series, a pool that was replaced rather than grown…): an unknown is a reading we could not take, never a no. The bars the verdict uses: at least 10 roles served at the window's start; then BOTH at least 4 more roles AND at least 25% more, on a board tracked for at least 21 days, with every read in the window whole. Per BOARD (a vendor tenant), never summed across an employer's boards; more roles served is roles opened net of roles that came down — not a headcount and not a hire. This tool never ranks employers, and no list of growing employers exists here or anywhere on the board. Needs a key or a sign-in.

Input parameters:

- `companyTokens` (array, required): companyToken values from job cards or search_jobs. Up to 20; more is refused with the count named.

Output parameters:

- `asked` (integer)
- `bars` (object): What the verdict measured against — for reading a row, never for re-judging one.
- `basis` (string)
- `employers` (array): One row per token asked, in the order asked. A token with no daily series answers unknown with its reason.

### `key_status` (~133 tokens)

This key's limits and powers

What THIS key is and may do: tier, requests left this minute, calls left today (both including this call), whether fit_resume (and engine=ranked on the data API) answers on it, and whether the apply tools would — with any blocker named: account link, Agent plan or live pass, mandate, résumé on file. On an Agent Pass: when the clock ends and how many applications are left (a pass starts at the first call other than this one). Call it first in a keyed session, and after any 'quota' or 'rate' refusal. Needs a key or a sign-in.

Output parameters:

- `apply` (object)
- `counted` (string)
- `docs` (string)
- `features` (object)
- `key` (object)
- `pass` (object): The account's pass, if any. Every figure is read off the pass row; nothing here is a constant.
- `quota` (object)
- `rate` (object)

### `debug_search` (~775 tokens)

Explain a search

Explain WHY a search returns what it does — the board's own decision trace merged with the run's outcome. Shows the parsed query (terms, exclusions, intent-lifts, alias expansions), which filters were applied vs IGNORED and why, the route and retriever chosen, the ranking regime (ranked/ring-merged/deep-page and the seam), plus the real run's route, timings, count basis and any fallback. Use this when a search returns surprising, empty, or mis-ranked results — it turns 'why?' into one call. Takes the SAME arguments as search_jobs. Needs a key or a sign-in.

Input parameters:

- `agentReadyOnly` (boolean): Only jobs the apply agent can submit to on the user's behalf.
- `category` (string): Comma list of category slugs (see board_stats for the live set), max 3.
- `companies` (string): Scope to specific employers: a comma list of companyToken values from job cards (or from the site's employer pages). An employer the board does not carry simply matches nothing; tokens the board drop…
- `country` (string): ISO-2 codes, comma-separated, max 5. E.g. 'US,GB'.
- `department` (string): Substring match on the employer's own department/team text.
- `employmentType` (string): Comma list of: full_time, part_time, contract, temporary, internship.
- `excludeAgencies` (boolean): Hide postings from staffing/recruiting agencies (their job cards carry agency:true). Agencies are served by default; this is an opt-in narrowing.
- `experience` (string): Comma list of seniority bands the POSTING asks for: entry, mid, senior, expert. Rows whose band could not be read are excluded — use maxYears for the candidate's own side of the question.
- `hasStatedPay` (boolean): Only postings that state a salary (excludes the ~87% that don't).
- `includeUnstatedPay` (boolean): WIDENS an active salaryMin/salaryMax band to also admit postings that state no pay at all. Inert with no band set (unpriced rows are already included). The response says salaryStatedOnly when a band…
- `limit` (number): Rows per page, 1-60. Default 20.
- `location` (string): City/state/metro, e.g. 'texas', 'NYC', 'berlin'.
- `maxAgeDays` (number): Only postings from the last N days (1-30).
- `maxYears` (number): Only roles asking for at most N years of experience.
- `offset` (number): Paging offset — pass back the previous response's nextOffset.
- `payBasis` (string): Restrict to hourly or salaried pay.
- `postedAfter` (string): ISO-8601 instant; only postings the EMPLOYER dated after it. Undated rows fall out of this window (unlike maxAgeDays, which falls back to when the board first saw a posting), so this is the strict fo…
- `query` (string): Search terms. Supports exclusions: 'engineer -senior'.
- `remote` (boolean): Only remote-friendly roles.
- `salaryMax` (number): Annual USD-equivalent salary ceiling.
- `salaryMin` (number): Annual USD-equivalent salary floor. Note: only ~13% of postings state pay.
- `sort` (string): Default relevance.
- `vendor` (string): Comma list of hiring-system vendors (greenhouse, lever, ashby, …), max 8.
- `workMode` (string): Comma list of: remote, hybrid, onsite.

Output parameters:

- `decision` (object): The board's own explain trace for this query: parsed terms, filters applied or ignored and why, route, retriever and ranking regime. Its keys are the board's and change as the board's decisions do.
- `outcome` (object)

### `search` (~145 tokens)

Search (alias of search_jobs, in ChatGPT's research shape)

An ALIAS of search_jobs in the fixed shape ChatGPT's deep-research and company-knowledge connectors call: one query string in, {results:[{id,title,url}]} out. Every result's id is the job id fetch and every other tool take; url is the employer's own apply page when the board holds one, else the posting's page on the site. Same board, same ranking, same limit as an unkeyed search_jobs (10 rows); the disclosures ride beside the results. Any other client should call search_jobs, which takes every filter.

Input parameters:

- `query` (string, required): Free text — title, skills, a place, exclusions with a leading minus.

Output parameters:

- `agenciesExcluded` (boolean): Row-selecting: disclosed agency inventory is hidden from this page.
- `countUnavailable` (boolean): The board could not count this query exactly — do not report a total.
- `didYouMean` (string)
- `excludedTerms` (array)
- `hasMore` (boolean)
- `ignoredFilters` (array): Filters the board could NOT apply. Results answer a wider question than was asked.
- `intentFilters` (array): Words read out of the query as filters.
- `nextOffset` (integer): Pass back as `offset` for the next page.
- `note` (string)
- `results` (array)
- `salaryStatedOnly` (boolean): Row-selecting: this page excludes the ~87% of postings with no stated pay.
- `total` (integer|null): Exact match count. ABSENT with countUnavailable:true when the board refuses to guess.

### `fetch` (~135 tokens)

Fetch (alias of get_job, in ChatGPT's research shape)

An ALIAS of get_job in the fixed shape ChatGPT's deep-research and company-knowledge connectors call: one id in (from search), {id,title,text,url,metadata} out. text is the posting's full description; metadata carries the job card's structured fields (pay, experience, location, workMode, postedAt, companyToken, agentReady). A dead id answers with what the board knows — a watched closure, an aged-out stub, or not found — in text and metadata, never a stale card. Any other client should call get_job.

Input parameters:

- `id` (string, required): A job id from search.

Output parameters:

- `id` (string)
- `metadata` (object): The compact job card without the description; on a dead id, the board's closed/agedOut/notFound record.
- `note` (string)
- `text` (string): The description, or the board's one-line reason when there is none.
- `title` (string|null): Null when there is no posting to return; read metadata.closed / agedOut / notFound.
- `url` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/work-resumebooster-jobs/functions-v1-agent-mcp#diagnostics

## Score history

- 2026-09-20: 66
- 2026-09-19: 66
- 2026-09-18: 66

## Common questions

### What is the Resume Booster Job Board MCP server?

Resume Booster Job Board is an MCP server listed in the public MCP registry as work.resumebooster/jobs. Job search over employers' own hiring systems. Search with no key; a free key opens every read tool. This page covers its hosted endpoint (https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp).

### Is the Resume Booster Job Board MCP server safe to use?

Resume Booster Job Board scores 66 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 Resume Booster Job Board MCP server expose?

Resume Booster Job Board exposes 15 tools: search_jobs, get_job, get_jobs, check_jobs_open, check_apply_support, and 10 more. Their descriptions and schemas cost roughly 3,766 tokens of context every time the server is loaded.

### Does the Resume Booster Job Board MCP server require authentication?

No. We connected to Resume Booster Job Board without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Resume Booster Job Board MCP server still maintained?

Resume Booster Job Board is still listed as active in the MCP registry. We last reached this channel on 20 September 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://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp
- Repository: https://github.com/campbellaabbott-rgb/resumebooster-mcp
- Website: https://resumebooster.work/agents
- Changelog RSS feed: https://verifymcp.io/servers/work-resumebooster-jobs/functions-v1-agent-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/work-resumebooster-jobs/functions-v1-agent-mcp.json
- HTML version of this page: https://verifymcp.io/servers/work-resumebooster-jobs/functions-v1-agent-mcp
