# Refine Job Search (remote · mcp.getrefine.co)

Job search management: applications, interviews, offers, recruiter email, and company openings.

- Trust score: 81/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `mcp.getrefine.co`: 81/100 (this document), [markdown](https://verifymcp.io/servers/co-getrefine-refine/mcp.md), [page](https://verifymcp.io/servers/co-getrefine-refine/mcp)

## Channel facts

- Endpoint: `https://mcp.getrefine.co/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.5.2`

## 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**: 81/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS enforcement could not be verified: the plaintext port answered with HTTP 401, which proves neither a plaintext path nor enforcement.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server supports Client ID Metadata Documents, the current MCP client-registration mechanism.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 86/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).
  - Tool/resource definitions use about 4003 tokens (~67/item across 59 items; 55 tools + 4 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 40/100
  - Stability check failed: schema churn in the 28 days we've observed: 30 tool removals, 6 breaking changes, 0 auth/transport breaks, 23 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% 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.
  - All 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 56 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.

## Install

### How do I install the Refine Job Search MCP server?

Refine Job Search is a hosted endpoint at https://mcp.getrefine.co/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 co-getrefine-refine 'https://mcp.getrefine.co/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "co-getrefine-refine": {
      "url": "https://mcp.getrefine.co/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "co-getrefine-refine": {
      "type": "http",
      "url": "https://mcp.getrefine.co/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.co-getrefine-refine]
url = "https://mcp.getrefine.co/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "co-getrefine-refine": {
      "type": "remote",
      "url": "https://mcp.getrefine.co/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add co-getrefine-refine --url 'https://mcp.getrefine.co/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  co-getrefine-refine:
    url: "https://mcp.getrefine.co/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "co-getrefine-refine": {
      "Transport": "http",
      "Url": "https://mcp.getrefine.co/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add co-getrefine-refine -t streamable-http -u 'https://mcp.getrefine.co/mcp'
```

### Other

```json
{
  "mcpServers": {
    "co-getrefine-refine": {
      "type": "http",
      "url": "https://mcp.getrefine.co/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-18 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33.

### 2026-09-16 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27.

### 2026-09-14 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20.

### 2026-09-12 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13.

### 2026-09-10 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7.

### 2026-08-27 (score 76, 0)

- [functional] Server version: 0.5.1 → 0.5.2

### 2026-08-26 (score 76, +2)

- [security regression] Stability: 0.07 → fail
- [security regression] Tool “interviews.add” was removed
- [security regression] Tool “interviews.delete” was removed
- [security regression] Tool “interviews.list” was removed
- [security regression] Tool “interviews.update” was removed
- [security regression] Tool “persona.remove_trait” was removed
- [security regression] Tool “recommendations.block” was removed
- [security regression] Tool “inbox.accept” was removed
- [security regression] Tool “inbox.status” was removed
- [security regression] Tool “jobs.update_notes” was removed
- [security regression] Tool “journey.update” was removed
- [security regression] Tool “notifications.list” was removed
- [security regression] Tool “notifications.read” was removed
- [security regression] Tool “notifications.read_all” was removed
- [security regression] Tool “offers.accept” was removed
- [security regression] Tool “offers.add_negotiation” was removed
- [security regression] Tool “offers.create” was removed
- [security regression] Tool “offers.decline” was removed
- [security regression] Tool “offers.delete” was removed
- [security regression] Tool “offers.delete_negotiation” was removed
- [security regression] Tool “offers.get” was removed
- [security regression] Tool “offers.update” was removed
- [security regression] Tool “persona.confirm_trait” was removed
- [security regression] Tool “persona.correct_trait” was removed
- [security regression] Tool “recommendations.dismiss” was removed
- [security regression] Tool “recommendations.feedback” was removed
- [security regression] Tool “recommendations.get” was removed
- [security regression] Tool “recommendations.list” was removed
- [security regression] Tool “recommendations.restore” was removed
- [security regression] Tool “recommendations.watch” was removed
- [security regression] Tool “signals.save_opening” was removed
- [security] First check of Injection markers: pass
- [security] First check of Judged manipulation: pass
- [security] New tool “inbox.apply_suggestion”, which the server declares destructive
- [security] New tool “jobs.interviews.delete”, which the server declares destructive
- [security] New tool “jobs.offer.accept”, which the server declares destructive
- [security] New tool “jobs.offer.decline”, which the server declares destructive
- [security] New tool “jobs.offer.delete”, which the server declares destructive
- [security] New tool “jobs.offer.delete_negotiation”, which the server declares destructive
- [security] Tool “inbox.acknowledge” rewrote its description, which is the text the model reads
- [security] Tool “inbox.undo” rewrote its description, which is the text the model reads
- [security] Tool “integrations.connect_google” rewrote its description, which is the text the model reads
- [security] Tool “jobs.archive” rewrote its description, which is the text the model reads
- [security] Tool “jobs.delete” rewrote its description, which is the text the model reads
- [security] Tool “jobs.refresh” rewrote its description, which is the text the model reads
- [security] Tool “jobs.update” no longer declares itself destructive
- [security] Tool “signals.update” no longer declares itself destructive
- [security] Tool “inbox.acknowledge” is now declared destructive
- [functional regression] Schema quality: 59 → 67
- [functional regression] “inbox.acknowledge” added a required parameter “confirmed”, so existing callers break
- [functional regression] “inbox.dismiss” added a required parameter “confirmed”, so existing callers break
- [functional regression] “inbox.undo” added a required parameter “confirmed”, so existing callers break
- [functional regression] “inbox.unsubscribe” added a required parameter “confirmed”, so existing callers break
- [functional regression] “jobs.delete” added a required parameter “confirmed”, so existing callers break
- [functional regression] “signals.untrack” added a required parameter “confirmed”, so existing callers break
- [functional improvement] Schema quality: 78% → 100%
- [functional] First check of Destructive annotations: 100
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server
- [functional] Server version: 0.4.1 → 0.5.1
- [functional] New tool “inbox.sync_status”
- [functional] New tool “jobs.interviews.add”
- [functional] New tool “jobs.interviews.update”
- [functional] New tool “jobs.offer.add_negotiation”
- [functional] New tool “jobs.offer.create”
- [functional] New tool “jobs.offer.update”
- [functional] New tool “signals.openings.list”
- [functional] New tool “signals.openings.mark_all_read”
- [functional] New tool “signals.openings.mark_read”
- [functional] New tool “signals.openings.save”
- [functional] New tool “signals.recommendations.block”
- [functional] New tool “signals.recommendations.dismiss”
- [functional] New tool “signals.recommendations.feedback”
- [functional] New tool “signals.recommendations.get”
- [functional] New tool “signals.recommendations.list”
- [functional] New tool “signals.recommendations.restore”
- [functional] New tool “signals.recommendations.watch”
- [cosmetic] “inbox.list” added an optional parameter “limit”
- [cosmetic] “inbox.list” added an optional parameter “page”
- [cosmetic] “jobs.update” added an optional parameter “notes”
- [cosmetic] “signals.list_applied_jobs” added an optional parameter “limit”
- [cosmetic] “signals.list_applied_jobs” added an optional parameter “page”
- [cosmetic] “jobs.add” dropped the optional parameter “captured_at”
- [cosmetic] “jobs.add” dropped the optional parameter “journey_id”
- [cosmetic] “jobs.add” dropped the optional parameter “state”
- [cosmetic] “jobs.update” dropped the optional parameter “captured_at”
- [cosmetic] “jobs.update” dropped the optional parameter “journey_id”
- [cosmetic] “jobs.update” dropped the optional parameter “state”

### 2026-08-25 (score 74, +1)

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

## MCP tools (55)

### `jobs.list` (~39 tokens)

List jobs in your journey

Input parameters:

- `limit` (integer): Maximum records to return
- `page` (string): Pagination cursor returned as meta.next_page

Output parameters:

- `data` (array)
- `meta` (object)

### `jobs.get` (~25 tokens)

Get details of a specific job

Input parameters:

- `job_id` (string, required): Job id

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.add` (~98 tokens)

Add a new job to your journey

Input parameters:

- `company` (string, required): Company name
- `compensation_text` (string): Compensation text from the posting
- `description` (string): Job description
- `location` (string): Job location
- `qualifications` (string): Job qualifications
- `source` (string): Where this job came from
- `title` (string, required): Job title
- `url` (string): URL of the job posting

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.update` (~119 tokens)

Update a job in your journey

Input parameters:

- `company` (string): Company name
- `compensation_text` (string): Compensation text from the posting
- `description` (string): Job description
- `job_id` (string, required): Job id
- `location` (string): Job location
- `notes` (string): Markdown notes about this application
- `qualifications` (string): Job qualifications
- `source` (string): Where this job came from
- `title` (string): Job title
- `url` (string): URL of the job posting

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.delete` (~73 tokens)

Permanently delete a job and its application from the board. Confirm with the user first; it cannot be undone. To hide a job without recording a rejection or closure, use jobs.archive instead.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms permanent deletion
- `job_id` (string, required): Job id

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `jobs.refresh` (~46 tokens)

Queue a job posting to be re-scraped. The returned job may remain pending; use jobs.get later to inspect the refreshed state.

Input parameters:

- `job_id` (string, required): Job id

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.mark_applied` (~26 tokens)

Mark a job as applied

Input parameters:

- `job_id` (string, required): Job id

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.archive` (~34 tokens)

Hide a job from the active board without recording a rejection or closing the application

Input parameters:

- `job_id` (string, required): Job id

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.unarchive` (~28 tokens)

Restore an archived job to the active board

Input parameters:

- `job_id` (string, required): Job id

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.interviews.add` (~89 tokens)

Log an interview for a job

Input parameters:

- `job_id` (string, required): Job id
- `location` (string): Location or meeting link
- `name` (string, required): Interview name, e.g. phone screen, technical, behavioral, onsite
- `notes` (string): Notes or debrief from the interview
- `scheduled_at` (string): ISO 8601 date/time with timezone

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.interviews.update` (~206 tokens)

Update an existing interview

Input parameters:

- `cancelled_at` (string): ISO 8601 cancellation time with timezone
- `cancelled_reason` (string): Why the interview was cancelled
- `completed_at` (string): Completion date in YYYY-MM-DD format
- `feedback` (string): Feedback received or given
- `interview_id` (string, required): Interview id
- `interviewers` (string): Names or roles of the interviewers
- `job_id` (string, required): Job id
- `location` (string): Location or meeting link
- `name` (string): Interview name, e.g. phone screen, technical, onsite
- `next_action` (string): The next step after this interview
- `notes` (string): Notes or debrief from the interview
- `outcome` (string): Interview outcome
- `rating` (integer): Your rating of the interview, 1 to 5
- `scheduled_at` (string): ISO 8601 date/time with timezone

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.interviews.delete` (~66 tokens)

Permanently delete an interview from a job. Confirm with the user first; it cannot be undone.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms permanent deletion
- `interview_id` (string, required): Interview id
- `job_id` (string, required): Job id

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `jobs.offer.create` (~286 tokens)

Record a job offer with compensation details

Input parameters:

- `base_salary_cents` (integer): Base salary in cents (e.g. 15000000 for $150k)
- `bonus_cents` (integer): Bonus in cents
- `currency` (string): Supported currency code
- `deadline_at` (string): ISO 8601 offer deadline with timezone
- `equity_text` (string): Equity details as text
- `initial_bonus_cents` (integer): The originally offered bonus in cents
- `initial_equity_text` (string): The originally offered equity as text
- `initial_rsu_text` (string): The originally offered RSUs as text
- `initial_salary_cents` (integer): The originally offered base salary in cents
- `job_id` (string, required): Job id
- `next_action` (string): The next step on this offer
- `notes` (string): Notes about the offer
- `rsu_text` (string): RSU details as text
- `target_bonus_cents` (integer): The bonus you are negotiating toward, in cents
- `target_equity_text` (string): The equity you are negotiating toward, as text
- `target_rsu_text` (string): The RSUs you are negotiating toward, as text
- `target_salary_cents` (integer): The base salary you are negotiating toward, in cents

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.offer.update` (~286 tokens)

Update the offer recorded for a job

Input parameters:

- `base_salary_cents` (integer): Base salary in cents (e.g. 15000000 for $150k)
- `bonus_cents` (integer): Bonus in cents
- `currency` (string): Supported currency code
- `deadline_at` (string): ISO 8601 offer deadline with timezone
- `equity_text` (string): Equity details as text
- `initial_bonus_cents` (integer): The originally offered bonus in cents
- `initial_equity_text` (string): The originally offered equity as text
- `initial_rsu_text` (string): The originally offered RSUs as text
- `initial_salary_cents` (integer): The originally offered base salary in cents
- `job_id` (string, required): Job id
- `next_action` (string): The next step on this offer
- `notes` (string): Notes about the offer
- `rsu_text` (string): RSU details as text
- `target_bonus_cents` (integer): The bonus you are negotiating toward, in cents
- `target_equity_text` (string): The equity you are negotiating toward, as text
- `target_rsu_text` (string): The RSUs you are negotiating toward, as text
- `target_salary_cents` (integer): The base salary you are negotiating toward, in cents

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.offer.delete` (~68 tokens)

Permanently delete the offer recorded for a job (the job stays). Use only to fix a mistake, and confirm with the user first; it cannot be undone.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms permanent deletion
- `job_id` (string, required): Job id

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `jobs.offer.accept` (~72 tokens)

Accept the offer for a job. This is a major state change that closes out the search for this role; confirm with the user before calling. It does not email the employer.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms accepting the offer
- `job_id` (string, required): Job id

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.offer.decline` (~63 tokens)

Decline the offer for a job, a major state change; confirm with the user first. It does not email the employer.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms declining the offer
- `job_id` (string, required): Job id

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.offer.add_negotiation` (~143 tokens)

Log a negotiation event on an offer (counter-offer, update, etc.)

Input parameters:

- `bonus_cents` (integer): Signing bonus in cents
- `equity_text` (string): Equity details (e.g. "0.05% over 4 years")
- `event_date` (string): Event date in YYYY-MM-DD format
- `event_type` (string, required): Whether the event records an employer offer or your counter
- `job_id` (string, required): Job id
- `notes` (string): Notes about this negotiation event
- `salary_cents` (integer): Salary in cents (e.g. 15000000 for $150k)

Output parameters:

- `data` (object)
- `meta` (object)

### `jobs.offer.delete_negotiation` (~57 tokens)

Remove a negotiation event from an offer

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms deletion
- `event_id` (integer, required): Negotiation event id
- `job_id` (string, required): Job id

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `signals.list` (~39 tokens)

List companies you are tracking

Input parameters:

- `limit` (integer): Maximum records to return
- `page` (string): Pagination cursor returned as meta.next_page

Output parameters:

- `data` (array)
- `meta` (object)

### `signals.track` (~129 tokens)

Start tracking a company for new job openings

Input parameters:

- `careers_url` (string, required): URL of the company careers page
- `company_name` (string, required): Name of the company
- `departments` (array): Departments to filter by
- `exclude_keywords` (array): Keywords to exclude
- `include_keywords` (array): Keywords that must appear in the role
- `locations` (array): Locations to filter by; use "remote" for remote roles
- `seniority_levels` (array): Seniority levels to include
- `sync_frequency` (string): How often Refine should refresh this company

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.update` (~115 tokens)

Update filters on a tracked company

Input parameters:

- `departments` (array): Departments to filter by
- `exclude_keywords` (array): Keywords to exclude
- `include_keywords` (array): Keywords that must appear in the role
- `locations` (array): Locations to filter by; use "remote" for remote roles
- `seniority_levels` (array): Seniority levels to include
- `signal_id` (string, required): Signal (tracked company) id
- `sync_frequency` (string): How often Refine should refresh this company

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.untrack` (~77 tokens)

Stop tracking a company and delete its signal. Confirm with the user first; they stop getting new openings from it. To stop notifications temporarily instead, use signals.pause.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms they want to stop tracking the company
- `signal_id` (string, required): Signal (tracked company) id

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `signals.pause` (~28 tokens)

Pause tracking for a company

Input parameters:

- `signal_id` (string, required): Signal (tracked company) id

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.resume` (~28 tokens)

Resume tracking for a company

Input parameters:

- `signal_id` (string, required): Signal (tracked company) id

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.openings.save` (~42 tokens)

Save a matched opening returned by signals.openings.list to your job journey

Input parameters:

- `opening_id` (string, required): Matched opening id from signals.openings.list

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.list_applied_jobs` (~62 tokens)

List jobs in your journey that came from a tracked company

Input parameters:

- `limit` (integer): Maximum records to return
- `page` (string): Pagination cursor returned as meta.next_page
- `signal_id` (string, required): Signal (tracked company) id

Output parameters:

- `data` (array)
- `meta` (object)

### `signals.openings.list` (~129 tokens)

List signal notifications (new openings at tracked companies)

Input parameters:

- `department` (string): Exact department facet
- `limit` (integer): Maximum records to return
- `location` (string): Exact location facet; use "remote" for remote roles
- `matches` (boolean): Only openings that score as a match for your persona
- `page` (string): Pagination cursor returned as meta.next_page
- `q` (string): Free-text search over opening titles
- `tab` (string): Use new for unread notifications
- `tracker_id` (string): Filter notifications to one signal tracker

Output parameters:

- `data` (array)
- `meta` (object)

### `signals.openings.mark_read` (~39 tokens)

Mark one opening notification returned by signals.openings.list as read

Input parameters:

- `notification_id` (string, required): Notification id from signals.openings.list

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `signals.openings.mark_all_read` (~45 tokens)

Mark every unread opening notification as read after the user confirms the bulk action

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms marking all openings read

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `inbox.list` (~153 tokens)

List email conversations Refine matched to your job search (applications, interviews, recruiter outreach)

Input parameters:

- `account` (string): Filter to one connected Google account id
- `limit` (integer): Maximum records to return
- `page` (string): Pagination cursor returned as meta.next_page
- `shelf` (string): For the outreach tab: show the low-signal shelf instead of the main feed
- `status` (string): pending needs a decision, auto was auto-applied, active has an open conversation, handled is done
- `tab` (string): Which inbox tab to list; defaults to applications
- `unread` (boolean): With status=active: only conversations with (or without) an unread reply

Output parameters:

- `data` (array)
- `meta` (object)

### `inbox.get` (~30 tokens)

Get one inbox item with its related job and application

Input parameters:

- `item_id` (string, required): Inbox item id

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.get_thread` (~30 tokens)

Fetch the full email thread for an inbox item

Input parameters:

- `item_id` (string, required): Inbox item id

Output parameters:

- `data` (array)
- `meta` (object)

### `inbox.draft_reply` (~59 tokens)

Generate an AI reply draft for an inbox item. Returns HTML for review; it does not send anything.

Input parameters:

- `item_id` (string, required): Inbox item id
- `kind` (string, required): decline politely passes; interested asks to continue the conversation

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.send_reply` (~115 tokens)

Send an email reply through the user's Gmail. This emails a real person from the user's address. Only call after the user has seen the exact message body and explicitly approved sending it.

Input parameters:

- `body` (string, required): HTML body of the reply, exactly as approved by the user
- `confirmed` (boolean, required): Must be true, and only after the user explicitly approved sending this exact message
- `draft_kind` (string): Set when the body came from inbox.draft_reply
- `item_id` (string, required): Inbox item id

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.apply_suggestion` (~67 tokens)

Apply an inbox item's suggested action, such as adding an application to the board or recording a rejection. Confirm the specific action with the user first.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms applying this suggestion
- `item_id` (string, required): Inbox item id

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.undo` (~65 tokens)

Undo an auto-applied inbox action. This can delete a board record that the automatic action created, so confirm with the user first.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms undoing the automatic action
- `item_id` (string, required): Inbox item id

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.mark_read` (~29 tokens)

Clear an inbox item's unread-reply flag

Input parameters:

- `item_id` (string, required): Inbox item id

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `inbox.unsubscribe` (~91 tokens)

Unsubscribe the user from this sender's mailing list via one-click list-unsubscribe. This changes the user's real email subscriptions; confirm with them before calling. Use it for unwanted bulk senders, not for a person you can simply decline.

Input parameters:

- `confirmed` (boolean, required): Must be true, and only after the user explicitly approved unsubscribing from this sender
- `item_id` (string, required): Inbox item id

Output parameters:

- `message` (string): Human-readable confirmation of the action

### `inbox.dismiss` (~61 tokens)

Dismiss inbox items you are not acting on (also marks the mail read in Gmail)

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms dismissing these items and marking their mail read
- `ids` (array, required): Inbox item ids to dismiss

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.acknowledge` (~64 tokens)

Keep auto-applied inbox items as-is and finalize the automatic action. Confirm the specific items with the user first.

Input parameters:

- `confirmed` (boolean, required): Must be true after the user confirms keeping these automatic actions
- `ids` (array, required): Inbox item ids to acknowledge

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.decline` (~105 tokens)

Queue decline replies to recruiter outreach. Depending on the user's preference this SENDS email from their address. Only call after the user explicitly approved declining these specific conversations.

Input parameters:

- `confirmed` (boolean, required): Must be true, and only after the user explicitly approved declining these conversations
- `ids` (array, required): Inbox item ids to decline
- `preference` (string): Send preference to apply; omit to use the saved preference
- `remember` (boolean): Save the preference for future declines

Output parameters:

- `data` (object)
- `meta` (object)

### `inbox.refresh` (~21 tokens)

Check Gmail for new mail now; returns per-account sync status

Output parameters:

- `data` (array)
- `meta` (object)

### `inbox.sync_status` (~23 tokens)

Per-account Gmail synchronization status, including current progress and last sync time

Output parameters:

- `data` (array)
- `meta` (object)

### `persona.get` (~32 tokens)

Get the user's persona: inferred job-search preferences and traits with an understanding score. Use it to tailor advice and searches.

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.recommendations.list` (~67 tokens)

List companies recommended from one company you track. Get signal_id from signals.list.

Input parameters:

- `limit` (integer): Maximum records to return
- `page` (string): Pagination cursor returned as meta.next_page
- `signal_id` (string, required): Tracked-company id from signals.list

Output parameters:

- `data` (array)
- `meta` (object)

### `signals.recommendations.get` (~31 tokens)

Get one recommended company with sources and persona fit

Input parameters:

- `recommendation_id` (string, required): Recommendation id

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.recommendations.watch` (~34 tokens)

Start tracking a recommended company (converts it into a signal)

Input parameters:

- `recommendation_id` (string, required): Recommendation id

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.recommendations.dismiss` (~43 tokens)

Dismiss a recommended company

Input parameters:

- `reason` (string): Why it was dismissed; sharpens future recommendations
- `recommendation_id` (string, required): Recommendation id

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.recommendations.block` (~33 tokens)

Dismiss a recommended company and block it from future recommendations

Input parameters:

- `recommendation_id` (string, required): Recommendation id

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.recommendations.restore` (~28 tokens)

Restore a dismissed or blocked recommendation

Input parameters:

- `recommendation_id` (string, required): Recommendation id

Output parameters:

- `data` (object)
- `meta` (object)

### `signals.recommendations.feedback` (~74 tokens)

Record why a recommendation was or was not a fit; this sharpens future recommendations and the persona

Input parameters:

- `feedback_types` (array, required): One or more supported feedback tags
- `interaction_source` (string): Where the feedback came from in the UI or agent flow
- `recommendation_id` (string, required): Recommendation id

Output parameters:

- `data` (object)
- `meta` (object)

### `account.agenda` (~16 tokens)

Get upcoming interviews and action items

Output parameters:

- `data` (object)
- `meta` (object)

### `integrations.list` (~28 tokens)

List connected Google accounts and their grant status. To connect a new account, use integrations.connect_google.

Output parameters:

- `data` (array)
- `meta` (object)

### `integrations.connect_google` (~66 tokens)

Get a link for the user to connect Gmail to Refine or approve a missing Gmail permission. Refine selects the permission needed for the connected account. The connection happens in the browser with no Refine sign-in required. Share the link only with the owner of this Refine account.

Output parameters:

- `connect_url` (string): Single-use browser URL for connecting Gmail
- `expires_at` (string): When the connection URL expires
- `instructions` (string): Safety and usage instructions for the connection URL

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/co-getrefine-refine/mcp#diagnostics

## Score history

- 2026-09-20: 81
- 2026-09-19: 81
- 2026-09-18: 81
- 2026-09-17: 80
- 2026-09-16: 80
- 2026-09-15: 79
- 2026-09-14: 79
- 2026-09-13: 78
- 2026-09-12: 78
- 2026-09-11: 77
- 2026-09-10: 77
- 2026-09-09: 76
- 2026-09-08: 76
- 2026-09-07: 76
- 2026-09-06: 76
- 2026-09-05: 76
- 2026-09-04: 76
- 2026-09-03: 76
- 2026-09-02: 76
- 2026-09-01: 76
- 2026-08-31: 76
- 2026-08-30: 76
- 2026-08-29: 76
- 2026-08-28: 76
- 2026-08-27: 76
- 2026-08-26: 76
- 2026-08-25: 74
- 2026-08-24: 73
- 2026-08-23: 73

## Common questions

### What is the Refine Job Search MCP server?

Refine Job Search is an MCP server listed in the public MCP registry as co.getrefine/refine. Job search management: applications, interviews, offers, recruiter email, and company openings. This page covers its hosted endpoint (https://mcp.getrefine.co/mcp).

### Is the Refine Job Search MCP server safe to use?

Refine Job Search scores 81 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 Refine Job Search MCP server expose?

Refine Job Search exposes 55 tools: jobs.list, jobs.get, jobs.add, jobs.update, jobs.delete, and 50 more. Their descriptions and schemas cost roughly 3,922 tokens of context every time the server is loaded.

### Does the Refine Job Search MCP server require authentication?

Yes. Refine Job Search asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the Refine Job Search MCP server still maintained?

Refine Job Search 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://mcp.getrefine.co/mcp
- Website: https://getrefine.co/mcp
- Changelog RSS feed: https://verifymcp.io/servers/co-getrefine-refine/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/co-getrefine-refine/mcp.json
- HTML version of this page: https://verifymcp.io/servers/co-getrefine-refine/mcp
