Openings
Server Details
Search jobs on verified employer job boards. Every link is the employer's own posting.
Glama couldn't complete the latest health check. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 60.2% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- abhay-avagama/hiring-agent
- GitHub Stars
- 0
- Server Listing
- openings
TDQS
Scored across 7 tools
Each tool has a clear role: search_jobs is resume-free filtering, recommend_jobs is resume-based ranking, analyze_job_fit is a single-job deep dive, and optimize_resume is revision. The only mild overlap is between recommend_jobs and analyze_job_fit, but their descriptions distinguish list-level ranking from role-level analysis.
All tool names follow the same snake_case verb_noun convention: analyze_job_fit, get_job, get_job_coverage, optimize_resume, prepare_job_search, recommend_jobs, search_jobs. The pattern is predictable and makes the action and target clear across the set.
Seven tools is well-scoped for a job-search and resume-optimization server. Each tool covers a distinct stage of the workflow without redundancy or unnecessary bulk.
The tool surface covers the core workflow well: prepare the index, search, get details, rank by resume, analyze fit, and optimize a resume. A minor gap is the lack of any candidate-side workflow for saving, tracking, or managing applications beyond receiving the application URL.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
- Changed
analyze_job_fit15 fields changed- added
Input schema / properties / intent / descriptionAdded value: +"What the candidate is actually looking for, stated explicitly rather than guessed from the resume. Every field is optional; the ones given narrow the result, and the excluded* fields remove roles the candidate does not want to see." - added
Input schema / properties / intent / properties / countries / descriptionAdded value: +"Two-letter codes the candidate may work in, such as IN or US. This is eligibility to work, not where the office is" - added
Input schema / properties / intent / properties / excludedCountries / descriptionAdded value: +"Two-letter codes to drop even when a role is otherwise eligible" - added
Input schema / properties / intent / properties / excludedLocations / descriptionAdded value: +"Cities or regions to drop, matched like locations" - added
Input schema / properties / intent / properties / excludedRoles / descriptionAdded value: +"Role titles to drop, matched like roles" - added
Input schema / properties / intent / properties / excludedTerms / descriptionAdded value: +"Words that disqualify a role, matched as whole words in the title, such as \"intern\" or \"sales\"" - added
Input schema / properties / intent / properties / locations / descriptionAdded value: +"Cities or regions to keep, matched as case-insensitive substrings of the job's location, such as \"Bengaluru\" or \"Delhi NCR\"" - added
Input schema / properties / intent / properties / remote / descriptionAdded value: +"True to keep only remote roles, false to drop them; omit to keep both" - added
Input schema / properties / intent / properties / requiredSkills / descriptionAdded value: +"Skills a role must state to be kept, such as \"kubernetes\". Each is matched as a whole word" - added
Input schema / properties / intent / properties / roles / descriptionAdded value: +"Role titles the candidate is looking for, in their own words, such as \"backend engineer\" or \"data analyst\". Matched against the job title" - added
Input schema / properties / intent / properties / seniority / descriptionAdded value: +"Levels to keep, in the posting's own vocabulary, such as \"senior\" or \"lead\". Not a years-of-experience filter: use experienceYears in search_jobs for that" - added
Input schema / properties / jobId / descriptionAdded value: +"Stable job id from search_jobs or recommend_jobs" - added
Input schema / properties / resume / descriptionAdded value: +"The resume itself, passed inline. It is parsed in memory for this call and never written to disk, logged, or sent anywhere else." - added
Input schema / properties / resume / properties / format / descriptionAdded value: +"How content is encoded: plain text, markdown, or base64 of a PDF or DOCX file" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "assessment": { + "additionalProperties": true, + "description": "The overall read, with its reasoning", + "type": "object" + }, + "interviewPreparationGaps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "job": { + "additionalProperties": true, + "description": "The job that was analyzed", + "properties": { + "age": { + "description": "Bucketed posting age; undated means the board gave no date, not that the role is fresh", + "enum": [ + "new", + "older", + "stale", + "undated" + ], + "type": "string" + }, + "company": { + "type": "string" + }, + "eligibleCountries": { + "description": "Two-letter codes the role is open to", + "items": { + "type": "string" + }, + "type": "array" + }, + "experience": { + "additionalProperties": true, + "description": "Years the posting itself states as { min, max }; null when it states none, absent when the description was not read", + "type": [ + "object", + "null" + ] + }, + "id": { + "description": "Stable id to pass to get_job, analyze_job_fit or optimize_resume", + "type": "string" + }, + "location": { + "type": "string" + }, + "postedDaysAgo": { + "type": "number" + }, + "remote": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "updatedAt": { + "description": "When the board says the role was posted or last updated; absent when the board states none", + "type": "string" + }, + "url": { + "description": "The employer's own posting, which is where an application is made", + "type": "string" + }, + "workMode": { + "enum": [ + "remote", + "hybrid", + "onsite", + "unknown" + ], + "type": "string" + } + }, + "type": "object" + }, + "partiallySupported": { + "description": "Requirements with partial evidence, and what is missing", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "profile": { + "additionalProperties": true, + "description": "What was read from the resume; not stored", + "type": "object" + }, + "scores": { + "additionalProperties": true, + "type": "object" + }, + "screeningRisks": { + "description": "What is likely to stop this application early", + "items": { + "type": "string" + }, + "type": "array" + }, + "supported": { + "description": "Requirements the resume supports, each with the quoted evidence", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "unsupported": { + "description": "Requirements the resume does not evidence at all", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "job", + "assessment" + ], + "type": "object" +}
- Changed
get_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "job": { + "additionalProperties": true, + "description": "The full job, including its description and the employer's application URL", + "properties": { + "age": { + "description": "Bucketed posting age; undated means the board gave no date, not that the role is fresh", + "enum": [ + "new", + "older", + "stale", + "undated" + ], + "type": "string" + }, + "company": { + "type": "string" + }, + "eligibleCountries": { + "description": "Two-letter codes the role is open to", + "items": { + "type": "string" + }, + "type": "array" + }, + "experience": { + "additionalProperties": true, + "description": "Years the posting itself states as { min, max }; null when it states none, absent when the description was not read", + "type": [ + "object", + "null" + ] + }, + "id": { + "description": "Stable id to pass to get_job, analyze_job_fit or optimize_resume", + "type": "string" + }, + "location": { + "type": "string" + }, + "postedDaysAgo": { + "type": "number" + }, + "remote": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "updatedAt": { + "description": "When the board says the role was posted or last updated; absent when the board states none", + "type": "string" + }, + "url": { + "description": "The employer's own posting, which is where an application is made", + "type": "string" + }, + "workMode": { + "enum": [ + "remote", + "hybrid", + "onsite", + "unknown" + ], + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "job" + ], + "type": "object" +}
- Changed
get_job_coverage2 fields changed- added
Input schema / properties / countries / descriptionAdded value: +"Two-letter codes to report coverage for, such as IN or US" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "countries": { + "description": "Per-country live and recent role counts", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "snapshotUpdatedAt": { + "description": "When the index this answer came from was last refreshed", + "type": "string" + } + }, + "type": "object" +}
- Changed
optimize_resume5 fields changed- added
Input schema / properties / jobId / descriptionAdded value: +"Stable job id from search_jobs or recommend_jobs" - added
Input schema / properties / output / descriptionAdded value: +"suggestions lists changes to consider; unified_diff shows them as a patch; revised_markdown returns the rewritten resume" - added
Input schema / properties / resume / descriptionAdded value: +"The resume itself, passed inline. It is parsed in memory for this call and never written to disk, logged, or sent anywhere else." - added
Input schema / properties / resume / properties / format / descriptionAdded value: +"How content is encoded: plain text, markdown, or base64 of a PDF or DOCX file" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "content": { + "description": "The diff or rewritten resume, when that form was asked for", + "type": "string" + }, + "gaps": { + "description": "What the resume cannot honestly claim, and so was left alone", + "items": { + "type": "string" + }, + "type": "array" + }, + "job": { + "additionalProperties": true, + "description": "The job the revision targets", + "properties": { + "age": { + "description": "Bucketed posting age; undated means the board gave no date, not that the role is fresh", + "enum": [ + "new", + "older", + "stale", + "undated" + ], + "type": "string" + }, + "company": { + "type": "string" + }, + "eligibleCountries": { + "description": "Two-letter codes the role is open to", + "items": { + "type": "string" + }, + "type": "array" + }, + "experience": { + "additionalProperties": true, + "description": "Years the posting itself states as { min, max }; null when it states none, absent when the description was not read", + "type": [ + "object", + "null" + ] + }, + "id": { + "description": "Stable id to pass to get_job, analyze_job_fit or optimize_resume", + "type": "string" + }, + "location": { + "type": "string" + }, + "postedDaysAgo": { + "type": "number" + }, + "remote": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "updatedAt": { + "description": "When the board says the role was posted or last updated; absent when the board states none", + "type": "string" + }, + "url": { + "description": "The employer's own posting, which is where an application is made", + "type": "string" + }, + "workMode": { + "enum": [ + "remote", + "hybrid", + "onsite", + "unknown" + ], + "type": "string" + } + }, + "type": "object" + }, + "originalOverwritten": { + "description": "Always false: the candidate's resume is never modified in place", + "type": "boolean" + }, + "output": { + "description": "Which form was produced", + "enum": [ + "suggestions", + "unified_diff", + "revised_markdown" + ], + "type": "string" + }, + "profile": { + "additionalProperties": true, + "type": "object" + }, + "suggestions": { + "description": "Each proposed change with the evidence behind it", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "output", + "suggestions", + "originalOverwritten" + ], + "type": "object" +}
- Changed
prepare_job_search3 fields changed- changed
Input schema / properties / continuation / descriptionPrevious value: -"Opaque token returned by the preceding preparation batch"New value: +"Opaque token from the previous call's result. Pass it back to prepare the next batch of at most 25 sources; omit it to start" - added
Input schema / properties / countries / descriptionAdded value: +"Two-letter codes whose sources should be prepared, such as IN or US" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "continuation": { + "description": "Token for the next batch; present only when nextAction is call_again", + "type": "string" + }, + "coverage": { + "additionalProperties": true, + "properties": { + "countries": { + "description": "Per-country live and recent role counts", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "snapshotUpdatedAt": { + "description": "When the index this answer came from was last refreshed", + "type": "string" + } + }, + "type": "object" + }, + "crawl": { + "additionalProperties": true, + "description": "What this batch crawled: selected, succeeded, and the sources that failed", + "type": "object" + }, + "networkAttempted": { + "description": "Whether this call actually reached out to employer boards", + "type": "boolean" + }, + "nextAction": { + "description": "call_again means pass continuation back for the next batch; retry_later means the network refused and waiting is the fix", + "enum": [ + "ready", + "call_again", + "retry_later" + ], + "type": "string" + }, + "note": { + "type": "string" + }, + "sources": { + "additionalProperties": true, + "description": "How many sources are in the catalog, indexed, fresh, stale, missing and pending", + "type": "object" + }, + "status": { + "description": "ready means searches can run now; partial means sources are still missing", + "enum": [ + "ready", + "partial" + ], + "type": "string" + } + }, + "required": [ + "status", + "nextAction", + "coverage" + ], + "type": "object" +}
- Changed
recommend_jobs21 fields changed- added
Input schema / properties / intent / descriptionAdded value: +"What the candidate is actually looking for, stated explicitly rather than guessed from the resume. Every field is optional; the ones given narrow the result, and the excluded* fields remove roles the candidate does not want to see." - added
Input schema / properties / intent / properties / countries / descriptionAdded value: +"Two-letter codes the candidate may work in, such as IN or US. This is eligibility to work, not where the office is" - added
Input schema / properties / intent / properties / excludedCountries / descriptionAdded value: +"Two-letter codes to drop even when a role is otherwise eligible" - added
Input schema / properties / intent / properties / excludedLocations / descriptionAdded value: +"Cities or regions to drop, matched like locations" - added
Input schema / properties / intent / properties / excludedRoles / descriptionAdded value: +"Role titles to drop, matched like roles" - added
Input schema / properties / intent / properties / excludedTerms / descriptionAdded value: +"Words that disqualify a role, matched as whole words in the title, such as \"intern\" or \"sales\"" - added
Input schema / properties / intent / properties / locations / descriptionAdded value: +"Cities or regions to keep, matched as case-insensitive substrings of the job's location, such as \"Bengaluru\" or \"Delhi NCR\"" - added
Input schema / properties / intent / properties / remote / descriptionAdded value: +"True to keep only remote roles, false to drop them; omit to keep both" - added
Input schema / properties / intent / properties / requiredSkills / descriptionAdded value: +"Skills a role must state to be kept, such as \"kubernetes\". Each is matched as a whole word" - added
Input schema / properties / intent / properties / roles / descriptionAdded value: +"Role titles the candidate is looking for, in their own words, such as \"backend engineer\" or \"data analyst\". Matched against the job title" - added
Input schema / properties / intent / properties / seniority / descriptionAdded value: +"Levels to keep, in the posting's own vocabulary, such as \"senior\" or \"lead\". Not a years-of-experience filter: use experienceYears in search_jobs for that" - added
Input schema / properties / limit / descriptionAdded value: +"How many ranked matches to return" - added
Input schema / properties / ranking / descriptionAdded value: +"How matches are scored and how weak a match may be before it is dropped" - added
Input schema / properties / ranking / properties / mode / descriptionAdded value: +"evidence scores a match only on requirements the resume text supports; keyword scores on term overlap alone" - added
Input schema / properties / refresh / descriptionAdded value: +"Whether this call may crawl employer boards before ranking. Crawling costs seconds; the default only does it when the result would otherwise be thin" - added
Input schema / properties / refresh / properties / minimumMatches / descriptionAdded value: +"With auto, the match count below which a refresh is worth the wait" - added
Input schema / properties / refresh / properties / policy / descriptionAdded value: +"auto crawls once only when matches are thin and the snapshot is stale; never keeps the snapshot as it is; always crawls first" - added
Input schema / properties / refresh / properties / staleDays / descriptionAdded value: +"With auto, how old the snapshot must be before a refresh is considered" - added
Input schema / properties / resume / descriptionAdded value: +"The resume itself, passed inline. It is parsed in memory for this call and never written to disk, logged, or sent anywhere else." - added
Input schema / properties / resume / properties / format / descriptionAdded value: +"How content is encoded: plain text, markdown, or base64 of a PDF or DOCX file" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "assumptions": { + "description": "Anything inferred rather than stated; worth repeating to the candidate", + "items": { + "type": "string" + }, + "type": "array" + }, + "coverage": { + "additionalProperties": true, + "properties": { + "countries": { + "description": "Per-country live and recent role counts", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "snapshotUpdatedAt": { + "description": "When the index this answer came from was last refreshed", + "type": "string" + } + }, + "type": "object" + }, + "explanation": { + "description": "Why the result looks the way it does, in words meant for the candidate", + "type": "string" + }, + "exploration": { + "additionalProperties": true, + "description": "Direct, hidden title-family and stretch groupings", + "type": "object" + }, + "filteredOut": { + "additionalProperties": true, + "description": "Counts by reason, with a small sample, for roles the intent excluded", + "type": "object" + }, + "matches": { + "description": "Ranked matches, each carrying the job, its scores, and the resume text that supports them", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "nextActions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "nextMoves": { + "description": "What to try next when the result is thin; relay these instead of inventing advice", + "items": { + "type": "string" + }, + "type": "array" + }, + "outcome": { + "description": "widened means the date window had to open up to find anything; no_matches means say so rather than searching again silently", + "enum": [ + "matches", + "widened", + "no_matches" + ], + "type": "string" + }, + "profile": { + "additionalProperties": true, + "description": "What was read from the resume. It is returned so claims can be checked, and is not stored", + "type": "object" + }, + "ranking": { + "additionalProperties": true, + "type": "object" + }, + "refresh": { + "additionalProperties": true, + "description": "Whether this call crawled, and what it found", + "type": "object" + }, + "shortfall": { + "additionalProperties": true, + "description": "Present when fewer matches came back than asked for", + "type": "object" + }, + "snapshot": { + "additionalProperties": true, + "description": "Age and size of the index these matches came from", + "type": "object" + }, + "window": { + "additionalProperties": true, + "description": "Which age windows were walked and which one the results came from", + "type": "object" + } + }, + "required": [ + "outcome", + "matches", + "explanation" + ], + "type": "object" +}
- Changed
search_jobs3 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"How many jobs to return in this page" - added
Input schema / properties / offset / descriptionAdded value: +"Where the page starts. Use pagination.nextOffset from the previous result rather than counting by hand" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "guidance": { + "description": "How to present these results honestly; meant for the assistant, not the candidate", + "type": "string" + }, + "jobs": { + "description": "Matches, newest first", + "items": { + "additionalProperties": true, + "description": "One matching job", + "properties": { + "age": { + "description": "Bucketed posting age; undated means the board gave no date, not that the role is fresh", + "enum": [ + "new", + "older", + "stale", + "undated" + ], + "type": "string" + }, + "company": { + "type": "string" + }, + "eligibleCountries": { + "description": "Two-letter codes the role is open to", + "items": { + "type": "string" + }, + "type": "array" + }, + "experience": { + "additionalProperties": true, + "description": "Years the posting itself states as { min, max }; null when it states none, absent when the description was not read", + "type": [ + "object", + "null" + ] + }, + "id": { + "description": "Stable id to pass to get_job, analyze_job_fit or optimize_resume", + "type": "string" + }, + "location": { + "type": "string" + }, + "postedDaysAgo": { + "type": "number" + }, + "remote": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "updatedAt": { + "description": "When the board says the role was posted or last updated; absent when the board states none", + "type": "string" + }, + "url": { + "description": "The employer's own posting, which is where an application is made", + "type": "string" + }, + "workMode": { + "enum": [ + "remote", + "hybrid", + "onsite", + "unknown" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "pagination": { + "additionalProperties": true, + "description": "offset, limit, total and nextOffset. nextOffset is null on the last page", + "type": "object" + }, + "window": { + "additionalProperties": true, + "description": "The age window the results came from, and whether it had to widen. Say which window was used", + "type": "object" + } + }, + "required": [ + "jobs", + "window", + "pagination" + ], + "type": "object" +}
7 tool updates
- First observed
analyze_job_fit - First observed
get_job - First observed
get_job_coverage - First observed
optimize_resume - First observed
prepare_job_search - First observed
recommend_jobs - First observed
search_jobs
Publisher details
- Operator
- Avagama Consulting · Publisher source
- Operator website
- https://www.avagama.co · Publisher source
- Vendor relationship
- Not applicable
- Documentation
- Not applicable
- Trust center
- Not applicable
- Restrictions
- Not applicable
Related MCP Connectors
Verified job postings from employer ATS boards, employer hiring signals and pay statistics.
Verified job search: every listing confirmed live and accepting applicants within the last 72h.
Search a live index of millions of open jobs from employer career sites and 100+ ATS platforms.
Read job postings live from employer career sites across 10 applicant tracking systems.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceVerified job search: every listing is opened and confirmed live and accepting applicants within the last 72 hours, and re-verified on a rolling clock, so agents can recommend jobs without ghost-job or dead-link risk. Read-only, no auth.MIT

JobsPipe MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceJobsPipe — data pipeline of every job posting on the web. Search live, normalized job postings from 30+ ATS feeds and job boards for AI agents via MCP.MIT- AlicenseAqualityDmaintenanceSearch current remote / work-from-home jobs by category, region, perk, or company — with ready-to-apply links.5MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to find live job postings from employer career sites and rank them against a user's resume, with each requirement matched and tiered for fit.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.