Skip to main content
Glama
campbellaabbott-rgb

Resume Booster Job Board

README.md
<!-- GENERATED by scripts/build.mjs from mcp.config.json — edit those, not this file. -->
# Resume Booster Job Board — MCP server

Job search over employers' own hiring systems. Search with no key; a free key opens every read tool. board_stats, search_jobs, search and fetch answer with no key at all, so a fresh connection works on its first call from any host.

**Verify:** ask your agent to call `board_stats`. It answers with no key and says how many free calls are left today.

- Server address: `https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp` — this address is on Supabase, the company that hosts our server; it is ours. Paste it exactly as it is (do not add `/mcp`). It is a plain web address your agent talks to (MCP over Streamable HTTP, one POST per message, no session to keep); there is nothing to install.
- Tools: 15 — `search_jobs`, `get_job`, `get_jobs`, `check_jobs_open`, `check_apply_support`, `board_stats`, `employer_hiring_record`, `employer_growth`, `key_status`, `debug_search`, `search`, `fetch`, `fit_resume`, `request_application`, `application_status`
- The how-to, per app, with a **Test the server** button: https://resumebooster.work/agents
- Free key: https://resumebooster.work/data-api
- One server, four names: `resumebooster-job-board` is what `initialize` answers, `resumebooster` is the install name in every block below, `Resume Booster` is the name you type into Claude's or ChatGPT's own dialog, and `work.resumebooster/jobs` is the name reserved for the MCP Registry (not published yet).

A `https://resumebooster.work/jobs?job=<id>` link's `id` is the argument `get_job`, `fetch`, `check_apply_support` and `request_application` take.

Claude, Claude Desktop and ChatGPT have no field for a key. They sign you in instead — but only while the server's sign-in service is switched on. When it is off, a tool that needs your account answers in words (no Connect card), and `board_stats`, `search_jobs`, `search` and `fetch` still answer. Today's state: press **Test the server** on https://resumebooster.work/agents, or run

```sh
curl -s -X POST https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp -H 'content-type: application/json' -H 'mcp-protocol-version: 2025-06-18' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}' | jq '.result._meta["work.resumebooster/sign-in"].state'
```

