{
  "schemaVersion": 1,
  "generatedFrom": [
    "src/agent/bridge/mcpTools.ts",
    "src/agent/commands/registry.ts"
  ],
  "app": {
    "id": "pro.tasktime",
    "name": "TaskTime Pro",
    "category": "task-time-invoicing",
    "localFirst": true,
    "coreUseAccountRequired": false,
    "coreUseFree": true,
    "offlineCapable": true,
    "openSource": true,
    "workDataStorage": "browser-local",
    "aggregateUsageMetrics": true
  },
  "clawHub": {
    "owner": "tasktimepro",
    "slug": "tasktime-agent",
    "canonicalRef": "@tasktimepro/tasktime-agent",
    "sourceRepository": "https://github.com/tasktimepro/tasktime",
    "sourcePath": "integrations/openclaw/tasktime/skills/tasktime"
  },
  "bridge": {
    "binary": "tasktime-agent-bridge",
    "transport": "mcp-stdio-json-rpc",
    "appSessionRequired": true,
    "defaultScopes": [
      "read",
      "write",
      "navigation"
    ],
    "optionalScopes": [
      "billing",
      "export",
      "email"
    ]
  },
  "toolCount": 147,
  "scopes": [
    {
      "scope": "billing",
      "toolCount": 5
    },
    {
      "scope": "email",
      "toolCount": 3
    },
    {
      "scope": "export",
      "toolCount": 17
    },
    {
      "scope": "navigation",
      "toolCount": 9
    },
    {
      "scope": "read",
      "toolCount": 62
    },
    {
      "scope": "write",
      "toolCount": 91
    }
  ],
  "groups": [
    {
      "id": "projects-tasks",
      "title": "Projects and Tasks",
      "description": "Create, update, archive, delete, and inspect projects, clients, tasks, and task relationships.",
      "toolCount": 27
    },
    {
      "id": "timers-time",
      "title": "Timers and Time Entries",
      "description": "Start, pause, resume, stop, clear, and edit timer and time-entry records.",
      "toolCount": 10
    },
    {
      "id": "planner-notes",
      "title": "Planner and Notes",
      "description": "Manage planner attachments, daily goals, and project notes.",
      "toolCount": 9
    },
    {
      "id": "expenses-tax",
      "title": "Expenses and Tax",
      "description": "Manage expenses, recurring expenses, tax return periods, and tax-claim status.",
      "toolCount": 24
    },
    {
      "id": "invoices-quotes",
      "title": "Invoices and Quotes",
      "description": "Preview, draft, finalize, cancel, email, export, and update invoices and project quotes.",
      "toolCount": 23
    },
    {
      "id": "settings",
      "title": "Settings and Templates",
      "description": "Manage preferences, business profiles, payment methods, brand assets, and templates.",
      "toolCount": 23
    },
    {
      "id": "reports-exports-backups",
      "title": "Reports, Exports, and Backups",
      "description": "Read reports, export files through the browser app, and manage local or cloud backups.",
      "toolCount": 15
    },
    {
      "id": "sync-account",
      "title": "Sync and Account",
      "description": "Inspect sync status, update explicit sync settings, and handle account-level data operations.",
      "toolCount": 3
    },
    {
      "id": "navigation",
      "title": "Navigation",
      "description": "Open TaskTime Pro screens in the paired browser session for human review.",
      "toolCount": 9
    },
    {
      "id": "queries",
      "title": "Queries and Summaries",
      "description": "Read dashboard, project, client, unbilled-work, and recent-entry summaries.",
      "toolCount": 4
    }
  ],
  "tools": [
    {
      "name": "list_projects",
      "description": "List active TaskTime Pro projects visible to the paired app session.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "create_project",
      "description": "Create a non-archived TaskTime Pro project, optionally linked to an existing preferred client.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "hourlyRate": {
            "type": [
              "number",
              "null"
            ]
          },
          "flatRate": {
            "type": "boolean"
          },
          "preferredClientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "isPersonal": {
            "type": "boolean"
          },
          "color": {
            "type": [
              "string",
              "null"
            ]
          },
          "billableTimeIncrementMinutes": {
            "type": [
              "number",
              "null"
            ]
          },
          "taskView": {
            "type": "string",
            "enum": [
              "list",
              "kanban"
            ]
          },
          "taskSort": {
            "type": "string",
            "enum": [
              "createdAt",
              "lastActive",
              "name",
              "manual"
            ]
          },
          "statusMode": {
            "type": "string",
            "enum": [
              "active",
              "quote"
            ]
          },
          "deadline": {
            "type": [
              "string",
              "null"
            ]
          },
          "budgetAmount": {
            "type": [
              "number",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_project",
      "description": "Update non-destructive project fields such as title, rates, client link, color, deadline, budget, and task view preferences.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "projectId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "archive_project",
      "description": "Archive an existing project without deleting related data.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unarchive_project",
      "description": "Restore an archived project without changing related data.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "preview_delete_project",
      "description": "Preview the UI-style cascade impact of deleting a project without mutating data.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "includeInvoiceDeletion": {
            "type": "boolean"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cascade_delete_project",
      "description": "Delete a project and related non-billed tasks, active time entries, timers, expenses, recurring templates, and planner attachments after preview matching, explicit confirmation, and TaskTime Pro approval. Invoice-linked, billed, or tax-claimed records are rejected.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          },
          "expectedTaskIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedTimeEntryIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedTimerKeys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedExpenseIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedRecurrenceIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedPlannerAttachmentIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "projectId",
          "confirmDelete",
          "confirmationText",
          "expectedTaskIds",
          "expectedTimeEntryIds"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_project",
      "description": "Delete one unreferenced project after explicit command confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "projectId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_clients",
      "description": "List TaskTime Pro clients visible to the paired app session.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeArchived": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "create_client",
      "description": "Create a non-archived TaskTime Pro client. Free includes one active client; trial and Pro include unlimited active clients.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "clientName": {
            "type": "string"
          },
          "contactPerson": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "address": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "zip": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "registrationNumber": {
            "type": "string"
          },
          "vat": {
            "type": "string"
          },
          "taxNumber": {
            "type": "string"
          },
          "notes": {
            "type": "string"
          },
          "disableTax": {
            "type": "boolean"
          },
          "defaultHourlyRate": {
            "type": [
              "number",
              "null"
            ]
          },
          "hourlyRate": {
            "type": [
              "number",
              "null"
            ]
          },
          "flatRate": {
            "type": "boolean"
          },
          "defaultCurrency": {
            "type": "string"
          },
          "color": {
            "type": [
              "string",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_client",
      "description": "Update client fields. Editing is always available; changing archived to false applies the active-client policy.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "clientId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "archive_client",
      "description": "Archive an existing client without deleting related data.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          }
        },
        "required": [
          "clientId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unarchive_client",
      "description": "Restore an archived client without changing related data. Free includes one active client; trial and Pro include unlimited active clients.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          }
        },
        "required": [
          "clientId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "preview_delete_client",
      "description": "Preview the UI-style cascade impact of deleting a client without mutating data.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          },
          "alsoDeleteProjects": {
            "type": "boolean"
          },
          "includeInvoiceDeletion": {
            "type": "boolean"
          }
        },
        "required": [
          "clientId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cascade_delete_client",
      "description": "Delete a client and either convert linked projects to personal or delete related non-billed project data after preview matching, explicit confirmation, and TaskTime Pro approval. Invoice-linked, billed, or tax-claimed records are rejected.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          },
          "alsoDeleteProjects": {
            "type": "boolean"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          },
          "expectedProjectIdsToDelete": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedProjectIdsToConvertToPersonal": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedTaskIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedTimeEntryIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedTimerKeys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedExpenseIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedRecurrenceIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedPlannerAttachmentIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "clientId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_client",
      "description": "Delete one unreferenced client after explicit command confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "clientId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_business_infos",
      "description": "List business profiles used for invoices, expenses, and tax/reporting context.",
      "scopes": [
        "read"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "create_business_info",
      "description": "Create a business profile for invoice sender/tax details. Requires title/name and businessName/name.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "businessName": {
            "type": "string"
          },
          "email": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "address": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "zip": {
            "type": "string"
          },
          "country": {
            "type": "string"
          },
          "registrationNumber": {
            "type": "string"
          },
          "vat": {
            "type": "string"
          },
          "taxNumber": {
            "type": "string"
          },
          "taxId": {
            "type": "string"
          },
          "isDefault": {
            "type": "boolean"
          },
          "taxEnabled": {
            "type": "boolean"
          },
          "taxLabel": {
            "type": "string"
          },
          "taxRate": {
            "type": "number"
          },
          "branding": {
            "type": "object"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "update_business_info",
      "description": "Update a business profile without deleting invoices, expenses, or brand assets.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessInfoId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "businessInfoId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "set_default_business_info",
      "description": "Set the default business profile and clear default status from the others.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessInfoId": {
            "type": "string"
          }
        },
        "required": [
          "businessInfoId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_business_info",
      "description": "Delete one unreferenced business profile after explicit command confirmation and TaskTime Pro approval. Profiles referenced by invoices, brand assets, expenses, recurring templates, or tax return periods are rejected.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessInfoId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "businessInfoId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_business_brand_assets",
      "description": "List business logo brand assets, optionally scoped to a business profile and including archived assets or data URLs.",
      "scopes": [
        "read"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessInfoId": {
            "type": "string"
          },
          "includeArchived": {
            "type": "boolean"
          },
          "includeDataUrl": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "create_business_brand_asset",
      "description": "Create a validated business logo brand asset for an existing business profile, reusing an existing matching content hash when present.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "businessInfoId": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "logo"
            ]
          },
          "dataUrl": {
            "type": "string"
          },
          "mimeType": {
            "type": "string",
            "enum": [
              "image/svg+xml",
              "image/png",
              "image/jpeg",
              "image/webp"
            ]
          },
          "fileName": {
            "type": [
              "string",
              "null"
            ]
          },
          "width": {
            "type": "number"
          },
          "height": {
            "type": "number"
          },
          "byteSize": {
            "type": "number"
          },
          "contentHash": {
            "type": "string"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "businessInfoId",
          "dataUrl",
          "mimeType",
          "width",
          "height",
          "byteSize",
          "contentHash"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_business_brand_asset",
      "description": "Update a business logo brand asset without deleting invoices or business profile references.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessBrandAssetId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "businessBrandAssetId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "archive_business_brand_asset",
      "description": "Archive a business logo brand asset without deleting invoices or business profile references.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessBrandAssetId": {
            "type": "string"
          }
        },
        "required": [
          "businessBrandAssetId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unarchive_business_brand_asset",
      "description": "Restore an archived business logo brand asset without changing invoices or business profile references.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessBrandAssetId": {
            "type": "string"
          }
        },
        "required": [
          "businessBrandAssetId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_business_brand_asset",
      "description": "Delete one unreferenced business logo brand asset after explicit command confirmation and TaskTime Pro approval. Assets referenced by business profiles or invoice snapshots are rejected.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "businessBrandAssetId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "businessBrandAssetId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_payment_methods",
      "description": "List payment methods used on invoices and expenses.",
      "scopes": [
        "read"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "create_payment_method",
      "description": "Create a payment method. The first method becomes default unless specified otherwise.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "fullName": {
            "type": "string"
          },
          "bank": {
            "type": "string"
          },
          "iban": {
            "type": "string"
          },
          "swift": {
            "type": "string"
          },
          "bankAddress": {
            "type": "string"
          },
          "paypal": {
            "type": "string"
          },
          "instructions": {
            "type": "string"
          },
          "custom": {
            "type": "array"
          },
          "isDefault": {
            "type": "boolean"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_payment_method",
      "description": "Update a payment method without deleting invoices or expenses that reference older snapshots.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "paymentMethodId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "paymentMethodId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "set_default_payment_method",
      "description": "Set the default payment method and clear default status from the others.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "paymentMethodId": {
            "type": "string"
          }
        },
        "required": [
          "paymentMethodId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_payment_method",
      "description": "Delete one unreferenced payment method after explicit command confirmation and TaskTime Pro approval. Payment methods referenced by invoices are rejected.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "paymentMethodId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "paymentMethodId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_invoice_templates",
      "description": "List invoice templates, including sequence and branding defaults.",
      "scopes": [
        "read"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "create_invoice_template",
      "description": "Create an invoice template with sequence, tax, notes, and branding defaults.",
      "scopes": [
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "prefix": {
            "type": "string"
          },
          "useSequentialNumbers": {
            "type": "boolean"
          },
          "currentSequentialNumber": {
            "type": "number"
          },
          "defaultNotes": {
            "type": "string"
          },
          "defaultTaxRate": {
            "type": "number"
          },
          "defaultDueDays": {
            "type": "number"
          },
          "isDefault": {
            "type": "boolean"
          },
          "brandingOptions": {
            "type": "object"
          },
          "layoutStyle": {
            "type": "string",
            "enum": [
              "classic",
              "neutral"
            ]
          },
          "logoPlacement": {
            "type": "string"
          },
          "showBillingPeriod": {
            "type": "boolean"
          },
          "showProjectTitle": {
            "type": "boolean"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_invoice_template",
      "description": "Update an invoice template. Sequence changes are allowed but should be deliberate.",
      "scopes": [
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceTemplateId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "invoiceTemplateId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "set_default_invoice_template",
      "description": "Set the default invoice template and clear default status from the others.",
      "scopes": [
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceTemplateId": {
            "type": "string"
          }
        },
        "required": [
          "invoiceTemplateId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_invoice_template",
      "description": "Delete one unreferenced invoice template after explicit command confirmation and TaskTime Pro approval. Templates referenced by invoices are rejected.",
      "scopes": [
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceTemplateId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "invoiceTemplateId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_email_templates",
      "description": "List invoice/quote email templates, optionally filtered by template type.",
      "scopes": [
        "read"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "invoice",
              "quote",
              null
            ]
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "create_email_template",
      "description": "Create an invoice or quote email template with subject, body, reminder body, and attachment filename defaults.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "invoice",
              "quote"
            ]
          },
          "fromName": {
            "type": "string"
          },
          "replyTo": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "sendBody": {
            "type": "string"
          },
          "reminderBody": {
            "type": "string"
          },
          "attachmentTitle": {
            "type": "string"
          },
          "isDefault": {
            "type": "boolean"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "type",
          "subject",
          "sendBody",
          "reminderBody",
          "attachmentTitle"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_email_template",
      "description": "Update an invoice or quote email template.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "emailTemplateId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "emailTemplateId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "set_default_email_template",
      "description": "Set the default email template for its type and clear default status from other templates of the same type.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "emailTemplateId": {
            "type": "string"
          }
        },
        "required": [
          "emailTemplateId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_email_template",
      "description": "Delete one invoice or quote email template after explicit command confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "emailTemplateId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "emailTemplateId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_expense_categories",
      "description": "List active expense categories used by expense and recurring expense workflows. Set includeArchived to true to include archived categories.",
      "scopes": [
        "read"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "includeArchived": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "create_expense_category",
      "description": "Create a non-archived expense category through the validated settings collection.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "group": {
            "type": [
              "string",
              "null"
            ]
          },
          "color": {
            "type": [
              "string",
              "null"
            ]
          },
          "isDefault": {
            "type": "boolean"
          },
          "archived": {
            "type": "boolean"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_expense_category",
      "description": "Update expense category metadata such as name, group, color, default flag, and archive state.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseCategoryId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "expenseCategoryId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "archive_expense_category",
      "description": "Archive an expense category without deleting expenses or recurring templates that reference it.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseCategoryId": {
            "type": "string"
          }
        },
        "required": [
          "expenseCategoryId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unarchive_expense_category",
      "description": "Restore an archived expense category without changing related expenses or recurring templates.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseCategoryId": {
            "type": "string"
          }
        },
        "required": [
          "expenseCategoryId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_expense_category",
      "description": "Delete one unreferenced expense category after explicit command confirmation and TaskTime Pro approval. Categories referenced by expenses or recurring templates are rejected.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseCategoryId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "expenseCategoryId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_preferences",
      "description": "Return validated TaskTime Pro user preferences. Sync/backup control state is readable but not mutable through update_preferences.",
      "scopes": [
        "read"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "update_preferences",
      "description": "Update non-sync user preferences such as currency, theme, date/time format, default view, week start, task visibility, default billable behavior, sorting, weekly goals, and notification time. Sync/backup preferences are intentionally rejected.",
      "scopes": [
        "write"
      ],
      "group": "settings",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "updates": {
            "type": "object",
            "properties": {
              "currency": {
                "type": "string"
              },
              "dateFormat": {
                "type": "string"
              },
              "timeFormat": {
                "type": "string"
              },
              "theme": {
                "type": "string",
                "enum": [
                  "light",
                  "dark",
                  "system"
                ]
              },
              "defaultView": {
                "type": "string"
              },
              "weekStartsOn": {
                "type": "number"
              },
              "autoHideTotalsOnRevisit": {
                "type": "boolean"
              },
              "showCompletedTasks": {
                "type": "boolean"
              },
              "defaultBillable": {
                "type": "boolean"
              },
              "projectSort": {
                "type": "string",
                "enum": [
                  "createdAt",
                  "lastActive",
                  "name"
                ]
              },
              "clientSort": {
                "type": "string",
                "enum": [
                  "createdAt",
                  "lastActive",
                  "name"
                ]
              },
              "weeklyGoalTargetHours": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "weeklyGoalTargetEarnings": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "systemNotificationsEnabled": {
                "type": "boolean"
              },
              "systemNotificationTime": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_tasks",
      "description": "List TaskTime Pro tasks, optionally scoped to a project ID.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "create_task",
      "description": "Create a TaskTime Pro task or subtask. Subtasks cannot be recurring.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "parentTaskId": {
            "type": [
              "string",
              "null"
            ]
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "billable": {
            "type": "boolean"
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "recurring": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "weekly",
                  "monthly",
                  "yearly"
                ]
              },
              "paused": {
                "type": "boolean"
              },
              "weeklyDays": {
                "type": "array",
                "items": {
                  "type": "number"
                }
              },
              "monthlyType": {
                "type": "string",
                "enum": [
                  "first",
                  "last",
                  "specific"
                ]
              },
              "monthlyDay": {
                "type": "number"
              },
              "yearlyDate": {
                "type": "string"
              }
            },
            "required": [
              "type"
            ],
            "additionalProperties": false
          },
          "promptTimeEntry": {
            "type": "boolean"
          },
          "estimatedHours": {
            "type": [
              "number",
              "null"
            ]
          },
          "estimatedFlatAmount": {
            "type": [
              "number",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "title"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_task",
      "description": "Update a TaskTime Pro task through relationship and task-state invariants. Use complete_task for recurring occurrences. Set updates.recurring.paused to true to pause the schedule or false to resume without catching up; include the recurrence type and schedule. Timer state is unchanged.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          },
          "updates": {
            "type": "object"
          }
        },
        "required": [
          "taskId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "complete_task",
      "description": "Complete a non-recurring task or a specific recurring occurrence.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          },
          "occurrenceDate": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "archive_task",
      "description": "Archive a task using TaskTime Pro archive behavior. This is not a destructive delete.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "unarchive_task",
      "description": "Restore an archived task using TaskTime Pro unarchive behavior. This is not a destructive recreate.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "preview_delete_task",
      "description": "Preview the UI-style cascade impact of deleting an active or archived task without mutating data.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cascade_delete_task",
      "description": "Delete a task, descendant tasks, related active time entries, matching timers, and planner attachments after preview matching, explicit confirmation, and TaskTime Pro approval. Billed or invoice-linked tasks are rejected.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          },
          "expectedTaskIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedTimeEntryIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedTimerKeys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "expectedPlannerAttachmentIds": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "taskId",
          "confirmDelete",
          "confirmationText",
          "expectedTaskIds",
          "expectedTimeEntryIds"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_task",
      "description": "Delete one unreferenced active or archived task after explicit command confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "projects-tasks",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "taskId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_active_timers",
      "description": "List active timers with resolved timer keys and elapsed time.",
      "scopes": [
        "read"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "start_timer",
      "description": "Start a timer for a task. Existing active timers for the same key are not overwritten.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          },
          "note": {
            "type": "string"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "taskId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "pause_timer",
      "description": "Pause a timer by timer key or task ID.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "timerKey": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "pausedAt": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "resume_timer",
      "description": "Resume a paused timer by timer key or task ID.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "timerKey": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "stop_timer",
      "description": "Stop a timer and create one matching time entry with complete-history validation and replay/concurrency recovery.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "timerKey": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "clear_timer",
      "description": "Discard an active timer without creating a time entry after explicit confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "timerKey": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "confirmClear": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "confirmClear",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_timer",
      "description": "Update an active timer note and/or start timestamp.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "timerKey": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "startTime": {
            "type": "number"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "add_manual_time_entry",
      "description": "Create a manual time entry after TaskTime Pro validates billing cutoffs and overlaps against complete local history.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          },
          "start": {
            "type": "number"
          },
          "end": {
            "type": "number"
          },
          "note": {
            "type": "string"
          },
          "billingIncrementMinutes": {
            "type": [
              "number",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "taskId",
          "start",
          "end"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_time_entry",
      "description": "Edit an active unbilled time entry after validating source/target task, billing cutoff, and complete-history overlap rules. Historical and billed entries are rejected.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "entryId": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          },
          "start": {
            "type": "number"
          },
          "end": {
            "type": "number"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "billingIncrementMinutes": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "entryId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_time_entry",
      "description": "Delete one active unbilled time entry after explicit command confirmation and TaskTime Pro approval. Historical and billed entries are rejected.",
      "scopes": [
        "write"
      ],
      "group": "timers-time",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "entryId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "entryId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_planner_attachments",
      "description": "List planner attachments, optionally filtered by entity, mode, date, or weekday.",
      "scopes": [
        "read"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "client",
              "project",
              "task"
            ]
          },
          "referenceId": {
            "type": "string"
          },
          "mode": {
            "type": "string",
            "enum": [
              "static",
              "date",
              "weekday"
            ]
          },
          "date": {
            "type": "string"
          },
          "weekday": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "attach_planner_item",
      "description": "Attach a client, project, or task to the planner for a static pin, date, weekday, this week, or every week.",
      "scopes": [
        "write"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "client",
              "project",
              "task"
            ]
          },
          "referenceId": {
            "type": "string"
          },
          "mode": {
            "type": "string",
            "enum": [
              "static",
              "date",
              "weekday",
              "week",
              "every-week"
            ]
          },
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "weekday": {
            "type": [
              "number",
              "null"
            ]
          },
          "weekStartDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "includeWeekends": {
            "type": "boolean"
          },
          "estimatedHours": {
            "type": [
              "number",
              "null"
            ]
          },
          "duplicateMode": {
            "type": "string",
            "enum": [
              "reject",
              "skip",
              "overwrite"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "type",
          "referenceId",
          "mode"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_planner_attachment",
      "description": "Update planner attachment options such as estimated hours.",
      "scopes": [
        "write"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "plannerAttachmentId": {
            "type": "string"
          },
          "estimatedHours": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "plannerAttachmentId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "remove_planner_attachment",
      "description": "Remove one planner attachment without deleting the referenced entity.",
      "scopes": [
        "write"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "plannerAttachmentId": {
            "type": "string"
          }
        },
        "required": [
          "plannerAttachmentId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_daily_goals",
      "description": "List weekday daily planner goals.",
      "scopes": [
        "read"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "weekday": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "set_daily_goal",
      "description": "Set or clear a weekday daily planner goal.",
      "scopes": [
        "write"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "weekday": {
            "type": "number"
          },
          "targetHours": {
            "type": [
              "number",
              "null"
            ]
          },
          "targetEarnings": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "weekday"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "remove_daily_goal",
      "description": "Remove a weekday daily planner goal.",
      "scopes": [
        "write"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "weekday": {
            "type": "number"
          }
        },
        "required": [
          "weekday"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_project_notes",
      "description": "Read project notes in persisted TipTap JSON format plus plain text.",
      "scopes": [
        "read"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_project_notes",
      "description": "Update project notes with plain text or TipTap JSON using the same persisted notes payload as the UI.",
      "scopes": [
        "write"
      ],
      "group": "planner-notes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "plainText": {
            "type": "string"
          },
          "content": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true
          },
          "clear": {
            "type": "boolean"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_expenses",
      "description": "List expenses, optionally scoped by client, project, or billable state.",
      "scopes": [
        "read"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "billableOnly": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "create_expense",
      "description": "Create an expense through the TaskTime Pro command layer.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "currency": {
            "type": "string"
          },
          "isPersonal": {
            "type": "boolean"
          },
          "billable": {
            "type": "boolean"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "supplierName": {
            "type": [
              "string",
              "null"
            ]
          },
          "receiptNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "paidOn": {
            "type": [
              "string",
              "null"
            ]
          },
          "paidBy": {
            "type": [
              "string",
              "null"
            ]
          },
          "paymentStatus": {
            "type": "string",
            "enum": [
              "unpaid",
              "paid"
            ]
          },
          "paymentMode": {
            "type": "string",
            "enum": [
              "manual",
              "auto"
            ]
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessId": {
            "type": [
              "string",
              "null"
            ]
          },
          "categoryId": {
            "type": [
              "string",
              "null"
            ]
          },
          "isRecurring": {
            "type": "boolean"
          },
          "recurrenceId": {
            "type": [
              "string",
              "null"
            ]
          },
          "amountType": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "fixed",
              "variable",
              null
            ]
          },
          "taxNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "isTaxExempt": {
            "type": "boolean"
          },
          "amountExcludingTax": {
            "type": [
              "number",
              "null"
            ]
          },
          "taxLabel": {
            "type": [
              "string",
              "null"
            ]
          },
          "taxRate": {
            "type": [
              "number",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "date",
          "amount",
          "currency",
          "isPersonal",
          "billable"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_expense",
      "description": "Delete one active unbilled and unclaimed expense after explicit command confirmation and TaskTime Pro approval. Billed and tax-claimed expenses are rejected.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "expenseId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_expense_recurrences",
      "description": "List recurring expense templates, optionally scoped by client/project or active status.",
      "scopes": [
        "read"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "activeOnly": {
            "type": "boolean"
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "create_expense_recurrence",
      "description": "Create a recurring expense template and optionally generate the initial expense instance when due, matching the UI flow.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "supplierName": {
            "type": [
              "string",
              "null"
            ]
          },
          "paidBy": {
            "type": [
              "string",
              "null"
            ]
          },
          "paymentMode": {
            "type": "string",
            "enum": [
              "manual",
              "auto"
            ]
          },
          "currency": {
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "amountType": {
            "type": "string",
            "enum": [
              "fixed",
              "variable"
            ]
          },
          "repeat": {
            "type": "string",
            "enum": [
              "monthly",
              "yearly"
            ]
          },
          "monthlyType": {
            "type": "string",
            "enum": [
              "first",
              "last",
              "specific"
            ]
          },
          "monthlyDay": {
            "type": "number"
          },
          "startDate": {
            "type": "string"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessId": {
            "type": [
              "string",
              "null"
            ]
          },
          "categoryId": {
            "type": [
              "string",
              "null"
            ]
          },
          "isPersonal": {
            "type": "boolean"
          },
          "billable": {
            "type": "boolean"
          },
          "taxNumber": {
            "type": [
              "string",
              "null"
            ]
          },
          "isTaxExempt": {
            "type": "boolean"
          },
          "amountExcludingTax": {
            "type": [
              "number",
              "null"
            ]
          },
          "taxLabel": {
            "type": [
              "string",
              "null"
            ]
          },
          "taxRate": {
            "type": [
              "number",
              "null"
            ]
          },
          "active": {
            "type": "boolean"
          },
          "generateInitial": {
            "type": "boolean"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "currency",
          "amount",
          "amountType",
          "repeat",
          "startDate",
          "isPersonal",
          "billable",
          "isTaxExempt"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_expense_recurrence",
      "description": "Update a recurring expense template for future generated expenses without mutating already-created expenses.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recurrenceId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "recurrenceId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "pause_expense_recurrence",
      "description": "Pause a recurring expense template without deleting generated expenses.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recurrenceId": {
            "type": "string"
          }
        },
        "required": [
          "recurrenceId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "resume_expense_recurrence",
      "description": "Resume a paused recurring expense template without changing already-generated expenses.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recurrenceId": {
            "type": "string"
          }
        },
        "required": [
          "recurrenceId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_expense_recurrence",
      "description": "Delete one recurring expense template after explicit command confirmation and TaskTime Pro approval without deleting generated expenses.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recurrenceId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "recurrenceId",
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_expense_paid",
      "description": "Mark an expense paid using existing TaskTime Pro payment snapshot behavior.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseId": {
            "type": "string"
          },
          "amount": {
            "type": "number"
          },
          "paidOn": {
            "type": [
              "string",
              "null"
            ]
          },
          "paidBy": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "expenseId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_expense_unpaid",
      "description": "Mark an expense unpaid.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseId": {
            "type": "string"
          }
        },
        "required": [
          "expenseId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_tax_return_periods",
      "description": "List tax return periods used by Reports tax-claim workflows.",
      "scopes": [
        "read"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "create_tax_return_period",
      "description": "Create a tax return period for VAT, income-tax, sales-tax, or other reporting workflows.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "vat",
              "income-tax",
              "sales-tax",
              "other"
            ]
          },
          "startDate": {
            "type": "string"
          },
          "endDate": {
            "type": "string"
          },
          "businessInfoId": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "filed",
              "paid"
            ]
          },
          "filedAt": {
            "type": [
              "number",
              "null"
            ]
          },
          "paidAt": {
            "type": [
              "number",
              "null"
            ]
          },
          "notes": {
            "type": [
              "string",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "title",
          "type",
          "startDate",
          "endDate"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_tax_return_period",
      "description": "Update non-status tax return period metadata such as title, dates, business profile, and notes. Filing/payment status changes use explicit status tools.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taxReturnPeriodId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "taxReturnPeriodId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_tax_return_period_filed",
      "description": "Mark a tax return period filed after explicit confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taxReturnPeriodId": {
            "type": "string"
          },
          "filedAt": {
            "type": "number"
          },
          "confirmFiled": {
            "type": "boolean"
          }
        },
        "required": [
          "taxReturnPeriodId",
          "confirmFiled"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_tax_return_period_paid",
      "description": "Mark a tax return period paid after explicit confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "taxReturnPeriodId": {
            "type": "string"
          },
          "filedAt": {
            "type": "number"
          },
          "paidAt": {
            "type": "number"
          },
          "confirmPaid": {
            "type": "boolean"
          }
        },
        "required": [
          "taxReturnPeriodId",
          "confirmPaid"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_expenses_tax_claimed",
      "description": "Mark selected expenses as tax claimed against an existing tax return period after explicit confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1
          },
          "taxReturnPeriodId": {
            "type": "string"
          },
          "confirmClaim": {
            "type": "boolean"
          }
        },
        "required": [
          "expenseIds",
          "taxReturnPeriodId",
          "confirmClaim"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_expenses_tax_unclaimed",
      "description": "Clear tax claim status and period links from selected expenses after explicit confirmation and TaskTime Pro approval.",
      "scopes": [
        "write"
      ],
      "group": "expenses-tax",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "expenseIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1
          },
          "confirmUnclaim": {
            "type": "boolean"
          }
        },
        "required": [
          "expenseIds",
          "confirmUnclaim"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_invoices",
      "description": "List invoices as bounded summary records, optionally scoped by client, project, or status.",
      "scopes": [
        "read"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "enum": [
              "draft",
              "sent",
              "paid",
              "overdue",
              "canceled"
            ]
          },
          "limit": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "preview_invoice_from_unbilled_work",
      "description": "Calculate a read-only invoice preview from unbilled project work. This does not create invoices, mark billing state, or advance invoice numbering.",
      "scopes": [
        "read"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "billingPeriodStart": {
            "type": "string"
          },
          "billingPeriodEnd": {
            "type": "string"
          },
          "includeClientLevelExpenses": {
            "type": "boolean"
          },
          "exchangeRates": {
            "type": [
              "object",
              "null"
            ]
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "create_invoice_draft",
      "description": "Create a draft invoice from unbilled project work. This creates only a draft invoice record and does not mark entries or expenses billed, update task billing cutoffs, update project invoice references, or advance invoice numbering.",
      "scopes": [
        "read",
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "clientId": {
            "type": "string"
          },
          "invoiceNumber": {
            "type": "string"
          },
          "invoiceDate": {
            "type": "string"
          },
          "dueDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "templateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessInfoId": {
            "type": [
              "string",
              "null"
            ]
          },
          "paymentMethodId": {
            "type": [
              "string",
              "null"
            ]
          },
          "notes": {
            "type": "string"
          },
          "billingPeriodStart": {
            "type": "string"
          },
          "billingPeriodEnd": {
            "type": "string"
          },
          "includeClientLevelExpenses": {
            "type": "boolean"
          },
          "exchangeRates": {
            "type": [
              "object",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "update_invoice_draft",
      "description": "Edit allowed metadata, line items, totals, and UI composition fields on an existing draft invoice. Set draftNumberMode to automatic or manual; an invoiceNumber edit defaults to manual. This does not mark billing state, update task billing cutoffs, link projects, or advance invoice numbering.",
      "scopes": [
        "read",
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "updates": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "invoiceId",
          "updates"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "delete_invoice_draft",
      "description": "Delete an unissued draft after confirmation. Source time, expenses and numbering remain unchanged.",
      "scopes": [
        "read",
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "confirmDelete": {
            "type": "boolean"
          }
        },
        "required": [
          "invoiceId",
          "confirmDelete"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "refresh_invoice_draft",
      "description": "Rebuild and save linked work for the draft client/project scope and billing period after confirmation, including client-only expenses. Reset linked task/expense selections, hours, rates and merged rows. Retain manual items, notes, discount, shipping and tax settings. Review the refreshed draft before finalization.",
      "scopes": [
        "read",
        "write"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "confirmRefresh": {
            "type": "boolean"
          },
          "exchangeRates": {
            "type": [
              "object",
              "null"
            ]
          }
        },
        "required": [
          "invoiceId",
          "confirmRefresh"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "finalize_invoice",
      "description": "Finalize a UI- or agent-created draft invoice after explicit confirmation. This revalidates the saved source selection and marks its time entries and expenses billed, updates task billing cutoffs, links the invoice to the project, advances invoice sequence state, and changes the invoice from draft to sent.",
      "scopes": [
        "read",
        "write",
        "billing"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "confirmFinalize": {
            "type": "boolean"
          },
          "finalizedAt": {
            "type": "number"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "invoiceId",
          "confirmFinalize"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_invoice_paid",
      "description": "Mark an invoice paid after explicit confirmation. Cross-currency invoices require exchange rates so TaskTime Pro can store the existing payment currency snapshot.",
      "scopes": [
        "read",
        "write",
        "billing"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "confirmPaid": {
            "type": "boolean"
          },
          "paidAt": {
            "type": "number"
          },
          "exchangeRates": {
            "type": [
              "object",
              "null"
            ]
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "invoiceId",
          "confirmPaid"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "mark_invoice_unpaid",
      "description": "Mark an invoice unpaid after explicit confirmation, matching TaskTime Pro UI status fallback behavior.",
      "scopes": [
        "read",
        "write",
        "billing"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "confirmUnpaid": {
            "type": "boolean"
          },
          "referenceAt": {
            "type": "number"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "invoiceId",
          "confirmUnpaid"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "cancel_invoice",
      "description": "Cancel a finalized unpaid invoice after explicit confirmation and exact invoice-number confirmation text. The invoice and number remain as an audit record while source claims owned by that invoice are released for future billing.",
      "scopes": [
        "read",
        "write",
        "billing"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "confirmCancel": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          },
          "canceledAt": {
            "type": "number"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "invoiceId",
          "reason",
          "confirmCancel",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "undo_latest_invoice",
      "description": "Undo the latest unpaid invoice after explicit confirmation text matching the invoice number. Restores billed time entries, invoice adjustments, quoted flat amounts, linked expenses, project invoice references, task cutoffs, and sequence state when safe.",
      "scopes": [
        "read",
        "write",
        "billing"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "confirmUndo": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          },
          "undoneAt": {
            "type": "number"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "invoiceId",
          "confirmUndo",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "export_invoice_pdf",
      "description": "Generate and download an invoice PDF in the paired browser app session. The bridge returns status metadata only, not PDF bytes.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "invoiceId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "preview_project_quote",
      "description": "Build a non-persistent quote document from project estimates without creating invoices or billing side effects.",
      "scopes": [
        "read"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessInfoId": {
            "type": [
              "string",
              "null"
            ]
          },
          "paymentMethodId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceTemplateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "note": {
            "type": "string"
          },
          "quoteDate": {
            "type": "string"
          },
          "quoteTimestamp": {
            "type": "string"
          },
          "quoteTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          },
          "additionalTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "export_project_quote_pdf",
      "description": "Generate and download a non-persistent project quote PDF in the paired browser app session. The bridge returns status metadata only, not PDF bytes.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessInfoId": {
            "type": [
              "string",
              "null"
            ]
          },
          "paymentMethodId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceTemplateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "note": {
            "type": "string"
          },
          "quoteDate": {
            "type": "string"
          },
          "quoteTimestamp": {
            "type": "string"
          },
          "quoteTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          },
          "additionalTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "preview_project_quote_email",
      "description": "Resolve project quote email recipient, template fields, body, and attachment title without sending email or mutating data.",
      "scopes": [
        "read"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessInfoId": {
            "type": [
              "string",
              "null"
            ]
          },
          "paymentMethodId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceTemplateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "note": {
            "type": "string"
          },
          "quoteDate": {
            "type": "string"
          },
          "quoteTimestamp": {
            "type": "string"
          },
          "quoteTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          },
          "additionalTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          },
          "emailTemplateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "to": {
            "type": [
              "string",
              "null"
            ]
          },
          "fromName": {
            "type": [
              "string",
              "null"
            ]
          },
          "replyTo": {
            "type": [
              "string",
              "null"
            ]
          },
          "subject": {
            "type": [
              "string",
              "null"
            ]
          },
          "body": {
            "type": [
              "string",
              "null"
            ]
          },
          "attachmentTitle": {
            "type": [
              "string",
              "null"
            ]
          },
          "forwardToSelf": {
            "type": "boolean"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "send_project_quote_email",
      "description": "Hosted quote Send requires a Pro trial or subscription, explicit confirmation, and TaskTime Pro approval. Preview and PDF export remain available without hosted Send.",
      "scopes": [
        "read",
        "email"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessInfoId": {
            "type": [
              "string",
              "null"
            ]
          },
          "paymentMethodId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceTemplateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "note": {
            "type": "string"
          },
          "quoteDate": {
            "type": "string"
          },
          "quoteTimestamp": {
            "type": "string"
          },
          "quoteTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          },
          "additionalTasks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                },
                "hourlyRate": {
                  "type": "number"
                },
                "flatRate": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                },
                "useFlatRate": {
                  "type": "boolean"
                },
                "parentTaskId": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": [
                "title"
              ],
              "additionalProperties": false
            }
          },
          "emailTemplateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "to": {
            "type": [
              "string",
              "null"
            ]
          },
          "fromName": {
            "type": [
              "string",
              "null"
            ]
          },
          "replyTo": {
            "type": [
              "string",
              "null"
            ]
          },
          "subject": {
            "type": [
              "string",
              "null"
            ]
          },
          "body": {
            "type": [
              "string",
              "null"
            ]
          },
          "attachmentTitle": {
            "type": [
              "string",
              "null"
            ]
          },
          "forwardToSelf": {
            "type": "boolean"
          },
          "confirmSend": {
            "type": "boolean"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "projectId",
          "confirmSend"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "preview_invoice_email",
      "description": "Resolve invoice email recipient, template, subject, body, and attachment filename without sending email or mutating invoice state.",
      "scopes": [
        "read"
      ],
      "group": "invoices-quotes",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "sendType": {
            "type": "string",
            "enum": [
              "invoice",
              "reminder",
              "quote"
            ]
          },
          "templateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "to": {
            "type": [
              "string",
              "null"
            ]
          },
          "fromName": {
            "type": [
              "string",
              "null"
            ]
          },
          "replyTo": {
            "type": [
              "string",
              "null"
            ]
          },
          "subject": {
            "type": [
              "string",
              "null"
            ]
          },
          "body": {
            "type": [
              "string",
              "null"
            ]
          },
          "attachmentTitle": {
            "type": [
              "string",
              "null"
            ]
          },
          "forwardToSelf": {
            "type": "boolean"
          }
        },
        "required": [
          "invoiceId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "send_invoice_email",
      "description": "Hosted invoice, reminder, or quote Send requires a Pro trial or subscription, explicit confirmation, and TaskTime Pro approval. Preview and PDF export remain available without hosted Send.",
      "scopes": [
        "read",
        "write",
        "email"
      ],
      "group": "invoices-quotes",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          },
          "sendType": {
            "type": "string",
            "enum": [
              "invoice",
              "reminder",
              "quote"
            ]
          },
          "templateId": {
            "type": [
              "string",
              "null"
            ]
          },
          "to": {
            "type": [
              "string",
              "null"
            ]
          },
          "fromName": {
            "type": [
              "string",
              "null"
            ]
          },
          "replyTo": {
            "type": [
              "string",
              "null"
            ]
          },
          "subject": {
            "type": [
              "string",
              "null"
            ]
          },
          "body": {
            "type": [
              "string",
              "null"
            ]
          },
          "attachmentTitle": {
            "type": [
              "string",
              "null"
            ]
          },
          "forwardToSelf": {
            "type": "boolean"
          },
          "confirmSend": {
            "type": "boolean"
          },
          "idempotencyKey": {
            "type": "string"
          }
        },
        "required": [
          "invoiceId",
          "confirmSend"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_email_send_status",
      "description": "Read one durable hosted-email attempt without contacting the provider or sending/retrying a message.",
      "scopes": [
        "read",
        "email"
      ],
      "group": "queries",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "attemptId": {
            "type": "string"
          }
        },
        "required": [
          "attemptId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_dashboard_summary",
      "description": "Get a bounded summary of current work and canonical invoice-eligible time across complete local history.",
      "scopes": [
        "read"
      ],
      "group": "queries",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "get_project_overview",
      "description": "Get a bounded project summary with canonical invoice-eligible time across complete local history.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_client_overview",
      "description": "Get a bounded client summary with project, expense, and invoice totals.",
      "scopes": [
        "read"
      ],
      "group": "projects-tasks",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          }
        },
        "required": [
          "clientId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_report_summary",
      "description": "Get the Free basic current-month Overview with scope=basic-current-month, or Pro advanced Reports summaries. Omitted scope remains advanced.",
      "scopes": [
        "read"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": [
              "basic-current-month",
              "advanced"
            ]
          },
          "section": {
            "type": "string",
            "enum": [
              "overview",
              "monthly",
              "statement",
              "work-summary",
              "tax",
              "invoices",
              "outstanding",
              "expenses",
              "hours",
              "to-invoice"
            ]
          },
          "period": {
            "type": "string",
            "enum": [
              "this-month",
              "last-month",
              "this-quarter",
              "last-quarter",
              "this-year",
              "last-year",
              "custom"
            ]
          },
          "customStart": {
            "type": [
              "string",
              "null"
            ]
          },
          "customEnd": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessId": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "categoryId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceStatus": {
            "type": "string",
            "enum": [
              "all",
              "non-draft",
              "paid",
              "unpaid",
              "overdue",
              "draft",
              "canceled"
            ]
          },
          "expenseStatus": {
            "type": "string",
            "enum": [
              "all",
              "paid",
              "unpaid",
              "claimed",
              "unclaimed",
              "excluded"
            ]
          },
          "incomeDateBasis": {
            "type": "string",
            "enum": [
              "invoice-date",
              "paid-date"
            ]
          },
          "expenseDateBasis": {
            "type": "string",
            "enum": [
              "expense-date",
              "paid-date"
            ]
          },
          "includeRows": {
            "type": "boolean"
          },
          "rowLimit": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "export_report_csv",
      "description": "Generate and download a CSV export for a Reports-page section in the paired browser app session without returning file contents through the bridge.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "section": {
            "type": "string",
            "enum": [
              "overview",
              "monthly",
              "statement",
              "work-summary",
              "tax",
              "invoices",
              "outstanding",
              "expenses",
              "hours",
              "to-invoice"
            ]
          },
          "period": {
            "type": "string",
            "enum": [
              "this-month",
              "last-month",
              "this-quarter",
              "last-quarter",
              "this-year",
              "last-year",
              "custom"
            ]
          },
          "customStart": {
            "type": [
              "string",
              "null"
            ]
          },
          "customEnd": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessId": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "categoryId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceStatus": {
            "type": "string",
            "enum": [
              "all",
              "non-draft",
              "paid",
              "unpaid",
              "overdue",
              "draft",
              "canceled"
            ]
          },
          "expenseStatus": {
            "type": "string",
            "enum": [
              "all",
              "paid",
              "unpaid",
              "claimed",
              "unclaimed",
              "excluded"
            ]
          },
          "incomeDateBasis": {
            "type": "string",
            "enum": [
              "invoice-date",
              "paid-date"
            ]
          },
          "expenseDateBasis": {
            "type": "string",
            "enum": [
              "expense-date",
              "paid-date"
            ]
          },
          "rowLimit": {
            "type": "number"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "section"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "export_report_pdf",
      "description": "Generate and download a PDF export for Reports-page sections that have existing UI PDF exporters, without returning file contents through the bridge.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "section": {
            "type": "string",
            "enum": [
              "overview",
              "monthly",
              "statement",
              "work-summary",
              "invoices",
              "outstanding",
              "expenses"
            ]
          },
          "period": {
            "type": "string",
            "enum": [
              "this-month",
              "last-month",
              "this-quarter",
              "last-quarter",
              "this-year",
              "last-year",
              "custom"
            ]
          },
          "customStart": {
            "type": [
              "string",
              "null"
            ]
          },
          "customEnd": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessId": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "categoryId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceStatus": {
            "type": "string",
            "enum": [
              "all",
              "non-draft",
              "paid",
              "unpaid",
              "overdue",
              "draft",
              "canceled"
            ]
          },
          "expenseStatus": {
            "type": "string",
            "enum": [
              "all",
              "paid",
              "unpaid",
              "claimed",
              "unclaimed",
              "excluded"
            ]
          },
          "incomeDateBasis": {
            "type": "string",
            "enum": [
              "invoice-date",
              "paid-date"
            ]
          },
          "expenseDateBasis": {
            "type": "string",
            "enum": [
              "expense-date",
              "paid-date"
            ]
          },
          "rowLimit": {
            "type": "number"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "section"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "export_accountant_pack",
      "description": "Generate and download the Reports accountant pack ZIP in the paired browser app session without returning file contents through the bridge.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "period": {
            "type": "string",
            "enum": [
              "this-month",
              "last-month",
              "this-quarter",
              "last-quarter",
              "this-year",
              "last-year",
              "custom"
            ]
          },
          "customStart": {
            "type": [
              "string",
              "null"
            ]
          },
          "customEnd": {
            "type": [
              "string",
              "null"
            ]
          },
          "businessId": {
            "type": [
              "string",
              "null"
            ]
          },
          "clientId": {
            "type": [
              "string",
              "null"
            ]
          },
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "categoryId": {
            "type": [
              "string",
              "null"
            ]
          },
          "invoiceStatus": {
            "type": "string",
            "enum": [
              "all",
              "non-draft",
              "paid",
              "unpaid",
              "overdue",
              "draft",
              "canceled"
            ]
          },
          "expenseStatus": {
            "type": "string",
            "enum": [
              "all",
              "paid",
              "unpaid",
              "claimed",
              "unclaimed",
              "excluded"
            ]
          },
          "incomeDateBasis": {
            "type": "string",
            "enum": [
              "invoice-date",
              "paid-date"
            ]
          },
          "expenseDateBasis": {
            "type": "string",
            "enum": [
              "expense-date",
              "paid-date"
            ]
          },
          "rowLimit": {
            "type": "number"
          },
          "filename": {
            "type": "string"
          },
          "includeInvoicePdfs": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "export_backup_json",
      "description": "Export all TaskTime Pro backup data as a browser-downloaded JSON file without returning backup contents through the bridge.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string"
          },
          "exportDate": {
            "type": "string"
          },
          "refreshFromCloud": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "list_cloud_backups",
      "description": "List TaskTime Pro backup snapshots in the active cloud provider without returning backup contents.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "create_cloud_backup",
      "description": "Create a TaskTime Pro backup snapshot in the active cloud provider using the existing backup manager.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "download_cloud_backup_json",
      "description": "Download a selected backup from the active cloud provider as a browser JSON file without returning backup contents through the bridge.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "backupId": {
            "type": "string"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "backupId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "list_drive_backups",
      "description": "Deprecated Google Drive compatibility alias for list_cloud_backups. List TaskTime Pro backup snapshots in Google Drive without returning backup contents.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "create_drive_backup",
      "description": "Deprecated Google Drive compatibility alias for create_cloud_backup. Create a TaskTime Pro backup snapshot in Google Drive.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "download_drive_backup_json",
      "description": "Deprecated Google Drive compatibility alias for download_cloud_backup_json. Download a selected Google Drive backup as a browser JSON file without returning backup contents through the bridge.",
      "scopes": [
        "read",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "backupId": {
            "type": "string"
          },
          "filename": {
            "type": "string"
          }
        },
        "required": [
          "backupId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "preview_backup_import_json",
      "description": "Validate a TaskTime Pro backup JSON payload and return version/count metadata without changing current data.",
      "scopes": [
        "read"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "backupJson": {
            "type": "string"
          }
        },
        "required": [
          "backupJson"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "restore_backup_json",
      "description": "Replace current local TaskTime Pro data with a validated backup JSON payload after explicit confirmation and TaskTime Pro approval. Requires confirmationText to equal RESTORE.",
      "scopes": [
        "read",
        "write",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "backupJson": {
            "type": "string"
          },
          "confirmRestore": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "backupJson",
          "confirmRestore",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "restore_cloud_backup",
      "description": "Replace current local TaskTime Pro data from a selected backup in the active cloud provider after explicit confirmation and TaskTime Pro approval. Requires confirmationText to equal RESTORE.",
      "scopes": [
        "read",
        "write",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "backupId": {
            "type": "string"
          },
          "confirmRestore": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "backupId",
          "confirmRestore",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "restore_drive_backup",
      "description": "Deprecated Google Drive compatibility alias for restore_cloud_backup. Replace current local TaskTime Pro data from a selected Google Drive backup after explicit confirmation and TaskTime Pro approval. Requires confirmationText to equal RESTORE.",
      "scopes": [
        "read",
        "write",
        "export"
      ],
      "group": "reports-exports-backups",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "backupId": {
            "type": "string"
          },
          "confirmRestore": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          }
        },
        "required": [
          "backupId",
          "confirmRestore",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "get_sync_status",
      "description": "Read the active cloud provider, sync status, auto-sync mode, pending changes, and backup preference metadata.",
      "scopes": [
        "read"
      ],
      "group": "sync-account",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "update_sync_settings",
      "description": "Update explicit cloud sync and backup preferences for the active provider. Backup mode requires confirmBackupMode: true. Optional runSync triggers Sync Now after saving.",
      "scopes": [
        "read",
        "write",
        "export"
      ],
      "group": "sync-account",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "autoSyncEnabled": {
            "type": "boolean"
          },
          "autoSyncMode": {
            "type": "string",
            "enum": [
              "backup",
              "sync"
            ]
          },
          "backupEnabled": {
            "type": "boolean"
          },
          "backupFrequencyHours": {
            "type": "number"
          },
          "confirmBackupMode": {
            "type": "boolean"
          },
          "runSync": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "delete_all_account_data",
      "description": "Delete all local TaskTime Pro data and, when cloud storage is connected, wipe all TaskTime sync data and backups and revoke the active provider after explicit confirmation and TaskTime Pro approval. Requires confirmationText to equal DELETE ALL DATA.",
      "scopes": [
        "read",
        "write",
        "export"
      ],
      "group": "sync-account",
      "requiresApproval": true,
      "approvalMode": "tasktime_approval_token_or_visible_prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "confirmDelete": {
            "type": "boolean"
          },
          "confirmationText": {
            "type": "string"
          },
          "includeCloudData": {
            "type": "boolean"
          },
          "includeDriveData": {
            "type": "boolean"
          }
        },
        "required": [
          "confirmDelete",
          "confirmationText"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "find_unbilled_time",
      "description": "Find canonical invoice-eligible time across complete local history, optionally scoped by project or task.",
      "scopes": [
        "read"
      ],
      "group": "queries",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "taskId": {
            "type": [
              "string",
              "null"
            ]
          },
          "limit": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "list_recent_entries",
      "description": "List recent entries across complete local history with actual and billable duration summaries.",
      "scopes": [
        "read"
      ],
      "group": "queries",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": [
              "string",
              "null"
            ]
          },
          "taskId": {
            "type": [
              "string",
              "null"
            ]
          },
          "limit": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "open_dashboard_view",
      "description": "Open the TaskTime Pro dashboard route in the paired app session.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "open_planner_view",
      "description": "Open the TaskTime Pro planner route, optionally for a specific year and week.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "year": {
            "type": "number"
          },
          "week": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "open_account_view",
      "description": "Open the TaskTime Pro account route, optionally focused on a specific Account section.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "section": {
            "type": "string",
            "enum": [
              "preferences",
              "email-templates",
              "sync",
              "agent",
              "data"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "open_project_view",
      "description": "Open a project view in the paired TaskTime Pro app session after validating the project exists.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string"
          }
        },
        "required": [
          "projectId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "open_client_view",
      "description": "Open a client view in the paired TaskTime Pro app session after validating the client exists.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          }
        },
        "required": [
          "clientId"
        ],
        "additionalProperties": false
      }
    },
    {
      "name": "open_invoice_view",
      "description": "Open the invoices route, optionally focused on an existing invoice.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invoiceId": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "open_expenses_view",
      "description": "Open the expenses route, optionally scoped by client or project.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clientId": {
            "type": "string"
          },
          "projectId": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "open_reports_view",
      "description": "Open the TaskTime Pro reports route in the paired app session.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    {
      "name": "focus_running_timer",
      "description": "Focus the TaskTime Pro app on a running timer by timer key or task ID.",
      "scopes": [
        "navigation"
      ],
      "group": "navigation",
      "requiresApproval": false,
      "approvalMode": "none",
      "inputSchema": {
        "type": "object",
        "properties": {
          "timerKey": {
            "type": "string"
          },
          "taskId": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  ]
}