{"name":"manifestly-mcp","description":"MCP server for Manifestly API v2 – workflows, checklists, and runs.","version":"0.1.0","tools":[{"name":"about","description":"Learn how Manifestly works and which tools to use for common tasks. Call this when you're unfamiliar with the connector or unsure which tool to start with.","input_schema":{"type":"object","properties":{},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"verify_authentication","description":"Verify the current API authentication and return information about the authenticated user and account.\n\nEndpoint: GET /verify\n\nParameters: none.\n\nReturns: Object with user and account info for the currently authenticated token.\n\nOn error:\n  401 unauthorized – the token is invalid or expired.","input_schema":{"type":"object","properties":{},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_departments","description":"List all departments in the account.\n\nEndpoint: GET /departments\n\nParameters:\n  - search (string, optional): Filter departments by name (case-insensitive partial match).\n  - page (integer, optional): Page number (default: 1).\n  - per_page (integer, optional): Items per page (default: 25, max: 100).\n\nReturns: Paginated list of department objects with id, name.\n\nExample:\n  Input: {}\n  Output: { \"departments\": [{ \"id\": 1, \"name\": \"Engineering\" }, ...], \"meta\": { ... } }\n\nOn error:\n  401 unauthorized – re-authenticate.\n  403 forbidden – insufficient scope.","input_schema":{"type":"object","properties":{"search":{"type":"string","description":"Filter departments by name."},"page":{"type":"integer","minimum":1,"description":"Page number."},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Items per page."}},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_workflows","description":"List workflows accessible to the authenticated user.\n\nEndpoint: GET /workflows\n\nParameters:\n  - search (string, optional): Filter workflows by title (case-insensitive partial match).\n  - department_id (integer, optional): Filter by department.\n  - tag (string, optional): Filter by tag name.\n  - sort (string, optional): Sort order. Enum: \"title_asc\", \"title_desc\". Default: title ascending.\n  - page (integer, optional): Page number (default: 1).\n  - per_page (integer, optional): Items per page (default: 25, max: 100).\n\nReturns: Paginated list of workflow objects. Note: each workflow's step_count includes section headers (non-completable grouping steps). For accurate completion tracking, use the run's progress.total_steps instead.\n\nExample:\n  Input: { \"search\": \"Onboarding\" }\n  Output: { \"workflows\": [...], \"meta\": { \"current_page\": 1, \"per_page\": 25, \"total_count\": 5, \"total_pages\": 1 } }\n\nOn error:\n  401 unauthorized – re-authenticate.","input_schema":{"type":"object","properties":{"search":{"type":"string","description":"Filter workflows by title."},"department_id":{"type":"integer","description":"Filter by department ID."},"tag":{"type":"string","description":"Filter by tag name."},"sort":{"type":"string","enum":["title_asc","title_desc"],"description":"Sort order (default: title ascending)."},"page":{"type":"integer","minimum":1,"description":"Page number."},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Items per page."}},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_workflow","description":"Get details for a single workflow by ID, including its definition steps.\n\nEndpoint: GET /workflows/:id\n\nParameters:\n  - id (integer, required): Workflow ID.\n  - steps_page (integer, optional): Page number for definition steps (default: 1).\n  - steps_per_page (integer, optional): Definition steps per page (default: 10, max: 50).\n  - page (integer, optional): Page number for section substeps within header steps.\n  - per_page (integer, optional): Substeps per page (default: 10, max: 50). Substeps are only returned when page is explicitly provided.\n\nReturns: Workflow object with nested steps array and step_meta pagination info.\n\nExample:\n  Input: { \"id\": 42 }\n  Output: { \"workflow\": { \"id\": 42, \"title\": \"Employee Onboarding\", \"steps\": [...] }, \"step_meta\": { ... } }\n\nUsage guidance: To see the full step tree including substeps within sections, always pass page=1 and per_page=50 alongside steps_per_page=50. Without page, only top-level section headers are returned with empty substeps.\n\nOn error:\n  404 not_found – the workflow does not exist or is not accessible.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Workflow ID."},"steps_page":{"type":"integer","minimum":1,"description":"Page number for definition steps."},"steps_per_page":{"type":"integer","minimum":1,"maximum":50,"description":"Definition steps per page."},"page":{"type":"integer","minimum":1,"description":"Page number for section substeps."},"per_page":{"type":"integer","minimum":1,"maximum":50,"description":"Section substeps per page."}},"required":["id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"export_workflow","description":"Export a workflow as a portable JSON template.\n\nEndpoint: GET /workflows/:id/template\n\nParameters:\n  - id (integer, required): Workflow ID.\n\nReturns: A template object that can be passed to import_workflow or validate_workflow_import to recreate the workflow in another department or account.\n\nExample:\n  Input: { \"id\": 42 }\n  Output: { \"template\": { \"title\": \"Employee Onboarding\", \"main_steps\": [...] } }\n\nOn error:\n  404 not_found – the workflow does not exist or is not accessible.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Workflow ID."}},"required":["id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_runs","description":"List workflow runs visible to the authenticated user.\n\nEndpoint: GET /runs\n\nParameters:\n  - workflow_id (integer, optional): Filter by workflow.\n  - department_id (integer, optional): Filter by department.\n  - status (string, optional): Filter by status. Enum: \"closed\", \"completed\", \"late\", \"in-progress\", \"started\", \"upcoming\".\n  - search (string, optional): Search on run title (case-insensitive partial match).\n  - tag (string, optional): Filter by tag name.\n  - sort (string, optional): Sort order. Enum: \"late_at_asc\", \"late_at_desc\", \"started_asc\", \"started_desc\", \"title_asc\", \"title_desc\". Default: started descending.\n  - page (integer, optional): Page number (default: 1).\n  - per_page (integer, optional): Items per page (default: 25, max: 100).\n\nReturns: Paginated list of run objects.\n\nExample:\n  Input: { \"status\": \"in-progress\", \"workflow_id\": 42 }\n  Output: { \"runs\": [...], \"meta\": { \"current_page\": 1, \"total_count\": 10, \"total_pages\": 1 } }\n\nOn error:\n  401 unauthorized – re-authenticate.","input_schema":{"type":"object","properties":{"workflow_id":{"type":"integer","description":"Filter by workflow ID."},"department_id":{"type":"integer","description":"Filter by department ID."},"status":{"type":"string","enum":["closed","completed","late","in-progress","started","upcoming"],"description":"Filter by run status."},"search":{"type":"string","description":"Search on run title."},"tag":{"type":"string","description":"Filter by tag name."},"sort":{"type":"string","enum":["late_at_asc","late_at_desc","started_asc","started_desc","title_asc","title_desc"],"description":"Sort order (default: started descending)."},"page":{"type":"integer","minimum":1,"description":"Page number."},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Items per page."}},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_run","description":"Get full details for a single run, including its steps.\n\nEndpoint: GET /runs/:id\n\nParameters:\n  - id (integer, required): Run ID.\n  - steps_page (integer, optional): Page number for main run steps (default: 1).\n  - steps_per_page (integer, optional): Main run steps per page (default: 10, max: 50).\n  - page (integer, optional): Page number for substeps within header steps (default: 1).\n  - per_page (integer, optional): Substeps per page (default: 50, max: 50).\n\nReturns: Run object with nested run_steps array and step_meta pagination info. The run's progress.total_steps counts only completable steps (excludes section headers), so it may be less than the workflow's step_count.\n\nExample:\n  Input: { \"id\": 101 }\n  Output: { \"run\": { \"id\": 101, \"title\": \"Q1 Onboarding\", \"status\": \"active\", \"run_steps\": [...] }, \"step_meta\": { ... } }\n\nOn error:\n  404 not_found – the run does not exist or is not accessible.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Run ID."},"steps_page":{"type":"integer","minimum":1,"description":"Page number for main run steps."},"steps_per_page":{"type":"integer","minimum":1,"maximum":50,"description":"Main run steps per page."},"page":{"type":"integer","minimum":1,"description":"Page number for header substeps."},"per_page":{"type":"integer","minimum":1,"maximum":50,"description":"Header substeps per page."}},"required":["id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_run_step","description":"Get details for a single step within a run.\n\nEndpoint: GET /runs/:run_id/run_steps/:id\n\nParameters:\n  - run_id (integer, required): ID of the parent run.\n  - id (integer, required): Run-step ID.\n  - page (integer, optional): Page number for substeps if this is a header step (default: 1).\n  - per_page (integer, optional): Substeps per page (default: 50, max: 50).\n\nReturns: Run-step object with state, assignment, due date, data, and optional substeps.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, \"title\": \"Review contract\", \"state\": \"incomplete\" } }\n\nOn error:\n  404 not_found – the run or step does not exist.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"page":{"type":"integer","minimum":1,"description":"Page number for header substeps."},"per_page":{"type":"integer","minimum":1,"maximum":50,"description":"Header substeps per page."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_run_step_comments","description":"List comments on a run step.\n\nEndpoint: GET /runs/:run_id/run_steps/:run_step_id/comments\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - run_step_id (integer, required): Run-step ID.\n\nReturns: Array of comment objects ordered by created_at.\n\nExample:\n  Input: { \"run_id\": 101, \"run_step_id\": 501 }\n  Output: { \"comments\": [{ \"id\": 1, \"comment\": \"Looks good!\" }] }\n\nOn error:\n  404 not_found – the run or step does not exist.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"run_step_id":{"type":"integer","description":"Run-step ID."}},"required":["run_id","run_step_id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_fields","description":"Get data collection field definitions for a run step and their current values.\n\nEndpoint: GET /runs/:run_id/run_steps/:run_step_id/fields\n\nBehavior depends on step type:\n  - Header step: returns fields for all substeps that have data collection enabled.\n  - Non-header step: returns that step's field(s). On accounts with multi data settings enabled, a single step can have multiple fields (the fields array will contain multiple entries all sharing the same run_step_id).\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - run_step_id (integer, required): Run-step ID (header or non-header).\n\nReturns: Object with run_step info, fields array (always an array, even for a single step), and summary.\n\nEach fields entry includes:\n  - field_id: the unique field identifier to use when setting data via set_fields\n  - label: human-readable field name (e.g. \"Employee Name\")\n  - value_format: field type (text, list, date, number, url, email, paragraph, phone, datetime, choose_from_data_table)\n  - required: whether the field is required\n  - config: format-specific config, or null. For \"list\" fields: { values, value_selection_type }. For \"choose_from_data_table\" fields: { data_table_id, display_column_id, value_selection_type }. value_selection_type is \"single\" (default) or \"multi\".\n  - data_table_options: only present on \"choose_from_data_table\" fields — array of allowed values to choose from. For single-select, submit one of these verbatim as the field value. For multi-select (config.value_selection_type === \"multi\"), submit an array of any subset of these values.\n  - value: the currently collected value, or null\n  - run_step_id: the run step this field belongs to\n\nExample (header step):\n  Input: { \"run_id\": 101, \"run_step_id\": 501 }\n  Output: {\n    \"run_step\": { \"id\": 501, \"title\": \"Employee Details\", \"header_step\": true },\n    \"fields\": [\n      { \"field_id\": 10, \"label\": \"Name\", \"value_format\": \"text\", \"required\": true, \"config\": null, \"value\": null, \"run_step_id\": 502 },\n      { \"field_id\": 11, \"label\": \"Role\", \"value_format\": \"list\", \"required\": true, \"config\": { \"values\": [\"Engineer\", \"Designer\"], \"value_selection_type\": \"single\" }, \"value\": \"Engineer\", \"run_step_id\": 503 },\n      { \"field_id\": 12, \"label\": \"State\", \"value_format\": \"choose_from_data_table\", \"required\": true, \"config\": { \"data_table_id\": 7, \"display_column_id\": 21, \"value_selection_type\": \"single\" }, \"data_table_options\": [\"California\", \"Texas\"], \"value\": null, \"run_step_id\": 504 }\n    ],\n    \"summary\": { \"total\": 3, \"filled\": 1, \"empty\": 2 }\n  }\n\nExample (non-header step with no data collection):\n  Input: { \"run_id\": 101, \"run_step_id\": 504 }\n  Output: { \"run_step\": { \"id\": 504, \"title\": \"Review contract\", \"header_step\": false }, \"fields\": [], \"summary\": { \"total\": 0, \"filled\": 0, \"empty\": 0 } }\n\nUsage guidance: Call this before set_fields to discover what fields exist and what values are valid. When presenting fields to the user:\n  - For list fields, present config.values as tappable choices\n  - For choose_from_data_table fields, present data_table_options as the tappable choices. Single-select: submit the chosen string. Multi-select (config.value_selection_type === \"multi\"): submit an array of chosen strings.\n  - For text, email, date, and other free-input fields, ask conversationally rather than trying to force them into a selection UI\n  - When a section has mixed field types, present the list selections first, then ask for the remaining fields in a single follow-up message\n\nTo update a single field in isolation (rather than a batch), use update_field.\n\nOn error:\n  404 not_found – the run or step does not exist.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"run_step_id":{"type":"integer","description":"Run-step ID (header or non-header)."}},"required":["run_id","run_step_id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_field","description":"Get a single data collection field on a run step.\n\nEndpoint: GET /runs/:run_id/run_steps/:run_step_id/fields/:id\n\nUse this to re-fetch a single field's current state — typically after an update_field call, or to check one field without pulling the full list with get_fields. For discovering which fields exist on a step, use get_fields instead.\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - run_step_id (integer, required): Run-step ID that owns the field.\n  - id (integer, required): Field ID (the field_id value returned by get_fields).\n\nReturns: Object with a single field entry. For \"choose_from_data_table\" fields the entry also includes data_table_options (the array of allowed values — see get_fields for the full shape).\n\nExample:\n  Input: { \"run_id\": 101, \"run_step_id\": 501, \"id\": 202 }\n  Output: {\n    \"field\": { \"field_id\": 202, \"label\": \"Email\", \"value_format\": \"email\", \"required\": true, \"config\": null, \"value\": \"jane@example.com\", \"run_step_id\": 501 }\n  }\n\nOn error:\n  404 not_found – the run, step, or field does not exist.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"run_step_id":{"type":"integer","description":"Run-step ID that owns the field."},"id":{"type":"integer","description":"Field ID (from get_fields)."}},"required":["run_id","run_step_id","id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_my_assignments","description":"List run steps currently assigned to the authenticated user (or another user if admin).\n\nEndpoint: GET /assignments\n\nParameters:\n  - user_id (integer, optional): ID of user whose assignments to retrieve (admins only; defaults to current user).\n  - department_id (integer, optional): Filter by department.\n  - workflow_id (integer, optional): Filter by workflow.\n  - state (string, optional): Filter by state. Enum: \"overdue\", \"upcoming\", \"with_due_date\", \"without_due_date\".\n  - due_after (string, optional): ISO 8601 datetime — only steps due after this time.\n  - due_before (string, optional): ISO 8601 datetime — only steps due before this time.\n  - search (string, optional): Search on step title or run title (case-insensitive partial match).\n  - include_completed (string, optional): Set to \"true\" to include completed steps (excluded by default).\n  - sort (string, optional): Sort by due date. Null due dates are always last. Enum: \"due_asc\", \"due_desc\". Default: \"due_asc\".\n  - page (integer, optional): Page number (default: 1).\n  - per_page (integer, optional): Items per page (default: 25, max: 100).\n\nReturns: Paginated list of assigned run-step objects, sorted by due date (nulls last by default), then run ID and position.\n\nExample:\n  Input: { \"state\": \"overdue\" }\n  Output: { \"assignments\": [{ \"id\": 501, \"title\": \"Review contract\", ... }], \"meta\": { ... } }\n\nOn error:\n  400 bad_request – invalid ISO 8601 date in due_after or due_before.\n  401 unauthorized – re-authenticate.\n\nUsage guidance: This is typically the first tool to call when a user asks about their status, workload, or what needs attention. Pair with list_runs(status: \"late\") for a complete team overview. For a single-call status summary, use get_my_status instead.","input_schema":{"type":"object","properties":{"user_id":{"type":"integer","description":"ID of user whose assignments to retrieve (admins only; defaults to current user)."},"department_id":{"type":"integer","description":"Filter by department ID."},"workflow_id":{"type":"integer","description":"Filter by workflow ID."},"state":{"type":"string","enum":["overdue","upcoming","with_due_date","without_due_date"],"description":"Filter by assignment state."},"due_after":{"type":"string","description":"ISO 8601 datetime — only steps due after this time."},"due_before":{"type":"string","description":"ISO 8601 datetime — only steps due before this time."},"search":{"type":"string","description":"Search on step or run title."},"include_completed":{"type":"string","enum":["true"],"description":"Set to \"true\" to include completed steps."},"sort":{"type":"string","enum":["due_asc","due_desc"],"description":"Sort by due date. Null due dates are always last. Default: due_asc."},"page":{"type":"integer","minimum":1,"description":"Page number."},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Items per page."}},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_department","description":"Get details for a single department by ID, including its members.\n\nEndpoint: GET /departments/:id\n\nParameters:\n  - id (integer, required): Department ID.\n\nReturns: Department object with id, name, and members array. Each member has id, email, name, and role.\n\nExample:\n  Input: { \"id\": 3 }\n  Output: { \"department\": { \"id\": 3, \"name\": \"Engineering\", \"members\": [{ \"id\": 42, \"email\": \"alice@example.com\", \"name\": \"Alice\", \"role\": \"admin\" }] } }\n\nOn error:\n  401 unauthorized – re-authenticate.\n  404 not_found – the department does not exist or is not accessible.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Department ID."}},"required":["id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_users","description":"List users within the master account. Only accessible to admins. Master admins see all users; department admins see only users in their admin departments.\n\nEndpoint: GET /users\n\nParameters:\n  - search (string, optional): Search by name or username (case-insensitive).\n  - department_id (integer, optional): Filter by department ID.\n  - page (integer, optional): Page number (default: 1).\n  - per_page (integer, optional): Items per page (default: 25, max: 100).\n\nReturns: Paginated list of user objects with id, email, name, username, avatar_url, simple_display_name, and memberships.\n\nExample:\n  Input: { \"search\": \"alice\" }\n  Output: { \"users\": [{ \"id\": 42, \"email\": \"alice@example.com\", \"name\": \"Alice\", \"memberships\": [...] }], \"meta\": { ... } }\n\nOn error:\n  401 unauthorized – re-authenticate.\n  403 forbidden – admin access required.","input_schema":{"type":"object","properties":{"search":{"type":"string","description":"Search by name or username."},"department_id":{"type":"integer","description":"Filter by department ID."},"page":{"type":"integer","minimum":1,"description":"Page number."},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Items per page."}},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_user","description":"Get details for a single user by ID. Only accessible to admins with access to that user.\n\nEndpoint: GET /users/:id\n\nParameters:\n  - id (integer, required): User ID.\n\nReturns: User object with id, email, name, username, avatar_url, simple_display_name, and memberships array. Each membership has id, department_id, department_name, and role.\n\nExample:\n  Input: { \"id\": 42 }\n  Output: { \"user\": { \"id\": 42, \"email\": \"alice@example.com\", \"name\": \"Alice\", \"memberships\": [{ \"id\": 1, \"department_id\": 3, \"department_name\": \"Engineering\", \"role\": \"admin\" }] } }\n\nOn error:\n  401 unauthorized – re-authenticate.\n  404 not_found – the user does not exist or is not accessible.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"User ID."}},"required":["id"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_webhooks","description":"List all active webhooks registered for the account.\n\nEndpoint: GET /webhooks\n\nParameters: none.\n\nReturns: Array of webhook objects with id, url, event, active status.\n\nExample:\n  Input: {}\n  Output: [{ \"id\": 7, \"url\": \"https://my.app/hook\", \"event\": \"run.completed\" }]\n\nOn error:\n  401 unauthorized – re-authenticate.\n  403 forbidden – insufficient scope.","input_schema":{"type":"object","properties":{},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_workflow_schema","description":"Fetch the JSON Schema that describes the template object accepted by import_workflow and validate_workflow_import.\n\nEndpoint: GET /schemas/checklist.json\n\nParameters: none.\n\nReturns: A JSON Schema document describing the full structure of a workflow template, including all accepted properties, types, and constraints for the \"checklist\", \"main_steps\", \"conditionals\", and \"checklist_run_links\" keys.\n\nThe result is cached in memory for 24 hours. Use this before constructing or modifying a template for import.","input_schema":{"type":"object","properties":{},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"create_run","description":"Start a new workflow run from a workflow template.\n\nEndpoint: POST /runs\n\nParameters (nested under \"run\"):\n  - checklist_id (integer, required): ID of the workflow template to use.\n  - title (string, optional): Custom title for this run (defaults to workflow title).\n  - late_at (string, optional): ISO 8601 due datetime, e.g. \"2025-12-31T17:00:00Z\".\n  - started_at (string, optional): ISO 8601 start datetime. Defaults to now.\n  - notes (string, optional): Notes for the run.\n  - external_id (string, optional): External system identifier for cross-referencing.\n  - channel (string, optional): Channel identifier (e.g. Slack channel).\n  - origin (string, optional): Origin label (defaults to user agent or \"API V2\").\n  - participants (array, optional): Array of participant objects with { email, user_id }. At least one of email or user_id is required per entry.\n  - roles_to_users (array, optional): Array of role assignment objects with { email, role_id }. Creates limited memberships for unknown emails.\n  - data_choices (array, optional): Array of data choice objects with { data_setting_id, data }.\n  - tag_list (array of strings, optional): Tags to apply to the run.\n  - idempotency_key (string, optional): Client-supplied idempotency key. Auto-generated if omitted.\n\nReturns: The created run object. When `include` is provided, returns an enriched response with additional context.\n\nSupported include values: \"steps\" (all run steps), \"first_steps\" (first incomplete steps), \"progress\" (completion summary).\n\nExample without include:\n  Input: { \"run\": { \"checklist_id\": 42, \"title\": \"Alice's Onboarding\" } }\n  Output: { \"run\": { \"id\": 201, \"title\": \"Alice's Onboarding\", ... } }\n\nExample with include:\n  Input: { \"run\": { \"checklist_id\": 42 }, \"include\": [\"first_steps\", \"progress\"] }\n  Output: { \"run\": { ... }, \"first_steps\": [...], \"progress\": { \"total\": 10, \"completed\": 0, \"skipped\": 0, \"incomplete\": 10, \"percentage\": 0 } }\n\nOn error:\n  400 invalid_include – one or more include values are not recognized.\n  404 not_found – workflow (checklist) not found or not in account.\n  422 validation_error – check errors array for details.","input_schema":{"type":"object","properties":{"run":{"type":"object","description":"Run attributes.","properties":{"checklist_id":{"type":"integer","description":"Workflow template ID."},"title":{"type":"string","description":"Custom run title."},"late_at":{"type":"string","description":"ISO 8601 due datetime."},"started_at":{"type":"string","description":"ISO 8601 start datetime."},"notes":{"type":"string","description":"Run notes."},"external_id":{"type":"string","description":"External system identifier."},"channel":{"type":"string","description":"Channel identifier."},"origin":{"type":"string","description":"Origin label."},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email"},"user_id":{"type":"integer"}}},"description":"Participant objects with email and/or user_id."},"roles_to_users":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role_id":{"type":"integer"}},"required":["email","role_id"]},"description":"Role-to-user mappings."},"data_choices":{"type":"array","items":{"type":"object","properties":{"data_setting_id":{"type":"integer"},"data":{"type":"string"}},"required":["data_setting_id"]},"description":"Pre-filled data choices."},"tag_list":{"type":"array","items":{"type":"string"},"description":"Tags to apply."}},"required":["checklist_id"]},"idempotency_key":{"type":"string","description":"Client-supplied idempotency key."},"include":{"type":"array","items":{"type":"string","enum":["steps","first_steps","progress"]},"description":"Optional enrichments to include in the response: \"steps\" (all run steps), \"first_steps\" (first incomplete steps), \"progress\" (completion summary)."}},"required":["run"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"update_run","description":"Update an existing run's title or participants.\n\nEndpoint: PATCH /runs/:id\n\nOnly \"title\" and \"participants\" may be updated. Any other keys under \"run\" will be rejected with a 422.\n\nParameters:\n  - id (integer, required): Run ID.\n  - run (object, required): Object containing fields to update.\n    - title (string, optional): New title.\n    - participants (array, optional): Array of participant objects with { email, user_id }. Replaces the existing participant list.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: Updated run object.\n\nExample:\n  Input: { \"id\": 201, \"run\": { \"title\": \"Alice's Updated Onboarding\" } }\n  Output: { \"run\": { \"id\": 201, \"title\": \"Alice's Updated Onboarding\", ... } }\n\nOn error:\n  404 not_found – the run does not exist.\n  422 validation_error – unpermitted or invalid parameters.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Run ID."},"run":{"type":"object","description":"Fields to update.","properties":{"title":{"type":"string"},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email"},"user_id":{"type":"integer"}}},"description":"Participant objects with email and/or user_id. Replaces existing list."}}},"idempotency_key":{"type":"string"}},"required":["id","run"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"close_run","description":"Close (delete) a run. Marks the run as closed. This cannot be undone.\n\nEndpoint: DELETE /runs/:id\n\nParameters:\n  - id (integer, required): Run ID to close.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: 204 No Content on success.\n\nExample:\n  Input: { \"id\": 201 }\n  Output: null\n\nOn error:\n  404 not_found – the run does not exist.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Run ID to close."},"idempotency_key":{"type":"string"}},"required":["id"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"complete_run_step","description":"Mark a run step as complete.\n\nEndpoint: POST /runs/:run_id/run_steps/:id\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object. When `include` is provided, returns enriched response with additional context.\n\nExample without include:\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step completed successfully\" }\n\nExample with include:\n  Input: { \"run_id\": 101, \"id\": 501, \"include\": [\"next_steps\", \"progress\"] }\n  Output: { \"run_step\": { ... }, \"next_steps\": [...], \"progress\": { \"total\": 10, \"completed\": 3, ... } }\n\nOn error:\n  400 invalid_include – one or more include values are not recognized.\n  404 not_found – run or step not found.\n  422 validation_error – step cannot be completed in its current state.\n\nImportant: Only non-header steps (header_step=false) can be completed. Header steps are section groupings — skip them when resolving \"the first step\" or \"the next step.\"\n\nUsage guidance: Always include [\"next_steps\", \"progress\"] to show the user what's next and overall run progress. This avoids needing a follow-up get_run call. Optionally add \"run\" if you need the run title or workflow name and don't already have it from conversation context.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID. Must be a non-header step (header_step=false)."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\" (parent run), \"steps\" (all steps), \"next_steps\" (next incomplete steps), \"progress\" (completion summary)."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"uncomplete_run_step","description":"Mark a previously-completed run step as incomplete.\n\nEndpoint: POST /runs/:run_id/run_steps/:id\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - clear_data (boolean, optional): If true, also clears any data collected on the step (resets it). Only valid with this action.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with a success message.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step uncompleted successfully\" }\n\nExample with clear_data:\n  Input: { \"run_id\": 101, \"id\": 501, \"clear_data\": true }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step reset successfully\" }","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"clear_data":{"type":"boolean","description":"If true, clears collected data (reset)."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\", \"steps\", \"next_steps\", \"progress\"."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"skip_run_step","description":"Skip a run step (mark it as not applicable for this run).\n\nEndpoint: POST /runs/:run_id/run_steps/:id\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with a success message.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step skipped successfully\" }\n\nUsage guidance: Always include [\"next_steps\", \"progress\"] to show the user what's next and overall run progress. Optionally add \"run\" if you need the run title or workflow name and don't already have it from conversation context.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\", \"steps\", \"next_steps\", \"progress\"."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"unskip_run_step","description":"Unskip a previously-skipped run step, restoring it to incomplete.\n\nEndpoint: POST /runs/:run_id/run_steps/:id\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with a success message.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step unskipped successfully\" }","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\", \"steps\", \"next_steps\", \"progress\"."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"start_run_step","description":"Start progress on a run step (mark it as in-progress).\n\nEndpoint: POST /runs/:run_id/run_steps/:id\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with a success message.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step started successfully\" }","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\", \"steps\", \"next_steps\", \"progress\"."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"stop_run_step","description":"Stop progress on a run step (revert from in-progress).\n\nEndpoint: POST /runs/:run_id/run_steps/:id\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with a success message.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step stopped successfully\" }","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\", \"steps\", \"next_steps\", \"progress\"."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"update_run_step_due_date","description":"Set or clear the due date on a run step.\n\nEndpoint: PATCH /runs/:run_id/run_steps/:id\n\nThe due date is stored as \"late_at\" internally. Pass an ISO 8601 datetime string to set, or null/empty string to clear.\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - late_at (string or null, required): ISO 8601 datetime, e.g. \"2025-12-31T17:00:00Z\". Pass null or \"\" to clear.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: Updated run-step object with a success message.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501, \"late_at\": \"2025-06-30T17:00:00Z\" }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step due date updated successfully\" }","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"late_at":{"oneOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime for due date, or null to clear."},"idempotency_key":{"type":"string"}},"required":["run_id","id","late_at"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"assign_run_step","description":"Assign a run step to a user by membership ID, or unassign it.\n\nEndpoint: POST /runs/:run_id/run_steps/:id/assign\n\nAssignment is by membership ID (not email). The membership must belong to the same department as the run.\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - assignee_membership_id (integer, optional): Membership ID of the user to assign. Omit (or pass null) to unassign.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with a success message. When `include` is provided, returns enriched response with additional context.\n\nExample (assign):\n  Input: { \"run_id\": 101, \"id\": 501, \"assignee_membership_id\": 77, \"include\": [\"next_steps\", \"progress\"] }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"next_steps\": [...], \"progress\": { ... }, \"message\": \"Run step assigned successfully\" }\n\nExample (unassign):\n  Input: { \"run_id\": 101, \"id\": 501 }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"message\": \"Run step unassigned successfully\" }\n\nOn error:\n  400 invalid_include – one or more include values are not recognized.\n  404 not_found – membership not found or not within the run's department.\n\nUsage guidance: This tool requires a membership_id. If the user provides a name or email, use assign_run_step_by_name or assign_run_step_by_email instead — they resolve the membership automatically and echo back the assignee's name and email.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"assignee_membership_id":{"type":"integer","description":"Membership ID to assign. Omit to unassign."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\" (parent run), \"steps\" (all steps), \"next_steps\" (next incomplete steps), \"progress\" (completion summary)."}},"required":["run_id","id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"add_comment","description":"Add a comment to a run step.\n\nEndpoint: POST /runs/:run_id/run_steps/:run_step_id/comments\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - run_step_id (integer, required): Run-step ID.\n  - comment (string, required): Comment text.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: Created comment object with a success message.\n\nExample:\n  Input: { \"run_id\": 101, \"run_step_id\": 501, \"comment\": \"Reviewed and approved.\" }\n  Output: { \"comment\": { \"id\": 12, \"comment\": \"Reviewed and approved.\", ... }, \"message\": \"Comment created successfully\" }\n\nOn error:\n  404 not_found – run or step not found.\n  422 validation_error – comment cannot be blank.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"run_step_id":{"type":"integer","description":"Run-step ID."},"comment":{"type":"string","description":"Comment text."},"idempotency_key":{"type":"string"}},"required":["run_id","run_step_id","comment"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"create_run_step","description":"Add a new step to an ad-hoc run. Only works on runs created without a workflow template (ad-hoc runs). Requires the ad_hoc_runs feature to be enabled.\n\nEndpoint: POST /runs/:run_id/run_steps\n\nParameters (top-level or nested under \"run_step\"):\n  - run_id (integer, required): Parent run ID (must be an ad-hoc run).\n  - title (string, required): Step title.\n  - header_step (boolean, optional): If true, creates a section header step. Default: false.\n  - after_step_id (integer, optional): Insert the new step after this step ID.\n  - parent_run_step_id (integer, optional): Parent header step ID (for substeps).\n  - position (integer, optional): Explicit position. Used if after_step_id is not provided.\n  - assigned_to_membership_id (integer, optional): Membership ID to assign the step to.\n  - late_at (string, optional): ISO 8601 due datetime.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: Created run-step object.\n\nExample:\n  Input: { \"run_id\": 101, \"run_step\": { \"title\": \"Review document\" } }\n  Output: { \"run_step\": { \"id\": 502, \"title\": \"Review document\", ... } }\n\nOn error:\n  400 bad_request – title is required.\n  403 forbidden – ad-hoc runs feature not enabled or run is not ad-hoc.\n  404 not_found – after_step_id not found.\n  422 validation_error – check errors for details.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID (must be ad-hoc)."},"run_step":{"type":"object","description":"Run step attributes.","properties":{"title":{"type":"string","description":"Step title."},"header_step":{"type":"boolean","description":"Create as section header."},"after_step_id":{"type":"integer","description":"Insert after this step ID."},"parent_run_step_id":{"type":"integer","description":"Parent header step ID."},"position":{"type":"integer","description":"Explicit position."},"assigned_to_membership_id":{"type":"integer","description":"Membership ID to assign."},"late_at":{"type":"string","description":"ISO 8601 due datetime."}},"required":["title"]},"idempotency_key":{"type":"string"}},"required":["run_id","run_step"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"set_fields","description":"Set data collection values on one or more fields within a run step.\n\nEndpoint: POST /runs/:run_id/run_steps/:run_step_id/fields\n\nBehavior depends on step type:\n  - Header step: sets data on fields identified by field_id in the fields array.\n  - Non-header step: sets data on the step's field(s). On accounts with multi data settings enabled, a single non-header step may have multiple fields — pass all of them in the fields array.\n\nSetting data auto-completes each step once all its required fields are filled.\n\nTo update a single field in isolation, use update_field (PUT /runs/.../fields/:id) instead — that is the canonical per-field update path on accounts with multi data settings.\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - run_step_id (integer, required): Run-step ID (header or non-header).\n  - fields (array, required): Array of { field_id, value } objects.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: Object with per-field results, summary, and run progress.\n\nExample (header step — fill multiple fields):\n  Input: {\n    \"run_id\": 101,\n    \"run_step_id\": 501,\n    \"fields\": [\n      { \"field_id\": 10, \"value\": \"Jane Doe\" },\n      { \"field_id\": 11, \"value\": \"Engineer\" }\n    ]\n  }\n  Output: {\n    \"results\": [\n      { \"field_id\": 10, \"label\": \"Name\", \"value\": \"Jane Doe\", \"status\": \"ok\" },\n      { \"field_id\": 11, \"label\": \"Role\", \"value\": \"Engineer\", \"status\": \"ok\" }\n    ],\n    \"summary\": { \"total\": 2, \"filled\": 2, \"empty\": 0 },\n    \"progress\": { \"total\": 7, \"completed\": 4, \"percentage\": 57 }\n  }\n\nExample (non-header step):\n  Input: { \"run_id\": 101, \"run_step_id\": 502, \"fields\": [{ \"field_id\": 10, \"value\": \"Jane Doe\" }] }\n\nUsage guidance: Call get_fields first to discover available fields and valid values.\n  - For list fields, the value must be one of the values from config.values. Multi-select lists (config.value_selection_type === \"multi\") accept an array of values.\n  - For choose_from_data_table fields, single-select (default) takes one of the strings in the field's data_table_options array. Multi-select (config.value_selection_type === \"multi\") takes an array of strings, each of which must appear in data_table_options. Submitting any value not in data_table_options returns a per-field error with status \"error\" and message \"Value is not one of the available data table options\".\n\nNote: setting data on a field automatically completes that step. This is by design — in Manifestly, providing data *is* completing the step. Do not call complete_run_step after set_fields; it would be redundant and error on an already-completed step.\n\nTo clear a field's value and reset the step, use uncomplete_run_step with clear_data: true.\n\nOn error:\n  404 not_found – the run or step does not exist.\n  422 validation_error – invalid field_id or invalid value for the field type.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"run_step_id":{"type":"integer","description":"Run-step ID (header or non-header)."},"fields":{"type":"array","items":{"type":"object","properties":{"field_id":{"type":"integer","description":"Field identifier (from get_fields)."},"value":{"description":"Data value to set. Pass an array of strings for multi-select fields (list or choose_from_data_table with config.value_selection_type === \"multi\"); pass a single string otherwise.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","value"]},"description":"Array of field data entries."},"idempotency_key":{"type":"string"}},"required":["run_id","run_step_id","fields"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"update_field","description":"Set the value of a single data collection field on a run step.\n\nEndpoint: PUT /runs/:run_id/run_steps/:run_step_id/fields/:id\n\nUse this for single-field updates on accounts with multi data settings enabled, where a step may expose several fields and you want to update just one. For batch updates across multiple fields, use set_fields instead.\n\nThe run step auto-completes once all of its required fields are filled — no explicit complete_run_step call is needed.\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - run_step_id (integer, required): Run-step ID that owns the field.\n  - id (integer, required): Field ID (the field_id value returned by get_fields).\n  - value (string or array of strings, required): New value for the field. Pass an array for multi-select fields (config.value_selection_type === \"multi\"); arrays are joined with newlines server-side and stored as the field value.\n    - For list fields, must be one of config.values (or a subset for multi-select lists).\n    - For choose_from_data_table fields, single-select takes one of the strings in data_table_options (returned by get_fields). Multi-select takes an array of strings, each of which must appear in data_table_options. A non-matching value returns 422.\n  - idempotency_key (string, optional): Client-supplied idempotency key. Auto-generated if omitted.\n\nReturns: Object with the updated field, current run_step state, and a message.\n\nExample:\n  Input: { \"run_id\": 101, \"run_step_id\": 501, \"id\": 202, \"value\": \"jane.doe@company.com\" }\n  Output: {\n    \"field\": { \"field_id\": 202, \"label\": \"Email\", \"value_format\": \"email\", \"required\": true, \"config\": null, \"value\": \"jane.doe@company.com\", \"run_step_id\": 501 },\n    \"run_step\": { \"id\": 501, \"title\": \"Employee Info\", \"header_step\": false, \"completed_at\": null },\n    \"message\": \"Field updated successfully\"\n  }\n\nOn error:\n  404 not_found – the run, step, or field does not exist.\n  422 validation_error – invalid value for the field type (including a choose_from_data_table value that is not one of data_table_options).","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"run_step_id":{"type":"integer","description":"Run-step ID that owns the field."},"id":{"type":"integer","description":"Field ID (from get_fields)."},"value":{"description":"New value for the field. Pass an array of strings for multi-select fields (list or choose_from_data_table with config.value_selection_type === \"multi\"); pass a single string otherwise.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"idempotency_key":{"type":"string"}},"required":["run_id","run_step_id","id","value"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"import_workflow","description":"Import a workflow from a JSON template into a department.\n\nEndpoint: POST /workflows/import\n\nParameters:\n  - department_id (integer, required): ID of the department to import the workflow into.\n  - template (object, required): Workflow template object (as exported by the /workflows/:id/template endpoint). Must contain a \"checklist\" key with workflow metadata (title, description, tags, etc.) and optionally \"main_steps\", \"conditionals\", and \"checklist_run_links\".\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nTip: Call get_workflow_schema to fetch the full JSON Schema for the template object.\n\nReturns: The imported workflow summary with id, title, department_id, and links.\n\nExample:\n  Input: { \"department_id\": 5, \"template\": { \"checklist\": { \"title\": \"My Workflow\" }, \"main_steps\": [{ \"title\": \"First step\", \"header_step\": false }] } }\n  Output: { \"workflow\": { \"id\": 99, \"title\": \"My Workflow\", \"department_id\": 5 }, \"_links\": { ... } }\n\nTip: Use validate_workflow_import first to check for errors without creating the workflow.\nTip: Use get_workflow with template=true to export an existing workflow's template as a reference.\n\nOn error:\n  413 content_too_large – template exceeds size limit.\n  422 validation_error – schema or semantic errors in the template.","input_schema":{"type":"object","properties":{"department_id":{"type":"integer","description":"Department ID to import into."},"template":{"type":"object","description":"Workflow template object. Must contain a \"checklist\" key. Call get_workflow_schema for the full schema."},"idempotency_key":{"type":"string"}},"required":["department_id","template"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"validate_workflow_import","description":"Validate a workflow template without importing it. Dry-run.\n\nEndpoint: POST /workflows/import/validate\n\nParameters:\n  - template (object, required): Workflow template object to validate. Must contain a \"checklist\" key. See import_workflow for details, or call get_workflow_schema for the full schema.\n\nReturns: { \"valid\": true } on success, or { \"errors\": [...] } with 422 on failure.\n\nExample:\n  Input: { \"template\": { \"checklist\": { \"title\": \"My Workflow\" }, \"main_steps\": [{ \"title\": \"First step\", \"header_step\": false }] } }\n  Output: { \"valid\": true }\n\nOn error:\n  413 content_too_large – template exceeds size limit.\n  422 validation_error – returns errors array with details.","input_schema":{"type":"object","properties":{"template":{"type":"object","description":"Workflow template object to validate. Must contain a \"checklist\" key. Call get_workflow_schema for the full schema."}},"required":["template"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"create_webhook","description":"Register a new webhook for the account.\n\nEndpoint: POST /webhooks\n\nEach webhook subscribes to a single event and is attached to a hookable resource (workflow, step, run, or run_step).\n\nParameters:\n  - webhook (object, required): Webhook attributes.\n    - url (string, required): URL to receive webhook payloads (http or https).\n    - event (string, required): Event type. One of: \"completed\", \"late\", \"started\", \"step_completed\", \"step_late\", \"step_skipped\", \"tag_changed\".\n    - signature_version (integer, optional): Signature algorithm version. 1 = MD5, 2 = SHA256. Default depends on account settings.\n    - tag_list (array of strings, optional): Tag names to filter on (only valid when event is \"tag_changed\").\n  - hookable (string, required): Type of resource to attach to. One of: \"checklist\", \"step\", \"run\", \"run_step\".\n  - hookable_id (integer, required): ID of the hookable resource.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: Created webhook object.\n\nExample:\n  Input: { \"webhook\": { \"url\": \"https://my.app/hook\", \"event\": \"completed\" }, \"hookable\": \"checklist\", \"hookable_id\": 42 }\n  Output: { \"webhook\": { \"id\": 7, \"url\": \"https://my.app/hook\", \"event\": \"completed\", ... } }\n\nOn error:\n  400 bad_request – invalid hookable type.\n  422 validation_error – URL, event, or signature_version validation failure.","input_schema":{"type":"object","properties":{"webhook":{"type":"object","description":"Webhook attributes.","properties":{"url":{"type":"string","format":"uri","description":"Webhook endpoint URL."},"event":{"type":"string","enum":["completed","late","started","step_completed","step_late","step_skipped","tag_changed"],"description":"Event type to subscribe to."},"signature_version":{"type":"integer","enum":[1,2],"description":"1 = MD5, 2 = SHA256."},"tag_list":{"type":"array","items":{"type":"string"},"description":"Tag names (only for tag_changed event)."}},"required":["url","event"]},"hookable":{"type":"string","enum":["checklist","step","run","run_step"],"description":"Type of resource to attach the webhook to."},"hookable_id":{"type":"integer","description":"ID of the hookable resource."},"idempotency_key":{"type":"string"}},"required":["webhook","hookable","hookable_id"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"update_webhook","description":"Update an existing webhook's URL, event, signature version, or hookable target.\n\nEndpoint: PATCH /webhooks/:id\n\nParameters:\n  - id (integer, required): Webhook ID.\n  - webhook (object, required): Fields to update.\n    - url (string, optional): New webhook URL.\n    - event (string, optional): New event type. One of: \"completed\", \"late\", \"started\", \"step_completed\", \"step_late\", \"step_skipped\", \"tag_changed\".\n    - signature_version (integer, optional): 1 = MD5, 2 = SHA256.\n    - tag_list (array of strings, optional): Tag names (only for tag_changed event).\n  - hookable (string, required): Type of resource. One of: \"checklist\", \"step\", \"run\", \"run_step\".\n  - hookable_id (integer, required): ID of the hookable resource.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: Updated webhook object.\n\nExample:\n  Input: { \"id\": 7, \"webhook\": { \"url\": \"https://new.app/hook\" }, \"hookable\": \"checklist\", \"hookable_id\": 42 }\n  Output: { \"webhook\": { \"id\": 7, \"url\": \"https://new.app/hook\", ... } }\n\nOn error:\n  400 bad_request – invalid hookable type.\n  422 validation_error – check errors for details.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Webhook ID."},"webhook":{"type":"object","description":"Fields to update.","properties":{"url":{"type":"string","format":"uri"},"event":{"type":"string","enum":["completed","late","started","step_completed","step_late","step_skipped","tag_changed"]},"signature_version":{"type":"integer","enum":[1,2]},"tag_list":{"type":"array","items":{"type":"string"}}}},"hookable":{"type":"string","enum":["checklist","step","run","run_step"]},"hookable_id":{"type":"integer"},"idempotency_key":{"type":"string"}},"required":["id","webhook","hookable","hookable_id"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"delete_webhook","description":"Deactivate (soft-delete) a webhook registration.\n\nEndpoint: DELETE /webhooks/:id\n\nThe webhook is deactivated, not permanently deleted. It will no longer fire.\n\nParameters:\n  - id (integer, required): Webhook ID to deactivate.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: { \"id\": <webhook_id> } with 200 OK on success.\n\nExample:\n  Input: { \"id\": 7 }\n  Output: { \"id\": \"7\" }\n\nOn error:\n  404 not_found – webhook does not exist or is not accessible.","input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Webhook ID to deactivate."},"idempotency_key":{"type":"string"}},"required":["id"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"unsubscribe_webhooks_by_url","description":"Deactivate all webhooks matching a target URL.\n\nEndpoint: DELETE /webhooks/unsubscribe\n\nParameters:\n  - target_url (string, required): The webhook URL to unsubscribe. All active webhooks with this URL will be deactivated.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n\nReturns: { \"url\": \"<target_url>\", \"unsubscribed\": true } with 200 OK.\n\nExample:\n  Input: { \"target_url\": \"https://my.app/hook\" }\n  Output: { \"url\": \"https://my.app/hook\", \"unsubscribed\": true }\n\nOn error:\n  400 bad_request – target_url is blank.\n  404 not_found – no webhooks found with that URL.","input_schema":{"type":"object","properties":{"target_url":{"type":"string","format":"uri","description":"Webhook URL to unsubscribe."},"idempotency_key":{"type":"string"}},"required":["target_url"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"get_my_status","description":"Get a complete status overview for the current user: overdue assignments, late runs, and in-progress runs. This is the recommended first tool to call when a user asks about their workload, what needs attention, or what's happening with their team.\n\nParameters: none.\n\nReturns: Object with three arrays:\n  - overdue_assignments: Steps assigned to you that are past due\n  - late_runs: All runs that have missed their due date\n  - in_progress_runs: All currently active runs\n\nExample:\n  Input: {}\n  Output: { \"overdue_assignments\": [...], \"late_runs\": [...], \"in_progress_runs\": [...] }","input_schema":{"type":"object","properties":{},"required":[]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"assign_run_step_by_email","description":"Assign a run step to a user by their email address. Resolves the user's membership in the run's department automatically.\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - email (string, required): Email address of the user to assign.\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with assigned_to (name and email of the assignee) and a success message. When `include` is provided, returns enriched response with additional context.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501, \"email\": \"riley.kim@example.com\", \"include\": [\"next_steps\", \"progress\"] }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"assigned_to\": { \"name\": \"Riley Kim\", \"email\": \"riley.kim@example.com\" }, \"next_steps\": [...], \"progress\": { ... } }\n\nOn error:\n  400 invalid_include – one or more include values are not recognized.\n  404 not_found – user not found or not a member of the run's department.\n\nUsage guidance: Always include [\"next_steps\", \"progress\"] to show what's next and overall run progress after assignment. Optionally add \"run\" if you need the run title or workflow name and don't already have it from conversation context.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"email":{"type":"string","format":"email","description":"Email address of the user to assign."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\" (parent run), \"steps\" (all steps), \"next_steps\" (next incomplete steps), \"progress\" (completion summary)."}},"required":["run_id","id","email"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"assign_run_step_by_name","description":"Assign a run step to a user by searching for their name. Resolves the user's membership in the run's department automatically.\n\nUse this when the user refers to someone by name (e.g. \"Assign to Sam Chen\"). If you already know the user's email, prefer assign_run_step_by_email instead.\n\nParameters:\n  - run_id (integer, required): Parent run ID.\n  - id (integer, required): Run-step ID.\n  - name (string, required): Person's name to search for (case-insensitive partial match).\n  - idempotency_key (string, optional): Client-supplied idempotency key.\n  - include (array, optional): Enrichments to include. Valid: \"run\", \"steps\", \"next_steps\", \"progress\".\n\nReturns: Updated run-step object with assigned_to (name and email of the assignee) and a success message. When `include` is provided, returns enriched response with additional context.\n\nBehavior:\n  - Searches for users matching the name.\n  - If exactly one match is found, proceeds with assignment.\n  - If multiple matches: returns an error with code \"ambiguous_user\" and the matches; ask the user to clarify.\n  - If no matches: returns a not_found error.\n\nExample:\n  Input: { \"run_id\": 101, \"id\": 501, \"name\": \"Riley Kim\", \"include\": [\"next_steps\", \"progress\"] }\n  Output: { \"run_step\": { \"id\": 501, ... }, \"assigned_to\": { \"name\": \"Riley Kim\", \"email\": \"riley.kim@example.com\" }, \"next_steps\": [...], \"progress\": { ... } }\n\nOn error:\n  400 invalid_include – one or more include values are not recognized.\n  404 not_found – no user found matching the name, or user is not a member of the run's department.\n  422 ambiguous_user – multiple users matched; response includes the matches.\n\nUsage guidance: Always include [\"next_steps\", \"progress\"] to show what's next and overall run progress after assignment. Optionally add \"run\" if you need the run title or workflow name and don't already have it from conversation context.","input_schema":{"type":"object","properties":{"run_id":{"type":"integer","description":"Parent run ID."},"id":{"type":"integer","description":"Run-step ID."},"name":{"type":"string","description":"Person's name to search for."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["run","steps","next_steps","progress"]},"description":"Optional enrichments: \"run\" (parent run), \"steps\" (all steps), \"next_steps\" (next incomplete steps), \"progress\" (completion summary)."}},"required":["run_id","id","name"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"start_run_by_workflow_name","description":"Find a workflow by name and start a new run from it. Combines a workflow search with a run creation in one step.\n\nParameters:\n  - workflow_name (string, required): Partial or full name of the workflow to search for. Case-insensitive.\n  - title (string, optional): Custom title for the run. Defaults to the workflow title.\n  - participants (array of strings, optional): Email addresses to add as run participants.\n  - due_at (string, optional): ISO 8601 due datetime for the run, e.g. \"2025-12-31T17:00:00Z\".\n  - idempotency_key (string, optional): Passed through to the create_run call.\n  - include (array, optional): Enrichments to include. Valid: \"steps\", \"first_steps\", \"progress\".\n\nReturns: The created run object, with a \"workflow\" property containing the matched workflow. When `include` is provided, returns enriched response with additional context.\n\nBehavior:\n  - Searches for workflows matching the name. If exactly one match is found, proceeds.\n  - If zero matches: returns an error with code \"not_found\" and lists available workflow names.\n  - If multiple matches: returns an error with code \"ambiguous_workflow\" and lists the matching names; ask the user to be more specific.\n\nExample without include:\n  Input: { \"workflow_name\": \"Onboarding\", \"participants\": [\"alice@example.com\"], \"due_at\": \"2025-04-14T17:00:00Z\" }\n  Output: { \"id\": 201, \"title\": \"Employee Onboarding\", \"workflow\": { \"id\": 42, ... }, ... }\n\nExample with include:\n  Input: { \"workflow_name\": \"Onboarding\", \"include\": [\"first_steps\", \"progress\"] }\n  Output: { \"run\": { \"id\": 201, ... }, \"workflow\": { \"id\": 42, ... }, \"first_steps\": [...], \"progress\": { ... } }\n\nUsage guidance:\n- Always include [\"first_steps\", \"progress\"] so the user immediately sees what steps are coming and the overall scope of the run.\n- The first_steps and next_steps arrays may include header steps (header_step=true) which are section groupings, not actionable items. When identifying \"the first step\" or \"the next step,\" skip headers and use the first entry with header_step=false.\n- Best practice: use the `title` parameter to distinguish this run instance — e.g. just \"Dana Park\" for an onboarding run, or \"April 24, 2026\" for a daily opening. The workflow name already provides context, so the title only needs the unique element. If the user doesn't provide context, ask briefly (e.g. \"Who is this onboarding for?\") before starting.","input_schema":{"type":"object","properties":{"workflow_name":{"type":"string","description":"Name (or partial name) of the workflow to start."},"title":{"type":"string"},"participants":{"type":"array","items":{"type":"string","format":"email"}},"due_at":{"type":"string","description":"ISO 8601 due datetime, e.g. \"2025-12-31T17:00:00Z\"."},"idempotency_key":{"type":"string"},"include":{"type":"array","items":{"type":"string","enum":["steps","first_steps","progress"]},"description":"Optional enrichments: \"steps\" (all run steps), \"first_steps\" (first incomplete steps), \"progress\" (completion summary)."}},"required":["workflow_name"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}]}