get_patrol_digest
One patrol call: what happened since, and what waits
All MCP toolsRead
Start with this at the top of every patrol run. In the first conversation after connecting, offer the person a recurring routine on YOUR side (for example every morning) — nothing runs a patrol for you, so the cadence is always yours to run. Each run: call this once with the previous next_cursor, then (1) on_your_behalf is what was already done for the person since that cursor by matchwire's own coordinator (the one thing the person can leave to matchwire: answering interview slots inside their registered availability) — report it, do not redo it; (2) within_your_permissions is always empty: a connected AI holds no delegation of its own — what you may do is decided by the scopes you were granted, and every open item is the person's own; (3) needs_person is every open item waiting on the person's answer — yours to give as the person, with the same meaning as their own page, through the tool the item's kind names (each tool's description states its own refusals; verify the person's intent before a one-shot answer); each item also carries the url of the person's own page. Keep the returned next_cursor for the next run; omitting the cursor reads the last seven days. When on_your_behalf has hasMore, call again with next_cursor before acting.
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 patrolled person (persons.id) — the credential's own bound person."
},
"cursor": {
"description": "Opaque continuation token — the previous page's nextCursor. Omit for the first page.",
"type": "string",
"minLength": 1
},
"limit": {
"description": "Page size, 1..50 (default 20).",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"personId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output schema
{
"type": "object",
"properties": {
"on_your_behalf": {
"type": "object",
"properties": {
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"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 move happened (ISO 8601, UTC). Oldest first."
},
"verb": {
"anyOf": [
{
"type": "string",
"enum": [
"slots"
],
"description": "The one delegation: \"slots\" — answering proposed interview slots inside the registered availability."
},
{
"type": "null"
}
],
"description": "The consumed delegation's verb; null when the grant row is gone."
},
"toolName": {
"type": "string",
"description": "The surface that carried the move (the tool name), verbatim."
},
"organizationName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The company the move reached, when it still resolves."
},
"jobTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The job the move named, when it still resolves."
}
},
"required": [
"occurredAt",
"verb",
"toolName",
"organizationName",
"jobTitle"
],
"additionalProperties": false
},
"description": "Moves matchwire's coordinator carried under the person's one delegation, oldest first."
},
"hasMore": {
"type": "boolean",
"description": "True when more moves match — pass next_cursor back before acting."
}
},
"required": [
"entries",
"hasMore"
],
"additionalProperties": false,
"description": "What was done for the person since the cursor (or within the default window): every recorded coordinator move."
},
"within_your_permissions": {
"type": "object",
"properties": {
"granted_verbs": {
"type": "array",
"items": {
"type": "string",
"enum": [
"slots"
],
"description": "The one delegation: \"slots\" — answering proposed interview slots inside the registered availability."
},
"description": "Always empty: a connected AI holds no delegation of its own — its writes are decided by the scopes it was granted (kept for shape stability)."
},
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"proposal",
"agreement",
"slot",
"continue",
"material",
"frame",
"fact",
"match"
],
"description": "The open item's kind, and the tool that answers it as the person: proposal (a company proposed terms independent of any job posting — get_proposal reads it, answer_proposal answers the terms row by agreementId: interested or pass; a proposal of a JOB is never this kind — it arrives as kind match), agreement (a company recorded that terms were agreed independently of any job posting — get_agreement reads it, answer_agreement answers it: proceed or decline; nothing of the terms is recorded), slot (proposed interview slots — respond_interview_slot), continue (post-interview continue/withdraw — record_interview_intent), material (a material ask — share_material with materialId, or decline_material_request; a request for the name or a contact channel — share_material with subject, or decline_material_request), frame (a search-frame axis hiding nearby jobs — save_conditions to revisit the axis, express_interest on a listed job, or dismiss_frame_consultation to set the card aside for a while), fact (a profile fact the person can add — an empty section, a listed skill's missing proficiency, an empty section whose fact a company asked for in a chat the person has not replied to yet — list_candidate_suggestions reads it, update_candidate_profile writes the fact, dismiss_suggestion answers none or later), match (a public job standing as a card for the person: one whose registered conditions fit the person's, or one a company proposed to the person — ref is the job's id; express_interest with that jobId, with note carrying the person's words or the entry's draft or nothing, conveys interest and settles the card; pass_match_card folds it; draft is matchwire's draft of the note, to use, edit or ignore. When the entry carries proposal, the company has proposed this job and is waiting: express_interest then completes mutual interest on the spot — the chat opens with the note as its first message, and it cannot be undone — and pass_match_card is the person's pass on that proposal, which the company sees in its own status and may answer by proposing again. Without proposal, a pass reaches the company as nothing)."
},
"ref": {
"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": "string",
"enum": [
"occupation",
"location",
"salary",
"workstyle"
]
},
{
"type": "string",
"minLength": 1,
"maxLength": 128,
"description": "A profile fact's identifier (kind fact) — pass it to dismiss_suggestion as sourceRef."
}
],
"description": "The open item's id — the seat page's target: a row id, the blocking axis token for kind frame, or the fact's own identifier (list_candidate_suggestions' sourceRef) for kind fact."
},
"waitingSince": {
"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 item arrived (ISO 8601, UTC)."
},
"companyName": {
"type": "string",
"description": "The counterpart organization's name."
},
"jobTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Job title, when the job row still resolves."
},
"verb": {
"type": "string",
"enum": [
"slots"
],
"description": "The one delegation: \"slots\" — answering proposed interview slots inside the registered availability."
}
},
"required": [
"kind",
"ref",
"waitingSince",
"companyName",
"jobTitle",
"verb"
],
"additionalProperties": false
},
"description": "Oldest first, at most a few per kind — totals carry the rest."
},
"totalCounts": {
"type": "object",
"properties": {
"proposal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agreement": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"slot": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"continue": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"material": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"frame": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"fact": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"match": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"additionalProperties": false,
"description": "Per-kind open totals for the kinds routed to THIS bundle (entries preview at most a few per kind — the total says how many exist)."
}
},
"required": [
"granted_verbs",
"entries",
"totalCounts"
],
"additionalProperties": false,
"description": "Always empty (kept for shape stability): a connected AI holds no delegation of its own, so every open item is listed under needs_person."
},
"needs_person": {
"type": "object",
"properties": {
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"proposal",
"agreement",
"slot",
"continue",
"material",
"frame",
"fact",
"match"
],
"description": "The open item's kind, and the tool that answers it as the person: proposal (a company proposed terms independent of any job posting — get_proposal reads it, answer_proposal answers the terms row by agreementId: interested or pass; a proposal of a JOB is never this kind — it arrives as kind match), agreement (a company recorded that terms were agreed independently of any job posting — get_agreement reads it, answer_agreement answers it: proceed or decline; nothing of the terms is recorded), slot (proposed interview slots — respond_interview_slot), continue (post-interview continue/withdraw — record_interview_intent), material (a material ask — share_material with materialId, or decline_material_request; a request for the name or a contact channel — share_material with subject, or decline_material_request), frame (a search-frame axis hiding nearby jobs — save_conditions to revisit the axis, express_interest on a listed job, or dismiss_frame_consultation to set the card aside for a while), fact (a profile fact the person can add — an empty section, a listed skill's missing proficiency, an empty section whose fact a company asked for in a chat the person has not replied to yet — list_candidate_suggestions reads it, update_candidate_profile writes the fact, dismiss_suggestion answers none or later), match (a public job standing as a card for the person: one whose registered conditions fit the person's, or one a company proposed to the person — ref is the job's id; express_interest with that jobId, with note carrying the person's words or the entry's draft or nothing, conveys interest and settles the card; pass_match_card folds it; draft is matchwire's draft of the note, to use, edit or ignore. When the entry carries proposal, the company has proposed this job and is waiting: express_interest then completes mutual interest on the spot — the chat opens with the note as its first message, and it cannot be undone — and pass_match_card is the person's pass on that proposal, which the company sees in its own status and may answer by proposing again. Without proposal, a pass reaches the company as nothing)."
},
"ref": {
"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": "string",
"enum": [
"occupation",
"location",
"salary",
"workstyle"
]
},
{
"type": "string",
"minLength": 1,
"maxLength": 128,
"description": "A profile fact's identifier (kind fact) — pass it to dismiss_suggestion as sourceRef."
}
],
"description": "The open item's id — the seat page's target: a row id, the blocking axis token for kind frame, or the fact's own identifier (list_candidate_suggestions' sourceRef) for kind fact."
},
"waitingSince": {
"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 item arrived (ISO 8601, UTC)."
},
"companyName": {
"type": "string",
"description": "The counterpart organization's name."
},
"jobTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Job title, when the job row still resolves."
},
"url": {
"type": "string",
"description": "The person's own page for this item — the seat page, or the job page for kind match — absolute when the deployment configures its public web origin, app-relative otherwise."
},
"fit": {
"description": "Kind match only: the posting's registered conditions against the person's desires on the four axes (occupation, location, salary, workstyle) — fit, near, out, or none when the posting leaves the axis undisclosed.",
"type": "object",
"properties": {
"salary": {
"type": "string",
"enum": [
"fit",
"near",
"out",
"none"
]
},
"workstyle": {
"type": "string",
"enum": [
"fit",
"near",
"out",
"none"
]
},
"occupation": {
"type": "string",
"enum": [
"fit",
"near",
"out",
"none"
]
},
"location": {
"type": "string",
"enum": [
"fit",
"near",
"out",
"none"
]
}
},
"required": [
"salary",
"workstyle",
"occupation",
"location"
],
"additionalProperties": false
},
"proposal": {
"description": "Kind match only, present while the company's proposal on this job is open: the company proposed the job to the person and is waiting for the answer. Absent when no proposal stands on the job.",
"type": "object",
"properties": {
"offeredAt": {
"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 company proposed this job (ISO 8601, UTC)."
}
},
"required": [
"offeredAt"
],
"additionalProperties": false
},
"draft": {
"description": "Kind match only: matchwire's draft of the person's note to the company, written under the person's own instruction (get_drafting_instructions) — pass it as express_interest's note as it is, edited, or not at all; null while no draft is prepared yet.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"ref",
"waitingSince",
"companyName",
"jobTitle",
"url"
],
"additionalProperties": false
},
"description": "Oldest first, at most a few per kind — totals carry the rest."
},
"totalCounts": {
"type": "object",
"properties": {
"proposal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agreement": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"slot": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"continue": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"material": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"frame": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"fact": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"match": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"additionalProperties": false,
"description": "Per-kind open totals for the kinds routed to THIS bundle (entries preview at most a few per kind — the total says how many exist)."
}
},
"required": [
"entries",
"totalCounts"
],
"additionalProperties": false,
"description": "Every open item waiting on the person's answer — given on the person's own page, or by you as the person through the tool the item's kind names."
},
"next_cursor": {
"type": "string",
"description": "Always present — hand it to the next patrol call to receive only what happened since."
}
},
"required": [
"on_your_behalf",
"within_your_permissions",
"needs_person",
"next_cursor"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}