QuickBooks Time
STDIOCombined server providing access to all QuickBooks Time API functionality.
Combined server providing access to all QuickBooks Time API functionality.
This is a combined MCP server that provides access to all QuickBooks Time API functionality through a single interface. It combines the functionality of four separate servers:
I would LOVE help improving this project! Just glad to be able to give something back finally!
This entire project was developed and published using artificial intelligence (Anthropic, OpenAI, Llama/META), as I personally cannot write much code without assistance. While every effort has been made to ensure quality and functionality, there may be imperfections or areas for improvement. I welcome any feedback, corrections, or suggestions from the community.
pip install -r requirements.txt
.env
file with your QuickBooks Time access token:QB_TIME_ACCESS_TOKEN=your_access_token_here
NODE_ENV=development
To use this server with Claude Desktop, you'll need to configure it in your Claude Desktop settings. Here's an example configuration:
{ "globalShortcut": "Ctrl+Q", "mcpServers": { "qb-time-tools": { "command": "python", "args": [ "./qb-time-mcp-server/main.py" ], "env": { "QB_TIME_ACCESS_TOKEN": "your_quickbooks_time_access_token_here" } } } }
get_jobcodes
: Get jobcodes with advanced filtering options
ids
: (array of numbers, optional) Comma separated list of jobcode IDsname
: (string, optional) Filter by jobcode name, supports wildcard (*) matching from string startactive
: (string, optional) Filter by status: "yes", "no", "both" (default: "yes")type
: (string, optional) Filter by type: "regular", "pto", "paid_break", "unpaid_break", "all" (default: "regular")parent_ids
: (array of numbers, optional) Filter by parent jobcode IDs. Special values: 0 (top-level only), -1 (all levels)customfields
: (boolean, optional) Include custom fields in responsemodified_before
: (string, optional) Filter by modification date (ISO 8601 format)modified_since
: (string, optional) Filter by modification date (ISO 8601 format)page
: (number) Page number for paginationlimit
: (number) Results per page (max 200)get_jobcode
: Get a specific jobcode by ID
id
: (number) The ID of the jobcode to retrieveget_jobcode_hierarchy
: Get complete jobcode hierarchy structure
parent_ids
: (array of numbers, optional) Filter by parent IDs. Values: 0 (top-level), -1 (all), or specific IDsactive
: (string, optional) Filter by status: "yes", "no", "both" (default: "yes")type
: (string, optional) Filter by type: "regular", "pto", "paid_break", "unpaid_break", "all" (default: "regular")customfields
: (boolean, optional) Include custom fields in responseget_timesheets
: Get timesheets with filtering
ids
: (array of numbers) Comma separated list of timesheet IDsstart_date
: (string) Returns timesheets on or after this date (YYYY-MM-DD)modified_before
: (string) Returns timesheets modified before this time (ISO 8601)modified_since
: (string) Returns timesheets modified since this time (ISO 8601)end_date
: (string) Returns timesheets on or before this date (YYYY-MM-DD)user_ids
: (array of numbers) Filter by specific user IDsgroup_ids
: (array of numbers) Filter by specific group IDsjobcode_ids
: (array of numbers) Filter by specific jobcode IDs (includes children)payroll_ids
: (array of numbers) Filter by specific payroll IDson_the_clock
: (string) Filter by current working status: "yes", "no", "both" (default: "no")jobcode_type
: (string) Filter by type: "regular", "pto", "paid_break", "unpaid_break", "all" (default: "all")page
: (number) Page numberlimit
: (number) Results per pageget_timesheet
: Get a specific timesheet by ID
id
: (number) The ID of the timesheet to retrieveget_current_timesheets
: Get currently active timesheets
on_the_clock
: (string) Must be set to "yes"user_ids
: (array of numbers) Filter active timesheets for specific usersgroup_ids
: (array of numbers) Filter active timesheets for users in specific groupsjobcode_ids
: (array of numbers) Filter active timesheets for specific jobcodessupplemental_data
: (string) Include supplemental data: "yes", "no" (default: "yes")get_users
: Get all users with filtering
ids
: (array of numbers, optional) Filter by specific user IDsnot_ids
: (array of numbers, optional) Exclude specific user IDsemployee_numbers
: (array of numbers, optional) Filter by employee numbersusernames
: (array of strings, optional) Filter by specific usernamesgroup_ids
: (array of numbers, optional) Filter by group membershipnot_group_ids
: (array of numbers, optional) Exclude users from specific groupspayroll_ids
: (array of strings, optional) Filter by payroll identification numbersactive
: (string, optional) Filter by status: "yes", "no", "both" (default: "yes")first_name
: (string, optional) Filter by first name (supports wildcards *)last_name
: (string, optional) Filter by last name (supports wildcards *)modified_before
: (string, optional) Filter by modification date (ISO 8601)modified_since
: (string, optional) Filter by modification date (ISO 8601)page
: (number, optional) Page number (default: 1)per_page
: (number, optional) Results per page (default: 50, max: 50)get_user
: Get a specific user by ID
id
: (number) The ID of the user to retrieveget_current_user
: Get currently authenticated user
get_groups
: Get all groups from QuickBooks Time
ids
: (array of numbers) Filter by specific group IDsactive
: (string) Filter by status: "yes", "no", "both" (default: "yes")manager_ids
: (array of numbers) Filter groups by manager user IDssupplemental_data
: (string) Include supplemental data: "yes", "no" (default: "yes")get_projects
: Get projects with filtering
ids
: (array of numbers) Filter by specific project IDsactive
: (string) Filter by status: "yes", "no", "both" (default: "yes")client_id
: (number) Filter by client IDjobcode_id
: (number) Filter by associated jobcode IDmodified_before
: (string) Filter by modification date (ISO 8601)modified_since
: (string) Filter by modification date (ISO 8601)page
: (number) Page number (default: 1)per_page
: (number) Results per page (default: 50, max: 50)get_project_activities
: Get project activity logs
project_ids
: (array of numbers) Filter activities to specific projectsuser_ids
: (array of numbers) Filter activities by specific usersactivity_types
: (array of strings) Filter by activity types: "status_change", "note_added", "budget_change", "date_change", "custom_field_change"modified_before
: (string) Filter by modification date (ISO 8601)modified_since
: (string) Filter by modification date (ISO 8601)page
: (number) Page number (default: 1)per_page
: (number) Results per page (default: 50, max: 50)get_current_totals
: Get current totals snapshot including shift and day totals
user_ids
: (array of numbers) Filter totals to specific usersgroup_ids
: (array of numbers) Filter totals for users in specific groupsjobcode_ids
: (array of numbers) Filter totals for specific jobcodescustomfield_query
: (string) Filter by custom field values in format: <customfield_id>|get_payroll
: Get payroll report
start_date
: (string) Start of pay period (YYYY-MM-DD)end_date
: (string) End of pay period (YYYY-MM-DD)user_ids
: (array of numbers) Filter payroll for specific usersgroup_ids
: (array of numbers) Filter payroll for users in specific groupsinclude_zero_time
: (boolean) Include users with no time entries (default: false)get_payroll_by_jobcode
: Get payroll report grouped by jobcode
start_date
: (string) Start of pay period (YYYY-MM-DD)end_date
: (string) End of pay period (YYYY-MM-DD)user_ids
: (array of numbers) Filter payroll for specific usersgroup_ids
: (array of numbers) Filter payroll for users in specific groupsjobcode_ids
: (array of numbers) Filter payroll for specific jobcodesjobcode_type
: (string) Filter by type: "regular", "pto", "paid_break", "unpaid_break"include_zero_time
: (boolean) Include jobcodes with no time entries (default: false)get_project_report
: Get detailed project report with time entries
start_date
: (string) Start date in YYYY-MM-DD formatend_date
: (string) End date in YYYY-MM-DD formatuser_ids
: (array of numbers) Filter time entries by specific usersgroup_ids
: (array of numbers) Filter time entries by specific groupsjobcode_ids
: (array of numbers) Filter time entries by specific jobcodesjobcode_type
: (string) Filter by type: "regular", "pto", "unpaid_break", "paid_break", "all" (default: "all")customfielditems
: (object) Filter by custom field values in format: {"customfield_id": ["value1", "value2"]}get_custom_fields
: Get custom tracking fields configured on timecards
ids
: (array of numbers) Filter by specific custom field IDsactive
: (string) Filter by status: "yes", "no", "both"applies_to
: (string) Filter by application type: "timesheet", "jobcode", "user"value_type
: (string) Filter by value type: "managed-list", "free-form"page
: (number) Page numberlimit
: (number) Results per pageget_last_modified
: Get last modified timestamps for objects
types
: (array of strings) Types of objects to check (e.g., ["timesheets", "jobcodes", "users"])get_notifications
: Get notifications
page
: (number) Page numberlimit
: (number) Results per pageget_managed_clients
: Get managed clients
page
: (number) Page numberlimit
: (number) Results per pagepython main.py
The server will start and listen for JSON-RPC requests on stdin/stdout.
MIT License - See LICENSE file for details
Contributions are welcome! Please feel free to submit a Pull Request. Given that this project was developed with AI assistance, community input is especially valuable for improving and maintaining the codebase.
For issues and feature requests, please use the GitHub issues page or contact me directly at github.com/aallsbury.