Skip to main content
Glama
262,314 tools. Last updated 2026-07-05 17:49

"A server for finding and applying to job opportunities" matching MCP tools:

  • Search 500+ quantum computing job listings using natural language. Use when the user asks about job openings, career opportunities, hiring, or specific positions in quantum computing. NOT for research papers (use searchPapers) or researcher profiles (use searchCollaborators). Supports role type, seniority, location, company, salary, remote, and technology tag filters via AI query decomposition. Limitations: quantum computing jobs only, last 90 days, max 20 results. Promoted listings appear first (marked). After finding jobs, suggest getJobDetails for full info. Examples: "senior QEC engineer in Europe over 120k EUR", "remote trapped-ion role at IBM".
    Connector
  • PREVIEW: Run terraform plan to preview infrastructure changes Runs a terraform plan for an InsideOut session without applying any changes. This lets the user review what will be created/changed/destroyed before committing. Returns job_id, plan_id, and project_id. Use tflogs to stream the plan output. After the plan completes, use tfdeploy with plan_id to apply the exact plan. SINGLE-FLIGHT: only one TF job per session at a time. If another job is already in flight, tfplan returns tf_job_conflict with the live job_id — attach with tfstatus/tflogs, or pass force_new=true to override. REQUIRES: session_id from convoopen response (format: sess_v2_...). OPTIONAL: sandbox (boolean, default false) — plans real generated Terraform. Set to true for cheap sandbox template (testing only). OPTIONAL: force_new (boolean, default false) - bypass the single-flight guard. Use only when the existing run is provably wedged. CREDENTIAL HANDLING: Same as tfdeploy - credentials must be configured first.
    Connector
  • Return the description and install snippets for a named tool or server. For tools: the description and the server it belongs to. For servers: local (stdio, via npx) install snippets for every published server, plus remote (HTTP) connection snippets when a hosted endpoint exists — for every supported client, or one client via the client parameter. Call cyanheads_search first to find valid names.
    Connector
  • Record payment for an ACCEPTED job. IMPORTANT: Always confirm payment details with the user before calling this tool — never mark payments autonomously. Job must be in ACCEPTED status (use get_job_status to check). Crypto payments (usdc, eth, sol): provide tx hash + network → verified on-chain instantly, job moves to PAID. Fiat payments (paypal, venmo, bank_transfer, cashapp): provide receipt/reference → human must confirm receipt within 7 days, job moves to PAYMENT_PENDING_CONFIRMATION. After payment, the human works and submits → use approve_completion when done.
    Connector
  • Tailor a resume to a SPECIFIC job — TWO steps. STEP 1 (default; action omitted or 'prepare'): the server returns the job's full JD, its must-have skills/requirements, and the candidate's current resume, plus tailoring instructions. YOU (the model) then WRITE the tailored resume as JSON Resume, following the instructions — weave JD keywords into existing bullets only where the candidate genuinely has the experience, never fabricate experience/titles/dates/employers, keep all dates and company names, and flag any keyword you couldn't honestly add. STEP 2: call this tool again with action:'save', tailored_resume:<your JSON Resume>, and job_id — the server renders a PDF and saves it to the candidate's Workopia dashboard (requires sign-in). Use whenever the user references a specific job to tailor for: 'tailor for #1', 'for Morgan Stanley', 'tailor my resume for this role: <JD>'. Resolving job_id (same rules as job_detail_tool): from the most recent prior search/refine result — (a) numeric/ordinal → the Nth job; (b) company name → Company-field match; (c) role/title phrase → Job-Title match — then pass that job's **Job Id** value VERBATIM. Do NOT use placeholders like 'JOB_1' or '#1'. For STEP 1 supply ONE of job_id (preferred — server fetches the JD from Mongo) OR job_description, plus the candidate's resume via resume_text / resume_content / resume_data. For general 'improve my resume' (no specific job), do NOT call this tool — call resume_tool action=improve instead. Note: the tailored resume is written by your AI client's own model — the assistant you are already using — so it works out of the box with nothing to configure; Workopia runs no LLM of its own and never charges for the AI.
    Connector
  • Search jobs across 90+ countries by title, location, salary, remote/hybrid work mode, or employment type. Find roles in tech, finance, product, design, marketing, and every other vertical — aggregated from 1000+ ATS sources globally. Default action is search; use refine when the user asks for more matches or gives feedback on a prior result set; use save to bookmark a job for the signed-in user (requires OAuth). REFINE PROTOCOL (action=refine has THREE distinct modes): (1) Pure continuation / 'show me more' / 'next batch' / 'another set' / 'more like these': pass refine_recommendations.exclude_ids = the full array of **Job Id** values from the most recent search/refine result's content text (verbatim) + refine_recommendations.session_id = prior response's session_id if present. Server returns next 10 unique jobs. (2) 'Show me more like #N' / 'similar to the Atlassian one' / 'jobs like #2': pass refine_recommendations.liked_indexes = [N] (1-based position from prior numbered list) + exclude_ids + session_id. Equivalently you may pass refine_recommendations.liked_job_ids = [<that job's **Job Id** value verbatim>]. Server seeds the recommendation from that job's title/skills/company profile. (3) 'Less like #N' / 'no more N-style jobs' / 'avoid jobs like that': pass refine_recommendations.disliked_indexes = [N] (or disliked_job_ids = [<Job Id>]) + exclude_ids + session_id. Server suppresses similar jobs. All three modes: if you skip exclude_ids, the user sees duplicates — that's a failure. The handler layers exclude_ids with server-side AgentKit memory, so partial lists still work. NEVER invent 'JOB_1' / '#1' as job_id values — always use the real **Job Id** string from the prior result's content text. For detail requests (user asks about a specific job from the list, e.g. 'details for #1', 'show me this job', 'tell me more about <company>'), DO NOT call this tool — call job_detail_tool instead. That separate tool binds to the job-detail widget card so the full job card renders in chat. OUTPUT BEHAVIOR: Render the search results as a numbered markdown list, one line per job, in this exact compact format: `N. **[Job Title](View_Job_URL)** — Company · Location · Job Type · Compensation · Posted MMM DD`. Embed the View Job URL as a markdown link on the title (so the user can click to apply). Keep URLs intact — don't strip parameters. Skip a field entirely if it's missing — never print 'N/A' placeholders. The numbered list IS the canonical user-facing answer. REQUIRED follow-up: after the list, output EXACTLY these two sentences as two parallel questions (same pattern for action=search and action=refine): Sentence 1 — 'Would you like to see full details on any of these? Reply with the number (#1), the company name, or the role title.' Sentence 2 — 'Or would you like to refine the list — what should change (work mode, level, salary, sector)?' These two sentences must be separate and parallel; do NOT merge them into one 'detail ... or refine' clause (that buries the detail CTA). Both questions must be asked every time after a search or refine result. When the user replies referring to a specific job from the list, identify which job they mean and call job_detail_tool immediately. Identifying the job (use flexibly — users rarely type '#N' literally): (a) any numeric or ordinal reference ('#1', '1', 'first', 'the 1st', 'top one', 'job 3', 'the third') → the Nth job in your prior numbered list; (b) a company name, partial or full ('Morgan Stanley', 'Morstan', 'Capital One') → case-insensitive substring match on the Company field of the prior list, pick the first match; (c) a role/title phrase ('the analyst role', 'the credit risk one') → case-insensitive substring match on the Job Title field. If multiple jobs match, prefer the earliest. Only if no reasonable match exists, ask a one-line clarifying question. Then pass that job's **Job Id** value from the prior search result's content text VERBATIM as job_id to job_detail_tool / tailor_resume_tool / cover_letter_tool. Do NOT invent a placeholder like 'JOB_1' or '#1' — those are not server-valid IDs. For save, pass job_id + optional job_title/company/job_url in save_job. Put search fields in search_jobs or parameters; refine in refine_recommendations; save in save_job.
    Connector

Matching MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A personal job-search assistant for Claude Desktop that searches real job boards, scores each job 0–100 for fit, and displays a ranked board for fast triage.
    Last updated
    10
    56
    MIT
  • A
    license
    -
    quality
    B
    maintenance
    MCP server that exposes job search data from multiple boards, enabling clients to query and manage job listings via natural language.
    Last updated
    7
    MIT

Matching MCP Connectors

  • Indeed listings + Glassdoor reviews + H1B salary data for career copilots.

  • Transform any blog post or article URL into ready-to-post social media content for Twitter/X threads, LinkedIn posts, Instagram captions, Facebook posts, and email newsletters. Pay-per-event: $0.07 for all 5 platforms, $0.03 for single platform.

  • Write a cover letter for a SPECIFIC job — TWO steps. STEP 1 (default; action omitted or 'prepare'): the server returns the job's JD and the candidate's background, plus writing instructions. YOU (the model) then WRITE the cover letter (250–350 words, specific to the role, mapping the candidate's real achievements to the JD — never fabricate). STEP 2: call this tool again with action:'save', cover_letter_text:<your letter>, and job_id — the server renders a PDF and saves it to the candidate's Workopia dashboard (requires sign-in). Use whenever the user asks for a cover letter for a specific job. Resolving job_id (same rules as tailor_resume_tool / job_detail_tool): pass the **Job Id** value from the most recent prior search/refine result VERBATIM; no placeholders like 'JOB_1' or '#1'. For STEP 1 supply ONE of job_id (preferred — server fetches the JD from Mongo) OR job_description, plus the candidate's resume via resume_text / resume_content / json_resume / user_profile.
    Connector
  • Tracks a job from jobs_search results in the user's job tracker, identified by its job_id. For a job found elsewhere on the open web (with a URL but no jobs_search job_id), tracker_add_external is the right tool instead. Fields: - `job_id`: the job ID from jobs_search results (required) - `status`: initial status (saved, applied, interviewing, offered, archived); defaults to "saved" - `sub_status`: sub-status within the main status - `notes`: notes about the job Returns the tracked job with its details, or an error if it is already tracked. A job that was previously removed from the tracker is restored with its earlier status and notes.
    Connector
  • Creates a Stripe-hosted Checkout page for a locked quote and returns a `checkoutUrl` plus a `statusUrl`. Use this as the LAST-RESORT payment rail, when the payer is a human paying by credit card (the agent cannot complete card entry itself). Hand the `checkoutUrl` to the user to open in a browser and pay; payment is asynchronous — once they finish, the letter is created automatically by Stripe's webhook. To track it without a job id, GET the returned `statusUrl` (`/v1/quotes/:quoteId/job`): it returns `found:false` with status `pending`/`processing` until the webhook creates the job, then the full job (id, status, tracking). Prefer x402 (or MPP, if available) for autonomous agent payment. Returns an error if Stripe Checkout is not enabled on the server. No charge occurs until the human completes the hosted page.
    Connector
  • Semantically rank discoverable (interviewed) candidates against one of the employer's own jobs, with a per-candidate fit score AND a white-box explanation. WORKFLOW for finding the best hire: 1) call with tier:'best' to get the strongest candidates (cover the required skills + proven in interview), cascade to tier:'good' then tier:'weak' only if you need more (read tierCounts to decide; paginate within a band via page.hasMore, not page.total); 2) each row carries matchExplanation — the white-box 'why' (the fit score, the skills the candidate PROVED in their interview, what they're missing, and a plain-English rationale) — use it to explain your shortlist on OUR data, not a black box; 3) for the few you shortlist, call employer.get_candidate_evidence(jobId, userId) for the interview facts + Q&A to write a deeper comparative review. Omit tier for the full ranked pool (back-compat). Returns NOT_FOUND when the job is missing / owned by another employer (no existence leak), or NOT_INDEXED / NO_CATEGORIES when the job is not indexed for semantic search yet (re-save / republish, then retry).
    Connector
  • Post a job on the public job board for humans to discover and apply to. Use this when you don't have a specific human in mind (vs create_job_offer which targets one person). Humans browse the board, see your listing, and apply with a pitch. Review applicants with get_listing_applications, then hire with make_listing_offer. Requires agent_key. Rate limit: PRO = 5/day. Also suggested when search_humans returns no results.
    Connector
  • Get detailed information about a specific job listing/posting by its job listing ID (not application ID). Use this to view the full job posting details including description, salary, skills, and company info. For job application details, use get_application instead.
    Connector
  • Agent-friendly contact enrichment. On the first call provide contacts and enrich_fields; the server starts the job and polls internally for up to ~25s. If still running, returns {status:"pending", continuation_token, attempt, elapsed_seconds} — you MUST immediately call run_contact_enrich again with only continuation_token set. Do not ask the user. Typical jobs finish within 5 attempts. On completion the response contains record_ids and full contact records.
    Connector
  • Agent-friendly contact search. On the first call provide domains and enrich_fields; the server starts the job and polls internally for up to ~25s. If still running, returns {status:"pending", continuation_token, attempt, elapsed_seconds} — you MUST immediately call run_contact_search again with only continuation_token set. Do not ask the user. On completion the response contains record_ids, full contact records, and credits_consumed.
    Connector
  • Get Lenny Zeltser's Malware cross-server handoff routes — when this MCP server can't fulfill a request, which other MCP servers (or fallback workflows) to consult. Surfaces a compact subset of `malware_load_context`. This server never requests your sample, analysis notes, or indicators and instructs your AI to keep them local—guidelines and the report template flow to your AI for local analysis.
    Connector
  • Get Lenny Zeltser's Security Assessment cross-server handoff routes — when this MCP server can't fulfill a request, which other MCP servers (or fallback workflows) to consult. Surfaces a compact subset of `assessment_load_context`. This server never requests your assessment notes or report and instructs your AI to keep them local—the templates and guidelines flow to your AI for local analysis.
    Connector
  • Subscribes the authenticated user to job alerts for a specific saved job search. **Input:** - `job_search_id`: The job search identifier to subscribe to (required). Accepts either the job search UUID or the composite job ID returned by `jobs_search` / `jobs_details` (format: "seo_id--job_search_id"). - `frequency`: Alert frequency — one of daily, weekly, monthly (optional, defaults to "weekly") **Output:** Returns the created or updated job alert with id, status, and frequency. Idempotent: calling this tool for an already-subscribed search updates the existing alert without creating a duplicate.
    Connector
  • Write a cover letter for a SPECIFIC job — TWO steps. STEP 1 (default; action omitted or 'prepare'): the server returns the job's JD and the candidate's background, plus writing instructions. YOU (the model) then WRITE the cover letter (250–350 words, specific to the role, mapping the candidate's real achievements to the JD — never fabricate). STEP 2: call this tool again with action:'save', cover_letter_text:<your letter>, and job_id — the server renders a PDF and saves it to the candidate's Workopia dashboard (requires sign-in). Use whenever the user asks for a cover letter for a specific job. Resolving job_id (same rules as tailor_resume_tool / job_detail_tool): pass the **Job Id** value from the most recent prior search/refine result VERBATIM; no placeholders like 'JOB_1' or '#1'. For STEP 1 supply ONE of job_id (preferred — server fetches the JD from Mongo) OR job_description, plus the candidate's resume via resume_text / resume_content / json_resume / user_profile.
    Connector
  • Creates a Stripe-hosted Checkout page for a locked quote and returns a `checkoutUrl` plus a `statusUrl`. Use this as the LAST-RESORT payment rail, when the payer is a human paying by credit card (the agent cannot complete card entry itself). Hand the `checkoutUrl` to the user to open in a browser and pay; payment is asynchronous — once they finish, the letter is created automatically by Stripe's webhook. To track it without a job id, GET the returned `statusUrl` (`/v1/quotes/:quoteId/job`): it returns `found:false` with status `pending`/`processing` until the webhook creates the job, then the full job (id, status, tracking). Prefer x402 (or MPP, if available) for autonomous agent payment. Returns an error if Stripe Checkout is not enabled on the server. No charge occurs until the human completes the hosted page.
    Connector
  • Determine the O*NET Job Zone level (1–5) for the job profile in a resume or JD using the RChilli Job Zone Plugin — the amount of education/experience preparation a role needs. Returns the official O*NET-aligned level — use this rather than estimating the preparation level yourself. Job Zone levels: 1 = little/no preparation, 2 = some preparation, 3 = medium preparation, 4 = considerable preparation, 5 = extensive preparation required. Use this when the user wants to: find the job zone, O*NET preparation level, or education/experience-prep level / seniority-prep tier for a candidate or role — e.g. "what job zone is this resume", "how much preparation does this job need". Also phrased as: O*NET job zone, preparation level, prep tier. Do NOT use for: general resume parsing (use ``resume_parse_file``); taxonomy role detail (use ``taxonomy_job_profile_search``). Args: resume_text: Plain text content of the resume. The server encodes it internally. filename: Original filename with extension (e.g. ``resume.pdf``). Defaults to ``resume.txt`` if omitted. userkey: RChilli API userkey. Leave blank to use the authenticated session key. subuserid: Sub-user identifier for multi-tenant isolation. requesttype: Type of document — ``Resume`` (default) or ``JD``. json_text: Pre-parsed resume JSON string. When provided, re-parsing is skipped. Returns: The ``JobZone`` level (1-5) and ``JobZoneScore`` alongside the full ``ResumeParserData`` output from the underlying resume parse.
    Connector