propose_jobs
Propose published jobs, or terms independent of any job, to a candidate
All MCP toolsWrite
The employer's move inside a match: propose one or several of your organization's published jobs — or terms independent of any job posting (terms: true), with or without jobs — to a candidate the organization may see — matched by the engine to one of its jobs, or one who said interested to one of them. No message rides along. All rows land or none: cannot_propose names the job ids the person's registered conditions exclude (no reason is ever given; the terms row compares no conditions, so it is never cannot_propose), already_proposed the ones awaiting an answer or already mutual (a passed job may be proposed again; details.terms: true names the terms row — a record of the pair awaits its answer, or the chat's topic already is the agreed terms), pair_not_formed a person the organization may not see, refused_organization a person who refused the company. A job the person already says interested to completes mutual on the spot and opens the pair's chat; the rest — the terms row included — reach the person as ONE decision item per company, answered row by row. An interested answer to the terms row makes the pair mutual with no job: the chat opens with the agreed terms as its topic from the start. Only your organization's PUBLISHED jobs may be proposed — a draft or another organization's job refuses with job_not_found. From the candidate's detail page or the pair's chat it is the same move: a proposal made after the chat opened appears in both sides' chat as one line (get_employer_thread / get_conversation proposals) linked to the candidate's Decisions; the answer is never duplicated in the chat. From a matched candidate (list_matched_candidates) the same call proposes THIS job; to lower the matched job and propose another instead, pass_matched_candidate first, then propose_jobs with the other job. actorPersonId is the human principal you act for (persons.id), never a credential identity: candidate agents pass the candidate, employer agents pass the hiring-side member.
Input schema
{
"type": "object",
"properties": {
"actorPersonId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The acting hiring-side member (persons.id) — the proposal is recorded as theirs."
},
"personToken": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The candidate, as an opaque subject_token."
},
"jobIds": {
"description": "The published jobs to propose (jobs.id), distinct; one or several, or none when terms is true.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"terms": {
"description": "true to propose terms independent of any job posting (with or without jobs) — the terms row of the person's decision item; nothing of the terms is recorded.",
"type": "boolean"
}
},
"required": [
"actorPersonId",
"personToken"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output schema
{
"type": "object",
"properties": {
"jobs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"jobId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"interestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The proposal's interests row (interests.id)."
},
"state": {
"type": "string",
"enum": [
"waiting",
"mutual"
],
"description": "\"waiting\" (awaiting the person's answer) or \"mutual\" (the person already said interested)."
}
},
"required": [
"jobId",
"interestId",
"state"
],
"additionalProperties": false
},
"description": "One entry per proposed job, in input order; empty when terms were proposed alone."
},
"terms": {
"anyOf": [
{
"type": "object",
"properties": {
"agreementId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The proposal-born agreement record (agreements.id) — answer_proposal's agreementId on the person's side."
},
"state": {
"type": "string",
"const": "waiting",
"description": "Always awaiting the person's answer: terms never complete mutual on the spot."
}
},
"required": [
"agreementId",
"state"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The terms row this proposal recorded; null when no terms were proposed."
},
"threadId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
],
"description": "The chat a mutual transition opened in this call, when one did; null otherwise."
},
"notificationsPublished": {
"type": "boolean",
"description": "False when the post-commit notification publish failed — the committed rows stand (row-first); the recipients may not have been notified."
}
},
"required": [
"jobs",
"terms",
"threadId",
"notificationsPublished"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}