express_interest
Express interest (strong verb)
All MCP toolsWrite
Express a strong, counterpart-visible interest verb on one person↔job pair: interested (the candidate's own strong yes — person_to_job only), not_interested, withdrawn (person_to_job only), or declined (job_to_person only); optional rationale on withdrawn/declined only. The candidate's interested may carry a note to the company (note, person_to_job × interested only — its own words, the draft get_patrol_digest carries on a match card, the draft get_interest_note_draft returns for the job (a match card's, or the one kept for a job the person found), or none): the company reads it before mutual interest, and it opens the chat as the candidate's first message when the pair becomes mutual. An interested on a job standing as a match card settles the card (the same one state the person's own page writes); passing a card is pass_match_card. withdrawn goes through the same entrance as the job page's hand: it appends the row and reopens the pair's match card when the interest folded one (a passed card is never reopened). The employer's move is the proposal: propose_jobs (job_to_person × interested refuses — kind_direction_mismatch). A job the company proposed stands as a match card whose digest entry carries proposal: the candidate's interested on it completes mutual interest on the spot, and pass_match_card passes the proposal; terms independent of any job posting are answered with answer_proposal (offered and passed are refused here). With an employer credential the call passes only while the job is published. The candidate's interested passes only while the job's recruitment is open: a seat on hold, filled or closed refuses (job_not_accepting) and writes nothing; a reached listing deadline or a withdrawn external listing never refuses it. Mutual interest is detected atomically and notifies both sides. Under the person's disclosure settings (default: the name opens on mutual interest), the candidate's interested that completes a mutual — on the spot when the company has proposed the job, or later when it does — discloses the person's name to that company; a name already open to it, or one the person closed by hand, stands as it is. Once the pair is mutual, withdrawn / not_interested refuse (already_mutual) and write nothing — mutual interest is a fixed fact; only the employer's declined dissolves it. 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 human principal (persons.id) — the verb is recorded as theirs."
},
"direction": {
"type": "string",
"enum": [
"person_to_job",
"job_to_person"
],
"description": "Interest direction: \"person_to_job\" (candidate → job) or \"job_to_person\" (a job's team → candidate)."
},
"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)$",
"description": "The job side of the pair (jobs.id)."
},
"personToken": {
"description": "The person side of the pair as an opaque subject_token — required iff direction is job_to_person (from list_job_interests); omit for person_to_job, where the pair person IS the actor.",
"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)$"
},
"kind": {
"type": "string",
"enum": [
"interested",
"offered",
"passed",
"not_interested",
"withdrawn",
"declined"
],
"description": "The strong verb: interested / not_interested / withdrawn / declined. offered (the proposal) belongs to propose_jobs and passed to pass_match_card. Latest strong verb wins per side; weak annotations go through annotate_interest."
},
"rationale": {
"description": "Optional short reason on withdrawn / declined only — never surfaces to the counterpart; include no PII about others.",
"type": "string",
"minLength": 1,
"maxLength": 500
},
"note": {
"description": "Optional note to the company on person_to_job × interested only (note_not_allowed elsewhere) — the person's own words, the draft get_interest_note_draft returns for the job (the match card's, or the one kept for a job the person found), or omitted. The company reads it before mutual interest; when the pair becomes mutual it becomes the person's first message in the chat. Send it as the person would write it.",
"type": "string",
"minLength": 1,
"maxLength": 2000
}
},
"required": [
"actorPersonId",
"direction",
"jobId",
"kind"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output schema
{
"type": "object",
"properties": {
"state": {
"type": "object",
"properties": {
"personToJob": {
"type": "object",
"properties": {
"strong": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"interested",
"offered",
"passed",
"not_interested",
"withdrawn",
"declined"
],
"description": "The side's standing strong verb (latest wins, ADR-0084)."
},
"eventId": {
"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 winning interests row (interests.id)."
},
"occurredAt": {
"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 winning verb happened (ISO 8601, UTC)."
}
},
"required": [
"kind",
"eventId",
"occurredAt"
],
"additionalProperties": false
},
"weak": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"saved",
"dismissed"
],
"description": "The acting side's latest private annotation — omitted for the counterpart; never changes strong state."
},
"eventId": {
"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 winning interests row (interests.id)."
},
"occurredAt": {
"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 winning verb happened (ISO 8601, UTC)."
}
},
"required": [
"kind",
"eventId",
"occurredAt"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"description": "The candidate side (direction person_to_job)."
},
"jobToPerson": {
"type": "object",
"properties": {
"strong": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"interested",
"offered",
"passed",
"not_interested",
"withdrawn",
"declined"
],
"description": "The side's standing strong verb (latest wins, ADR-0084)."
},
"eventId": {
"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 winning interests row (interests.id)."
},
"occurredAt": {
"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 winning verb happened (ISO 8601, UTC)."
}
},
"required": [
"kind",
"eventId",
"occurredAt"
],
"additionalProperties": false
},
"weak": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"saved",
"dismissed"
],
"description": "The acting side's latest private annotation — omitted for the counterpart; never changes strong state."
},
"eventId": {
"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 winning interests row (interests.id)."
},
"occurredAt": {
"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 winning verb happened (ISO 8601, UTC)."
}
},
"required": [
"kind",
"eventId",
"occurredAt"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"description": "The employer side (direction job_to_person)."
},
"mutual": {
"type": "boolean",
"description": "true iff BOTH sides' strong states are interested."
}
},
"required": [
"personToJob",
"jobToPerson",
"mutual"
],
"additionalProperties": false,
"description": "The folded state of ONE person↔job pair (resolveInterestState, ADR-0084)."
},
"mutual": {
"type": "boolean",
"description": "Convenience mirror of state.mutual — true iff the pair is mutual."
},
"notificationsPublished": {
"type": "boolean",
"description": "False when the post-commit notification publish failed — the committed interest/outcome rows stand (row-first); the recipients may not have been notified."
}
},
"required": [
"state",
"mutual",
"notificationsPublished"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}