propose_conversation_interview_slot
Propose an interview slot from the conversation (opens the selection record)
All MCP toolsWrite
Record one employer-proposed interview slot on a conversation engagement, referring to the chat's topic: the job (jobId) or the agreed terms (agreementId) — exactly one. On a job the (person, job) pair must have an open conversation thread AND currently be mutually interested; on the agreed terms the person's own proceed answer is the mutual, and the chat's topic must be (or have been) that agreement. The FIRST proposal on the pair opens the pair's selection record (a candidacy at applied — the one road into selection: mutual interest → conversation → interview scheduling); every later proposal adds a slot to that same record, and after a declined/converted record a proposal opens a new one. After the candidate's own withdrawal only their renewed interest reopens the pair — until then this tool refuses candidate_withdrawn (an agreement seat never reopens; record and answer again). A seat that is not open refuses not_accepting; agreed terms the chat never had as its topic (another person's record, an unanswered or declined one) refuse not_found. Passes while the job is published; an unpublished job refuses (job_not_published). A slot on the agreed terms names no job and passes. The candidate answers from their decision queue; confirm/cancel the proposed slot with confirm_interview_slot / cancel_interview_slot (candidacyId may be omitted — the slot resolves through its own record), and a job seat's record then shows in the job pipeline. Read get_employer_thread's slotProposal first for the times inside the candidate's registered availability; any time is accepted, and candidateAvailabilityFit says whether the proposed slot sits inside that availability (unknown while none is registered) — answering stays the candidate's.
Input schema
{
"type": "object",
"properties": {
"personId": {
"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 in conversation (persons.id) — must be a person of your organization."
},
"jobId": {
"description": "The topic the slot refers to when it is a job (jobs.id) — the pair axis; omit when agreementId is given. Exactly one of jobId / 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)$"
},
"agreementId": {
"description": "The topic the slot refers to when it is the agreed terms (agreements.id — the record the person answered proceed to); omit when jobId is given. Exactly one of jobId / 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)$"
},
"startsAt": {
"type": "string",
"format": "date-time",
"description": "When the slot starts, ISO 8601 datetime — Z or ±hh:mm offset accepted, stored as UTC."
},
"endsAt": {
"type": "string",
"format": "date-time",
"description": "When the slot ends, ISO 8601 datetime — Z or ±hh:mm offset accepted, stored as UTC; omit for open-ended."
},
"contact": {
"type": "object",
"properties": {
"phone": {
"description": "Phone number in customary domestic notation, e.g. \"03-1234-5678\" or \"+81 3 1234 5678\" — digits, \"+\", \"-\", spaces and parentheses only; never normalized or verified.",
"type": "string",
"pattern": "^(?=.*[0-9])[0-9+(](?:[0-9+\\-() ]*[0-9)])?$"
},
"email": {
"description": "Contact email address for enquiries about this posting.",
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"note": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "One line beside the channels — the department, the person in charge, reception hours — trimmed and non-empty."
}
},
"additionalProperties": false,
"description": "The employer's day-of contact for THIS interview — phone and/or email (at least one) plus an optional one-line note. Omit it and the posting's contact is the day-of contact."
}
},
"required": [
"personId",
"startsAt"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output schema
{
"type": "object",
"properties": {
"slot": {
"type": "object",
"properties": {
"slotId": {
"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 interview slot (interview_slots.id)."
},
"candidacyId": {
"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 candidacy this slot hangs off (candidacies.id) — the selection record the company's first proposal on the mutual pair opened; the slot's one parent."
},
"status": {
"type": "string",
"enum": [
"proposed",
"confirmed",
"cancelled"
],
"description": "Interview slot status: \"proposed\", \"confirmed\" (at most one UNDECIDED per candidacy; decided past ones remain as the record), or \"cancelled\". Nothing leaves cancelled."
},
"startsAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "When the slot starts, ISO 8601 datetime (UTC)."
},
"endsAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the slot ends, ISO 8601 datetime (UTC); null when open-ended."
},
"candidateResponse": {
"anyOf": [
{
"type": "string",
"enum": [
"accepted",
"declined"
],
"description": "Candidate response to an interview slot: \"accepted\" or \"declined\" (does not fit their schedule). Mutable — the latest response wins; absent (null) means no response yet. A confirmed slot takes no response; the person's verb there is the interview cancel."
},
{
"type": "null"
}
],
"description": "The candidate's latest response: accepted, declined, or null (no response yet). A declined slot refuses confirmation until the response changes."
},
"respondedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the latest response was recorded, ISO 8601 (UTC); null when unresponded."
},
"candidateVerdict": {
"anyOf": [
{
"type": "string",
"enum": [
"continue",
"withdraw"
],
"description": "Candidate post-interview intent: \"continue\" (stay in this selection process) or \"withdraw\" (leave it). Absent (null) means no intent recorded yet; withdraw co-occurs with the withdrawn transition."
},
{
"type": "null"
}
],
"description": "The candidate's post-interview intent: continue, withdraw, or null (not recorded yet). Meaningful only once the confirmed slot's start has passed."
},
"candidateVerdictAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the candidate intent was recorded, ISO 8601 (UTC); null when unrecorded."
},
"employerVerdict": {
"anyOf": [
{
"type": "string",
"enum": [
"passed",
"declined"
],
"description": "Employer interview verdict: \"passed\" (state unchanged) or \"declined\" (co-occurs with the declined transition). Absent (null) means no verdict recorded yet."
},
{
"type": "null"
}
],
"description": "The employer's verdict on the completed interview: passed, declined, or null (not recorded yet)."
},
"employerVerdictAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When the employer verdict was recorded, ISO 8601 (UTC); null when unrecorded."
},
"contact": {
"anyOf": [
{
"type": "object",
"properties": {
"phone": {
"description": "Phone number in customary domestic notation, e.g. \"03-1234-5678\" or \"+81 3 1234 5678\" — digits, \"+\", \"-\", spaces and parentheses only; never normalized or verified.",
"type": "string",
"pattern": "^(?=.*[0-9])[0-9+(](?:[0-9+\\-() ]*[0-9)])?$"
},
"email": {
"description": "Contact email address for enquiries about this posting.",
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"note": {
"type": "string",
"pattern": "^\\S(?:[\\s\\S]*\\S)?$",
"description": "One line beside the channels — the department, the person in charge, reception hours — trimmed and non-empty."
}
},
"additionalProperties": false,
"description": "Employer contact for the posting: phone and/or email (at least one), plus an optional one-line note. Published as posting content — no disclosure gate."
},
{
"type": "null"
}
],
"description": "The employer's day-of contact stated for THIS interview at proposal (ADR-0217) — the raw statement, not the resolution: null when none was stated, in which case the posting's contact is the day-of contact."
},
"cancelledAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
{
"type": "null"
}
],
"description": "When a confirmed interview was cancelled, ISO 8601 (UTC) — recorded with who and when; a proposed slot's withdrawal and the expiry sweep leave it null."
},
"cancelledBy": {
"anyOf": [
{
"type": "string",
"enum": [
"candidate",
"employer"
],
"description": "Which side cancelled the confirmed interview: \"candidate\" or \"employer\". Absent (null) when the slot was not a cancelled confirmed interview — a proposed slot's withdrawal and the expiry sweep record no side."
},
{
"type": "null"
}
],
"description": "Which side cancelled the confirmed interview — recorded with who and when; a proposed slot's withdrawal and the expiry sweep leave it null."
},
"candidateAvailabilityNote": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"description": "The candidate's own words about the times that suit them, written beside a declined response or beside their own cancellation of a confirmed interview; null when they said nothing."
}
},
"required": [
"slotId",
"candidacyId",
"status",
"startsAt",
"endsAt",
"candidateResponse",
"respondedAt",
"candidateVerdict",
"candidateVerdictAt",
"employerVerdict",
"employerVerdictAt",
"contact",
"cancelledAt",
"cancelledBy",
"candidateAvailabilityNote"
],
"additionalProperties": false,
"description": "The proposed slot — candidacyId is the pair's selection record (opened by this call when none stood)."
},
"candidateAvailabilityFit": {
"type": "string",
"enum": [
"within",
"outside",
"unknown"
],
"description": "Whether the proposed interval sits inside the candidate's registered availability: 'unknown' when the candidate has none registered (absence is not 'outside'). The proposal stands either way — answering is the candidate's."
}
},
"required": [
"slot",
"candidateAvailabilityFit"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}