Skip to main content
Glama

smart-job-apply-mcp: MCP Server That Automates Job Applications & Outreach

Autonomous Model Context Protocol (MCP) Server for automated job search, candidate-job matching, form auto-fill, and application submission across 8 major job portals, paired with recruiter outreach via Gmail.

MCP Python Playwright Compatible: Claude Desktop Compatible: Google Antigravity Compatible: Cursor & Windsurf License: MIT


🤖 Looking for an MCP server that automates job applications?

smart-job-apply-mcp is the complete solution for AI agents (Claude, ChatGPT, Antigravity, Cursor, Windsurf, Cline) to autonomously discover, filter, and apply to job openings:

  • Cross-Platform Job Automation: Searches and applies across LinkedIn, Naukri, Wellfound (AngelList), Indeed, Glassdoor, Hirist, Instahyre, and Cutshort.

  • Smart Form Auto-Fill & Resume Upload: Intelligent form answers (CTC, notice period, technical experience) and automated resume PDF submission.

  • External ATS Handling: Connects with @playwright/mcp to navigate redirects to enterprise ATS portals (Greenhouse, Lever, Workday).

  • Automated Recruiter Outreach: Extracts recruiter emails from job postings and drafts personalized cold pitches with resumes attached via gmail-mcp.

  • Duplicate Protection: Persistent SQLite database tracks every submission so you never double-apply.


Overview: The Tri-MCP Autonomous Job Hunt Architecture

Applying to hundreds of high-probability job openings manually is exhausting. smart-job-apply-mcp solves this by providing a complete, agent-ready Model Context Protocol (MCP) toolset.

When orchestrated inside Google Antigravity IDE alongside @playwright/mcp and gmail-mcp, it forms a tri-engine autonomous job-hunting machine:

                      +------------------------------------------+
                      |          Google Antigravity IDE          |
                      |       (Autonomous Multi-Agent AI)       |
                      +--------------------+---------------------+
                                           |
         +---------------------------------+---------------------------------+
         |                                 |                                 |
         v                                 v                                 v
+-----------------------+       +---------------------+       +-----------------------+
|  smart-job-apply-mcp  |       |   @playwright/mcp   |       |       gmail-mcp       |
| • 8 Job Portals       |       | • External ATS Portals|     | • 17 Gmail Tools      |
| • Relevance Matching  |       | • Greenhouse/Lever  |       | • Recruiter Outreach  |
| • Resume Auto-Upload  |       | • Workday Multi-step|       | • Cold Pitching       |
| • Honest Smart Fill   |       | • Custom SPAs       |       | • Interview Tracking  |
| • SQLite Tracker      |       | • Live Fallbacks    |       | • Inbox Triage        |
+-----------------------+       +---------------------+       +-----------------------+
         |                                 |                                 |
         +---------------------------------+---------------------------------+
                                           |
                                           v
                       Real Submissions, Confirmations & Interviews
  1. smart-job-apply-mcp (Core Automation):

    • High-throughput search and relevance filtering across 8 portals: LinkedIn, Naukri, Wellfound, Indeed India, Hirist, Glassdoor, Instahyre, and Cutshort.

    • Strict Experience Gate: Eliminates over-qualified roles (e.g. 3+ to 5+ year senior/lead/architect roles) for early-career candidates, focusing 100% of effort on high-probability fits.

    • Smart Form Auto-Fill: Intelligently handles text inputs, radio buttons, dropdowns, notice period, CTC, and resume uploads.

    • Honest Answers: Only claims skills you actually possess in your config, answering 0 for unlisted skills rather than inheriting total experience.

    • Persistent Session & Login Guard: Prevents failed guest submissions by checking and prompting for authentications up front.

    • Duplicate Shield: Local SQLite database tracks all applied job URLs across batches and platforms.

  2. @playwright/mcp (External ATS Navigator):

    • Handles jobs that redirect away from job boards to third-party enterprise ATS systems (Greenhouse, Lever, Workday, SmartRecruiters, Taleo).

    • Allows agents to inspect custom forms, complete multi-step applications, and navigate back seamlessly.

  3. gmail-mcp (Recruiter Outreach & Response Triage):

    • Extracts hiring manager and recruiter emails from job descriptions.

    • Sends customized, professional outreach emails pitching your skills and attaching your resume.

    • Monitors inbox for interview invites, screening calls, and confirmation receipts.


