Skip to main content
Glama

Preview merging two candidates

preview_candidate_merge
Read-onlyIdempotent

[Candidates] Show what merging merge_id into keep_id would do: both values of each field, the records that move, blockers, and preview_token. merge_candidates needs that token, and refuses it if either candidate changed since.

Every argument in full, with examples: get_tool_reference.

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": {
      "keep_id": "<keep_id>",
      "merge_id": "<merge_id>"
    },
    "name": "preview_candidate_merge"
  }
}

Input Schema

NameRequiredDescriptionDefault
keep_idYesCandidate id (the `id` of a list_candidates row) of the record that stays.
merge_idYesCandidate id (the `id` of a list_candidates row) of the record merged into it (archived afterwards).
llm_modelNoYour model id, e.g. "claude-opus-4-8"; "unknown" if unsure. For analytics.
conversation_idNoThe conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.

Output Schema

NameRequiredDescriptionDefault
fieldsYes
skillsYes
keep_idYes
blockersYes
merge_idYes
can_mergeYes
preview_tokenYes
attached_recordsYes
_mcp_instructionsNoServer-issued metadata for this conversation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / keep_id / description
      Previous value: -"Candidate id (profile_interview.id) of the record that stays."New value: +"Candidate id (the `id` of a list_candidates row) of the record that stays."
    • changedInput schema / properties / merge_id / description
      Previous value: -"Candidate id (profile_interview.id) of the record merged into it (archived afterwards)."New value: +"Candidate id (the `id` of a list_candidates row) of the record merged into it (archived afterwards)."
  2. Changed23 schema fields changed
    • addedInput schema / properties / llm_model
      Added value: +{
      +  "description": "Your model id, e.g. \"claude-opus-4-8\"; \"unknown\" if unsure. For analytics.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / attached_records / description
      Removed value: -"Applications, results, files, notes, tags and other records of each candidate. Everything of the merged record moves to the kept one."
    • removedOutput schema / properties / attached_records / properties / keep / description
      Removed value: -"Records attached to the candidate, by kind (table name: count); only kinds with at least one record."
    • removedOutput schema / properties / attached_records / properties / keep / example
      Removed value: -{
      -  "interview_result": 1,
      -  "position_result": 2
      -}
    • removedOutput schema / properties / attached_records / properties / merge / description
      Removed value: -"Records attached to the candidate, by kind (table name: count); only kinds with at least one record."
    • removedOutput schema / properties / attached_records / properties / merge / example
      Removed value: -{
      -  "interview_result": 1,
      -  "position_result": 2
      -}
    • removedOutput schema / properties / blockers / description
      Removed value: -"Reasons the merge cannot run now. Empty when nothing blocks it."
    • removedOutput schema / properties / blockers / items / properties / code / description
      Removed value: -"other_company: the records belong to different companies; already_merged: one is deleted or merged already; same_position: both have an open application to the same position."
    • removedOutput schema / properties / blockers / items / properties / position_id / description
      Removed value: -"Position id (position_def_set.id) of a same_position blocker; left out when the position is hidden from you."
    • removedOutput schema / properties / blockers / items / properties / position_name / description
      Removed value: -"Name of that position; left out when it is hidden from you."
    • removedOutput schema / properties / can_merge / description
      Removed value: -"True when nothing blocks the merge and you may merge (owners and admins only)."
    • removedOutput schema / properties / fields / description
      Removed value: -"Each field the merge can take from either record, with both values. The kept record keeps its own value unless the merge chooses the other (field_choices)."
    • removedOutput schema / properties / fields / items / properties / keep / description
      Removed value: -"Value on the record that stays (null when empty)."
    • removedOutput schema / properties / fields / items / properties / key / description
      Removed value: -"Candidate field: name, email, phone_number, linked_in, physical_address, avatar_url, avatar_local_path, mojito_language_code or external_id."
    • removedOutput schema / properties / fields / items / properties / key / example
      Removed value: -"phone_number"
    • removedOutput schema / properties / fields / items / properties / merge / description
      Removed value: -"Value on the record merged into it (null when empty)."
    • removedOutput schema / properties / keep_id / description
      Removed value: -"Candidate id (profile_interview.id) of the record that stays."
    • removedOutput schema / properties / merge_id / description
      Removed value: -"Candidate id (profile_interview.id) of the record merged into it."
    • removedOutput schema / properties / preview_token / description
      Removed value: -"Send this value to merchant-candidate-merge. It changes when either record changes, so a merge only runs on the state shown here."
    • removedOutput schema / properties / preview_token / example
      Removed value: -"9f2c1d..."
    • removedOutput schema / properties / skills / description
      Removed value: -"CV skills of both records."
    • removedOutput schema / properties / skills / properties / keep / description
      Removed value: -"Skills of the record that stays."
    • removedOutput schema / properties / skills / properties / merge / description
      Removed value: -"Skills of the merged record. The merge unites both lists."
  3. Added

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered, but the description adds genuinely new behavior: the tool emits a preview_token that merge_candidates consumes, and that token is rejected if either candidate changed in the interim. It also flags that blockers may be returned, which the agent cannot infer from annotations alone.

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?

The core sentence is front-loaded and dense with useful content, with the merge_candidates dependency immediately following. The trailing pointer to get_tool_reference for full argument examples is defensible but is the one element that could be trimmed.

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?

With an output schema present, the description doesn't need to explain return values, and it covers the workflow dependency and invalidation risk. It doesn't state whether the preview can be called repeatedly or what a blocker looks like, but those are minor relative to the annotation and schema support.

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 coverage is 100% and both required parameters already carry direction-bearing descriptions ('the record that stays' vs 'merged into it (archived afterwards)'). The description's 'merging merge_id into keep_id' reinforces that direction but adds no syntax or format detail beyond the schema, 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 states a specific verb and resource ('Show what merging merge_id into keep_id would do') and enumerates the payload: both field values, the records that move, blockers, and a preview_token. It is immediately distinguishable from the sibling merge_candidates, which actually performs the merge.

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?

It names the downstream alternative explicitly ('merge_candidates needs that token, and refuses it if either candidate changed since'), which tells the agent both the ordering constraint and the invalidation condition that forces a re-preview. That is exactly the when-to-use routing an agent needs.

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.