# HopeHire (remote · hopehire.in)

Tailor resumes, score ATS fit, find hiring leads, and send cold outreach, from your agent.

- Trust score: 66/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `hopehire.in`: 66/100 (this document), [markdown](https://verifymcp.io/servers/in-hopehire-mcp/hopehire.md), [page](https://verifymcp.io/servers/in-hopehire-mcp/hopehire)

## Channel facts

- Endpoint: `https://hopehire.in/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-11-05.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 168 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - 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**: 58/100
  - AI-judged instruction clarity (fair).
  - Tool/resource definitions use about 15344 tokens (~91/item across 168 items; 168 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 43/100
  - Stability observed for 13 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 74/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 21% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 24 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_notification_api_notifications__notification_id__delete" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 168 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 HopeHire MCP server?

HopeHire is a hosted endpoint at https://hopehire.in/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 in-hopehire-mcp 'https://hopehire.in/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "in-hopehire-mcp": {
      "url": "https://hopehire.in/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "in-hopehire-mcp": {
      "type": "http",
      "url": "https://hopehire.in/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.in-hopehire-mcp]
url = "https://hopehire.in/mcp"
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add in-hopehire-mcp --url 'https://hopehire.in/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  in-hopehire-mcp:
    url: "https://hopehire.in/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "in-hopehire-mcp": {
      "Transport": "http",
      "Url": "https://hopehire.in/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add in-hopehire-mcp -t streamable-http -u 'https://hopehire.in/mcp'
```

### Other

```json
{
  "mcpServers": {
    "in-hopehire-mcp": {
      "type": "http",
      "url": "https://hopehire.in/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-11-04 (score 66, +1)

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

### 2026-11-02 (score 65, +1)

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

### 2026-10-31 (score 64, +1)

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

### 2026-10-29 (score 63, +1)

- [functional] New tool “send_pending_auto_reply_now_api_auto_replies__reply_id__send_post”

### 2026-10-27 (score 62, +1)

- [functional] New tool “apply_resume_theme_api_resume_apply_theme_post”
- [functional] New tool “list_themes_api_resume_themes_get”

### 2026-10-25 (score 61, +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.

### 2026-10-24 (score 60, 0)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-23 (score 60)

First indexed and scored.

## MCP tools (168)

### `get_notifications_api_notifications_get` (~69 tokens)

Get Notifications

Fetch notifications for the current user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {}
]
\```

Input parameters:

- `is_read` (boolean)
- `limit` (integer)

### `mark_all_notifications_as_read_api_notifications_read_all_post` (~56 tokens)

Mark All Notifications As Read

Mark every unread notification as read (not just the page the client loaded).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `mark_notification_as_read_api_notifications__notification_id__read_patch` (~56 tokens)

Mark Notification As Read

Mark a notification as read.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `notification_id` (string, required)

### `delete_notification_api_notifications__notification_id__delete` (~49 tokens)

Delete Notification

Delete a notification.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `notification_id` (string, required)

### `get_ats_score_api_resume_ats_score_get` (~51 tokens)

Get Ats Score

Return the most recently calculated ATS score for the user's resume.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `refresh_ats_score_api_resume_ats_score_refresh_post` (~53 tokens)

Refresh Ats Score

Recalculate the ATS score from the current resume and persist it.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `resume_ai_chat_api_resume_ai_chat_post` (~99 tokens)

Resume Ai Chat

Stream an AI response that helps the user interactively improve their resume.

Body:
    user_id             (str)  — authenticated user's ID
    message             (str)  — latest user message
    conversation_history (list) — [{role: "user"|"assistant", content: str}]

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `mark_improvement_suggestions_invalid_api_resume_improvement_suggestions_mark_invalid_post` (~76 tokens)

Mark Improvement Suggestions Invalid

Replace improvement suggestions with the provided valid_suggestions list.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)
- `valid_suggestions` (array, required)

### `generate_yaml_version_api_resume_generate_yaml_post` (~49 tokens)

Generate Yaml Version

Generate YAML version and RenderCV PDF for existing resume

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `apply_suggestions_api_resume_apply_suggestions_post` (~46 tokens)

Apply Suggestions

Apply improvement suggestions to YAML and regenerate PDF

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_yaml_suggestions_api_resume_yaml_suggestions_post` (~46 tokens)

Get Yaml Suggestions

Generate YAML-based improvement suggestions

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `generate_complete_resume_api_resume_generate_complete_post` (~69 tokens)

Generate Complete Resume

Generate a complete, enhanced resume with additional relevant content using AI.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `resume_text` (string, required)
- `user_id` (string, required)

### `render_raw_yaml_api_resume_render_raw_yaml_post` (~50 tokens)

Render Raw Yaml

Hot-reload: Generate PDF from raw YAML content

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `list_themes_api_resume_themes_get` (~36 tokens)

List Themes

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `apply_resume_theme_api_resume_apply_theme_post` (~55 tokens)

Apply Resume Theme

Switch the design theme in a YAML document. Pure transform: no render, no save.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `save_resume_yaml_api_resume_save_yaml_post` (~114 tokens)

Save Resume Yaml

Save raw YAML content to the user's resume.

YAML is treated as the source of truth: the structured resume fields
(personalInfo, experience, education, projects, skills, certifications)
are parsed from the YAML and written back to the database so that every
other part of the application (resume overview, AI chat, job matching …)
always reflects the latest YAML edits.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `create_resume_from_linkedin_api_resume_from_linkedin_post` (~75 tokens)

Create Resume From Linkedin

Create a resume from LinkedIn profile URL using Apify API.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

### `get_rendercv_pdf_api_resume_rendercv_pdf_get` (~62 tokens)

Get Rendercv Pdf

Get RenderCV PDF download URL for the user's resume.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `get_rendercv_pdf_download_api_resume_rendercv_pdf_download_get` (~75 tokens)

Get Rendercv Pdf Download

Return a presigned URL with Content-Disposition: attachment so the browser
downloads the resume PDF instead of opening it inline.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `test_pdf_generation_api_resume_test_pdf_generation_get` (~49 tokens)

Test Pdf Generation

Test PDF generation to debug PDF issues.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `debug_pdf_api_resume_debug_pdf_get` (~54 tokens)

Debug Pdf

Get debugging information about a PDF file.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `file_path` (string, required)

### `download_resume_api_resume_download_get` (~66 tokens)

Download Resume

Download the user's resume.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `s3Path` (string, required)

### `public_resume_api_resume_public_get` (~68 tokens)

Public Resume

Resume link embedded in cold emails: no login, but only links we signed will open.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `s3Path` (string, required)
- `sig` (string, required)

### `show_resume_api_resume__resume_id__get` (~76 tokens)

Show Resume

Show the resume via redirect to presigned S3 URL.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `s3Path` (string, required)

### `get_resume_api_resume_get` (~64 tokens)

Get Resume

Get the user's resume.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `user_id` (string)

### `upload_resume_api_resume_post` (~76 tokens)

Upload Resume

Upload and process a resume file.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `file` (string)
- `user_id` (string)

### `update_resume_manual_api_resume_put` (~296 tokens)

Update Resume Manual

Update a user's resume manually and trigger PDF generation.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `achievements` (array)
- `certifications` (array)
- `cold_email_resume_source` (string)
- `createdAt` (string, required)
- `education` (array, required)
- `experience` (array, required)
- `extracurriculars` (array)
- `fileName` (string)
- `fileSize` (integer)
- `fileType` (string)
- `id` (string, required)
- `improvementSuggestions` (array)
- `jobPreferences` (object)
- `languages` (array)
- `linkedin_url` (string)
- `personalInfo` (object, required)
- `positionsOfResponsibility` (array)
- `projects` (array)
- `rendercv_pdf_path` (string)
- `rendercv_pdf_url` (string)
- `rendercv_url_refreshed_at` (string)
- `s3Path` (string)
- `skills` (array, required)
- `source` (string)
- `updatedAt` (string, required)
- `userId` (string, required)
- `yaml_content` (string)
- `yaml_updated_at` (string)

### `delete_resume_api_resume_delete` (~62 tokens)

Delete Resume

Delete the user's resume and cleanup associated resources.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `s3Path` (string)
- `user_id` (string)

### `set_cold_email_resume_source_api_resume_cold_email_source_put` (~118 tokens)

Set Cold Email Resume Source

Set which resume file cold outreach should use: the originally uploaded
file ("uploaded", the default) or HopeHire's RenderCV-generated PDF
("generated"). A lightweight sibling to the full manual-edit PUT above —
this only flips one field and doesn't trigger PDF/YAML regeneration.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

### `get_preferences_api_job_preferences_get` (~69 tokens)

Get Preferences

Get the user's job preferences
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `user_id` (string)

### `create_preferences_api_job_preferences_post` (~189 tokens)

Create Preferences

Create the user's job preferences
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `expectedCtc` (string)
- `experienceLevels` (array)
- `functionAreas` (array)
- `graduationYear` (integer)
- `id` (string)
- `industries` (array)
- `isFresher` (boolean)
- `jobTypes` (array)
- `locationTypes` (array)
- `locations` (array)
- `specializations` (array)
- `targetCompanies` (array)
- `targetRoles` (array)
- `techStack` (array)
- `updatedAt` (string)
- `userId` (string)

### `update_preferences_api_job_preferences_put` (~189 tokens)

Update Preferences

Update the user's job preferences
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `expectedCtc` (string)
- `experienceLevels` (array)
- `functionAreas` (array)
- `graduationYear` (integer)
- `id` (string)
- `industries` (array)
- `isFresher` (boolean)
- `jobTypes` (array)
- `locationTypes` (array)
- `locations` (array)
- `specializations` (array)
- `targetCompanies` (array)
- `targetRoles` (array)
- `techStack` (array)
- `updatedAt` (string)
- `userId` (string)

### `delete_preferences_api_job_preferences_delete` (~51 tokens)

Delete Preferences

Delete the user's job preferences
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string)