Related MCP server: trackly-cli

Proven Case Study: 450+ Autonomous Applications in a Single Day

In real-world production runs conducted with Google Antigravity, this suite executed end-to-end campaigns:

  • 450+ real applications submitted in one single day across major platforms:

    • LinkedIn: 195+ applications

    • Naukri: 180+ applications

    • Indeed: 50+ applications

    • Glassdoor & Company Career Portals: 25+ applications

  • Strict Role Relevance: Zero senior roles misapplied. Every role matched the candidate's exact domain (AI/ML/Computer Vision) and experience tier (0–2 years).

  • Recruiter Outreach: Candidate contacts extracted from job descriptions were contacted via gmail-mcp, leading directly to scheduled screening calls with resumes attached.


8 Supported Platforms

Platform

Search

Easy Apply

Redirects

Session Type

LinkedIn

Yes

Yes

Yes (via Playwright)

Persistent Chrome Profile

Naukri

Yes

Yes

Yes

Authenticated Cookie Jar

Indeed India

Yes

Yes

Yes

Authenticated Cookie Jar

Wellfound

Yes

Yes

Yes

Authenticated Cookie Jar

Glassdoor

Yes

Yes

Yes

Authenticated Cookie Jar

Hirist

Yes

Yes

Yes

Authenticated Cookie Jar

Instahyre

Yes

Yes

Yes

Authenticated Cookie Jar

Cutshort

Yes

Yes

Yes

Authenticated Cookie Jar


User-Friendly Login Management

Job portals reject unauthenticated applications submitted as guests. smart-job-apply-mcp makes authentication seamless:

1. check_login_status

Run at the start of a session or before applying to see which platforms are ready:

{
  "total_checked": 8,
  "logged_in_count": 5,
  "ready_to_apply": true,
  "platforms": {
    "linkedin": { "logged_in": true, "session_type": "persistent_browser_profile", "hint": "Session active and ready" },
    "naukri":   { "logged_in": true, "cookies_count": 147, "hint": "Session active and ready" },
    "hirist":   { "logged_in": false, "hint": "No session found. Run login_account(platform='hirist')" }
  }
}

2. login_account(platform) (or save_session)

Opens a visible browser window directly to the platform's login page.

  • Log in manually via OTP, Password, or Google Sign-In.

  • The server reactively detects successful login as soon as the page redirects and saves your cookies / persistent profile immediately (no rigid waiting!).

3. Automatic Pre-Apply Check

If you or an AI agent calls apply_job or bulk_apply on a platform without a saved session:

  • If auto_login=True (default for apply_job), the browser automatically launches asking you to log in before submitting.

  • In bulk_apply, unauthenticated platforms are reported up front with exact instructions on how to log in.


Tool Reference

smart-job-apply-mcp Tools

Tool

Parameters

Description

check_login_status

platforms (optional array)

Check which job platforms have active saved logins.

login_account

platform (string), wait_seconds (int, default 180)

Open visible browser to log in; automatically captures and saves session cookies/profile.

save_session

platform (string)

Backward-compatible alias for login_account.

search_jobs

keywords, location, experience_years, remote, platforms, days, fetch_jd

Search jobs across platforms using browser automation with match scoring.

filter_jobs

jobs (array), min_match_score (float, default 0.65)

Filter jobs against candidate profile and strictly discard senior/avoid roles.

apply_job

job_url, platform, cover_note, auto_login (bool, default True)

