save_scenario
What it answers
Create or change a saved scenario, as the Model Calculator does. Without scenarioId it creates one (name and range required; payrollGridId/expenseGridId choose grids when several exist). With scenarioId and baseRevision from get_scenario it changes only the fields you give; a stale baseRevision is refused and nothing is overwritten, so read the scenario again. rows are Include/exclude choices by rowKey from get_scenario with includeRows, and replace the stored choices. The Base case cannot be saved, and this tool does not delete or restore scenarios. The scenario belongs to the person who owns this connection: only its creator or an administrator can change it. Requires the connection to allow changes, Agents may change data on the account for the owner, and Model Calculator access (or administrator). Recorded in the change log as made by the agent, with the optional reason. Read parakeeto://methodology for shared response conventions and INVALID_ARGUMENT guidance.
Changes data. Listed only on a connection that is allowed to change data, and runs only when the connection owner may change data on the account.
Arguments
| Argument | Type | Required | Default | Allowed values |
|---|---|---|---|---|
account |
string (uuid) | no | — | — |
includeDefinitions |
boolean | no | true |
— |
scenarioId |
string | no | — | minLength: 1; maxLength: 64 |
baseRevision |
string | no | — | pattern ^[1-9]\d*$ |
name |
string | no | — | minLength: 1; maxLength: 200 |
range |
object | no | — | — |
range.from |
string | yes | — | pattern ^\d{4}-\d{2}-\d{2}$ |
range.to |
string | yes | — | pattern ^\d{4}-\d{2}-\d{2}$ |
includePending |
boolean | no | — | — |
rows |
array of object | no | — | maxItems: 2000 |
rows[].rowKey |
object | yes | — | — |
rows[].rowKey.name |
string | yes | — | maxLength: 500 |
rows[].rowKey.startDate |
string or null | yes | — | maxLength: 10 |
rows[].rowKey.occurrence |
string | yes | — | pattern ^\d{1,6}$ |
rows[].rowKey.siblings |
string | yes | — | pattern ^[1-9]\d{0,5}$ |
rows[].rowKey.hint |
string or null | yes | — | maxLength: 100 |
rows[].included |
boolean | yes | — | — |
overrides |
object | no | — | — |
overrides.grossCapacity |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.modelAbr |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.modelUtilization |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.deliveryPayrollBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.deliveryExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.smPayrollBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.smExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.adminPayrollBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.adminExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
overrides.facilitiesExpenseBudget |
string | no | — | pattern ^-?\d+(?:\.\d+)?$ |
payrollGridId |
string (uuid) | no | — | — |
expenseGridId |
string (uuid) | no | — | — |
reason |
string | no | — | maxLength: 500 |
Returned fields
The result is an envelope: ok: true with data, or ok: false with error. Error codes: MODEL_CALCULATOR_ACCESS_REQUIRED, PAYROLL_GRID_MISSING, PAYROLL_GRID_REQUIRED, PROJECT_GRID_REQUIRED, EXPENSE_GRID_REQUIRED, PAYROLL_ENTRY_REFERENCE_STALE, ACCOUNT_NOT_FOUND, ACCOUNT_CONFIGURATION_MISSING, NO_IMPORTED_TIME, NOTHING_IMPORTED, ACCOUNT_REQUIRED, NO_REACHABLE_ACCOUNTS, FEATURE_NOT_ENTITLED, PERMISSION_DENIED, CALCULATION_FAILED, INTERNAL_ERROR, INVALID_ARGUMENT.
data: objectdata.account: string (uuid)data.created: booleandata.scenario: objectdata.scenario.id: stringdata.scenario.name: stringdata.scenario.readOnly: booleandata.scenario.revision: string or null (pattern^[1-9]\d*$)data.scenario.window: object or nulldata.scenario.window.from: string (pattern^\d{4}-\d{2}-\d{2}$)data.scenario.window.to: string (pattern^\d{4}-\d{2}-\d{2}$)
data.scenario.includePending: boolean or nulldata.scenario.createdByName: string or nulldata.scenario.updatedAt: string (date-time) or nulldata.scenario.canManage: boolean
data.definitions: map of string to string, optionaldata.definitions.*: string
data.caveats: array of objectdata.caveats[].code: stringdata.caveats[].message: stringdata.caveats[].reference: string, optional
On failure:
error: objecterror.code: string ("MODEL_CALCULATOR_ACCESS_REQUIRED","PAYROLL_GRID_MISSING","PAYROLL_GRID_REQUIRED","PROJECT_GRID_REQUIRED","EXPENSE_GRID_REQUIRED","PAYROLL_ENTRY_REFERENCE_STALE","ACCOUNT_NOT_FOUND","ACCOUNT_CONFIGURATION_MISSING","NO_IMPORTED_TIME","NOTHING_IMPORTED","ACCOUNT_REQUIRED","NO_REACHABLE_ACCOUNTS","FEATURE_NOT_ENTITLED","PERMISSION_DENIED","CALCULATION_FAILED","INTERNAL_ERROR","INVALID_ARGUMENT")error.argument: string, optional (minLength: 1)error.message: stringerror.accounts: array of object, optionalerror.accounts[].id: string (uuid)error.accounts[].name: string
error.payrollGrids: array of object, optionalerror.payrollGrids[]: same shape aserror.accounts[]
error.projectGrids: array of object, optionalerror.projectGrids[]: same shape aserror.accounts[]
error.expenseGrids: array of object, optionalerror.expenseGrids[]: same shape aserror.accounts[]
error.context: object, optionalerror.context.account: object- Further fields: see the response.
error.context.imports: array of object- Further fields: see the response.
error.context.hasTimeEntries: booleanerror.context.reports: array of object- Further fields: see the response.
Definitions
Returned in definitions when includeDefinitions is true (the default). It is a map of string to string: each key names a field and each value is its definition text.
Caveats
Always empty for this tool.
Read every caveat before interpreting a figure. See methodology on how to communicate caveats and data-quality conditions.
Example call
{
"name": "save_scenario",
"arguments": {
"name": "Hire two designers",
"range": {
"from": "2026-01-01",
"to": "2026-12-31"
}
}
}
Add account with an identifier from list_accounts; omit it only when the connection reaches exactly one account.
Questions and answers
What does save_scenario answer?
Create or change a saved scenario, as the Model Calculator does. Without scenarioId it creates one (name and range required; payrollGridId/expenseGridId choose grids when several exist). With scenarioId and baseRevision from get_scenario it changes only the fields you give; a stale baseRevision is refused and nothing is overwritten, so read the scenario again. rows are Include/exclude choices by rowKey from get_scenario with includeRows, and replace the stored choices. The Base case cannot be saved, and this tool does not delete or restore scenarios. The scenario belongs to the person who owns this connection: only its creator or an administrator can change it. Requires the connection to allow changes, Agents may change data on the account for the owner, and Model Calculator access (or administrator). Recorded in the change log as made by the agent, with the optional reason. Read parakeeto://methodology for shared response conventions and INVALID_ARGUMENT guidance.
Which arguments does save_scenario accept?
Argument Type Required Default Allowed values account string (uuid) no — — includeDefinitions boolean no true — scenarioId string no — minLength: 1; maxLength: 64 baseRevision string no — pattern ^[1-9]\d*$ name string no — minLength: 1; maxLength: 200 range object no — — range.from string yes — pattern ^\d{4}-\d{2}-\d{2}$ range.to string yes — pattern ^\d{4}-\d{2}-\d{2}$ includePending boolean no — — rows array of object no — maxItems: 2000 rows[].rowKey object yes — — rows[].rowKey.name string yes — maxLength: 500 rows[].rowKey.startDate string or null yes — maxLength: 10 rows[].rowKey.occurrence string yes — pattern ^\d{1,6}$ rows[].rowKey.siblings string yes — pattern ^[1-9]\d{0,5}$ rows[].rowKey.hint string or null yes — maxLength: 100 rows[].included boolean yes — — overrides object no — — overrides.grossCapacity string no — pattern ^-?\d+(?:\.\d+)?$ overrides.modelAbr string no — pattern ^-?\d+(?:\.\d+)?$ overrides.modelUtilization string no — pattern ^-?\d+(?:\.\d+)?$ overrides.deliveryPayrollBudget string no — pattern ^-?\d+(?:\.\d+)?$ overrides.deliveryExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$ overrides.smPayrollBudget string no — pattern ^-?\d+(?:\.\d+)?$ overrides.smExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$ overrides.adminPayrollBudget string no — pattern ^-?\d+(?:\.\d+)?$ overrides.adminExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$ overrides.facilitiesExpenseBudget string no — pattern ^-?\d+(?:\.\d+)?$ payrollGridId string (uuid) no — — expenseGridId string (uuid) no — — reason string no — maxLength: 500
What does save_scenario return?
The result is an envelope: ok: true with data, or ok: false with error.