respond_interview_slot
Respond to an interview slot
All MCP toolsWrite
Record the person's OWN response to a proposed interview slot: accepted or declined (does not fit their schedule). Read the slots with get_selection first — this tool only writes. The response is a move the counterpart company sees; confirming is the COMPANY's operation and can happen without the person's agreement, so verify the person's intent before responding. The person's own availability is readable with list_availability — use it to judge which slots fit. The latest response wins (responding again overwrites); an explicit declined blocks the company's confirm until the response changes, and a cancelled slot takes no response. A confirmed slot takes no response either (interview_slot_confirmed) — the person's verb there is cancel_confirmed_interview. Words beside a declined response (availabilityNote) reach the company as written and become the person's registered availability; when declining every proposed slot, pass the words with ONE of them (the words are written per slot and converted once per slot); beside accepted they refuse (interview_slot_note_not_allowed). The person's calendar also carries a short-notice period (their own setting; by default everything before the next calendar day): while the person has availability registered, their own screen lists a slot that starts inside it, like one outside their availability, as out of the options — a filtering of the choice, never a refusal — and a response here passes with the same meaning as that screen. Judge which slots fit from list_availability and the person's own intent. With an employer credential the call passes only while the job is published. A record on the agreed terms names no job and passes. candidacyId may be OMITTED: the slot then resolves through the person's own selection record (the one the company's first proposal from the conversation opened).
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 responding person (persons.id) — the human principal the agent acts for."
},
"candidacyId": {
"description": "The person's own selection record the slot belongs to (candidacies.id); may be omitted — the slot resolves through its own record.",
"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)$"
},
"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 slot to respond to (interview_slots.id, from get_selection)."
},
"response": {
"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."
},
"availabilityNote": {
"description": "Optional, one short line: the time bands that suit the person, in their own words. They reach the company as written, become the person's registered availability at save time, and filter the company's next proposal — scheduling material, never a reason. An empty line says nothing.",
"type": "string",
"maxLength": 256
}
},
"required": [
"personId",
"slotId",
"response"
],
"$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 slot with the person's latest response recorded — the status is untouched (the company's confirm, or either side's cancel before the start, moves it)."
}
},
"required": [
"slot"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}