Skip to main content
Glama

Apply to Job

aiapplyd_apply
Destructive

Apply to one job on the user's behalf. Pass job_match_id from aiapplyd_get_matches, or job_url for any posting. AI Applyd rewrites the resume and cover letter for that role, then completes and submits the application on the employer's own hiring system (Greenhouse, Lever, Ashby, Workday, Personio, Teamtailor, SmartRecruiters, Recruitee, Breezy, Workable, Rippling, BambooHR, JazzHR, softgarden, Jobvite, Gem, Zoho Recruit, Dayforce, Hireology, Dover, Oracle Recruiting Cloud, Paylocity, Oracle Taleo, UKG Pro Recruiting, ADP, Avature, CareerPlug, Pinpoint, Manatal, and Eightfold). mode "auto" submits with no review step; mode "review" prepares everything and holds it for the user's approval; omit mode to follow the review setting on the user's account. The mode applies to this one application and never changes the user's settings. Spends one of the user's applications and AI credits, and a submitted application cannot be withdrawn, so apply only to jobs the user chose. Returns the application id and a tracking link; when the job already has an application, that one comes back with alreadyExisted true instead of a second. On a timeout or an error, call aiapplyd_get_applications before retrying, and never re-apply by job_url to a job already applied to by job_match_id. Do not use it to save or skip a match; use aiapplyd_triage_matches. Next: aiapplyd_get_applications to follow it, and aiapplyd_review_application if it waits for approval.

Input Schema

NameRequiredDescriptionDefault
modeNo"auto" submits with no review step. "review" holds the prepared application for the user's approval. Omit to follow the user's account setting. Applies to this application only.
job_urlNoURL of any job posting to apply to (e.g. "https://boards.greenhouse.io/acme/jobs/123"). Pass this OR job_match_id.
job_match_idNoThe job_match_id of a match from aiapplyd_get_matches (e.g. 48213). Pass this OR job_url.

Output Schema

NameRequiredDescriptionDefault
jobUrlYes
statusYesOur own record. Never proof the employer received it.
companyYes
outcomeYesstarted: a new application; already_in_progress: this job already had one (alreadyExisted); not_confirmed: the user declined, nothing was sent.
jobTitleYes
jobMatchIdYes
trackingUrlYes
recordedModeYes
applicationIdYesThe application to follow with aiapplyd_get_applications. Null only when nothing was started.
requestedModeYes
alreadyExistedYesTrue when this job already had an application, which is returned instead of a second one.
preparationStatusYes
preparedUnderFreeWatchYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed18 schema fields changed
    • removedOutput schema / properties / applicationId / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / applicationId / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / company / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / company / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / jobMatchId / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / jobMatchId / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / jobTitle / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / jobTitle / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / jobUrl / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / jobUrl / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / preparationStatus / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / preparationStatus / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recordedMode / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recordedMode / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / status / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / status / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / trackingUrl / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / trackingUrl / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed20 schema fields changed
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / job_match_id / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / applicationId / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / applicationId / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / company / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / company / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / jobMatchId / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / jobMatchId / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / jobTitle / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / jobTitle / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / jobUrl / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / jobUrl / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / preparationStatus / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / preparationStatus / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / recordedMode / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / recordedMode / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / status / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / status / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • addedOutput schema / properties / trackingUrl / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / trackingUrl / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
  3. Changed8 schema fields changed
    • addedOutput schema / properties / alreadyExisted
      Added value: +{
      +  "description": "True when this job already had an application, which is returned instead of a second one.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / applicationId / description
      Added value: +"The application to follow with aiapplyd_get_applications. Null only when nothing was started."
    • changedOutput schema / properties / applicationId / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / jobMatchId / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / outcome
      Added value: +{
      +  "description": "started: a new application; already_in_progress: this job already had one (alreadyExisted); not_confirmed: the user declined, nothing was sent.",
      +  "enum": [
      +    "started",
      +    "already_in_progress",
      +    "not_confirmed"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / status / description
      Added value: +"Our own record. Never proof the employer received it."
    • changedOutput schema / properties / trackingUrl / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / required
      Previous value: -[
      -  "applicationId",
      -  "jobMatchId",
      -  "jobTitle",
      -  "company",
      -  "jobUrl",
      -  "requestedMode",
      -  "recordedMode",
      -  "status",
      -  "preparationStatus",
      -  "preparedUnderFreeWatch",
      -  "trackingUrl"
      -]New value: +[
      +  "outcome",
      +  "applicationId",
      +  "jobMatchId",
      +  "jobTitle",
      +  "company",
      +  "jobUrl",
      +  "requestedMode",
      +  "recordedMode",
      +  "status",
      +  "preparationStatus",
      +  "preparedUnderFreeWatch",
      +  "alreadyExisted",
      +  "trackingUrl"
      +]
  4. Added

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint/openWorldHint/idempotentHint=false) by disclosing the concrete cost model ('Spends one of the user's applications and AI credits'), irreversibility ('a submitted application cannot be withdrawn'), idempotent-by-result behavior ('alreadyExisted true instead of a second'), and a timeout/error recovery protocol that prevents duplicate submissions.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, then behavioral warnings and next steps in a logical order with no filler sentences. The one excess is the 30-name enumeration of employer ATS platforms, which adds bulk without changing how an agent calls the tool.

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

Completeness5/5

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

For a destructive, open-world mutation with an output schema present, the description covers cost, irreversibility, duplicate handling, mode semantics, and the retry protocol — everything an agent needs before firing. Return-value detail is appropriately left to the output schema.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds source-tool provenance for job_match_id and clarifies that mode is per-application and never mutates account settings, which the schema only gestures at. It does not add format or syntax detail beyond the schema for job_url.

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

Purpose5/5

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

States a specific verb+resource ('Apply to one job on the user's behalf') and immediately scopes it ('one job'), distinguishing it from the bulk aiapplyd_auto_apply sibling. The description also names the correct alternatives for the adjacent actions (triage_matches for save/skip).

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

Usage Guidelines5/5

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

Explicit routing: pass job_match_id from aiapplyd_get_matches or job_url for arbitrary postings; mode selection semantics spelled out including the omit case. It states when NOT to use it ('Do not use it to save or skip a match; use aiapplyd_triage_matches') and names the follow-up tools (get_applications, review_application).

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.