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
}

On this page