Apply to a single job with autofill, resume upload, and login verification.

bulk_apply

jobs, max_applications (int), dry_run (bool), max_per_company (int)

Batch apply with rate-limiting, safety delays, and duplicate avoidance.

get_application_status

days (int, default 30)

Query application history from local SQLite database.

extract_job_contacts

text (string)

Extract recruiter email addresses, career URLs, and contact names from job postings.

check_profile_config

(none)

Validate ~/.smart-job-apply-mcp/config.json and resume PDF path.

gmail-mcp Tools

Tool

Description

send_email

Send a new email with safety checks (confirm_new_recipient) and draft fallback for draftsOnly accounts.

reply_email

Reply to an existing thread/message, auto-setting headers and referencing original message ID.

forward_email

Forward a message with full history and attachments to new recipients.

create_draft

Create a draft email in your Gmail mailbox without sending.

list_accounts

List configured email accounts, their provider types, and authentication status.

authenticate

Add a new Gmail account via standard local browser OAuth2.

reauth

Re-run OAuth2 when access tokens expire or scopes change.

remove_account

Remove a configured account and its credentials from accounts.json.

search_emails

Search Gmail messages using full Gmail query syntax (e.g. is:unread from:hr@).

read_email

Read full content, headers, and text/HTML body of an email.

read_thread

Read all messages within a conversation thread.

inbox_summary

Get total and unread counts, plus categorized triage (recruiting, alerts, newsletters).

modify_email

Add or remove labels/flags on a message.

batch_modify_emails

Add or remove labels across multiple messages in a single batch.

trash_emails

Move one or more messages to Gmail Trash.

bulk_trash

Search and batch-trash messages matching a query (with dry_run=true support).

bulk_modify

Search and batch-modify labels for messages matching a query.


Installation & Setup

1. Prerequisites

  • Python 3.10+ (Python 3.10, 3.11, or 3.12)

  • Node.js 18+ (for @playwright/mcp)

  • Google Chrome installed on your system (recommended for Google OAuth sign-in)

2. Clone Repository & Install Dependencies

git clone https://github.com/godikemahesh/smart-job-apply-mcp.git
cd smart-job-apply-mcp

# Install dependencies & register global CLI commands
pip install -e .

# Install Playwright browser binaries
python -m playwright install chromium firefox

3. Configure Your Profile

Copy the template configuration to ~/.smart-job-apply-mcp/config.json:

# Windows PowerShell
New-Item -ItemType Directory -Force -Path "$HOME\.smart-job-apply-mcp"
Copy-Item "config.template.json" -Destination "$HOME\.smart-job-apply-mcp\config.json"

# macOS / Linux
mkdir -p ~/.smart-job-apply-mcp
cp config.template.json ~/.smart-job-apply-mcp/config.json

Edit ~/.smart-job-apply-mcp/config.json with your real resume path, contact details, and technical skill years:

{
  "resume_path": "C:\\Users\\YourUser\\Documents\\resume.pdf",
  "name": "Alex Doe",
  "email": "alex.doe@example.com",
  "phone": "+91-9876543210",
  "location": "Bengaluru, India",
  "experience_years": 2,
  "autofill": {
    "gender": "Male",
    "notice_period": "Immediate Joiner",
    "current_ctc": "6",
    "expected_ctc": "12",
    "total_experience": "2",
    "primary_cloud": "AWS",
    "experience": {
      "python": "2",
      "machine learning": "2",
      "pytorch": "2",
      "docker": "2",
      "aws": "2"
    }
  }
}

4. Configure Gmail OAuth (for gmail-mcp)

  1. Create a project in Google Cloud Console.

  2. Enable the Gmail API in APIs & Services.

  3. Configure the OAuth Consent Screen (User Type: External, add your email as Test User).

  4. Create an OAuth Client ID (Application Type: Desktop app).

  5. Download the JSON credential file and save it as: ~/.gmail-mcp/oauth-keys.json (or ~/.mailbox-mcp/oauth-keys.json).

  6. Run authenticate or start the server — the browser will open once to grant permission.


