smart job apply mcp
Supports job search and applications on Glassdoor, including session management, smart form autofill, resume upload, and duplicate application tracking.
Integrates with Gmail (via gmail-mcp) to extract recruiter emails from job postings, send personalized outreach emails with resume attachments, and monitor the inbox for interview invites and responses.
Handles external ATS applications redirected to Greenhouse, using @playwright/mcp to navigate and complete multi-step application forms.
Supports job search and Easy Apply on Indeed India, including session management, smart form autofill, resume upload, and duplicate application tracking.
Supports job search and applications on Wellfound (AngelList), including session management, smart form autofill, resume upload, and duplicate application tracking.
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.
🤖 Looking for an MCP server that automates job applications?
smart-job-apply-mcpis 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/mcpto 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 & Interviewssmart-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
0for 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.
@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.
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 |
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 forapply_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 which job platforms have active saved logins. |
|
| Open visible browser to log in; automatically captures and saves session cookies/profile. |
|
| Backward-compatible alias for |
|
| Search jobs across platforms using browser automation with match scoring. |
|
| Filter jobs against candidate profile and strictly discard senior/avoid roles. |
|
| Apply to a single job with autofill, resume upload, and login verification. |
|
| Batch apply with rate-limiting, safety delays, and duplicate avoidance. |
|
| Query application history from local SQLite database. |
|
| Extract recruiter email addresses, career URLs, and contact names from job postings. |
| (none) | Validate |
gmail-mcp Tools
Tool | Description |
| Send a new email with safety checks ( |
| Reply to an existing thread/message, auto-setting headers and referencing original message ID. |
| Forward a message with full history and attachments to new recipients. |
| Create a draft email in your Gmail mailbox without sending. |
| List configured email accounts, their provider types, and authentication status. |
| Add a new Gmail account via standard local browser OAuth2. |
| Re-run OAuth2 when access tokens expire or scopes change. |
| Remove a configured account and its credentials from |
| Search Gmail messages using full Gmail query syntax (e.g. |
| Read full content, headers, and text/HTML body of an email. |
| Read all messages within a conversation thread. |
| Get total and unread counts, plus categorized triage (recruiting, alerts, newsletters). |
| Add or remove labels/flags on a message. |
| Add or remove labels across multiple messages in a single batch. |
| Move one or more messages to Gmail Trash. |
| Search and batch-trash messages matching a query (with |
| 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 firefox3. 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.jsonEdit ~/.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)
Create a project in Google Cloud Console.
Enable the Gmail API in APIs & Services.
Configure the OAuth Consent Screen (User Type: External, add your email as Test User).
Create an OAuth Client ID (Application Type: Desktop app).
Download the JSON credential file and save it as:
~/.gmail-mcp/oauth-keys.json(or~/.mailbox-mcp/oauth-keys.json).Run
authenticateor 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.
🌟 Recommended: Direct CLI Commands (Zero Path Edits)
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 withPYTHONPATHorPYTHONIOENCODING.smart-job-apply-mcpdynamically 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.pyMenu options:
Check login status (verify sessions for all 8 portals)
Login to a platform (opens headful browser to log in)
Search & Apply for jobs (interactive keyword search, preview, and apply)
View application status history (query database)
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.pyTroubleshooting & 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 toolsapply_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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_url | Yes | Direct URL to the job posting. | |
| platform | Yes | Platform hosting the job. | |
| auto_login | No | If true and the platform session is missing, automatically opens a browser window asking the user to log in before applying. | |
| cover_note | No | Optional cover letter or note. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobs | Yes | List of jobs (from search_jobs or filter_jobs). | |
| dry_run | No | Preview mode without submitting real applications. | |
| max_per_company | No | Max applications allowed per company to avoid looking like spam. | |
| max_applications | No | Maximum applications to submit in this run. | |
| company_window_days | No | Lookback window for per-company cap. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| platforms | No | Subset of platforms to verify. If omitted, checks all supported platforms: ['linkedin', 'naukri', 'wellfound', 'indeed', 'hirist', 'glassdoor', 'instahyre', 'cutshort']. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Full job description text or posting content. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| jobs | Yes | List of jobs returned by search_jobs. | |
| min_match_score | No | Minimum match score threshold (0.0 – 1.0). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days of history to inspect (default 30). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform to log in to (e.g. 'linkedin', 'naukri', 'indeed'). | |
| wait_seconds | No | Maximum seconds to wait for user to complete login (default 180). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform to log in to. | |
| wait_seconds | No | Max seconds to wait for login (default 180). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Only return jobs posted within this many days (e.g. 1 for past 24 hours, 7 for past week). | |
| remote | No | If true, filters for remote openings. | |
| fetch_jd | No | LinkedIn only: Fetch full job description to re-score against detailed skills. | |
| keywords | No | Search keywords. Defaults to target roles in candidate profile if omitted. | |
| location | No | Location filter for search (e.g. 'Hyderabad', 'Bangalore', 'India', 'Remote'). | India |
| platforms | No | Platforms to search. Defaults to all 8 platforms if omitted. | |
| experience_years | No | Years of experience filter. |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v1.0.0- First observed
apply_job - First observed
bulk_apply - First observed
check_login_status - First observed
check_profile_config - First observed
extract_job_contacts - First observed
filter_jobs - First observed
get_application_status - First observed
login_account - First observed
save_session - First observed
search_jobs
TDQS
Scored across 10 tools
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.
All tools use consistent snake_case with clear verb_noun or verb structures. The pattern is predictable throughout the set.
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.
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
Related MCP Connectors
Job application tracker for developers - AI agents write over MCP, you review in a dashboard.
AI job search MCP — fact-checked jobs, application tracker, alerts. ChatGPT, Claude, Cursor.
GetJobzi MCP server for job search, application tracking, and career forecasting.
Public MCP server for discovering open jobs. Search, filter, and get application links.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceJobPilot 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 with2MIT

trackly-cliofficial
AlicenseNot gradedqualityAmaintenanceMCP 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 npm3MIT- AlicenseNot gradedqualityDmaintenanceUnified 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
- AlicenseCqualityCmaintenanceAn 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.8319 npm1AGPL 3.0