### `start_job_matching_api_job_matches_start_post` (~91 tokens)

Start Job Matching

Start an asynchronous job matching process
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `resume_id` (string): Resume ID to use for matching
- `use_preferences` (boolean): Whether to filter jobs by user preferences first
- `user_id` (string): User ID to match jobs for

### `get_filtered_jobs_api_job_matches_get` (~233 tokens)

Get Filtered Jobs

Get filtered job matches for a user
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `experience_level` (string): Filter by experience level
- `job_type` (string): Filter by job type
- `keywords` (array): Filter by keywords
- `limit` (integer): Maximum number of results to return
- `location` (string): Filter by location
- `location_type` (string): Filter by location type (remote, onsite, hybrid)
- `min_match_score` (number): Filter by minimum match score
- `min_salary` (number): Filter by minimum salary
- `offset` (integer): Number of results to skip
- `resume_id` (string): Resume ID to get matches for
- `sort_by` (string): Field to sort by
- `sort_order` (string): Sort order (asc or desc)
- `user_id` (string): User ID to get matches for

### `clear_job_matches_api_job_matches_delete` (~61 tokens)

Clear Job Matches

Clear all job matches for a user
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string): User ID to clear matches for

### `start_conversation_api_auto_apply_start_conversation_post` (~103 tokens)

Start Conversation

Start a new conversation using the shared auto-apply service logic.

\### Responses:

\**201**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `job_id` (string, required): Related job ID
- `resume_id` (string): Resume ID if available
- `user_id` (string, required): User ID initiating the conversation
- `user_profile` (object): User profile (optional, for backward compatibility)

### `start_auto_apply_api_auto_apply_post` (~135 tokens)

Start auto-apply process

