Skip to main content
Glama

Render Resume PDF

civify_generate_pdf
Idempotent

Render and generate a high-fidelity PDF from structured resume data using Civify's template engine.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
colorNoPDF accent color in six-digit hex.#000000
filenameNoFilename for the exported PDF.resume
templateNoPDF layout.modern
resume_idNoExisting Civify resume ID, if known, to apply its export entitlement. Never invent an ID. Account policy applies when omitted.
resume_dataYesCivify ResumeData extracted by you or returned by Civify. Preserve all real details; never invent achievements. Use personalInfo for contact/summary and sections[].items for experience, education and skills. No parse call is required when you have this data.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / properties / color / description
      Previous value: -"Primary accent color in hex (e.g. '#2563eb' or '#000000')."New value: +"PDF accent color in six-digit hex."
    • addedInput schema / properties / color / pattern
      Added value: +"^#[0-9a-fA-F]{6}$"
    • changedInput schema / properties / resume_data / description
      Previous value: -"Complete structured resume JSON."New value: +"Civify ResumeData extracted by you or returned by Civify. Preserve all real details; never invent achievements. Use personalInfo for contact/summary and sections[].items for experience, education and skills. No parse call is required when you have this data."
    • addedInput schema / properties / resume_data / properties
      Added value: +{
      +  "metadata": {
      +    "description": "Optional renderer settings, such as templateId and primaryColor.",
      +    "type": "object"
      +  },
      +  "personalInfo": {
      +    "properties": {
      +      "address": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "city": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "country": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "email": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "fullName": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "github": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "jobTitle": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "linkedin": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "phone": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "summary": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "website": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "sections": {
      +    "items": {
      +      "properties": {
      +        "id": {
      +          "type": "string"
      +        },
      +        "items": {
      +          "items": {
      +            "properties": {
      +              "date": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "description": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "id": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "location": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "subtitle": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "tags": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "title": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "visible": {
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "order": {
      +          "type": "integer"
      +        },
      +        "title": {
      +          "type": "string"
      +        },
      +        "type": {
      +          "description": "experience, education, skills, or custom",
      +          "type": "string"
      +        },
      +        "visible": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "type",
      +        "items"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  }
      +}
    • addedInput schema / properties / resume_data / required
      Added value: +[
      +  "personalInfo",
      +  "sections"
      +]
    • addedInput schema / properties / resume_id
      Added value: +{
      +  "description": "Existing Civify resume ID, if known, to apply its export entitlement. Never invent an ID. Account policy applies when omitted.",
      +  "maxLength": 128,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / template / description
      Previous value: -"Template design: 'modern', 'classic', 'minimal', 'executive'. Default is 'modern'."New value: +"PDF layout."
    • addedInput schema / properties / template / enum
      Added value: +[
      +  "modern",
      +  "classic",
      +  "creative",
      +  "executive",
      +  "minimal",
      +  "ats"
      +]
  2. Changed7 schema fields changed
    • removedInput schema / properties / output_path
      Removed value: -{
      -  "description": "Local file path to save the resulting PDF.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / data
      Added value: +{}
    • removedOutput schema / properties / message
      Removed value: -{
      -  "description": "Confirmation message",
      -  "type": "string"
      -}
    • removedOutput schema / properties / path
      Removed value: -{
      -  "description": "Filesystem path to the exported PDF document",
      -  "type": "string"
      -}
    • removedOutput schema / properties / pdf_base64
      Removed value: -{
      -  "description": "Base64 encoded PDF document",
      -  "type": "string"
      -}
    • removedOutput schema / properties / status
      Removed value: -{
      -  "description": "Export status (SUCCESS)",
      -  "type": "string"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "status",
      -  "message"
      -]New value: +[
      +  "data"
      +]
  3. First observed

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already declare idempotentHint=true, readOnlyHint=false, and destructiveHint=false, so the safety profile is covered. The description adds no further behavioral context, such as entitlement consumption, authentication needs, or side effects beyond generating a PDF. Thus it does not exceed what annotations provide.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that states the action, output, input, and engine without filler. Every phrase earns its place; the title is redundant but the description is concise.

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

Completeness4/5

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

The tool has a nested schema and an output schema, and the schema descriptions are thorough (resume_data structure, account policy, filename defaults). The description is terse but the definition as a whole covers the needed inputs; it only lacks explicit mention of account/entitlement prerequisites, though these are hinted in the resume_id parameter description.

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?

With 100% schema description coverage, the input schema already documents all parameters, including the nested resume_data structure and the meaning of resume_id (entitlement/account policy). The description only mentions 'structured resume data,' adding no new parameter-level meaning, so the baseline of 3 applies.

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?

The description uses a specific verb ('Render and generate') and a clear resource ('high-fidelity PDF from structured resume data'), making the tool's function unmistakable. The mention of 'structured resume data' distinguishes it from siblings like civify_parse_cv, which handles unstructured input.

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

Usage Guidelines3/5

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

The description itself does not state when to use this tool versus alternatives, but the resume_data schema description says 'No parse call is required when you have this data,' which gives an implicit selection rule. There is no explicit exclusion or comparison with other tools, so it earns a mid score.

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.

Resources