which prints `"on"`, `"off"` or `"unknown"` — the same word the page shows (the server reads the sign-in service's own metadata at `https://bwhdazbotpblihdxcmho.supabase.co/.well-known/oauth-authorization-server/auth/v1` and caches the answer briefly).

## Tiers

| Tier | Tools | What opens it |
|---|---|---|
| Unkeyed | `board_stats`, `search_jobs`, `search`, `fetch` | Nothing. 25 calls a day per network address, 2000 a day across every unkeyed caller, a search is one page of 10 rows. |
| Free key | `get_job`, `get_jobs`, `check_jobs_open`, `check_apply_support`, `employer_hiring_record`, `employer_growth`, `key_status`, `debug_search` (and the unkeyed tools at a higher cap) | A free key from https://resumebooster.work/data-api — 1000 calls a day. |
| Paid or pass | `fit_resume` | The paid API tier, or a live pass on the key's account (https://resumebooster.work/agents/pass). |
| Apply | `request_application`, `application_status` | A key linked to an account with an Agent plan or a live pass, and a mandate — see `key_status`. |

The unkeyed allowance is 25 free calls a day per network address — an office, a home connection or a chat service's own servers count as one address, so from Claude or ChatGPT the number left can start lower because other people share it.

## Install

Pick your app. Every block but Zed's works with no key on its first call (Zed asks you to sign in when no key is set — its section says what to do); the keyed variant under a block is optional.

### Claude (claude.ai, Claude Desktop, Claude on your phone)

1. In Claude, open **Customize**, then **Connectors**.
2. Click **Add custom connector**. On a Team or Enterprise plan there is no such button: an owner adds the connector under **Organization settings > Connectors** (**Add**, then **Custom**; if it asks for the connector type, **Web**), and you then find it under **Customize > Connectors** with the "Custom" label and click **Connect**.
3. If it asks for a **Name**, type `Resume Booster`.
4. Paste this address into **MCP server URL**: `https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp` — this address is on Supabase, the company that hosts our server; it is ours. Paste it exactly as it is.
5. If Claude asks about **Authentication**, choose **Sign in when needed**. If it asks about **OAuth client**, choose **Register automatically**. Claude may already show these as "Detected" — leave them. Do not choose **No sign-in**: Claude cannot change that later, so the tools that need your account would stay off until you remove the connector and add it again.
6. Click **Add**.
7. In a chat, click **+**, open **Connectors**, and switch **Resume Booster** on.
8. Ask Claude: `Using Resume Booster, call board_stats and tell me how many jobs are open right now.`

When sign-in is on — the first time Claude needs your account — to open a posting in full, to check a shortlist, or to apply — a **Connect** card appears in the chat. Click it, sign in to Resume Booster, press **Allow**, and Claude continues where it stopped.

**How you know it worked:** Under **+ → Connectors**, Resume Booster is on. Ask "call board_stats": the answer names the number of open postings and a note that reads "unkeyed: N of 25 anonymous calls left today".

### ChatGPT (developer mode)

1. In ChatGPT, open **Settings**, choose **Security and login**, and turn on **Developer mode**. If you do not see it, your account or workspace does not allow it yet.
2. Go to chatgpt.com/plugins and click the **+** button.
3. Type a name — `Resume Booster` — and a description — `Live job board: search real openings from employers' own hiring systems.`
4. Under **Connection**, paste this address as the MCP server URL: `https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`. Paste it exactly as it is — do not add `/mcp` at the end. The address is on Supabase, the company that hosts our server; it is ours.
5. Create the connection, and check the list of tools it found — there should be 15.
6. Start a new chat and add **Resume Booster** from the tools menu.
7. Ask: `Search Resume Booster for nurse jobs in Texas and show me the first ten.`

When sign-in is on — if a tool needs your account, ChatGPT shows its sign-in for Resume Booster; sign in and press **Allow**.

**How you know it worked:** Ask it to search for "nurse in Texas": 10 results with ids come back. ChatGPT's own search uses `search` and `fetch` — 10 results per search and the full text of any result — with no sign-in.

### Claude Code

1. Copy this line and run it in your terminal (`--scope user` makes it available in every folder, not just this one): `claude mcp add --transport http --scope user resumebooster https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`
2. Start `claude` and type `/mcp` — `resumebooster` is listed as connected.
3. Ask: `call board_stats` — the answer names the number of open postings and says how many free calls are left today.

With a free key, for every project:

```sh
export RESUMEBOOSTER_KEY=<paste your key here>
claude mcp add --transport http --scope user resumebooster https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp --header "Authorization: Bearer $RESUMEBOOSTER_KEY"
```

Or clone this repository: its `.mcp.json` is a project-scope server, so Claude Code asks once to approve it and you are connected. As a plugin (adds the `/resumebooster:setup` and `/resumebooster:find-jobs` skills):

```text
/plugin marketplace add campbellaabbott-rgb/resumebooster-mcp
/plugin install resumebooster@resumebooster
```

The `.mcp.json` in this repo reads the key from the environment: `${RESUMEBOOSTER_KEY:-}` expands to the key when `RESUMEBOOSTER_KEY` is set and to nothing otherwise, and the server answers an empty header as the unkeyed tier — so the same file works with a key and without one. The keyless variant, if you would rather no header be sent at all:

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

When sign-in is on — without a key, the first tool that needs your account makes `/mcp` show `! Needs authentication`; type `/mcp` and sign in in the browser (Claude Code 2.1.186 or newer can also run `claude mcp login resumebooster`).

**How you know it worked:** `/mcp` lists `resumebooster` as connected; "call board_stats" answers with the count and the unkeyed note; with a key, "call key_status" names your tier and calls left.

### Cursor

1. Paste this link into your browser's address bar (GitHub does not make it clickable) — Cursor opens and asks you to confirm the server; the link holds only the address, never a key: `cursor://anysphere.cursor-deeplink/mcp/install?name=resumebooster&config=eyJ1cmwiOiJodHRwczovL2J3aGRhemJvdHBibGloZHhjbWhvLnN1cGFiYXNlLmNvL2Z1bmN0aW9ucy92MS9hZ2VudC1tY3AifQ==`
2. Or paste the block below into `~/.cursor/mcp.json`.
3. In Cursor's chat, ask: `call board_stats`.

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

With a free key, the same file names the variable and Cursor fills it in (`${env:RESUMEBOOSTER_KEY}` is resolved in `headers`), so the key never sits in the file:

```sh
export RESUMEBOOSTER_KEY=<paste your key here>
```

```json
{
  "mcpServers": {
    "resumebooster": {
      "url": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp",
      "headers": {
        "Authorization": "Bearer ${env:RESUMEBOOSTER_KEY}"
      }
    }
  }
}
```

**How you know it worked:** Ask the chat "call board_stats" — the count and the unkeyed note come back.

### VS Code

1. Paste this link into your browser's address bar — VS Code asks you to confirm: `vscode:mcp/install?%7B%22name%22%3A%22resumebooster%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fbwhdazbotpblihdxcmho.supabase.co%2Ffunctions%2Fv1%2Fagent-mcp%22%7D` (Insiders: `vscode-insiders:mcp/install?%7B%22name%22%3A%22resumebooster%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fbwhdazbotpblihdxcmho.supabase.co%2Ffunctions%2Fv1%2Fagent-mcp%22%7D`).
2. Or paste the block below into `.vscode/mcp.json`. When the server starts, VS Code asks for the key; leave it empty to use the tools that need no key (VS Code's own document does not say what an empty answer does — if the server does not start, use the link in step 1 instead).
3. In the chat, ask: `call board_stats`.

```json
{
  "inputs": [
    {
      "id": "resumebooster-key",
      "type": "promptString",
      "description": "Resume Booster Job Board API key (free at https://resumebooster.work/data-api); leave empty for the unkeyed tools",
      "password": true
    }
  ],
  "servers": {
    "resumebooster": {
      "type": "http",
      "url": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp",
      "headers": {
        "Authorization": "Bearer ${input:resumebooster-key}"
      }
    }
  }
}
```

[![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522resumebooster%2522%252C%2522type%2522%253A%2522http%2522%252C%2522url%2522%253A%2522https%253A%252F%252Fbwhdazbotpblihdxcmho.supabase.co%252Ffunctions%252Fv1%252Fagent-mcp%2522%257D) — the same link as step 1, made clickable through vscode.dev's redirect (a convenience GitHub needs; VS Code's docs describe only the `vscode:` form).

**How you know it worked:** If you used the mcp.json block, VS Code asks for the key at start — leave it empty (the link in step 1 declares no key, so it asks nothing). Either way, ask the chat "call board_stats" — the count and the unkeyed note come back.

### More… (Gemini CLI, Codex CLI, Cline, Zed, Windsurf, anything else)

1. Pick your app below — each has its own block. Anything else that speaks MCP works too: it is one plain web address, and **Any client / curl** at the end shows the first message.
2. Then ask your agent to call `board_stats`.

When sign-in is on — without a key, a tool that needs your account answers a sign-in challenge (HTTP 401); a client that supports sign-in opens it, and a client that does not needs a free key.

**How you know it worked:** The `initialize` answer's `serverInfo.name` is `resumebooster-job-board`; the **Test the server** button on https://resumebooster.work/agents runs this for you.

#### Gemini CLI

1. Run: `gemini mcp add --transport http --scope user resumebooster https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`
2. Ask: `call board_stats`.

With a key: `gemini mcp add --transport http --scope user --header "Authorization: Bearer $RESUMEBOOSTER_KEY" resumebooster https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`. Or install this repository as an extension — it declares the key as a setting, prompted at install and kept in your keychain:

```sh
gemini extensions install https://github.com/campbellaabbott-rgb/resumebooster-mcp
```

When sign-in is on — `/mcp auth resumebooster` starts the sign-in.

**How you know it worked:** "call board_stats" answers with the count and the unkeyed note.

#### Codex CLI

1. Run: `codex mcp add resumebooster --url https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`
2. Ask: `call board_stats`.

With a key, in `~/.codex/config.toml` (the key is read from `RESUMEBOOSTER_KEY`, never written here):

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

When sign-in is on — `codex mcp login resumebooster` starts the sign-in.

**How you know it worked:** "call board_stats" answers with the count and the unkeyed note.

#### Cline

1. In the **Remote Servers** tab: **Server Name** `resumebooster`, **Server URL** `https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`, **Transport Type** **Streamable HTTP**, then **Add Server**. Or paste the block below into `~/.cline/mcp.json` (the Cline CLI's file; in the VS Code extension, open the **MCP Servers** panel, the **Configure** tab, then **Configure MCP Servers** and add the same block).
2. Ask: `call board_stats`.

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

With a key: add `"headers": { "Authorization": "Bearer …" }` with your key to that server, in your own user-level file only — never in a committed one.

**How you know it worked:** "call board_stats" answers with the count and the unkeyed note.

#### Zed

1. Paste the block below into `settings.json`.
2. Zed prompts you to sign in whenever no `Authorization` header is set (its own document says so). If the curl above prints `"off"`, that prompt cannot finish — add `"headers": { "Authorization": "Bearer …" }` with a free key from https://resumebooster.work/data-api to the block, in your own settings file only.
3. Ask: `call board_stats`.

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

**How you know it worked:** "call board_stats" answers with the count and the unkeyed note.

#### Windsurf

1. Paste the block below into `~/.codeium/windsurf/mcp_config.json`. Windsurf's document says this file configures the legacy Cascade agent only; the Devin Local agent, the default for new tabs, reads the Devin CLI config files instead.
2. Ask: `call board_stats`.

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

With a free key, the same file names the variable and Windsurf fills it in (`${env:RESUMEBOOSTER_KEY}` is resolved in `headers`), so the key never sits in the file:

```sh
export RESUMEBOOSTER_KEY=<paste your key here>
```

```json
{
  "mcpServers": {
    "resumebooster": {
      "serverUrl": "https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp",
      "headers": {
        "Authorization": "Bearer ${env:RESUMEBOOSTER_KEY}"
      }
    }
  }
}
```

**How you know it worked:** "call board_stats" answers with the count and the unkeyed note.

#### Any client / curl

1. POST one JSON-RPC 2.0 message per request to `https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp` (Streamable HTTP; no session to keep); the first one is the `initialize` message below.
2. With a key, send `Authorization: Bearer <key>` on each request; without one, `board_stats`, `search_jobs`, `search` and `fetch` still answer.

```sh
curl -s -X POST https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp -H 'content-type: application/json' -H 'mcp-protocol-version: 2025-06-18' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'
```

**How you know it worked:** The `initialize` answer's `serverInfo.name` is `resumebooster-job-board`; the **Test the server** button on https://resumebooster.work/agents runs this for you.

#### Copy the prompt

1. For an agent that can install a server from prose, paste this: `Add the MCP server "resumebooster" at https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp (Streamable HTTP, POST only, no key needed for board_stats, search_jobs, search, fetch; a free key from https://resumebooster.work/data-api goes in an Authorization: Bearer header). Then call board_stats.`

**How you know it worked:** Your agent answers with the number of open postings and the unkeyed note.

## If it does not work

Symptoms are the server's own words, or a label the app's documentation prints (docs-snapshot.md). Rows marked "while sign-in is off" or "on" apply in that state only — the curl line above prints today's.

| What you see | Why | What to do |
|---|---|---|
| Sign-in through this server is not switched on yet, so this tool needs a key. (while sign-in is off) | The tool needs your account, and sign-in from chat apps is not switched on today. | Search, board statistics and full postings still work with no key. To use every tool, connect from Claude Code, Cursor or VS Code with a free key (https://resumebooster.work/data-api). |
| Claude: a **Connect** card appears (while sign-in is on) | A tool needs your account. | Click it, sign in to Resume Booster, press **Allow**; Claude retries the call itself. |
| Claude: "Couldn't reach the MCP server" or "Authorization with the MCP server failed" | The address was mistyped, `/mcp` was added to it, or (when sign-in is on) the sign-in could not finish. | Check the address is exactly `https://bwhdazbotpblihdxcmho.supabase.co/functions/v1/agent-mcp`; press **Test the server** on https://resumebooster.work/agents; if the test says sign-in is on and the card still fails, remove the connector and add it again with **Sign in when needed** + **Register automatically**. |
| Claude Code: `/mcp` shows `! Needs authentication` (while sign-in is on) | A tool that needs your account was called with no key, and the server asked for sign-in. | Type `/mcp` and follow the browser steps (2.1.186 or newer: `claude mcp login resumebooster`), or add a free key with `--header`. |
| The unkeyed allowance is spent | Your network address used its 25 free calls today; an office or a chat service counts as one address. | Get a free key at https://resumebooster.work/data-api (1000 calls a day, no account) and add it to your app. Resets at midnight UTC. |
| That key is not recognised. | The key was cut off, or the header lacks `Bearer ` with the space. | The header must read `Authorization: Bearer rb_live_…`. A key is shown once; get a new one if lost (the old one stops working). |
| This key has been revoked. | A newer key was made for the same account or email; only the newest works. | Use the newest key, or make one more and update every app that holds the old one. |
| Daily quota of | The free key's day is spent. | Wait for midnight UTC; the unkeyed tools still answer; an Agent Pass raises the limit for its hours. |
| requests/minute. | Too many calls in one minute. | Wait one minute. |
| fit_resume is a paid feature | Résumé fit scoring needs a paid key or a live Agent Pass. | https://resumebooster.work/data-api for a paid key, or https://resumebooster.work/agents/pass — search keeps working. |
| The apply agent needs an active Agent plan or a live pass. | Applying is paid. | https://resumebooster.work/agents/pass (sign in first), or the Agent plan on the site. |
| No agent mandate on this account. | The apply agent is not set up yet (the same answer names "Your agent is switched off." and "No resume on file" when that is the blocker). | Account → set up the apply agent: turn it on, choose countries and field, add the CV. The off switch always wins. |
| The pass on this account is not live. | The pass ended, or its applications are used ("No applications left on this pass."). | Search keeps working; buy another pass when the clock ends. |
| That is not a job id from this board. | You passed a link or a title. | Use the id from a search, e.g. `greenhouse:acme:12345`; the id in a `https://resumebooster.work/jobs?job=<id>` link is the same one. |
| This is an MCP server for AI agents, not a web page | You opened the address like a web page. | Nothing is wrong. Paste it into your agent; the how-to is https://resumebooster.work/agents. |
| Cursor / VS Code / Cline: server listed, zero tools | Wrong transport (Cline: not `sse`; VS Code: `"type": "http"`), or `/mcp` appended to the address. | The address ends in `/agent-mcp` exactly; the transport is HTTP (Cline: **Streamable HTTP**). |
| ChatGPT only ever searches and fetches | By design: ChatGPT's search calls `search` and `fetch`, 10 results a page. | For filters (pay, remote, seniority), use an app that calls `search_jobs`. |
| Sign in to use this tool (while sign-in is on) | A tool that needs a key was called with none (HTTP 401 from a script or curl). | Send `Authorization: Bearer <key>` (free at https://resumebooster.work/data-api), or call one of `board_stats`, `search_jobs`, `search` and `fetch`. |

## The plugin's skills

- `/resumebooster:setup` — get a free key, put it in `RESUMEBOOSTER_KEY`, reconnect.
- `/resumebooster:find-jobs` — the search → verify → apply order, with the gates named.

## Privacy

Every search you run travels to the server as the query you typed. A key is stored as its hash and its first characters, never the key. For unkeyed calls the server keeps a truncated hash of your network address for the daily cap and drops it after 7 days; the address itself is never stored. The tools never write to your machine. A key belongs in an environment variable, a keychain prompt or a host's secret store — never in a file you commit, a URL, a badge or a base64 config. Nothing in this repository carries a key.

## This repository

- `mcp.config.json` is the only place a URL, tool name, cap, quota, host step or troubleshooting row is written. `npm run build` regenerates every other file; `npm test` fails if any generated file was edited by hand or the constants changed without a rebuild, validates each manifest against the schema its host publishes (copies under `schemas/`, fetched 2026-09-16), and checks that no generated file carries a placeholder inside an Authorization value.
- The tool list, the host ids (the six above and the long tail) and the sign-in key are a mirror of the site's own (`resume-signal-pro/src/config/mcp-tools.ts` at `7266f38c`); when that changes, this file is re-synced and rebuilt.
- Every vendor label in the steps above is quoted from the vendor's documentation on the date in [docs-snapshot.md](./docs-snapshot.md); a label that is not there is not published here.
- `server.json` is the entry for the official MCP Registry.

## License

MIT — for the files in this repository. The server, the board and its data are https://resumebooster.work's own and are governed by its terms.