Launches an automated job application process that finds contacts, generates personalized messages, and sends emails with resume attachments.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "task_id": "Task Id",
  "status": "AutoApplyStatus"
}
\```

Input parameters:

- `job_id` (string, required): ID of the job to apply for
- `user_id` (string, required): ID of the user applying for the job
- `user_profile` (object, required): User profile information for job application

### `get_auto_apply_tasks_api_auto_apply_get` (~73 tokens)

Get all auto-apply tasks for a user

Get all auto-apply tasks for a given user.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string): ID of the user to fetch tasks for

### `get_auto_apply_status_api_auto_apply__task_id__get` (~105 tokens)

Check auto-apply status

Retrieves the current status and results of an auto-apply task.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "task_id": "Task Id",
  "status": "AutoApplyStatus"
}
\```

Input parameters:

- `task_id` (string, required): Auto-apply task ID returned from the start endpoint

### `get_auto_apply_status_by_task_id_api_auto_apply_status__task_id__get` (~110 tokens)

Get Auto Apply Status By Task Id

Get status of an auto-apply task by task_id (conversationId).
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "task_id": "Task Id",
  "status": "AutoApplyStatus"
}
\```

Input parameters:

- `task_id` (string, required): Auto-apply task ID

### `start_conversation_api_email_conversations_start_conversation_post` (~131 tokens)

Start Conversation

Start a new email conversation.

\### Responses:

\**201**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `contact_email` (string, required): Email address of the contact
- `contact_name` (string): Name of the contact
- `context_data` (object): Additional context data
- `initial_body` (string): Optional initial message body
- `intent` (string, required): Primary intent of the conversation
- `job_id` (string): Related job ID if applicable
- `subject_line` (string, required): Subject line for the conversation

### `get_conversations_api_email_conversations_get` (~143 tokens)

Get Conversations

Get all conversations for the authenticated user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {
    "id": "Id",
    "contact_email": "Contact Email",
    "status": "ConversationStatus",
    "intent": "ConversationIntent",
    "subject_line": "Subject Line",
    "message_count": 1,
    "last_updated": "2023-01-01T00:00:00Z"
  }
]
\```

Input parameters:

- `limit` (integer)
- `skip` (integer)

### `get_conversation_details_api_email_conversations__conversation_id__get` (~159 tokens)

Get Conversation Details

Get details of a specific conversation.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "id": "Id",
  "contact_email": "Contact Email",
  "status": "ConversationStatus",
  "intent": "ConversationIntent",
  "subject_line": "Subject Line",
  "message_count": 1,
  "last_updated": "2023-01-01T00:00:00Z",
  "messages": [
    {}
  ],
  "context_data": {}
}
\```

Input parameters:

- `conversation_id` (string, required): ID of the conversation to get

### `pause_conversation_api_email_conversations__conversation_id__pause_post` (~65 tokens)

Pause Conversation

Pause an ongoing conversation to stop automatic follow-ups.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `conversation_id` (string, required): ID of the conversation to pause

### `resume_conversation_api_email_conversations__conversation_id__resume_post` (~60 tokens)

Resume Conversation

Resume a paused conversation.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `conversation_id` (string, required): ID of the conversation to resume

### `send_manual_message_api_email_conversations__conversation_id__message_post` (~81 tokens)

Send Manual Message

Send a manual message in the conversation, overriding the AI.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `conversation_id` (string, required): ID of the conversation
- `message_content` (string, required): Content of the manual message to send

### `resolve_protocol_api_email_conversations__conversation_id__resolve_post` (~103 tokens)

Resolve Protocol

Resolve a human-intervention protocol by sending a manual reply 
and marking the associated notification as read.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `conversation_id` (string, required): ID of the conversation
- `message_content` (string, required): Content of the manual message to send
- `notification_id` (string, required): ID of the notification to mark as read

### `get_system_stats_api_multi_tenant_monitoring_stats_get` (~84 tokens)

Get System Stats

Get overall system statistics

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "workers": [
    {}
  ],
  "total_active_users": 1,
  "system_status": "System Status"
}
\```

### `get_active_users_api_multi_tenant_monitoring_users_active_get` (~90 tokens)

Get Active Users

Get list of active users with email monitoring enabled

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {}
]
\```

Input parameters:

- `limit` (integer): Maximum number of users to return
- `skip` (integer): Number of users to skip

### `enable_user_monitoring_api_multi_tenant_monitoring_users__user_id__enable_post` (~62 tokens)

Enable User Monitoring

Enable email monitoring for a specific user

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `disable_user_monitoring_api_multi_tenant_monitoring_users__user_id__disable_post` (~62 tokens)

Disable User Monitoring

Disable email monitoring for a specific user

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `update_user_monitoring_config_api_multi_tenant_monitoring_users__user_id__config_put` (~108 tokens)

Update User Monitoring Config

Update email monitoring configuration for a user

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `email_monitoring_enabled` (boolean): Enable/disable email monitoring
- `monitoring_frequency` (integer): Monitoring frequency in seconds
- `priority` (string): Priority level (low, normal, high)
- `user_id` (string, required): User ID

### `trigger_user_discovery_api_multi_tenant_monitoring_discovery_trigger_post` (~50 tokens)

Trigger User Discovery

Manually trigger user discovery process

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_user_monitoring_status_api_multi_tenant_monitoring_users__user_id__status_get` (~64 tokens)

Get User Monitoring Status

Get monitoring status for a specific user

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `get_email_analytics_report_api_reports__user_id___duration__get` (~118 tokens)

Get Email Analytics Report

Get email analytics report for a user over a specific duration.

Duration options:
\- 7d: Last 7 days
\- 30d: Last 30 days
\- 90d: Last 90 days
\- 1y: Last year
\- all: All time

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `duration` (string, required)
- `user_id` (string, required)

### `get_email_analytics_summary_api_reports__user_id__summary_get` (~74 tokens)

Get Email Analytics Summary

Get a quick summary of email analytics for the last 30 days.
This is a lightweight endpoint for dashboard widgets.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `get_user_memory_api_user_memory__user_id__get` (~73 tokens)

Get User Memory

Get user memory by user ID

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `user_id` (string, required)

### `create_user_memory_api_user_memory__user_id__post` (~145 tokens)

Create User Memory

Create new user memory

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `ai_context_notes` (string)
- `auto_apply_preferences` (object)
- `career_context` (object)
- `communication_preferences` (object)
- `compensation` (object)
- `job_preferences` (object)
- `notice_period` (object)
- `safety_guardrails` (object)
- `screening_profile` (object)
- `user_id` (string, required)

### `update_user_memory_api_user_memory__user_id__put` (~145 tokens)

Update User Memory

Update existing user memory

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `ai_context_notes` (string)
- `auto_apply_preferences` (object)
- `career_context` (object)
- `communication_preferences` (object)
- `compensation` (object)
- `job_preferences` (object)
- `notice_period` (object)
- `safety_guardrails` (object)
- `screening_profile` (object)
- `user_id` (string, required)

### `delete_user_memory_api_user_memory__user_id__delete` (~74 tokens)

Delete User Memory

Delete (deactivate) user memory

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `user_id` (string, required)

### `get_user_memory_history_api_user_memory__user_id__history_get` (~117 tokens)

Get User Memory History