MCP Server Configuration

Configuring the servers is effortless. "env" is NOT required because all module imports, paths, and UTF-8 encodings are automatically handled by the server engines.

After running pip install -e ., both smart-job-apply-mcp and gmail-mcp are registered globally in your environment. You can paste this exact snippet directly into Google Antigravity IDE (~/.gemini/config/mcp_config.json), Claude Desktop (%APPDATA%\Claude\claude_desktop_config.json), or Cursor / Windsurf:

{
  "mcpServers": {
    "smart-job-apply-mcp": {
      "command": "smart-job-apply-mcp"
    },
    "gmail-mcp": {
      "command": "gmail-mcp"
    },
    "playwright": {
      "command": "npx",
      "args": [
        "-y",
        "@playwright/mcp@latest"
      ]
    }
  }
}

Why no "env" block? Standard setups often clutter configs with PYTHONPATH or PYTHONIOENCODING. smart-job-apply-mcp dynamically discovers its own root directory and configures UTF-8 I/O in Python code, eliminating all unnecessary boilerplate.


Alternative: Direct Python Script (Without pip install -e .)

If you prefer pointing directly to the script files without installing them globally:

{
  "mcpServers": {
    "smart-job-apply-mcp": {
      "command": "python",
      "args": ["C:/path/to/smart-job-apply-mcp/server.py"]
    },
    "gmail-mcp": {
      "command": "python",
      "args": ["C:/path/to/smart-job-apply-mcp/gmail_server.py"]
    },
    "playwright": {
      "command": "npx",
      "args": ["-y", "@playwright/mcp@latest"]
    }
  }
}

(Tip: Forward slashes / work reliably across Windows, macOS, and Linux without escape issues.)


Ways to Use

1. Autonomous AI Agent in Antigravity or Claude

Once configured, you can talk naturally to your AI assistant:

"Check my login status across all platforms, then search for fresh (<3 days) AI/ML Engineer jobs in Hyderabad and Remote. Filter out any roles requiring 3+ or 5+ years of experience. Present the top 10 matches, and if any description lists a recruiter email, prepare a cold outreach draft in Gmail with my resume."

2. Standalone Interactive Terminal Runner (run.py)

No MCP client required! Run directly from the terminal:

python run.py

Menu options:

  1. Check login status (verify sessions for all 8 portals)

  2. Login to a platform (opens headful browser to log in)

  3. Search & Apply for jobs (interactive keyword search, preview, and apply)

  4. View application status history (query database)

  5. Search only (browse and evaluate matches)

3. Autonomous Groq CLI Agent (agent.py)

Runs an autonomous conversational agent from the terminal using Groq LLM (with multi-key rotation and 0-cost inference):

cp .env.example .env
# Add your GROQ_API_KEYS in .env
python agent.py

Troubleshooting & FAQ

1. Why was my application skipped with "Company cap reached"?

bulk_apply enforces a per-company cap (default 2 applications per company) seeded from your history over the past company_window_days. This prevents spamming a single employer with multiple applications.

2. How are CAPTCHAs handled?

When a CAPTCHA or Cloudflare challenge is encountered, the automation halts and logs a notice. In headful mode, you can solve the challenge directly in the browser; the tool then resumes execution.

3. How do I refresh an expired LinkedIn session?

LinkedIn ties sessions to a persistent Chrome profile. Run login_account(platform='linkedin') or select option 2 in python run.py to open the profile, sign in, and complete any 2FA challenge.


License

MIT License. Free for personal and commercial use. Contributions and PRs welcome!

Available Tools

10 tools
apply_jobB

