Skip to main content
Glama

Export resume as PDF

export_resume_pdf

Generate the PDF of a resume — the exact file the user downloads, never watermarked. An unchanged resume is handed back without a new render: the reply then has status 'completed' and the file itself (file_name, pages, and pdf_url that saves it for 60 minutes). Otherwise it renders asynchronously: a task_id comes back at once, the PDF is usually ready in a few seconds, get_task_status(task_id) reports progress and the outcome, and get_resume_pdf_url then gives the file. No quota on any plan. Returns 'not_found' if the resume does not exist or does not belong to the current user.

Input Schema

NameRequiredDescriptionDefault
inputYes

Output Schema

NameRequiredDescriptionDefault
reusedYesTrue when this exact resume already had a file: it is handed back without a new render, and the fields below describe it.
statusNo'completed' when the file is ready in this reply (reused); 'processing' while it renders.processing
made_atNoISO 8601 UTC moment the file was made.
pdf_urlNoAddress on ResumeQuick.app that downloads the file without signing in, until expires_at. The user's own copy, not a link for other people. Null while the file renders.
task_idYes
file_nameNoThe name the file saves under; null while the file renders.
resume_idYes
watermarkYesAlways false: the downloaded PDF carries no watermark on any plan.
expires_atNoISO 8601 UTC moment pdf_url stops working.
is_currentNoWhether the file matches the resume as it is now; null while it renders.
page_countNoPages in the file.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • addedOutput schema / properties / expires_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "ISO 8601 UTC moment pdf_url stops working.",
      +  "title": "Expires At"
      +}
    • addedOutput schema / properties / file_name
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The name the file saves under; null while the file renders.",
      +  "title": "File Name"
      +}
    • addedOutput schema / properties / is_current
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Whether the file matches the resume as it is now; null while it renders.",
      +  "title": "Is Current"
      +}
    • addedOutput schema / properties / made_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "ISO 8601 UTC moment the file was made.",
      +  "title": "Made At"
      +}
    • addedOutput schema / properties / page_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Pages in the file.",
      +  "title": "Page Count"
      +}
    • addedOutput schema / properties / pdf_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Address on ResumeQuick.app that downloads the file without signing in, until expires_at. The user's own copy, not a link for other people. Null while the file renders.",
      +  "title": "Pdf Url"
      +}
    • changedOutput schema / properties / reused / description
      Previous value: -"True when this exact resume already had a file: it is handed back without a new render."New value: +"True when this exact resume already had a file: it is handed back without a new render, and the fields below describe it."
    • addedOutput schema / properties / status / description
      Added value: +"'completed' when the file is ready in this reply (reused); 'processing' while it renders."
  2. Changed1 schema field changed
    • changedOutput schema / properties / reused / description
      Previous value: -"True when this exact resume already had a file: it is handed back, nothing is spent."New value: +"True when this exact resume already had a file: it is handed back without a new render."
  3. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only say readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=false; the description adds far more — no watermarking, a cached no-render fast path, async rendering with typical latency of a few seconds, a 60-minute pdf_url lifetime, and no plan quota. The only missing piece is whether failed renders are retryable or billed.

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 the outcome ('the exact file the user downloads'), and every clause carries information — caching, async path, quota, error. The async sentence is a long multi-clause run-on (task_id, latency, get_task_status, get_resume_pdf_url) that costs some scannability.

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?

Covers both execution paths, latency expectations, the URL's expiry, quota absence, and the error case; output shape is documented by the output schema, yet the description adds the status/file fields anyway. Nothing an agent needs to call this correctly and handle the response is missing.

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

Parameters3/5

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

Schema description coverage is reported at 0%, and the description never discusses resume_id directly; it only implies ownership scoping through the 'does not belong to the current user' error note and indirectly through 'as returned by list_resumes' in the schema. The parameter's meaning is largely carried by the inline schema text, not the description.

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 ('Generate the PDF of a resume') plus a distinguishing property ('the exact file the user downloads, never watermarked'). It also implicitly separates itself from the lookalike siblings get_task_status and get_resume_pdf_url by casting them as follow-up steps rather than substitutes.

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?

Gives explicit conditional routing: if the resume is unchanged, the call returns the file directly; otherwise it returns a task_id and the agent must poll get_task_status then call get_resume_pdf_url. It also names the failure condition ('not_found' when the resume is missing or owned by another user), leaving nothing to inference.

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.