Get user memory history (all versions)

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true,
  "total": 1,
  "page": 1,
  "limit": 1
}
\```

Input parameters:

- `limit` (integer): Items per page
- `page` (integer): Page number
- `user_id` (string, required)

### `add_ai_interaction_context_api_user_memory__user_id__context_post` (~78 tokens)

Add Ai Interaction Context

Add AI interaction context to user memory

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `user_id` (string, required)

### `update_remembered_field_answer_api_user_memory__user_id__remembered_field_put` (~141 tokens)

Update Remembered Field Answer

Edit one remembered application-field answer from the memory-bank UI.
Same durable store the extension writes to (interaction_history, keyed
by normalized label) - this just lets the user correct it directly
instead of waiting to be asked the question again on some future form.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `label` (string, required)
- `user_id` (string, required)
- `value` (string, required)

### `delete_remembered_field_answer_api_user_memory__user_id__remembered_field_delete` (~107 tokens)

Delete Remembered Field Answer

Forgets one remembered application-field answer (memory-bank UI delete action).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `normalized_label` (string, required): The entry's normalized_label, as returned in interaction_history
- `user_id` (string, required)

### `apply_memory_suggestion_api_user_memory_apply_suggestion_post` (~59 tokens)

Apply Memory Suggestion

Apply a specific memory update suggested by the AI.
Body: { user_id, suggestion }

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `user_memory_ai_chat_api_user_memory_ai_chat_post` (~40 tokens)

User Memory Ai Chat

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_available_senders_api_email_sender_pool_senders_get` (~79 tokens)

Get Available Senders