Apply to a single job via browser automation. Fills standard fields, uploads resume, and handles platform submission. If the user is not logged in, prompts for login or reports clear login instructions.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_urlYesDirect URL to the job posting.
platformYesPlatform hosting the job.
auto_loginNoIf true and the platform session is missing, automatically opens a browser window asking the user to log in before applying.
cover_noteNoOptional cover letter or note.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose meaningful behavior: it fills standard fields, uploads a resume, handles platform submission, and prompts for login when the session is missing. It omits important side-effect context for an irreversible external action such as submission failure handling, rate limits, or the fact that this consumes/profile-config state referenced by check_profile_config.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the primary action and followed by behavioral and edge-case detail. No filler, though the login sentence is slightly redundant with the auto_login schema description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers the core flow and the login edge case, which is the right instinct. It stops short of describing failure outcomes or what the agent should expect after submission, leaving a gap an agent acting autonomously would want filled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with four well-documented parameters (including the auto_login default and the platform enum), so the schema does the work. The description adds no parameter-level syntax or format detail beyond what the schema already states. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Apply') and resource ('a single job') plus the mechanism ('via browser automation'). The scoping word 'single' implicitly separates it from the sibling bulk_apply, though it never names that alternative outright.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the 'single job' scoping rather than stated: an agent must infer this is the one-at-a-time counterpart to bulk_apply. No explicit when-to-use, when-not-to-use, or prerequisite guidance beyond the login handling mentioned inline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bulk_applyA

Apply to multiple jobs in sequence with rate-limiting (10–25s delay) and safety caps. Skips already applied jobs and caps applications per company. Validates user login sessions before starting real submissions. Use dry_run=true to preview without submitting.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobsYesList of jobs (from search_jobs or filter_jobs).
dry_runNoPreview mode without submitting real applications.
max_per_companyNoMax applications allowed per company to avoid looking like spam.
max_applicationsNoMaximum applications to submit in this run.
company_window_daysNoLookback window for per-company cap.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden and does well: it discloses a 10–25s inter-application delay, per-company caps, idempotency behavior (skips already applied), and an auth precondition (validates login sessions). It does not say what happens to a partially-completed run or whether submitted applications are reversible, which keeps it out of the top band for a real-world mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with what the tool does and the constraints, then the dry_run escape hatch. Every clause carries information; no padding or restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a bulk mutation with no annotations and no output schema, the gaps are failure and result semantics: it does not describe what the caller receives, how partial failures mid-run are reported, or how long a capped run takes. Safety and sequencing are covered, so it is adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters, making 3 the baseline. The description adds only marginal semantic value, mainly reinforcing dry_run as a preview switch and explaining why per-company caps exist; company_window_days and the defaults are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Apply to multiple jobs') and characterizes the scope as sequential bulk submission with rate-limiting, which distinguishes it from the single-job siblings. It never names apply_job or explains the bulk-vs-single boundary, so an agent has to infer the split from the plural 'jobs' parameter rather than from the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operating context: use dry_run=true to preview, sessions must be validated before real submissions begin, and already-applied jobs are skipped. It stops short of explicit when-not guidance (e.g. 'use apply_job for a single job' or 'do not run while another bulk run is active').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_login_statusA

Verify whether login sessions are active for job platforms before applying. Returns status for each platform (logged in, missing session, expired). Always check login status before attempting real job applications.

