Skip to main content
Glama

WerkCV – Dutch CV check

Compare a CV with a vacancy

match_vacancy
Read-only

Compare a CV with one vacancy (vacature, job ad), requirement by requirement, with exact quotes from both, missing ATS keywords and the fixes to make first. Use when the user asks 'do I fit this job', 'past mijn cv bij deze vacature' or shares a vacancy with their CV. Uses AI and is rate-limited; nothing stored. Never advise claiming experience the user does not have. The result includes nextStep, a suggested follow-up.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "cv_text": "<cv_text>",
      "vacancy_text": "<vacancy_text>"
    },
    "name": "match_vacancy"
  }
}

Input Schema

NameRequiredDescriptionDefault
localeNoLanguage of the CV and the answer. Detected from the text when omitted.
cv_textYesThe full text of the CV (200-25,000 characters). Remove BSN, ID and bank numbers first.
vacancy_textYesThe full vacancy text: requirements and responsibilities (120-18,000 characters).

Output Schema

NameRequiredDescriptionDefault
bandYes
metaYes
scoreYes
countsYes
grade10Yes
summaryYes
nextStepYes
topFixesYes
bandLabelYes
limitationsYes
requirementsYes
vacancyTitleYes
canOpenInEditorYes
matchedKeywordsYes
missingKeywordsYesShort keywords only, deduplicated, most important first.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": false,
      +  "properties": {
      +    "band": {
      +      "enum": [
      +        "sterk",
      +        "goed",
      +        "in_ontwikkeling",
      +        "zwak"
      +      ],
      +      "type": "string"
      +    },
      +    "bandLabel": {
      +      "type": "string"
      +    },
      +    "canOpenInEditor": {
      +      "type": "boolean"
      +    },
      +    "counts": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "mustMatched": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "mustMissing": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "mustPartial": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "niceMatched": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "mustMatched",
      +        "mustPartial",
      +        "mustMissing",
      +        "niceMatched"
      +      ],
      +      "type": "object"
      +    },
      +    "grade10": {
      +      "maximum": 10,
      +      "minimum": 1,
      +      "type": "number"
      +    },
      +    "limitations": {
      +      "type": "string"
      +    },
      +    "matchedKeywords": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "meta": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "locale": {
      +          "enum": [
      +            "nl",
      +            "en"
      +          ],
      +          "type": "string"
      +        },
      +        "schemaVersion": {
      +          "const": "2.0.0",
      +          "type": "string"
      +        },
      +        "scoringVersion": {
      +          "type": "string"
      +        },
      +        "tool": {
      +          "enum": [
      +            "check_cv",
      +            "match_vacancy",
      +            "open_in_editor"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "tool",
      +        "schemaVersion",
      +        "scoringVersion",
      +        "locale"
      +      ],
      +      "type": "object"
      +    },
      +    "missingKeywords": {
      +      "description": "Short keywords only, deduplicated, most important first.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "nextStep": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "action": {
      +          "enum": [
      +            "open_in_editor",
      +            "match_vacancy",
      +            "none"
      +          ],
      +          "type": "string"
      +        },
      +        "reason": {
      +          "type": "string"
      +        },
      +        "suggestedUserPrompt": {
      +          "description": "A short line the agent can say to the user, in the CV's language.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "action",
      +        "reason",
      +        "suggestedUserPrompt"
      +      ],
      +      "type": "object"
      +    },
      +    "requirements": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "category": {
      +            "enum": [
      +              "experience",
      +              "tool",
      +              "skill",
      +              "education",
      +              "language",
      +              "duty",
      +              "other"
      +            ],
      +            "type": "string"
      +          },
      +          "cvQuote": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Exact text from the CV that supports the status. Null when missing."
      +          },
      +          "gap": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "For partial/missing: what exactly is not shown, e.g. 'Google Analytics genoemd, GA4 niet'."
      +          },
      +          "honestAction": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "What to add IF it is true. Never suggest claiming experience the user does not have."
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "keywords": {
      +            "description": "Short ATS keywords for this requirement, e.g. ['GA4']",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "requirement": {
      +            "description": "Short, one thing only: 'Meta Ads', not 'Google Ads en Meta Ads'.",
      +            "type": "string"
      +          },
      +          "status": {
      +            "enum": [
      +              "match",
      +              "partial",
      +              "missing"
      +            ],
      +            "type": "string"
      +          },
      +          "type": {
      +            "enum": [
      +              "must",
      +              "nice"
      +            ],
      +            "type": "string"
      +          },
      +          "vacancyQuote": {
      +            "description": "Exact text from the vacancy.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "requirement",
      +          "type",
      +          "category",
      +          "status",
      +          "vacancyQuote",
      +          "cvQuote",
      +          "gap",
      +          "honestAction",
      +          "keywords"
      +        ],
      +        "type": "object"
      +      },
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "score": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "summary": {
      +      "type": "string"
      +    },
      +    "topFixes": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "example": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Optional rewritten line in the CV's language. Must not invent facts; use [X] for numbers the user must fill in."
      +          },
      +          "fix": {
      +            "description": "One sentence: what to change.",
      +            "type": "string"
      +          },
      +          "id": {
      +            "description": "Stable machine id, e.g. 'quantified_achievement'",
      +            "type": "string"
      +          },
      +          "problem": {
      +            "description": "One sentence: what is wrong, with the measured value where there is one.",
      +            "type": "string"
      +          },
      +          "quote": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Exact text copied from the CV that this fix is about. Null when the problem is something missing."
      +          },
      +          "section": {
      +            "enum": [
      +              "contact",
      +              "profile",
      +              "experience",
      +              "education",
      +              "skills",
      +              "languages",
      +              "certificates",
      +              "hobbies",
      +              "general"
      +            ],
      +            "type": "string"
      +          },
      +          "severity": {
      +            "enum": [
      +              "critical",
      +              "high",
      +              "medium",
      +              "low"
      +            ],
      +            "type": "string"
      +          },
      +          "where": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Human location, e.g. 'Werkervaring > Marketing Coördinator, bullet 1'. Null for CV-wide issues."
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "severity",
      +          "section",
      +          "where",
      +          "quote",
      +          "problem",
      +          "fix",
      +          "example"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 3,
      +      "type": "array"
      +    },
      +    "vacancyTitle": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "required": [
      +    "score",
      +    "grade10",
      +    "band",
      +    "bandLabel",
      +    "summary",
      +    "vacancyTitle",
      +    "requirements",
      +    "counts",
      +    "matchedKeywords",
      +    "missingKeywords",
      +    "topFixes",
      +    "canOpenInEditor",
      +    "nextStep",
      +    "limitations",
      +    "meta"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, non-destructive and non-idempotent, so the safety bar is partly met. The description adds genuinely useful traits the annotations cannot: AI-backed, rate-limited, nothing stored, and an explicit behavioral constraint against advising fabricated experience. It stops short of describing latency or failure modes.

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 before moving to usage triggers and constraints, and each sentence carries distinct information. It is a dense block of prose rather than a bulleted list, but nothing is redundant.

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?

An output schema exists, so return values need not be spelled out, and the description still flags the nextStep field as a follow-up affordance. Combined with the rate-limit, no-storage and ethical notes, an agent has enough to call this correctly; only the sibling boundary is left implicit.

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 100%, so all three parameters (including the locale enum and the character bounds) are already documented in the schema. The description adds no parameter-level meaning beyond that, 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?

States a specific verb and resource — comparing a CV against one vacancy — and adds the distinguishing detail of doing it 'requirement by requirement, with exact quotes from both, missing ATS keywords and the fixes'. This is clearly separable from the sibling check_cv, which does not involve a vacancy.

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?

Gives concrete trigger conditions, including literal user phrasings ('do I fit this job', 'past mijn cv bij deze vacature') and the scenario of a shared vacancy plus CV. It does not name or exclude the alternative sibling (check_cv), so the agent must infer the boundary, but the when-to-use context is unambiguous.

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.