Get all available email senders (admin only — exposes other senders' PII and quotas)

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

### `get_least_used_sender_api_email_sender_pool_least_used_sender_get` (~110 tokens)

Get Least Used Sender

Get the least used email sender for load balancing, considering company contact history (admin only)

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `company_id` (string): Company ID to consider for contact history
- `company_name` (string): Company name to consider for contact history

### `get_fallback_sender_api_email_sender_pool_fallback_sender_get` (~89 tokens)

Get Fallback Sender

Get a fallback email sender, excluding the specified user (admin only)

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `exclude_user_id` (string): User ID to exclude from selection

### `send_email_via_pool_api_email_sender_pool_send_email_post` (~145 tokens)

Send Email Via Pool

Send an email using the email sender pool (admin only)

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

- `attachment_filename` (string)
- `in_reply_to` (string)
- `message_text` (string, required)
- `references` (string)
- `s3_attachment_key` (string)
- `sender_user_id` (string)
- `subject` (string, required)
- `thread_id` (string)
- `to` (string, required)

### `get_my_footer_api_email_footer_me_get` (~46 tokens)

Get My Footer

Get the footer for the currently authenticated user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `update_my_footer_api_email_footer_me_put` (~117 tokens)

Update My Footer

Update the footer for the currently authenticated user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `company` (string)
- `email` (string)
- `github` (string)
- `linkedin` (string)
- `location` (string)
- `name` (string)
- `phone` (string)
- `portfolio` (string)
- `project_links` (array)
- `title` (string)

### `get_email_footer_api_email_footer__user_id__get` (~55 tokens)

Get Email Footer

Get email footer for a user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `update_email_footer_api_email_footer__user_id__put` (~126 tokens)

Update Email Footer

Update email footer for a user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `company` (string)
- `email` (string)
- `github` (string)
- `linkedin` (string)
- `location` (string)
- `name` (string)
- `phone` (string)
- `portfolio` (string)
- `project_links` (array)
- `title` (string)
- `user_id` (string, required)

### `get_formatted_footer_api_email_footer__user_id__formatted_get` (~59 tokens)

Get Formatted Footer

Get formatted footer string for a user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `generate_footer_from_resume_api_email_footer__user_id__generate_from_resume_post` (~61 tokens)

Generate Footer From Resume

Generate email footer from user's resume data.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `get_user_config_api_config_user__user_id__get` (~55 tokens)

Get User Config

Get configuration for a specific user

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `update_user_config_api_config_user__user_id__put` (~55 tokens)

Update User Config

Update configuration for a specific user

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `reset_user_config_api_config_user__user_id__delete` (~54 tokens)

Reset User Config

Reset user configuration to defaults

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `get_campaign_config_api_config_campaign__campaign_id__get` (~55 tokens)

Get Campaign Config

Get configuration for a specific campaign

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `campaign_id` (string, required)

### `update_campaign_config_api_config_campaign__campaign_id__put` (~55 tokens)

Update Campaign Config

Update configuration for a specific campaign

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `campaign_id` (string, required)

### `reset_campaign_config_api_config_campaign__campaign_id__delete` (~54 tokens)

Reset Campaign Config

Reset campaign configuration to defaults

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `campaign_id` (string, required)

### `get_effective_config_api_config_effective__user_id__get` (~67 tokens)

Get Effective Config

Get effective configuration combining user and campaign settings

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `campaign_id` (string)
- `user_id` (string, required)

### `get_default_config_api_config_defaults_get` (~41 tokens)

Get Default Config

Get default configuration values

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_all_user_configs_api_config_admin_users_get` (~48 tokens)

Get All User Configs

Get all user configurations (admin only)

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_all_campaign_configs_api_config_admin_campaigns_get` (~49 tokens)

Get All Campaign Configs

Get all campaign configurations (admin only)

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_available_leads_api_linkedin_leads_get` (~142 tokens)

Get Available Leads

Return leads for the authenticated user, filtered by outreach status.

status=fresh      — leads not yet contacted (default); AI-ranked
status=queued     — leads the user has queued for outreach
status=contacted  — leads the user has already emailed

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `email_only` (boolean): Only return leads with a known email address
- `limit` (integer)
- `min_quality` (number)
- `offset` (integer)
- `status` (string): fresh | queued | contacted

### `get_all_leads_admin_api_linkedin_leads_all_get` (~83 tokens)

Get All Leads Admin

Admin view: return all leads regardless of outreach status.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `email_only` (boolean)
- `limit` (integer)
- `min_quality` (number)
- `offset` (integer)

### `get_lead_stats_api_linkedin_leads_stats_get` (~48 tokens)

Get Lead Stats

Return summary statistics for the lead database.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `list_accounts_api_linkedin_leads_accounts_get` (~51 tokens)

List Accounts

List all LinkedIn scraper accounts in the pool (passwords masked).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `add_account_api_linkedin_leads_accounts_post` (~86 tokens)

Add Account

Add a LinkedIn scraper account to the pool.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `assigned_queries` (array)
- `email` (string, required)
- `max_requests_per_day` (integer)
- `password` (string, required)
- `proxy` (string)

### `update_account_status_api_linkedin_leads_accounts__account_id__status_patch` (~74 tokens)

Update Account Status

Update the status of a LinkedIn account (active / cooldown / banned).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `account_id` (string, required)
- `status` (string, required)

### `list_scrape_runs_api_linkedin_leads_scrape_runs_get` (~71 tokens)

List Scrape Runs

List recent scrape run records for audit / dashboard (admin only: they hold platform-wide queries and volumes).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `limit` (integer)

### `get_lead_outreach_history_api_linkedin_leads__lead_id__history_get` (~106 tokens)

Get Lead Outreach History

Return the outreach thread for this lead for the current user.

Returns a chronological list of events:
  \- type=sent      — initial cold email
  \- type=follow_up — follow-up email
  \- type=reply     — recruiter reply

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `lead_id` (string, required)

### `get_lead_api_linkedin_leads__lead_id__get` (~57 tokens)

Get Lead

Fetch a single lead by its ID.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `lead_id` (string, required)

### `update_outreach_status_api_linkedin_leads__lead_id__outreach_patch` (~102 tokens)

Update Outreach Status

Update the current user's outreach status for a given lead.
Use this after sending a cold email so the lead is marked as contacted.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `cold_email_id` (string)
- `lead_id` (string, required)
- `notes` (string)
- `status` (string, required)

### `send_outreach_from_lead_api_linkedin_leads__lead_id__send_outreach_post` (~234 tokens)

Send Outreach From Lead

Generate and send a cold outreach email directly from a LinkedIn lead.

Flow:
  1\. Fetch the lead — must have an email address.
  2\. Load the authenticated user's resume/profile from MongoDB.
  3\. Call send_and_track_cold_email() to generate (or use custom_message)
     and send the email via the user's connected Gmail.
  4\. Record the outreach status on the lead (status='sent') with a back-
     reference to the cold_email_id.
  5\. Sync the company HR contact (idempotent — already done on scrape,
     but update lastContactedAt now).

Returns the cold_email_id so the frontend can link to the email thread.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `custom_message` (string): Override the LLM-generated email body
- `job_link` (string): Optional job URL to include in the email
- `lead_id` (string, required)

### `generate_linkedin_message_api_linkedin_leads__lead_id__generate_linkedin_message_post` (~99 tokens)

Generate Linkedin Message

Generate a short LinkedIn outreach message (≤280 chars) personalised to
this lead. The frontend copies it to clipboard and opens the recruiter's
LinkedIn profile so the user can paste-and-send in one step.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `lead_id` (string, required)

### `bulk_send_outreach_api_linkedin_leads_bulk_outreach_post` (~111 tokens)

Bulk Send Outreach

Send outreach emails to multiple leads in one call.

Each lead must have an email address. Leads without emails are skipped.
Returns per-lead results so the frontend can show success/fail per contact.

Rate-limited to 20 leads per request to protect Gmail sending quotas.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `lead_ids` (array, required): List of lead IDs to contact

### `trigger_scrape_api_linkedin_leads_trigger_post` (~142 tokens)

Trigger Scrape

Manually kick off a LinkedIn scrape run. Admin only: each run spends metered Apify credits and
accepts arbitrary search queries.

Strategy (tried in order):
  1\. Publish to the linkedin_scrape_queue via RabbitMQ (if running).
  2\. If RabbitMQ is unavailable or times out, run the scrape directly
     as a FastAPI BackgroundTask so this endpoint always returns fast.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `max_posts_per_query` (integer)
- `queries` (array)

### `apify_webhook_api_linkedin_leads_webhook_apify_post` (~81 tokens)

Apify Webhook

Receives push notifications from Apify when a scraper run completes.
No authentication required (Apify calls this endpoint).
Apify includes a secret token in the URL for verification in production.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `list_templates_api_email_templates_get` (~117 tokens)

List Templates

Return the user's email templates, generating them if none exist yet.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {
    "id": "Id",
    "name": "Name",
    "subject": "Subject",
    "body": "Body",
    "usage_count": 1,
    "reply_count": 1,
    "reply_rate": 1.0
  }
]
\```

### `update_template_api_email_templates__template_id__put` (~144 tokens)

Update Template

Edit a template's subject, body, or name.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "id": "Id",
  "name": "Name",
  "subject": "Subject",
  "body": "Body",
  "usage_count": 1,
  "reply_count": 1,
  "reply_rate": 1.0
}
\```

Input parameters:

- `body` (string)
- `name` (string)
- `subject` (string)
- `template_id` (string, required)

### `regenerate_templates_api_email_templates_regenerate_post` (~119 tokens)

Regenerate Templates

Delete all existing templates and generate a fresh one via AI.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {
    "id": "Id",
    "name": "Name",
    "subject": "Subject",
    "body": "Body",
    "usage_count": 1,
    "reply_count": 1,
    "reply_rate": 1.0
  }
]
\```

### `get_tools_schema_api_tools_schema_get` (~62 tokens)

Get Tools Schema

Returns the JSON schema for all available tools.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `use_composio` (boolean): Whether to include Composio tools

### `execute_tool_api_tools_execute_post` (~44 tokens)

Execute Tool

Executes a tool by name with provided arguments.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_connection_url_api_tools_connect__app_name__get` (~60 tokens)

Get Connection Url

Get the authorization URL for a specific Composio app.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `app_name` (string, required)

### `disconnect_app_api_tools_connect__app_name__delete` (~59 tokens)

Disconnect App

Revoke the user's Composio connection for a specific app.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `app_name` (string, required)

### `list_connections_api_tools_connections_get` (~46 tokens)

List Connections

List all active connections for the user in Composio.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_integration_status_api_tools_status_get` (~48 tokens)

Get Integration Status

Get the connection status for key integrations across all providers.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_user_credits_api_referrals_credits_get` (~53 tokens)

Get User Credits

Return the current user's credit balance, referral code, and total referrals.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_referral_code_api_referrals_code_get` (~52 tokens)

Get Referral Code

Return the user's referral code, generating one if it doesn't exist yet.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `claim_referral_code_api_referrals_claim_post` (~65 tokens)

Claim Referral Code

Claim a referral code. Awards 10 credits to both the claimer and the referrer.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `referral_code` (string, required)

### `get_outreach_queue_api_outreach_queue_get` (~62 tokens)

Get Outreach Queue

Get pending outreach queue items for the current user.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {}
]
\```

### `approve_outreach_item_api_outreach_queue__item_id__approve_post` (~62 tokens)

Approve Outreach Item

Approve a queue item and send the cold email.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `item_id` (string, required)

### `dismiss_outreach_item_api_outreach_queue__item_id__delete` (~57 tokens)

Dismiss Outreach Item

Dismiss an outreach queue item.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `item_id` (string, required)

### `get_autopilot_settings_api_autopilot_settings_get` (~112 tokens)

Get Autopilot Settings

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "daily_outreach_enabled": true,
  "outreach_timezone": "Outreach Timezone",
  "daily_outreach_batch_size": 1,
  "credit_balance": 1,
  "autopilot_enabled": true,
  "outreach_paused": true
}
\```

### `update_daily_outreach_settings_api_autopilot_settings_patch` (~140 tokens)

Update Daily Outreach Settings

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "daily_outreach_enabled": true,
  "outreach_timezone": "Outreach Timezone",
  "daily_outreach_batch_size": 1,
  "credit_balance": 1,
  "autopilot_enabled": true,
  "outreach_paused": true
}
\```

Input parameters:

- `daily_outreach_batch_size` (integer)
- `daily_outreach_enabled` (boolean, required)
- `outreach_timezone` (string)

### `resume_outreach_endpoint_api_autopilot_resume_outreach_post` (~125 tokens)

Resume Outreach Endpoint

User-initiated: clear the bounce circuit breaker's paused state.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "daily_outreach_enabled": true,
  "outreach_timezone": "Outreach Timezone",
  "daily_outreach_batch_size": 1,
  "credit_balance": 1,
  "autopilot_enabled": true,
  "outreach_paused": true
}
\```

### `update_legacy_autopilot_settings_api_autopilot_legacy_settings_patch` (~116 tokens)

Update Legacy Autopilot Settings

Legacy job-board autopilot — not available when daily outreach is enabled.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "autopilot_enabled": true,
  "autopilot_min_match_score": 1.0
}
\```

Input parameters:

- `autopilot_enabled` (boolean, required)
- `autopilot_min_match_score` (number, required)

### `get_active_outreach_batch_api_outreach_batches_active_get` (~41 tokens)

Get Active Outreach Batch

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `get_outreach_batch_api_outreach_batches__batch_id__get` (~50 tokens)

Get Outreach Batch

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `batch_id` (string, required)

### `create_outreach_batch_api_outreach_batches_post` (~88 tokens)

Create Outreach Batch

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `batch_type` (string, required): linkedin_leads | outreach_queue
- `item_ids` (array): Explicit IDs to process; otherwise auto-select from fresh/pending items
- `limit` (integer)
- `min_quality` (number)

### `cancel_outreach_batch_api_outreach_batches__batch_id__cancel_post` (~51 tokens)

Cancel Outreach Batch

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `batch_id` (string, required)

### `get_pending_auto_replies_api_auto_replies_get` (~65 tokens)

Get Pending Auto Replies

List pending auto-replies the user can still cancel.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {}
]
\```

### `cancel_pending_auto_reply_api_auto_replies__reply_id__delete` (~61 tokens)

Cancel Pending Auto Reply

Cancel a pending auto-reply before it fires.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `reply_id` (string, required)

### `send_pending_auto_reply_now_api_auto_replies__reply_id__send_post` (~74 tokens)

Send Pending Auto Reply Now

Send a pending auto-reply now instead of waiting for tomorrow's 9:30 AM run.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `reply_id` (string, required)

### `create_application_api_applications_post` (~213 tokens)

Create Application

Track a newly-submitted job application (called by the extension after a user submits).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "user_id": "User Id",
  "company_name": "Company Name",
  "job_title": "Job Title",
  "job_url": "Job Url",
  "platform": "Platform",
  "status": "ApplicationStatus",
  "applied_at": "2023-01-01T00:00:00Z",
  "status_history": [
    {
      "status": "ApplicationStatus",
      "changed_at": "2023-01-01T00:00:00Z"
    }
  ],
  "source": "Source"
}
\```

Input parameters:

- `company_name` (string, required)
- `job_title` (string, required)
- `job_url` (string, required)
- `platform` (string)

### `list_applications_api_applications_get` (~195 tokens)

List Applications

List the current user's tracked applications, most recent first.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {
    "user_id": "User Id",
    "company_name": "Company Name",
    "job_title": "Job Title",
    "job_url": "Job Url",
    "platform": "Platform",
    "status": "ApplicationStatus",
    "applied_at": "2023-01-01T00:00:00Z",
    "status_history": [
      {
        "status": "ApplicationStatus",
        "changed_at": "2023-01-01T00:00:00Z"
      }
    ],
    "source": "Source"
  }
]
\```

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `update_application_status_api_applications__application_id__status_patch` (~204 tokens)

Update Application Status

Manually update an application's status (e.g. marking Interview/Offer/Rejected).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "user_id": "User Id",
  "company_name": "Company Name",
  "job_title": "Job Title",
  "job_url": "Job Url",
  "platform": "Platform",
  "status": "ApplicationStatus",
  "applied_at": "2023-01-01T00:00:00Z",
  "status_history": [
    {
      "status": "ApplicationStatus",
      "changed_at": "2023-01-01T00:00:00Z"
    }
  ],
  "source": "Source"
}
\```

Input parameters:

- `application_id` (string, required)
- `status` (string, required)

### `answer_fields_api_extension_answer_fields_post` (~135 tokens)

Answer Fields

AI fallback for job-application form fields the extension's coded/heuristic
fill pass could not confidently answer. Batched per application (not per
field) to control latency and cost.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "answers": [
    {
      "field_id": "Field Id",
      "confidence": "Confidence",
      "source": "Source"
    }
  ]
}
\```

Input parameters:

- `fields` (array, required)
- `job_context` (object, required)

### `agent_step_api_extension_agent_step_post` (~179 tokens)

Agent Step

Tier 4: one step of an agentic fallback loop for pages where tiers 1-3
(coded adapters, universal field matcher, batched AI field-answering)
found nothing to work with. The extension sends a snapshot of every
visible interactive element on the page; this returns exactly one action
to take next. Never raises on a bad/failed model response - degrades to
"blocked" so the client loop just stops rather than crashing the fill.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "action": "Action"
}
\```

Input parameters:

- `elements` (array, required)
- `history` (array)
- `job_context` (object, required)
- `step` (integer, required)

### `remember_field_answer_api_extension_remember_field_answer_post` (~182 tokens)

Remember Field Answer

Durable, cross-device, cross-site memory of one field answer the extension
learned - either a confirmed AI answer or a user's correction, fired on
every blur/selection of a field the extension filled. Grounds future
/answer-fields calls (see get_remembered_field_answers above) so the same
question doesn't need asking again on the next application, anywhere.
Requires extension_field_memory_consent - the extension's own UI should
already gate whether it ever sends this request, but a consent decision
this sensitive (can include EEO/self-identification answers the user
typed themselves) shouldn't rely on client-side gating alone.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `label` (string, required)
- `value` (string, required)

### `tailor_resume_api_extension_tailor_resume_post` (~120 tokens)

Tailor Resume

Generates a one-off resume PDF reworded toward a specific job description,
for the extension to swap into a file-upload field before submitting that
one application. Never persisted to the user's profile/canonical resume.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "pdf_base64": "Pdf Base64",
  "file_name": "File Name"
}
\```

Input parameters:

- `job_description` (string, required)

### `match_score_api_extension_match_score_post` (~136 tokens)

Match Score

Ad-hoc resume<->job-description match score for a posting the extension
is looking at, which isn't (and doesn't need to be) a job stored in the
DB. Uses the pure heuristic matcher (no embeddings/DB lookups needed).

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "match_score": 1.0,
  "summary": "Summary",
  "missing_skills": [
    "string"
  ]
}
\```

Input parameters:

- `job_description` (string, required)

### `get_extension_settings_api_extension_settings_get` (~77 tokens)

Get Extension Settings

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "recruiter_comms_consent": true,
  "field_memory_consent": true,
  "credit_balance": 1
}
\```

### `update_extension_settings_api_extension_settings_patch` (~98 tokens)

Update Extension Settings

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "recruiter_comms_consent": true,
  "field_memory_consent": true,
  "credit_balance": 1
}
\```

Input parameters:

- `field_memory_consent` (boolean)
- `recruiter_comms_consent` (boolean)

### `extension_apply_api_extension_apply_post` (~166 tokens)

Extension Apply

Orchestrator called by the extension right after a user submits a job
application: tracks the application, then immediately attempts the same
credit-gated cold-outreach send the daily cron would eventually do,
triggered on-demand instead. Outreach is best-effort: if there is no
known contact for the company or the user is out of credits, the
application is still tracked and the response says why outreach was
skipped rather than failing the request.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `company_name` (string, required)
- `job_description` (string)
- `job_title` (string, required)
- `job_url` (string, required)
- `platform` (string)

### `send_product_update_broadcast_api_newsletter_send_post` (~69 tokens)

Send Product Update Broadcast

Manually trigger a one-off product-update broadcast to all subscribed users.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `html_body` (string, required)
- `subject` (string, required)

### `unsubscribe_api_newsletter_unsubscribe_get` (~79 tokens)

Unsubscribe

Public link clicked from a newsletter email - no auth, verified by HMAC signature.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: text/html

\**Example Response:**
\```json
"string"
\```

Input parameters:

- `sig` (string, required)
- `uid` (string, required)

### `submit_feedback_api_feedback_post` (~49 tokens)

Submit Feedback

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `action_type` (string, required)
- `feedback_text` (string)

### `list_keys_api_api_keys_get` (~34 tokens)

List Keys

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `create_key_api_api_keys_post` (~60 tokens)

Create Key

Create a new API key. The raw key is only ever returned here -- store it now.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `name` (string, required)

### `delete_key_api_api_keys__key_id__delete` (~46 tokens)

Delete Key

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `key_id` (string, required)

### `invite_info_api_orgs_invites__token__get` (~67 tokens)

Invite Info

Public (pre-login) details for the join page. Unknown, used and expired all look the same.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `token` (string, required)

### `my_org_api_orgs_me_get` (~35 tokens)

My Org

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `my_org_summary_api_orgs_me_summary_get` (~38 tokens)

My Org Summary

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

### `my_students_api_orgs_me_students_get` (~65 tokens)

My Students

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `cohort_id` (string)
- `limit` (integer)
- `q` (string)
- `skip` (integer)

### `remove_student_api_orgs_me_students__user_id__delete` (~48 tokens)

Remove Student

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `user_id` (string, required)

### `create_invites_api_orgs_me_invites_post` (~46 tokens)

Create Invites

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `invites` (array, required)

### `list_invites_api_orgs_me_invites_get` (~46 tokens)

List Invites

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `status` (string)

### `revoke_invite_api_orgs_me_invites__invite_id__delete` (~51 tokens)

Revoke Invite

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `invite_id` (string, required)

### `get_least_contacted_hr_api_cold_email_least_contacted_hr_get` (~138 tokens)

Get Least Contacted Hr

Get the least contacted HR email for a specific company.
This endpoint uses the same logic as the unified email flow to select the best HR contact.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true,
  "hr_email": "Hr Email",
  "company_name": "Company Name",
  "total_contacts": 1
}
\```

Input parameters:

- `company_name` (string, required): Name of the company to get least contacted HR for

### `get_cold_email_api_cold_email_get` (~231 tokens)

Get Cold Email

Get cold emails for a user with pagination.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "cold_emails": [
    {
      "user_id": "User Id",
      "recruiter_email": "Recruiter Email",
      "company_name": "Company Name",
      "sent_at": "2023-01-01T00:00:00Z",
      "status": "Status",
      "followup_interval_hours": 1,
      "followup_count": 1,
      "replied": true,
      "message": "Message",
      "opened": true,
      "open_count": 1,
      "auto_draft_generated": true
    }
  ],
  "offset": 1,
  "pagination": 1,
  "has_more": true
}
\```

Input parameters:

- `offset` (integer, required)
- `pagination` (integer, required)
- `user_id` (string)

### `send_cold_email_api_cold_email_post` (~215 tokens)

Send Cold Email

Send a cold email with a pre-generated message.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "user_id": "User Id",
  "recruiter_email": "Recruiter Email",
  "company_name": "Company Name",
  "sent_at": "2023-01-01T00:00:00Z",
  "status": "Status",
  "followup_interval_hours": 1,
  "followup_count": 1,
  "replied": true,
  "message": "Message",
  "opened": true,
  "open_count": 1,
  "auto_draft_generated": true
}
\```

Input parameters:

- `company_name` (string, required)
- `message` (string, required)
- `recruiter_email` (string, required)
- `user_id` (string, required)
- `user_profile` (object, required)

### `preview_cold_email_api_cold_email_preview_post` (~111 tokens)

Preview Cold Email

Generate a preview of a cold email without sending it.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "message": "Message",
  "subject": "Subject"
}
\```

Input parameters:

- `company_name` (string, required)
- `recruiter_email` (string, required)
- `user_id` (string, required)
- `user_profile` (object, required)

### `send_cold_email_to_hr_api_cold_email_send_to_hr_post` (~98 tokens)

Send Cold Email To Hr

Send a cold email to a specific HR contact.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `company_id` (string, required)
- `company_name` (string, required)
- `hr_email` (string, required)
- `user_id` (string, required)
- `user_profile` (object, required)

### `send_unified_cold_email_api_cold_email_unified_post` (~332 tokens)

Send Unified Cold Email

Unified cold email endpoint that handles:
1\. Company creation if it doesn't exist
2\. HR email auto-selection if not provided
3\. HR contact addition to company
4\. Email sending with tracking
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true,
  "cold_email": {
    "user_id": "User Id",
    "recruiter_email": "Recruiter Email",
    "company_name": "Company Name",
    "sent_at": "2023-01-01T00:00:00Z",
    "status": "Status",
    "followup_interval_hours": 1,
    "followup_count": 1,
    "replied": true,
    "message": "Message",
    "opened": true,
    "open_count": 1,
    "auto_draft_generated": true
  },
  "hr_email_used": "Hr Email Used",
  "company_created": true,
  "hr_added": true
}
\```

Input parameters:

- `company_name` (string, required)
- `email_content` (string)
- `fallback_enabled` (boolean)
- `hr_email` (string)
- `is_new_company` (boolean)
- `jobLink` (string)
- `sender_user_id` (string)
- `subject` (string)
- `user_id` (string, required)
- `user_profile` (object, required)

### `preview_unified_cold_email_api_cold_email_unified_preview_post` (~163 tokens)

Preview Unified Cold Email

Generate a preview for unified cold email flow.
Requires authentication.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "message": "Message",
  "subject": "Subject"
}
\```

Input parameters:

- `company_name` (string, required)
- `email_content` (string)
- `fallback_enabled` (boolean)
- `hr_email` (string)
- `is_new_company` (boolean)
- `jobLink` (string)
- `sender_user_id` (string)
- `subject` (string)
- `user_id` (string, required)
- `user_profile` (object, required)

### `get_cold_email_replies_api_cold_email__cold_email_id__replies_get` (~82 tokens)

Get Cold Email Replies

Get replies for a specific cold email using its ID.
This checks both the cold_emails collection and email_conversations collection.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `cold_email_id` (string, required)

### `get_cold_email_replies_by_message_id_api_cold_email_message__message_id__replies_get` (~89 tokens)

Get Cold Email Replies By Message Id

Get replies for a cold email using its Gmail message_id.
This is useful when you have the message_id from the cold email response.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `message_id` (string, required)

### `list_companies_api_companies_get` (~79 tokens)

List Companies

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
[
  {
    "hrContacts": [
      {
        "email": "Email"
      }
    ],
    "hrContactCount": 1
  }
]
\```

### `create_company_endpoint_api_companies_post` (~91 tokens)

Create Company Endpoint

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "hrContacts": [
    {
      "email": "Email"
    }
  ],
  "hrContactCount": 1
}
\```

Input parameters:

- `hrEmail` (string, required)
- `name` (string, required)

### `add_hr_contact_endpoint_api_companies__company_id__hr_contacts_post` (~71 tokens)

Add Hr Contact Endpoint

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "name": "Name"
}
\```

Input parameters:

- `company_id` (string, required)

### `tracking_pixel_api_tracking_pixel__email_id__png_get` (~66 tokens)

Tracking Pixel

Endpoint for the email tracking pixel.
When loaded, it updates the corresponding email record as opened.

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

Input parameters:

- `email_id` (string, required)

### `get_job_details_api_v1_jobs_get` (~226 tokens)

Get Job Details

Get detailed job listings with advanced filters and pagination

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true,
  "personalized": true
}
\```

Input parameters:

- `company` (string): Filter by company name
- `experience_level` (string): Filter by experience level
- `job_type` (string): Filter by job type
- `limit` (integer): Maximum number of jobs to return
- `location` (string): Filter by location
- `offset` (integer): Number of jobs to skip
- `remote` (boolean): Filter by remote jobs
- `salary_max` (number): Maximum salary
- `salary_min` (number): Minimum salary
- `search` (string): Search term for job title, company, or description
- `sort_by` (string): Field to sort by, or 'relevance' for a personalised ranking
- `sort_order` (string): Sort order (asc or desc)

### `get_job_detail_api_v1_jobs__job_id__get` (~77 tokens)

Get Job Detail

Get a detailed job listing by ID

\### Responses:

\**200**: Successful Response (Success Response)
Content-Type: application/json

\**Example Response:**
\```json
{
  "success": true
}
\```

Input parameters:

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

## Diagnostics

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

## Score history

- 2026-11-05: 66
- 2026-11-04: 66
- 2026-11-03: 65
- 2026-11-02: 65
- 2026-11-01: 64
- 2026-10-31: 64
- 2026-10-30: 63
- 2026-10-29: 63
- 2026-10-28: 62
- 2026-10-27: 62
- 2026-10-26: 61
- 2026-10-25: 61
- 2026-10-24: 60
- 2026-10-23: 60

## Common questions

### What is the HopeHire MCP server?

HopeHire is an MCP server listed in the public MCP registry as in.hopehire/mcp. Tailor resumes, score ATS fit, find hiring leads, and send cold outreach, from your agent. This page covers its hosted endpoint (https://hopehire.in/mcp).

### Is the HopeHire MCP server safe to use?

HopeHire 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 HopeHire MCP server expose?

HopeHire exposes 168 tools: get_notifications_api_notifications_get, mark_all_notifications_as_read_api_notifications_read_all_p…, mark_notification_as_read_api_notifications__notification_i…, delete_notification_api_notifications__notification_id__del…, get_ats_score_api_resume_ats_score_get, and 163 more. Their descriptions and schemas cost roughly 15,344 tokens of context every time the server is loaded.

### Does the HopeHire MCP server require authentication?

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

### Is the HopeHire MCP server still maintained?

HopeHire is still listed as active in the MCP registry. We last reached this channel on 5 November 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://hopehire.in/mcp
- Authorisation metadata: https://hopehire.in/.well-known/oauth-protected-resource/mcp
- Changelog RSS feed: https://verifymcp.io/servers/in-hopehire-mcp/hopehire.xml
- Changelog JSON feed: https://verifymcp.io/servers/in-hopehire-mcp/hopehire.json
- HTML version of this page: https://verifymcp.io/servers/in-hopehire-mcp/hopehire