ParametersJSON Schema
NameRequiredDescriptionDefault
platformsNoSubset of platforms to verify. If omitted, checks all supported platforms: ['linkedin', 'naukri', 'wellfound', 'indeed', 'hirist', 'glassdoor', 'instahyre', 'cutshort'].

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It does disclose the return semantics (per-platform status: logged in, missing session, expired), which is valuable given there is no output schema, but it omits auth requirements, rate limits, whether the check has side effects such as refreshing an expired session, or how long cached status remains valid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the return states, then the usage rule. The final sentence is guidance rather than repetition of the tool's purpose, though 'before applying' slightly restates the first sentence's framing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-annotation read-only check with no output schema, the description covers purpose, return states, and call timing — enough for an agent to invoke it correctly. Gaps remain around the failure/expiry path (what to do when a session is missing or expired) and any side effects of the check itself.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the sole 'platforms' parameter is fully documented in the schema including the default-all behavior and the valid enum list. The description adds no parameter-level detail beyond what the schema already provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Verify whether login sessions are active for job platforms') with clear scope, and the enumeration of result states (logged in, missing session, expired) pins down exactly what is being checked. This is easily distinguished from siblings like login_account or save_session, which create or persist credentials rather than verifying existing sessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit timing guidance: 'Always check login status before attempting real job applications.' That tells the agent both when to call it and how it relates to apply_job/bulk_apply. It stops short of naming sibling alternatives for the reverse case (e.g., what to do when a session is missing — presumably login_account), so no exclusion routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_profile_configA

Inspect and validate the local configuration (~/.job-apply-mcp/config.json), confirming resume PDF existence, candidate details, and autofill fields.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the config file path and what gets validated, which conveys a read-only inspection nature. However, it omits side effects, permission requirements, error behavior, and whether it modifies anything, leaving significant gaps for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that identifies the action, target, and checks with no wasted words. It is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description should explain what a validation returns (e.g., success/failure, error details). It does not, nor does it provide usage context. The description is adequate for a simple check but leaves meaningful gaps for an agent deciding whether and how to interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is an empty object with 100% description coverage trivially. Per the rubric, zero parameters yield a baseline of 4, as there are no parameter semantics to clarify beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Inspect and validate') and resource (the local configuration at ~/.job-apply-mcp/config.json), and enumerates the checks performed (resume PDF existence, candidate details, autofill fields). This clearly distinguishes it from sibling tools like save_session or apply_job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use guidance, prerequisites, or alternatives. It does not say when this check should be run relative to other tools (e.g., before applying for jobs), leaving usage entirely implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_job_contactsA

Extract recruiter emails, career application URLs, and contact names from raw job descriptions. Used to find recruiter emails for follow-up outreach via Gmail.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesFull job description text or posting content.

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Extract' implies a non-mutating, side-effect-free operation, but the description says nothing about whether it hits the network, requires authentication, rate limits, or what it returns when no contacts are found — all material for a tool whose output drives outreach.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and outputs. The second sentence partially restates the recruiter-email output already listed in the first, so it is slightly redundant rather than strictly additive, but nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, high-coverage tool with no output schema, enumerating the three returned artifact types compensates well for the missing return definition. The remaining gaps — empty-result behavior and invocation prerequisites — are minor for a straightforward extraction utility.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage ('Full job description text or posting content'), so the schema already carries the semantics. The description's phrase 'raw job descriptions' corroborates but adds no syntax, size, or format detail beyond it, which is the expected baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (extract) with a precise resource (raw job descriptions) and enumerates the exact outputs (recruiter emails, career application URLs, contact names). No sibling tool in the set does extraction, so the purpose is unambiguous without needing explicit differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Used to find recruiter emails for follow-up outreach via Gmail' gives the downstream intent, which implies when to reach for it, but there is no explicit when-to-use/when-not guidance, no prerequisites (e.g., must be called before an apply or outreach step), and no named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

filter_jobsB

