{
  "type": "object",
  "properties": {
    "prompt": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "The question or task to send to the council. Include all needed context \u2014 every query is stateless. Example: \"Is optimistic locking or a distributed lock the better fit for this checkout flow? [paste flow description]\""
    },
    "models": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 2,
      "maxItems": 10,
      "description": "Model IDs to include (2-10). Defaults to a cross-lab flagship council. Use council_models to list available IDs. Example: [\"claude-fable-5.1\", \"gpt-6.1-sol\", \"gemini-3.8-flash\"]"
    },
    "synthesize": {
      "type": "boolean",
      "default": true,
      "description": "When true (default), include the moderator synthesis + consensus score. Set false to get only the raw per-model responses (faster, cheaper)."
    },
    "synthesisDirective": {
      "type": "string",
      "minLength": 1,
      "maxLength": 8000,
      "description": "Optional instructions for the moderator that synthesizes the council's answers. The council models never see this \u2014 it only shapes the synthesis. Use for special modes, e.g. devil's advocate: \"Argue against the majority position \u2014 find the strongest case that the consensus is wrong and surface every dissenting point.\" Or output contracts: \"Answer VERDICT: SAFE/UNSAFE first, then justification.\" Omit for the standard balanced synthesis."
    },
    "mode": {
      "type": "string",
      "enum": [
        "independent",
        "sequential"
      ],
      "default": "independent",
      "description": "Cross-model visibility. 'independent' (default): all models answer in parallel, blind to each other \u2014 best for unbiased comparison; the synthesis reconciles them. 'sequential': models answer one at a time and each later model sees the earlier answers, debate-style \u2014 takes the SUM of per-model latencies instead of the max, so strongly consider async=true with it."
    },
    "async": {
      "type": "boolean",
      "default": false,
      "description": "When true, return {queryId, status:\"running\"} immediately instead of waiting for the council. Fetch the finished result with council_result. Use whenever your MCP client enforces a fixed tool-call timeout (a full council typically runs 1-3 minutes) or when querying 4+ models."
    }
  },
  "required": [
    "prompt"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}