Skip to main content
Glama

Generate Cover Letter

aiapplyd_generate_cover_letter
Destructive

Write a cover letter for a specific job from the user's default saved resume-builder document, or the first saved builder document if no default is set, in their own voice and free of recruiter cliches.

Instructions

Write a cover letter for a specific job from the user's default saved resume-builder document, or the first saved builder document if no default is set, in their own voice and free of recruiter cliches. Returns the finished letter as text and saves it to the account. Pass application_id instead to read the letter already written for that application. Add instructions only with application_id when the user asks to change that letter: the rewrite REPLACES the letter saved on the application. Writes from the user's resume on file, or a resume they paste or attach in this chat. If the user's plan does not include cover letters, it says so. Generation and revision use the user's AI credits; reading an existing letter does not run generation. Do not use it to apply to a job; use aiapplyd_apply. It also works without a resume-builder document. It uses the resume the user pasted or attached in this conversation (pass its text as resume_text), else the base resume uploaded to their account, else their resume-builder document.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
resume_textNoThe resume the user pasted or attached in this conversation, as plain text. Omit it to use the resume already on the user's AI Applyd account.
company_nameNoName of the company you are applying to
instructionsNoWith application_id: what to change in that letter, in the user's own words.
application_idNoReturn the cover letter already written for this application (an id from aiapplyd_get_applications) instead of writing a new one.
job_descriptionNoFull text of the target job description. Pass with company_name, or pass application_id instead.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlYes
sourceYesgenerated: newly written; application: the letter already prepared for application_id; refined: that letter, changed as asked.
companyNameYes
coverLetterYes
resumeSourceNoWhich resume a new letter was written from.
applicationIdYes
resumeBuildIdYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv1.9.0
    • addedInput schema / properties / resume_text
      Added value: +{
      +  "description": "The resume the user pasted or attached in this conversation, as plain text. Omit it to use the resume already on the user's AI Applyd account.",
      +  "maxLength": 50000,
      +  "minLength": 50,
      +  "type": "string"
      +}
    • addedOutput schema / properties / resumeSource
      Added value: +{
      +  "description": "Which resume a new letter was written from.",
      +  "enum": [
      +    "pasted",
      +    "attached",
      +    "on_file",
      +    "builder"
      +  ],
      +  "type": "string"
      +}
  2. Changed4 schema fields changedv1.8.5
    • removedOutput schema / properties / applicationId / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / applicationId / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / resumeBuildId / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / resumeBuildId / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  3. Changed6 schema fields changedv1.8.0
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / properties / application_id
      Added value: +{
      +  "description": "Return the cover letter already written for this application (an id from aiapplyd_get_applications) instead of writing a new one.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 9007199254740991,
      +  "type": "integer"
      +}
    • addedInput schema / properties / instructions
      Added value: +{
      +  "description": "With application_id: what to change in that letter, in the user's own words.",
      +  "maxLength": 2000,
      +  "type": "string"
      +}
    • changedInput schema / properties / job_description / description
      Previous value: -"Full text of the target job description"New value: +"Full text of the target job description. Pass with company_name, or pass application_id instead."
    • removedInput schema / required
      Removed value: -[
      -  "job_description",
      -  "company_name"
      -]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "applicationId": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "companyName": {
      +      "type": "string"
      +    },
      +    "coverLetter": {
      +      "type": "string"
      +    },
      +    "resumeBuildId": {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "source": {
      +      "description": "generated: newly written; application: the letter already prepared for application_id; refined: that letter, changed as asked.",
      +      "enum": [
      +        "generated",
      +        "application",
      +        "refined"
      +      ],
      +      "type": "string"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "coverLetter",
      +    "companyName",
      +    "source",
      +    "resumeBuildId",
      +    "applicationId",
      +    "url"
      +  ],
      +  "type": "object"
      +}
  4. First observedv1.3.0

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructive/non-idempotent/not-readonly, and the description aligns with them by disclosing that a rewrite 'REPLACES the letter saved on the application' and that the output is saved to the account. It adds real value beyond annotations with credit consumption ('Generation and revision use the user's AI credits'), the plan not including cover letters, and resume fallback order, though auth/rate context is absent.

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

Conciseness3/5

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

The core purpose is front-loaded, but the description is long and repeats itself – resume sourcing ('default saved resume-builder document... first saved builder document') is stated, then restated, and 'It also works without a resume-builder document' overlaps the fallback sentence. Tightening would remove wasted sentences.

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 five-parameter, zero-required, multi-mode tool with an output schema, the description covers every mode, the parameter combinations that select each mode, resume sourcing rules, plan gating, and credit behavior. Return values are covered by the output schema, so nothing material is missing.

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 description coverage is 100%, so the baseline is 3; the description goes beyond by explaining the resolution precedence for resume_text (pasted/attached text, else account base resume, else resume-builder document) and clarifying that application_id switches to read mode. It adds genuine precedence meaning the per-field schema text does not convey.

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 concrete verb+resource ('Write a cover letter for a specific job') and immediately distinguishes scope from the sibling, naming aiapplyd_apply as the tool for actually applying. Even the secondary read/revise modes are stated as actions, so an agent can classify the tool without opening the schema.

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

Usage Guidelines4/5

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

Covers when to write, when to read ('Pass application_id instead'), when to add instructions, and one explicit exclusion ('Do not use it to apply to a job; use aiapplyd_apply'). However the write/read/revise modes are interleaved in a way that makes selection less crisp than a 5, and no other resume siblings are positioned against it.

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