Skip to main content
Glama

Write a cover letter for a job

generate_cover_letter

Write the cover letter for a vacancy in the user's tracker, from their resume and the analysis, with an optional tone, length, up to three of the vacancy's key_strengths to lead with, and a personal note. The letter is written in the user's profile language and states only facts from the resume; a resume with no work history still gets a letter, built from its summary and skills. The letter is saved on the vacancy's Cover Letter tab in the web app, the same letter the web and the browser extension write. When the vacancy already has a letter, this replaces it: the new one is written with the previous version in view and the change in options, and an option not given keeps the value the previous letter used. Runs asynchronously — returns a task_id; get_task_status reports when it is written, and get_vacancy_detail then shows has_cover_letter: true. The letter text itself is not returned. Spends one cover letter from the plan (the free plan has one a month); replacing an existing letter spends another one. Returns 'not_found' if the vacancy does not belong to the current user, 'no_resume' if the user has no resume, 'limit_exceeded' if the plan allowance is used up.

Input Schema

NameRequiredDescriptionDefault
inputYes

Output Schema

NameRequiredDescriptionDefault
statusNoprocessing
task_idYesBackground task id; get_task_status reports when the letter is written.
vacancy_idYesId of the vacancy analysis the letter is for.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Far exceeds the annotations: it discloses that an existing letter is replaced (previous version in view, unset options inherit prior values), that generation runs asynchronously and returns only a task_id, that the letter text is never returned, that one plan credit is spent per call (and another on replacement), and enumerates error codes (not_found, no_resume, limit_exceeded). This is exactly the kind of mutation and cost/limit context annotations can't convey.

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-loads what the tool does and is dense with no filler, though the seven-sentence block mixes purpose, replacement semantics, async flow, cost, and errors into one paragraph. Slightly long, but nearly every sentence carries distinct operational information.

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 an async, credit-consuming, non-idempotent write tool, the description covers the full lifecycle: invocation inputs, replacement behavior, task_id polling path, success signal (has_cover_letter), credit cost, and failure modes. With an output schema present, nothing material is omitted.

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?

The auto-reported 0% coverage is misleading because the nested $defs properties carry rich descriptions, but the description still adds value by restating the option set (tone, length, up to three emphasis strengths, personal note) and, importantly, the inheritance rule that omitted options keep the previous letter's values. It largely mirrors rather than extends the schema, which caps it below 5.

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 and resource ('Write the cover letter for a vacancy in the user's tracker') plus its inputs (resume, analysis), which cleanly separates it from sibling analysis/read tools like analyze_vacancy and get_vacancy_detail.

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?

Clearly frames usage context: it writes to the vacancy's Cover Letter tab, replaces an existing letter when one exists, and routes the agent to get_task_status and get_vacancy_detail for the result. It does not state an explicit 'do not use this when X' alternative, but the surrounding flow is well-scoped.

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.