{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/iridiumhqmcp-com/json-schema/iridiumhqmcp-com-settings-update-schema.json",
  "title": "SettingsUpdate",
  "description": "Every user-writable setting, in one model — the single description of these columns.\n\nBoth transports bind to this: POST /users/setup (web) and POST /mcp/tools/update_settings\n(MCP + the in-app agent). Field names are the column names on purpose, so the field an\nerror names — outreach_blocker in routers/shared/pipelines.py prints raw column names —\nis the argument an agent sends back to fix it, with nothing to translate in between.\n\nThe descriptions are not decoration: fastapi-mcp builds the remote MCP input schema from\nthis model (main.py FastApiMCP), and services/agent_tools reads model_json_schema() for\nthe in-app agent, so this text is what both agents see. Plain `#` comments are invisible\nto both.\n\nEvery field is optional; only the ones passed are written (model_dump(exclude_none=True)).",
  "x-generated": "2026-11-12",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/iridiumhqmcp-com-openapi.json#/components/schemas/SettingsUpdate",
  "properties": {
    "current_role": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Current Role",
      "description": "The user's role and company, e.g. 'Founder at Acme'."
    },
    "credential_lead": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Credential Lead",
      "description": "One or two sentences on why the user is credible. Opens outreach messages."
    },
    "networking_goal": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Networking Goal",
      "description": "What the user wants from the people they reach, e.g. 'find design partners'."
    },
    "outreach_intent": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Outreach Intent",
      "description": "Message strategy: 'sell', 'connection' or 'referral'."
    },
    "style_examples": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Style Examples",
      "description": "Up to 3 approved note texts to imitate."
    },
    "target_personas": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Target Personas",
      "description": "Job titles to search for, e.g. ['VP of Engineering', 'Founder']."
    },
    "search_keywords": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Search Keywords",
      "description": "Keywords searched alongside the personas, e.g. ['AI platform']."
    },
    "target_cities": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Target Cities",
      "description": "Cities to search in, e.g. ['San Francisco', 'New York']."
    },
    "target_countries": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Target Countries",
      "description": "Countries to search in, e.g. ['United States']."
    },
    "daily_outreach_cap": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Daily Outreach Cap",
      "description": "Connection requests per day, clamped to 25."
    },
    "comment_topics": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Comment Topics",
      "description": "Subjects searched when finding posts to comment on."
    },
    "daily_comment_cap": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Daily Comment Cap",
      "description": "Comments per day, clamped to 25."
    },
    "network_post_pct": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Network Post Pct",
      "description": "Percent of comments sourced from in-network posts; the rest come from keyword search."
    },
    "new_position_pct": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "New Position Pct",
      "description": "Percent of the daily cap allowed for new-role announcement posts."
    },
    "comment_author_countries": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Comment Author Countries",
      "description": "Only comment on posts by authors in these countries. Empty means no filter."
    },
    "filter_cert_posts": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Filter Cert Posts",
      "description": "Skip 'I just earned/completed/certified' posts."
    },
    "filter_hiring_posts": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Filter Hiring Posts",
      "description": "Skip 'we're hiring / open role' posts."
    },
    "filter_job_seeking_posts": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Filter Job Seeking Posts",
      "description": "Skip 'open to work / looking for my next role' posts."
    },
    "comment_hiring_only": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Comment Hiring Only",
      "description": "Only comment on posts tagged #hiring — opt-in, the inverse of filter_hiring_posts."
    },
    "content_topics": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Content Topics",
      "description": "Subjects the user's own posts are drafted about."
    },
    "voice_dna": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Voice Dna",
      "description": "Writing rules applied to every draft, e.g. 'no buzzwords, direct, max 2 sentences'."
    },
    "onboarding_goals": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Onboarding Goals",
      "description": "Which pipelines are active. Any of ['commenting', 'content', 'outreach']."
    },
    "data_retention_days": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Data Retention Days",
      "description": "Days before scraped profiles and drafts are purged."
    }
  },
  "type": "object"
}