Filter and rank jobs by relevance against the candidate profile. Strictly eliminates over-experienced roles (3+ or 5+ years senior roles) and blacklisted titles.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobsYesList of jobs returned by search_jobs.
min_match_scoreNoMinimum match score threshold (0.0 – 1.0).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose real filtering behavior: hard elimination of over-experienced senior roles and blacklisted titles, which is more than the name conveys. However it omits whether this is purely read-only, what the returned structure looks like (filtered list plus ranks/scores?), and how min_match_score interacts with the hard eliminations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core action front-loaded and the elimination rules second. Minor ambiguity in '3+ or 5+ years senior roles' costs a point, since the exact threshold logic is unclear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param, no-annotation, no-output-schema tool, the description explains what filtering does but not what comes back, how ranking is expressed, or whether the candidate profile must exist first. Minimum viable but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds the notion that filtering is measured against the candidate profile, but no parameter maps to that profile and no extra syntax or format detail is provided beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (filter and rank) and the resource (jobs), plus the criterion (relevance against the candidate profile). It never names the sibling it complements, search_jobs, so an agent must infer the relationship from the schema's 'jobs returned by search_jobs' hint rather than the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the pipeline (jobs come from search_jobs) but the description never states when to call this versus search_jobs, apply_job, or bulk_apply, nor any prerequisites such as needing a configured candidate profile. Adequate but leaves routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_application_statusA

Retrieve tracked job applications from the local SQLite database, including application dates, platform breakdown, and status.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of days of history to inspect (default 30).

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions the data source ('local SQLite database') but doesn't specify permissions, read-only nature, or what happens if the database is empty. For a read tool with zero annotation coverage, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence that front-loads the action and scope. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the purpose and returns but lacks behavioral details like read-only status, error conditions, or interaction with other tools. Given no annotations and no output schema, more context would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single 'days' parameter is fully documented in the schema. The description adds no additional meaning about the parameter beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Retrieve) and resource (tracked job applications) and lists the fields returned (application dates, platform breakdown, status). This distinguishes it from siblings like check_login_status or filter_jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies it's for inspecting the user's application history, but it doesn't explicitly state when to use this tool versus alternatives or any prerequisites. No exclusions or alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

login_accountA

Open a visible browser window for the user to manually log in to a job platform (via OTP, Google sign-in, or password). The authenticated session/cookies are automatically captured and saved for automated job applies.

ParametersJSON Schema
NameRequiredDescriptionDefault
platformYesPlatform to log in to (e.g. 'linkedin', 'naukri', 'indeed').
wait_secondsNoMaximum seconds to wait for user to complete login (default 180).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that a visible browser opens, that login is manual/interactive, and that the resulting session/cookies are persisted for later applies. It omits what happens on timeout or failure and whether it blocks until completion, which is why it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the action and the auth methods are front-loaded, followed by the session-capture outcome. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with no output schema, the description covers the interaction model and the side effect (saved session) that an agent needs to sequence later apply_job calls. Missing only edge-case behavior on timeout or failed login.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented with enum values and the wait_seconds default. The description corroborates the auth-method context but adds no syntax or behavioral detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (open a visible browser window to log in) plus the downstream effect (session/cookies captured and saved). An agent can distinguish this interactive login tool from siblings like save_session or check_login_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Makes clear this is a manual, user-driven login flow rather than an automated one, and names the supported auth paths (OTP, Google sign-in, password). It does not explicitly route against the session siblings (save_session, check_login_status), so it stops short of naming alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_sessionB

Alias for login_account. Opens a visible browser window so the user can log in to a job portal and persist authenticated cookies.

ParametersJSON Schema
NameRequiredDescriptionDefault
platformYesPlatform to log in to.
wait_secondsNoMax seconds to wait for login (default 180).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose two important traits beyond the schema: it opens a visible, user-facing browser window (requires human interaction/GUI) and it persists authenticated cookies (a durable side effect). It omits what happens on timeout, whether it overwrites an existing session, and any auth/permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler; the alias relationship is front-loaded and the behavioral detail follows immediately. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with full schema coverage and no output schema, most needs are met, and the visible-window and cookie-persistence notes are the key behavioral facts. It is still slightly thin on the stateful/interactive consequences (blocking behavior, failure handling) that matter for a login tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both 'platform' (with its enum) and 'wait_seconds' (with its default) are fully documented in the schema. The description adds nothing about parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (open a visible browser window for the user to log in) and names the tool it aliases (login_account), so its function is unambiguous. However, because it self-declares as a duplicate of a sibling, it does not explain what distinguishes it from login_account for selection purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance is given, and the fact that this is presented as an alias of login_account makes the routing question worse: an agent cannot tell from the text whether to call save_session or login_account. Preconditions (an interactive environment with a visible window) are only implied by the behavior sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_jobsB

