save_intent

Save intent fields

All MCP toolsWrite

Merge the person's intent fields — mobility (3 levels), sideJobDesire, availability — into their canonical CandidateProfile (versioned; absent keys stay unchanged) and echo each CHANGED axis into the availability_signals capture. openToWork is DERIVED from mobility (ADR-0084): true iff mobility is "open_to_move" or above — the deprecated openToWork input is accepted only when it matches that derivation and refused (nothing written) when it contradicts it. Use get_candidate_profile.version as expectedVersion.

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 person whose intent is being saved (persons.id — self)."
    },
    "intent": {
      "type": "object",
      "properties": {
        "mobility": {
          "description": "Mobility: one of the ordered 3 levels (the intent UI writes only these).",
          "type": "string",
          "enum": [
            "not_looking",
            "open_to_move",
            "actively_looking"
          ]
        },
        "sideJobDesire": {
          "type": "string",
          "enum": [
            "not_open",
            "open"
          ],
          "description": "Side-job desire: \"open\" or \"not_open\". Orthogonal to mobility."
        },
        "openToWork": {
          "description": "DEPRECATED (ADR-0084): openToWork is DERIVED from mobility — true iff mobility is \"open_to_move\" or above — and can no longer be set independently. Omit it; a value that matches the derived one is accepted for backward compatibility, a contradicting value is refused and nothing is written.",
          "type": "boolean"
        },
        "availability": {
          "type": "object",
          "properties": {
            "earliestStartDate": {
              "type": "string",
              "pattern": "^[1-2]\\d{3}(-[0-1]\\d(-[0-3]\\d)?)?$",
              "description": "Earliest start date as ISO 8601 with optional month/day, e.g. \"2026-10\" or \"2026-10-01\"."
            },
            "weeklyHours": {
              "description": "Available hours per week as a positive integer.",
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            }
          },
          "additionalProperties": false,
          "description": "Availability window: earliest start date and weekly available hours (both optional)."
        }
      },
      "additionalProperties": false,
      "description": "Intent fields to merge into the profile; absent keys stay unchanged."
    },
    "expectedVersion": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "The version you loaded (get_candidate_profile.version) — a stale value refuses with a version conflict naming expected and latest; re-read and retry."
    }
  },
  "required": [
    "personId",
    "intent",
    "expectedVersion"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output schema

{
  "type": "object",
  "properties": {
    "version": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The newly appended profile version."
    },
    "emittedSignalKinds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "One availability_signals kind per CHANGED axis, in emission order — empty when nothing captured changed (openToWork and weeklyHours alone emit nothing)."
    }
  },
  "required": [
    "version",
    "emittedSignalKinds"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}

On this page