What this MCP does
Tracks time, monitors project budgets, and exports billing data for service firms.
Tools
Input schema
{'type': 'object', 'required': ['submission_period_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'submission_period_id': {'type': 'string', 'description': 'Id of the submission period to approve (from get_pending_approvals or list_approval_history).'}}}
Input schema
{'type': 'object', 'required': ['org_user_id', 'customer_id'], 'properties': {'customer_id': {'type': 'string', 'description': 'Id of the customer to assign the user to.'}, 'org_user_id': {'type': 'string', 'description': 'Id of the OrganizationUser to assign (not the Firebase user id — use get_project_team to discover it).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['project_id'], 'properties': {'email': {'type': 'string', 'description': 'Email of the member to assign (preferred). Provide this OR org_user_id.'}, 'project_id': {'type': 'string', 'description': 'Id of the project to assign the member to (required). Must be a project in your organization.'}, 'org_user_id': {'type': 'string', 'description': 'Organization-user id of the member to assign. Provide this OR email.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['entries'], 'properties': {'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['subtask_id', 'date', 'hours'], 'properties': {'date': {'type': 'string', 'description': 'Date of the work (YYYY-MM-DD).'}, 'text': {'type': 'string', 'description': 'Optional description (max 1000 characters).'}, 'hours': {'type': 'number', 'description': 'Hours worked (> 0 and ≤ 24).'}, 'start_time': {'type': 'string', 'description': 'Optional start time in 24-h HH:mm (defaults to 09:00).'}, 'subtask_id': {'type': 'string', 'description': 'Id of the subtask to log time against.'}}}, 'description': 'List of time entries to create (max 50).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['effective_from'], 'properties': {'fixed_amount': {'type': 'number', 'description': 'Set every rate to this exact amount. Provide this OR adjustment_percentage, not both.'}, 'effective_from': {'type': 'string', 'description': 'Date the adjusted rates take effect (YYYY-MM-DD) (required).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'adjustment_percentage': {'type': 'number', 'description': 'Percentage to adjust every rate by (e.g. 5 = +5%, -3 = -3%). Provide this OR fixed_amount, not both.'}}}
Input schema
{'type': 'object', 'required': ['ids', 'text'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Ids of the time entries to update (max 100).'}, 'text': {'type': 'string', 'description': 'New description to apply to all entries (max 1000 characters).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['invite_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'invite_id': {'type': 'string', 'description': 'Id of the pending invitation to cancel.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Id of the scheduled report to delete.'}, 'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'properties': {'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['org_user_id', 'new_role'], 'properties': {'new_role': {'type': 'string', 'description': 'New role to assign: Admin, Finance, Manager, Member, or Viewer.'}, 'org_user_id': {'type': 'string', 'description': 'Id of the OrganizationUser record to update (not the Firebase userId).'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['sub_task_id', 'additional_hours'], 'properties': {'sub_task_id': {'type': 'string', 'description': 'Id of the subtask to check.'}, 'additional_hours': {'type': 'number', 'description': 'Hours to check against the budget limit.'}}}
Input schema
{'type': 'object', 'required': ['frame_order_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'frame_order_id': {'type': 'string', 'description': 'Id of the frame order to close.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['year', 'month'], 'properties': {'year': {'type': 'integer', 'description': 'Calendar year of the month to close (e.g. 2026).'}, 'month': {'type': 'integer', 'description': 'Calendar month to close (1-12).'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['csv_content'], 'properties': {'csv_content': {'type': 'string', 'description': 'The CSV content to import. Must pass validate_import with no errors first.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['source_start_date', 'source_end_date', 'target_start_date'], 'properties': {'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'source_end_date': {'type': 'string', 'description': 'Inclusive end of the range to copy FROM (YYYY-MM-DD).'}, 'source_start_date': {'type': 'string', 'description': 'Inclusive start of the range to copy FROM (YYYY-MM-DD).'}, 'target_start_date': {'type': 'string', 'description': 'The first date of the target range (source_start_date maps here, YYYY-MM-DD).'}}}
Input schema
{'type': 'object', 'required': ['invoice_id', 'reason', 'credit_amount'], 'properties': {'reason': {'type': 'string', 'description': 'Reason for the credit note (required).'}, 'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'invoice_id': {'type': 'string', 'description': 'ID of the invoice to credit (required).'}, 'credit_amount': {'type': 'number', 'description': 'Total credit amount (required, must be > 0 and ≤ invoice total).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Customer name (required).'}, 'country': {'type': 'string', 'description': 'Optional country.'}, 'currency': {'type': 'string', 'description': 'Optional ISO 4217 currency code (e.g. USD, EUR). Defaults to USD.'}, 'description': {'type': 'string', 'description': 'Optional customer description (max 200 characters).'}, 'contact_email': {'type': 'string', 'description': 'Optional primary contact email address.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['entity', 'field_id', 'title', 'type'], 'properties': {'type': {'enum': ['String', 'Number', 'Date', 'DateTime', 'ListOfValues'], 'type': 'string', 'description': 'Field data type (required). One of: String, Number, Date, DateTime, ListOfValues.'}, 'title': {'type': 'string', 'description': 'Human-readable label shown in the UI (required).'}, 'entity': {'enum': ['billing_projects', 'billing_tasks', 'billing_sub_tasks', 'sub_tasks_time_reports', 'billing_customers'], 'type': 'string', 'description': 'The entity type this field is defined on (required). One of: billing_projects, billing_tasks, billing_sub_tasks, sub_tasks_time_reports, billing_customers.'}, 'field_id': {'type': 'string', 'description': 'A unique, stable key for the field (required, max 50 chars), e.g. "po_number".'}, 'is_mandatory': {'type': 'boolean', 'description': 'Whether a value is required when creating/updating the entity. Defaults to false.'}, 'list_of_values': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Options for a ListOfValues field (required for that type; at least one non-blank option).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['display_name', 'customer_id', 'project_id', 'task_id', 'sub_task_id'], 'properties': {'task_id': {'type': 'string', 'description': 'Task id.'}, 'project_id': {'type': 'string', 'description': 'Project id.'}, 'customer_id': {'type': 'string', 'description': 'Customer id.'}, 'description': {'type': 'string', 'description': 'Default time-entry description (optional).'}, 'sub_task_id': {'type': 'string', 'description': 'Subtask id.'}, 'display_name': {'type': 'string', 'description': "Short label for the favorite (e.g. 'Daily standup on Acme')."}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['customer_id', 'reference'], 'properties': {'notes': {'type': 'string', 'description': 'Optional free-text notes (max 2000 chars).'}, 'currency': {'type': 'string', 'description': "ISO 4217 currency code (e.g. USD). Defaults to the customer's currency when omitted."}, 'end_date': {'type': 'string', 'description': 'Optional end date in YYYY-MM-DD format (must be >= start_date).'}, 'reference': {'type': 'string', 'description': "Unique reference string per (org, customer), e.g. 'PO-2026-001'. Max 100 chars."}, 'start_date': {'type': 'string', 'description': 'Optional start date in YYYY-MM-DD format.'}, 'customer_id': {'type': 'string', 'description': 'Id of the customer this frame order belongs to.'}, 'description': {'type': 'string', 'description': 'Optional human-readable description (max 500 chars).'}, 'total_hours': {'type': 'number', 'description': 'Optional contracted hours cap (must be > 0).'}, 'total_amount': {'type': 'number', 'description': 'Optional contracted amount cap (must be > 0).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['name', 'year', 'holidays'], 'properties': {'name': {'type': 'string', 'description': 'A descriptive profile name, e.g. "US Holidays 2026" or "Israel 2026".'}, 'year': {'type': 'integer', 'description': 'The calendar year this profile governs (e.g. 2026). It applies only to its year.'}, 'notes': {'type': 'string', 'description': 'Optional free-text notes about this profile.'}, 'source': {'type': 'string', 'description': 'Provenance of the dates: "hebcal", "nager", "manual", or "ai". Use the source returned by suggest_holiday_profile.'}, 'holidays': {'type': 'string', 'description': 'A JSON array (as a string) of the confirmed holidays, each an object: {"date":"YYYY-MM-DD","name":"...","full_day_off":true|false,"window_start":"HH:mm","window_end":"HH:mm"}. Dates must be within the profile\'s year. full_day_off=false means a half/partial working day — include window_start/window_end; otherwise omit them. Example: [{"date":"2026-01-01","name":"New Year\'s Day","full_day_off":true},{"date":"2026-04-01","name":"Erev Pesach","full_day_off":false,"window_start":"08:00","window_end":"13:00"}]'}, 'set_as_default': {'type': 'boolean', 'description': "Optional. Set this profile as the organization's default holiday set for its year."}, 'default_for_countries': {'type': 'string', 'description': 'Optional comma-separated ISO-2 country codes this profile is the country-default for (for its year), e.g. "US" or "US,CA".'}}}
Input schema
{'type': 'object', 'required': ['customer_id', 'name', 'billing_type'], 'properties': {'name': {'type': 'string', 'description': 'Project name (required).'}, 'customer_id': {'type': 'string', 'description': 'Id of the customer this project belongs to (required). Must be a customer in your organization.'}, 'description': {'type': 'string', 'description': 'Optional project description (max 500 characters).'}, 'billing_type': {'enum': ['TM', 'Fix', 'OVH'], 'type': 'string', 'description': 'Billing type to allow on the project (required). One of: TM, Fix, OVH.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'create_general_activity': {'type': 'boolean', 'description': 'Optional. When true (the default for this tool), also create a default visible "General" task + activity so time can be logged on the project immediately. Set false to create an empty project with no activities yet.'}}}
Input schema
{'type': 'object', 'required': ['name', 'report_type', 'cadence', 'recipients'], 'properties': {'name': {'type': 'string', 'description': 'Name for this scheduled report (max 150 chars).'}, 'format': {'type': 'string', 'description': 'Output format: pdf (default) or csv.'}, 'cadence': {'type': 'string', 'description': 'Schedule cadence: Daily, Weekly, or Monthly.'}, 'recipients': {'type': 'string', 'description': 'Comma-separated recipient email addresses.'}, 'report_type': {'type': 'string', 'description': 'Report type: DailySummary or MonthlyHours.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['task_id', 'name'], 'properties': {'name': {'type': 'string', 'description': 'Subtask name (required).'}, 'task_id': {'type': 'string', 'description': 'Id of the parent task (required). Must be a task in your organization.'}, 'description': {'type': 'string', 'description': 'Optional subtask description.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['project_id', 'name'], 'properties': {'name': {'type': 'string', 'description': 'Task name (required).'}, 'project_id': {'type': 'string', 'description': 'Id of the parent project (required). Must be a project in your organization.'}, 'description': {'type': 'string', 'description': 'Optional task description.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'create_general_activity': {'type': 'boolean', 'description': 'Optional. When true (the default for this tool), also create a default visible "General" activity under the task so time can be logged immediately. Set false to create a task with no activities yet.'}}}
Input schema
{'type': 'object', 'required': ['subtask_id', 'date', 'hours'], 'properties': {'date': {'type': 'string', 'description': 'Date of the work (ISO 8601 YYYY-MM-DD, e.g. 2026-01-15).'}, 'text': {'type': 'string', 'description': 'Optional description of the work performed (max 1000 characters).'}, 'hours': {'type': 'number', 'description': 'Hours worked (> 0 and ≤ 24).'}, 'start_time': {'type': 'string', 'description': 'Optional start time in 24-h HH:mm (defaults to 09:00).'}, 'subtask_id': {'type': 'string', 'description': 'Id of the subtask to log time against.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['key_id'], 'properties': {'key_id': {'type': 'string', 'description': 'Id of the API key to permanently revoke.'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['customer_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'customer_id': {'type': 'string', 'description': 'Id of the customer to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['custom_field_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'custom_field_id': {'type': 'string', 'description': 'Id of the custom field definition to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['invoice_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'invoice_id': {'type': 'string', 'description': 'Id of the draft invoice to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['favorite_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'favorite_id': {'type': 'string', 'description': 'Id of the favorite to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['frame_order_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'frame_order_id': {'type': 'string', 'description': 'Id of the frame order to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['holiday_profile_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'holiday_profile_id': {'type': 'string', 'description': 'Id of the holiday profile to delete.'}}}
Input schema
{'type': 'object', 'properties': {'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['project_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'project_id': {'type': 'string', 'description': 'Id of the project to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['subtask_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'subtask_id': {'type': 'string', 'description': 'Id of the subtask to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['task_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'task_id': {'type': 'string', 'description': 'Id of the task to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['time_report_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'time_report_id': {'type': 'string', 'description': 'Id of the time report entry to delete.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['work_schedule_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'work_schedule_id': {'type': 'string', 'description': 'Id of the work schedule to delete.'}}}
Input schema
{'type': 'object', 'required': ['org_user_id'], 'properties': {'reason': {'type': 'string', 'description': 'Optional reason for disabling the user (stored for audit purposes).'}, 'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'org_user_id': {'type': 'string', 'description': 'Id of the OrganizationUser record to disable (not the Firebase userId).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['org_user_id'], 'properties': {'org_user_id': {'type': 'string', 'description': 'Id of the OrganizationUser to enable.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'properties': {'query': {'type': 'string', 'description': 'Optional case-insensitive name fragment to filter projects (or tasks when project_id is supplied).'}, 'project_id': {'type': 'string', 'description': "Optional project id to drill into. When supplied, returns that project's tasks and subtasks."}, 'max_results': {'type': 'integer', 'description': 'Optional maximum number of rows to return (1-50, default 50).'}}}
Input schema
{'type': 'object', 'required': ['customer_id', 'period_start', 'period_end'], 'properties': {'notes': {'type': 'string', 'description': 'Optional notes to include on the invoice.'}, 'due_date': {'type': 'string', 'description': 'Optional explicit due date (ISO 8601). Overrides payment_terms-based calculation.'}, 'grouping': {'type': 'string', 'description': 'How to group approved hours into line items: "project" (default) or "task".'}, 'period_end': {'type': 'string', 'description': 'Billing period end date (ISO 8601, e.g. 2026-05-31).'}, 'customer_id': {'type': 'string', 'description': 'Id of the customer to invoice.'}, 'period_start': {'type': 'string', 'description': 'Billing period start date (ISO 8601, e.g. 2026-05-01).'}, 'payment_terms': {'type': 'string', 'description': 'Payment terms string, e.g. "Net 30" (default).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['customer_id', 'start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'description': 'End date in YYYY-MM-DD format'}, 'start_date': {'type': 'string', 'description': 'Start date in YYYY-MM-DD format'}, 'customer_id': {'type': 'string', 'description': 'The customer ID to get billing report for'}}}
Input schema
{'type': 'object'}
Input schema
{'type': 'object'}
Input schema
{'type': 'object', 'required': ['user_id'], 'properties': {'user_id': {'type': 'string', 'description': 'Firebase UID of the user whose cost-rate history to retrieve.'}}}
Input schema
{'type': 'object', 'required': ['customer_id'], 'properties': {'customer_id': {'type': 'string', 'description': 'The unique identifier of the customer to retrieve information for'}}}
Input schema
{'type': 'object', 'properties': {'month': {'type': 'string', 'description': 'Month to get metrics for in YYYY-MM format (e.g. 2026-01). Defaults to current month if not provided.'}}}
Input schema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'description': 'End date in YYYY-MM-DD format'}, 'start_date': {'type': 'string', 'description': 'Start date in YYYY-MM-DD format'}, 'employee_name': {'type': 'string', 'description': "Name of the employee to look up. Leave empty or say 'me' for your own timesheet."}}}
Input schema
{'type': 'object', 'properties': {'status': {'type': 'string', 'description': 'Filter by status: Open or Closed (optional).'}, 'customer_id': {'type': 'string', 'description': 'Filter by customer id (optional).'}}}
Input schema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'scope': {'type': 'string', 'description': "Scope of the summary: 'user' for individual user hours, 'team' for organization-wide overview. Defaults to 'user'."}, 'end_date': {'type': 'string', 'description': 'End date for the summary period (ISO 8601 format, e.g. 2026-01-31)'}, 'start_date': {'type': 'string', 'description': 'Start date for the summary period (ISO 8601 format, e.g. 2026-01-01)'}}}
Input schema
{'type': 'object'}
Input schema
{'type': 'object', 'required': ['invoice_id'], 'properties': {'invoice_id': {'type': 'string', 'description': 'ID of the invoice to retrieve (required).'}}}
Input schema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'description': 'End date for the analytics period (ISO 8601 format, e.g. 2026-01-31)'}, 'start_date': {'type': 'string', 'description': 'Start date for the analytics period (ISO 8601 format, e.g. 2026-01-01)'}}}
Input schema
{'type': 'object', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'The unique identifier of the project to retrieve status for'}}}
Input schema
{'type': 'object', 'required': ['project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'The unique identifier of the project. Resolve a project name to its ID with find_billing_work or list_projects first.'}}}
Input schema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'end_date': {'type': 'string', 'description': 'End date for the utilization period (ISO 8601 format, e.g. 2026-01-31)'}, 'start_date': {'type': 'string', 'description': 'Start date for the utilization period (ISO 8601 format, e.g. 2026-01-01)'}}}
Input schema
{'type': 'object'}
Input schema
{'type': 'object', 'required': ['email', 'role'], 'properties': {'role': {'enum': ['Admin', 'Finance', 'Manager', 'Member', 'Viewer'], 'type': 'string', 'description': 'Role to grant on acceptance (required). One of: Admin, Finance, Manager, Member, Viewer. You cannot invite at a role more privileged than your own.'}, 'email': {'type': 'string', 'description': 'Email address of the person to invite (required).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['invoice_id'], 'properties': {'invoice_id': {'type': 'string', 'description': 'Id of the Draft invoice to issue.'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object'}
Input schema
{'type': 'object'}
Input schema
{'type': 'object', 'properties': {'status': {'type': 'string', 'description': 'Optional: filter by invoice status (e.g. Draft, Issued, Paid, Void).'}, 'page_size': {'type': 'integer', 'description': 'Number of results per page (default 20, max 100).'}, 'customer_id': {'type': 'string', 'description': 'Optional: filter by customer ID.'}, 'page_number': {'type': 'integer', 'description': 'Page number, 1-based (default 1).'}}}
Input schema
{'type': 'object', 'required': ['start_date', 'end_date'], 'properties': {'limit': {'type': 'integer', 'description': 'Optional maximum number of entries to return (1-200, default 200). Entries are returned most-recent first.'}, 'end_date': {'type': 'string', 'description': 'End date of the range (ISO 8601 format, e.g. 2026-01-31)'}, 'start_date': {'type': 'string', 'description': 'Start date of the range (ISO 8601 format, e.g. 2026-01-01)'}}}
Input schema
{'type': 'object', 'properties': {'customer_id': {'type': 'string', 'description': 'Optional customer ID to filter projects by customer'}}}
Input schema
{'type': 'object', 'properties': {'page': {'type': 'number', 'description': '1-based page number (default 1).'}, 'page_size': {'type': 'number', 'description': 'Items per page (default 20).'}, 'entity_type': {'type': 'string', 'description': 'Filter by type: Customer, Project, Task, or SubTask. Omit for all types.'}}}
Input schema
{'type': 'object'}
Input schema
{'type': 'object', 'required': ['subtask_id', 'date', 'hours'], 'properties': {'date': {'type': 'string', 'description': 'Date of the work (ISO 8601 format, e.g. 2026-01-15).'}, 'text': {'type': 'string', 'description': 'Optional description of the work performed.'}, 'hours': {'type': 'number', 'description': 'Number of hours worked (greater than 0 and at most 24).'}, 'start_time': {'type': 'string', 'description': 'Optional start time of day in 24-hour HH:mm (e.g. "12:00"). Set this when the user gives a specific time or a time range (and put the range length in \'hours\'); the entry then runs from this time for \'hours\'. Defaults to 09:00 when omitted.'}, 'subtask_id': {'type': 'string', 'description': 'Id of the subtask to log time against. All time entries are recorded at the subtask level.'}}}
Input schema
{'type': 'object', 'required': ['action'], 'properties': {'name': {'type': 'string', 'description': 'Optional schedule notes/name.'}, 'action': {'enum': ['create', 'update', 'delete', 'assign'], 'type': 'string', 'description': 'What to do (required): create, update, delete, or assign.'}, 'is_active': {'type': 'boolean', 'description': 'Whether this schedule is active (create/update).'}, 'schedule_id': {'type': 'string', 'description': 'Id of your schedule (required for update, delete, assign).'}, 'default_hours': {'type': 'number', 'description': 'Standard daily working hours for a simple schedule (e.g. 8).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['invoice_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'paid_date': {'type': 'string', 'description': 'Optional payment date (ISO 8601). Defaults to today.'}, 'invoice_id': {'type': 'string', 'description': 'Id of the invoice to mark as paid.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['time_report_ids'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'invoice_id': {'type': 'string', 'description': 'Optional ID of an existing invoice to link these time reports to.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'time_report_ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of time report IDs to mark as invoiced (required, at least one).'}}}
Input schema
{'type': 'object', 'required': ['project_id', 'new_customer_id'], 'properties': {'project_id': {'type': 'string', 'description': 'ID of the project to move (required).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'new_customer_id': {'type': 'string', 'description': 'ID of the destination customer (required, must belong to your organization).'}}}
Input schema
{'type': 'object', 'required': ['subtask_id', 'new_task_id'], 'properties': {'subtask_id': {'type': 'string', 'description': 'ID of the subtask to move (required).'}, 'new_task_id': {'type': 'string', 'description': 'ID of the destination task (required, must belong to your organization).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['task_id', 'new_project_id'], 'properties': {'task_id': {'type': 'string', 'description': 'ID of the task to move (required).'}, 'new_project_id': {'type': 'string', 'description': 'ID of the destination project (required, must belong to your organization).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['entity_id', 'entity_type'], 'properties': {'entity_id': {'type': 'string', 'description': 'Id of the recycle-bin entity to permanently delete.'}, 'entity_type': {'type': 'string', 'description': 'Type of entity to permanently delete. One of: Customer, Project, Task, SubTask.'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['year', 'month'], 'properties': {'year': {'type': 'integer', 'description': 'Calendar year of the month to recall (e.g. 2026).'}, 'month': {'type': 'integer', 'description': 'Calendar month to recall (1-12).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['invoice_id'], 'properties': {'invoice_id': {'type': 'string', 'description': 'Id of the issued invoice to void and reissue as a new Draft.'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['submission_period_id', 'comment'], 'properties': {'comment': {'type': 'string', 'description': 'Rejection reason shown to the reporter. Required so they know what to fix.'}, 'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'submission_period_id': {'type': 'string', 'description': 'Id of the submission period to reject (from get_pending_approvals or list_approval_history).'}}}
Input schema
{'type': 'object', 'required': ['org_user_id'], 'properties': {'org_user_id': {'type': 'string', 'description': 'Id of the OrganizationUser record to remove (not the Firebase userId).'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['customer_id', 'org_user_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'customer_id': {'type': 'string', 'description': 'Id of the customer to remove the user from.'}, 'org_user_id': {'type': 'string', 'description': 'OrganizationUsers.Id of the member to unassign.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['org_user_id', 'project_id'], 'properties': {'project_id': {'type': 'string', 'description': 'Id of the project to remove the user from.'}, 'org_user_id': {'type': 'string', 'description': 'Id of the OrganizationUser to remove from the project (not the Firebase user id).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['year', 'month'], 'properties': {'year': {'type': 'integer', 'description': 'Calendar year of the month to reopen (e.g. 2026).'}, 'month': {'type': 'integer', 'description': 'Calendar month to reopen (1-12).'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['submission_period_id'], 'properties': {'comment': {'type': 'string', 'description': 'Optional comment explaining why the period is being reopened. Shown to the reporter.'}, 'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'submission_period_id': {'type': 'string', 'description': 'Id of the submission period to reopen (from get_pending_approvals or list_approval_history).'}}}
Input schema
{'type': 'object', 'required': ['invite_id'], 'properties': {'invite_id': {'type': 'string', 'description': 'Id of the pending invitation to resend.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['entity_id', 'entity_type'], 'properties': {'entity_id': {'type': 'string', 'description': 'Id of the deleted entity to restore.'}, 'entity_type': {'type': 'string', 'description': 'Type of entity to restore. One of: Customer, Project, Task, SubTask.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'number', 'description': 'Maximum results to return (default 30).'}, 'query': {'type': 'string', 'description': 'Search text — matches by entity id (prefix) and name (contains).'}}}
Input schema
{'type': 'object', 'required': ['invoice_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'invoice_id': {'type': 'string', 'description': 'Id of the issued invoice to mark as sent.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'properties': {'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'budget_warning_threshold_percent': {'type': 'integer', 'description': 'Utilization % at which a project is flagged At-Risk (must be less than the critical threshold, 1-99).'}, 'budget_critical_threshold_percent': {'type': 'integer', 'description': 'Utilization % at which a project is flagged Over-Budget (must be greater than the warning threshold, 2-100).'}}}
Input schema
{'type': 'object', 'required': ['entity', 'entity_id', 'field_id', 'value'], 'properties': {'value': {'type': 'string', 'description': "The value to set, as a string. It is validated/coerced to the field's declared type (Number, Date, DateTime, or one of the list options)."}, 'entity': {'enum': ['billing_projects', 'billing_tasks', 'billing_sub_tasks', 'sub_tasks_time_reports', 'billing_customers'], 'type': 'string', 'description': 'The entity type (required). One of: billing_projects, billing_tasks, billing_sub_tasks, sub_tasks_time_reports, billing_customers.'}, 'field_id': {'type': 'string', 'description': 'The field_id of the custom field definition (required). Must be defined for this entity type.'}, 'entity_id': {'type': 'string', 'description': 'Id of the specific entity instance to set the value on (required). Must be in your organization.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Schedule name (required when creating).'}, 'notes': {'type': 'string', 'description': 'Optional free-text notes.'}, 'is_active': {'type': 'boolean', 'description': 'Whether the profile is active. Defaults to true on create.'}, 'schedule_id': {'type': 'string', 'description': 'Id of an existing schedule to UPDATE. Omit to CREATE a new one.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'weekly_schedule': {'type': 'string', 'description': 'A JSON object (as a string) mapping lowercase day names (sunday..saturday) to a {"start":"HH:mm","end":"HH:mm"} window, or null for a non-working day. Example: {"monday":{"start":"09:00","end":"18:00"},"sunday":null}.'}, 'first_day_of_week': {'type': 'integer', 'description': 'First day of the week: 0=Sunday .. 6=Saturday (1=Monday default).'}, 'default_for_countries': {'type': 'string', 'description': 'Optional comma-separated ISO-2 country codes this profile is the default for, e.g. "US,CA".'}}}
Input schema
{'type': 'object', 'required': ['user_id', 'hourly_rate'], 'properties': {'user_id': {'type': 'string', 'description': 'Id (or Firebase UID) of the member whose cost rate is being set (required). Must be a member of your organization; cannot be yourself.'}, 'currency': {'type': 'string', 'description': 'Optional ISO 4217 currency code (e.g. USD, EUR). Defaults to USD.'}, 'hourly_rate': {'type': 'number', 'description': 'The hourly cost rate, a positive number (required).'}, 'effective_to': {'type': 'string', 'description': 'Optional date this rate stops applying (YYYY-MM-DD). Omit for an open-ended rate.'}, 'effective_from': {'type': 'string', 'description': 'Optional date this rate takes effect (YYYY-MM-DD). Defaults to today.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['subtask_id'], 'properties': {'subtask_id': {'type': 'string', 'description': 'Id of the subtask to track time against.'}, 'description': {'type': 'string', 'description': 'Optional description of the work being tracked.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'properties': {'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['year', 'month'], 'properties': {'year': {'type': 'integer', 'description': 'Calendar year of the month to submit (e.g. 2026).'}, 'month': {'type': 'integer', 'description': 'Calendar month to submit (1-12).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['country', 'year'], 'properties': {'year': {'type': 'integer', 'description': 'The calendar year to look up holidays for (e.g. 2026).'}, 'country': {'type': 'string', 'description': 'ISO-2 country code (two letters), e.g. "US", "IL", "GB", "DE".'}}}
Input schema
{'type': 'object', 'required': ['time_report_id'], 'properties': {'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'time_report_id': {'type': 'string', 'description': 'ID of the time report whose most-recent write-off should be reversed (required).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['customer_id'], 'properties': {'name': {'type': 'string', 'description': 'New customer name (2-50 characters).'}, 'status': {'enum': ['Active', 'Inactive'], 'type': 'string', 'description': 'Customer status. One of: Active, Inactive.'}, 'country': {'type': 'string', 'description': 'Customer country.'}, 'currency': {'type': 'string', 'description': 'ISO 4217 currency code (e.g. USD, EUR).'}, 'customer_id': {'type': 'string', 'description': 'Id of the customer to update (required). Must be a customer in your organization.'}, 'description': {'type': 'string', 'description': 'Customer description (max 200 characters).'}, 'contact_name': {'type': 'string', 'description': 'Primary contact person name.'}, 'contact_email': {'type': 'string', 'description': 'Primary contact email address.'}, 'contact_phone': {'type': 'string', 'description': 'Primary contact phone number.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['field_definition_id'], 'properties': {'type': {'enum': ['String', 'Number', 'Date', 'DateTime', 'ListOfValues'], 'type': 'string', 'description': 'New field data type. One of: String, Number, Date, DateTime, ListOfValues.'}, 'title': {'type': 'string', 'description': 'New human-readable label.'}, 'is_mandatory': {'type': 'boolean', 'description': 'Whether a value is required when creating/updating the entity.'}, 'list_of_values': {'type': 'array', 'items': {'type': 'string'}, 'description': 'New options (for a ListOfValues field; at least one non-blank option).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'field_definition_id': {'type': 'string', 'description': 'Id of the custom field definition to update (required). Must belong to your organization.'}}}
Input schema
{'type': 'object', 'required': ['invoice_id'], 'properties': {'notes': {'type': 'string', 'description': 'Notes to appear on the invoice.'}, 'due_date': {'type': 'string', 'description': 'Due date override (ISO 8601).'}, 'invoice_id': {'type': 'string', 'description': 'Id of the draft invoice to update.'}, 'payment_terms': {'type': 'string', 'description': 'Payment terms, e.g. "Net 30".'}, 'internal_notes': {'type': 'string', 'description': 'Internal notes (not on the printed invoice).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'payment_instructions': {'type': 'string', 'description': 'Bank / payment instructions for the customer.'}, 'purchase_order_number': {'type': 'string', 'description': 'Customer PO number to reference on the invoice.'}}}
Input schema
{'type': 'object', 'required': ['frame_order_id', 'reference'], 'properties': {'notes': {'type': 'string', 'description': 'Updated free-text notes (max 2000 chars).'}, 'currency': {'type': 'string', 'description': 'Updated ISO 4217 currency code (e.g. USD).'}, 'end_date': {'type': 'string', 'description': 'Updated end date (YYYY-MM-DD, >= start_date), or omit to clear.'}, 'reference': {'type': 'string', 'description': 'New unique reference string for this (org, customer), max 100 chars.'}, 'start_date': {'type': 'string', 'description': 'Updated start date (YYYY-MM-DD), or omit to clear.'}, 'description': {'type': 'string', 'description': 'Updated description (max 500 chars).'}, 'total_hours': {'type': 'number', 'description': 'Updated contracted hours cap (must be > 0, or omit/null to clear).'}, 'total_amount': {'type': 'number', 'description': 'Updated contracted amount cap (must be > 0, or omit/null to clear).'}, 'frame_order_id': {'type': 'string', 'description': 'Id of the frame order to update.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['profile_id'], 'properties': {'name': {'type': 'string', 'description': 'New profile name.'}, 'notes': {'type': 'string', 'description': 'Optional free-text notes.'}, 'holidays': {'type': 'string', 'description': 'A JSON array (as a string) that REPLACES the profile\'s holidays, each: {"date":"YYYY-MM-DD","name":"...","full_day_off":true|false,"window_start":"HH:mm","window_end":"HH:mm"}. Dates must be within the profile\'s year.'}, 'is_active': {'type': 'boolean', 'description': 'Whether the profile is active.'}, 'profile_id': {'type': 'string', 'description': 'Id of the holiday profile to update (required). Must belong to your organization.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'default_for_countries': {'type': 'string', 'description': 'Optional comma-separated ISO-2 country codes this profile is the default for, e.g. "US,CA".'}}}
Input schema
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Organization display name.'}, 'country': {'type': 'string', 'description': 'Organization country.'}, 'base_currency': {'type': 'string', 'description': 'Base ISO 4217 currency code (e.g. USD, EUR).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'default_time_zone': {'type': 'string', 'description': 'Default IANA/Windows time zone id (e.g. America/New_York).'}, 'first_day_of_month': {'type': 'integer', 'description': 'Day the billing month starts (1-28).'}, 'auto_close_month_after_days': {'type': 'integer', 'description': 'Auto-close a month this many days after it ends (0 = never).'}, 'budget_warning_threshold_percent': {'type': 'integer', 'description': 'Utilization % at which a project is flagged At-Risk (must be less than the critical threshold).'}, 'budget_critical_threshold_percent': {'type': 'integer', 'description': 'Utilization % at which a project is flagged Over-Budget (must be greater than the warning threshold).'}}}
Input schema
{'type': 'object', 'required': ['project_id'], 'properties': {'name': {'type': 'string', 'description': 'New project name.'}, 'status': {'enum': ['Active', 'OnHold', 'Completed', 'Cancelled'], 'type': 'string', 'description': 'Project status. One of: Active, OnHold, Completed, Cancelled.'}, 'project_id': {'type': 'string', 'description': 'Id of the project to update (required). Must be a project in your organization.'}, 'description': {'type': 'string', 'description': 'Project description (max 500 characters).'}, 'billing_types': {'type': 'string', 'description': 'Comma-separated list of billing types to allow on this project. One or more of: TM, Fix, OVH. Replaces the entire set — include all types you want to keep.'}, 'tm_hour_limit': {'type': 'integer', 'description': 'T&M (Time & Materials) hour limit for this project (0 = unlimited).'}, 'fix_hour_limit': {'type': 'integer', 'description': 'Fixed-price hour limit for this project (0 = unlimited).'}, 'ovh_hour_limit': {'type': 'integer', 'description': 'Overhead hour limit for this project (0 = unlimited).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Id of the scheduled report to update.'}, 'name': {'type': 'string', 'description': 'New name (optional).'}, 'format': {'type': 'string', 'description': 'New format: pdf or csv (optional).'}, 'cadence': {'type': 'string', 'description': 'New cadence: Daily, Weekly, or Monthly (optional).'}, 'is_active': {'type': 'boolean', 'description': 'Enable (true) or disable (false) the schedule (optional).'}, 'recipients': {'type': 'string', 'description': 'New comma-separated recipient emails (optional).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['subtask_id'], 'properties': {'name': {'type': 'string', 'description': 'New subtask name.'}, 'status': {'enum': ['Active', 'Inactive', 'Completed'], 'type': 'string', 'description': 'Subtask status. One of: Active, Inactive, Completed.'}, 'hour_limit': {'type': 'integer', 'description': "Hour limit for this subtask (0 = unlimited). Validated against the parent task's limit for the subtask's billing type."}, 'subtask_id': {'type': 'string', 'description': 'Id of the subtask to update (required). Must be a subtask in your organization.'}, 'description': {'type': 'string', 'description': 'Subtask description.'}, 'billing_type': {'enum': ['TM', 'Fix', 'OVH'], 'type': 'string', 'description': 'Billing type for this subtask. One of: TM, Fix, OVH. Must be allowed by the parent task.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['task_id'], 'properties': {'name': {'type': 'string', 'description': 'New task name.'}, 'status': {'enum': ['Active', 'Inactive', 'Completed'], 'type': 'string', 'description': 'Task status. One of: Active, Inactive, Completed.'}, 'task_id': {'type': 'string', 'description': 'Id of the task to update (required). Must be a task in your organization.'}, 'description': {'type': 'string', 'description': 'Task description.'}, 'tm_hour_limit': {'type': 'integer', 'description': 'T&M (Time & Materials) hour limit for this task (0 = unlimited).'}, 'fix_hour_limit': {'type': 'integer', 'description': 'Fixed-price hour limit for this task (0 = unlimited).'}, 'ovh_hour_limit': {'type': 'integer', 'description': 'Overhead hour limit for this task (0 = unlimited).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['time_report_id'], 'properties': {'date': {'type': 'string', 'description': 'New date (ISO 8601 YYYY-MM-DD).'}, 'text': {'type': 'string', 'description': 'New description (max 1000 characters).'}, 'hours': {'type': 'number', 'description': 'New duration in hours (> 0 and ≤ 24).'}, 'start_time': {'type': 'string', 'description': 'New start time in 24-h HH:mm.'}, 'time_report_id': {'type': 'string', 'description': 'Id of the time entry to update.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'properties': {'time_format': {'enum': ['12h', '24h'], 'type': 'string', 'description': 'Clock format. One of: 12h, 24h.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}, 'theme_preference': {'enum': ['light', 'dark', 'system'], 'type': 'string', 'description': 'UI theme preference. One of: light, dark, system.'}, 'default_day_sub_view': {'enum': ['timeline', 'list', 'stats', 'table'], 'type': 'string', 'description': 'Default sub-view for the day view. One of: timeline, list, stats, table.'}, 'default_week_sub_view': {'enum': ['calendar', 'list', 'timeline'], 'type': 'string', 'description': 'Default sub-view for the week view. One of: calendar, list, timeline.'}, 'default_month_sub_view': {'enum': ['calendar', 'list', 'timeline'], 'type': 'string', 'description': 'Default sub-view for the month view. One of: calendar, list, timeline.'}, 'default_time_entry_view': {'enum': ['day', 'week', 'month'], 'type': 'string', 'description': 'Default time-entry view. One of: day, week, month.'}}}
Input schema
{'type': 'object', 'required': ['org_user_id'], 'properties': {'country': {'type': 'string', 'description': 'Updated country.'}, 'timezone': {'type': 'string', 'description': 'Updated timezone (IANA or Windows id).'}, 'job_title': {'type': 'string', 'description': 'Updated job title.'}, 'last_name': {'type': 'string', 'description': 'Updated last name.'}, 'first_name': {'type': 'string', 'description': 'Updated first name.'}, 'org_user_id': {'type': 'string', 'description': 'Id of the OrganizationUser to update.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['favorite_id'], 'properties': {'favorite_id': {'type': 'string', 'description': 'Id of the favorite to record usage for.'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['csv_content'], 'properties': {'csv_content': {'type': 'string', 'description': 'The CSV content to validate (use the template from get_import_template).'}}}
Input schema
{'type': 'object', 'required': ['invoice_id', 'reason'], 'properties': {'reason': {'type': 'string', 'description': 'Required reason for voiding (recorded in the audit trail).'}, 'invoice_id': {'type': 'string', 'description': 'Id of the issued invoice to void.'}, 'confirm_token': {'type': 'string', 'description': 'Token returned by the preview (call this tool once with no token to get it). Required to commit; expires in ~10 minutes.'}, 'idempotency_key': {'type': 'string', 'description': 'Required when committing (confirm_token present): retrying with the same key returns the original result instead of acting twice.'}}}
Input schema
{'type': 'object', 'required': ['time_report_id', 'hours', 'reason'], 'properties': {'hours': {'type': 'number', 'description': 'Number of hours to write off (required, must be > 0 and ≤ remaining billable hours).'}, 'reason': {'type': 'string', 'description': 'Reason for the write-off (required).'}, 'confirm': {'type': 'boolean', 'description': 'Set true to perform the action. Omit or false returns a preview only — nothing is written.'}, 'time_report_id': {'type': 'string', 'description': 'ID of the approved time report to write off hours from (required).'}, 'idempotency_key': {'type': 'string', 'description': 'Optional caller-supplied key; retrying with the same key returns the original result instead of acting twice.'}}}
Recent tool changes
Similar MCP servers
AdButler
Manages AdButler advertisers, campaigns, ad items, audiences, zones, creatives, catalogs, and advertising reports.
Duvo MCP
Provides governed retail and CPG operations for cases, queues, approvals, automations, process documentation, integrations, and a…
Lovie Company Formation
Supports company formation and business administration with bank accounts, cards, invoicing, bookkeeping, accounting periods, and…
freedom-mcp
Supports company operations through commitments, teams, agents, customer evidence, leads, content workflows, spreadsheets, commer…
独行录 / opcmenu
Supports founder and company discovery, collaboration goals and tasks, events and signups, networking, messaging, profiles, produ…
Meta Council
Provides governed workflows for consulting, outreach, sales deals, invoices, marketing campaigns, content approvals, accounting a…
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…