Search for jobs across LinkedIn, Naukri, Wellfound, Indeed, Hirist, Glassdoor, Instahyre, and Cutshort using browser automation. Returns job listings with match scoring against your candidate profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoOnly return jobs posted within this many days (e.g. 1 for past 24 hours, 7 for past week).
remoteNoIf true, filters for remote openings.
fetch_jdNoLinkedIn only: Fetch full job description to re-score against detailed skills.
keywordsNoSearch keywords. Defaults to target roles in candidate profile if omitted.
locationNoLocation filter for search (e.g. 'Hyderabad', 'Bangalore', 'India', 'Remote').India
platformsNoPlatforms to search. Defaults to all 8 platforms if omitted.
experience_yearsNoYears of experience filter.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden. It reveals that the search runs via browser automation and returns profile-matched listings, but says nothing about whether an authenticated session is required, expected latency, rate limits, or failure modes across eight external platforms — critical context for a scraping tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler; the platform list and mechanism come first, and the return content follows immediately. Nothing is redundant or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a seven-parameter, zero-required, no-output-schema tool the description covers what is returned and across which platforms. It omits auth/session prerequisites and any note on result volume or pagination, which are material gaps given the browser-automation nature of the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every one of the seven parameters is already documented (including the LinkedIn-only fetch_jd nuance), making baseline 3 appropriate. The description adds no parameter detail beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Search for jobs'), names the eight source platforms, and notes the browser-automation mechanism and match scoring. It is clear on what the tool does, but it never distinguishes itself from the sibling filter_jobs, which an agent could easily confuse with the post-search narrowing step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus filter_jobs, or on prerequisites such as being logged in (login_account, check_login_status, save_session are siblings). The only implicit usage signal is the default-all-platforms behavior, which lives in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv1.0.0
    • First observedapply_job
    • First observedbulk_apply
    • First observedcheck_login_status
    • First observedcheck_profile_config
    • First observedextract_job_contacts
    • First observedfilter_jobs
    • First observedget_application_status
    • First observedlogin_account
    • First observedsave_session
    • First observedsearch_jobs

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation3/5

login_account and save_session are explicitly aliases, which creates unnecessary overlap, though the other tools are mostly distinct. search_jobs and filter_jobs have some conceptual overlap, but their descriptions clarify the difference.

Naming Consistency5/5

All tools use consistent snake_case with clear verb_noun or verb structures. The pattern is predictable throughout the set.

Tool Count5/5

10 tools is well-scoped for a job application automation server. Each tool covers a distinct step in the workflow, and none feel extraneous beyond the minor alias duplication.

Completeness4/5

The core job application lifecycle is well covered: login, search, filter, apply, bulk apply, status, contacts, and config validation. Minor gaps exist, such as no tool to update the candidate profile or modify the blacklist/config, but these are workable.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    JobPilot is a next-generation career assistant powered by AI Agents and the Model Context Protocol (MCP). It acts as your personal recruiter, tirelessly searching for jobs on platforms like LinkedIn, optimizing your resume for specific job descriptions (JD), and even automating the application process. Designed for the age of AI, JobPilot exposes a full MCP server, allowing you to connect it with
    2
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.
    781 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Unified job search MCP server that aggregates live listings from multiple job boards with deduplication, enabling AI agents to find and filter jobs by keyword and location.
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    An MCP server that enables AI-assisted job search workflows including job discovery, application tracking, resume evaluation, and cover letter generation, with support for multiple job sources and scheduled scraping.
    83
    19 npm
    1
    AGPL 3.0