Integration details
Description
The Gusto MCP Server app connects a user’s ChatGPT workspace to their live Gusto payroll and people data, exposing tools for querying company details, payrolls, contractor payments, employee records, departments, compensation, and related structured objects. The tools are optimized for analytical and reporting workflows such as ad-hoc questions, trend analysis over time, and building tables or dashboards directly in the chat. Be aware that users have the opportunity to define the scope of a given connection, which directly impacts the tools and abilities provided to the LLM.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Payroll, EOR & HR Operations
- Secondary Subcategories
- None listed
- Brand
- Gusto
- Access
- Account required
- First tracked
- 2026-09-10
- Tool count
- 58
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Payroll, EOR & HR Operations
View Category58 tools agents can invoke
Marks the Solo S-corp owner's in-progress reasonable-salary estimate as accepted, recording the chosen W-2 salary for IRS-defensibility purposes. Call this LAST in the Reasonable Salary Calculator flow. Before calling, confirm the user has reviewed the calculated estimate and explicitly wants to accept that number; do not call `accept_reasonable_salary` automatically just because a `calculate_reasonable_salary` call succeeded. IMPORTANT - any later change to the estimate's inputs silently clears the acceptance, so accept must be the final step. Takes no arguments; the company and owner come from the token context, never the caller, so it requires an existing company — if the account does not have one yet, call create_company first, otherwise this fails. It accepts the single most recently calculated in-progress estimate for that owner; if several `calculate_reasonable_salary` calls were made, only the latest can be accepted (each overwrote the previous). On success, returns the accepted estimate (id, result as an integer USD amount, range, acceptedAt). On failure, the response `errors` list names a structured kind - "no_in_progress_estimate" (calculate a reasonable salary estimate first), "company_not_eligible" (company is not taxed as an S-corp), or "no_draft_team_member" (owner profile not ready yet, usually a brief race after signup; retry shortly). Does NOT set the owner's actual pay rate, file any tax form, or finalize the estimate to an employee job. ONBOARDING HANDOFF — RSC is reached two ways, and acceptance means different things in each. (1) Standalone: the owner came directly to figure out their salary; after a successful accept, confirm the saved number and you're done. (2) As an onboarding step: an earlier `get_company_onboarding_status` `next_step` routed you here (its `detail` was `reasonable_salary_calculator`). In that case acceptance is NOT the end of onboarding — after a successful accept, call `get_company_onboarding_status` again. Acceptance advances the flow, so the refreshed `next_step` points to the real next step (typically `continue_in_gusto` with the URL to send the owner to). Never invent or hardcode that destination URL yourself; always take it from the refreshed onboarding status — and if it comes back as `set_password` instead, there is no URL to relay: follow that step's own message.
accept_reasonable_salary
Internal tool for payroll calculation. Use run_payroll instead.
calculate_payroll
Calculates an IRS-defensible reasonable salary for an S-corp owner from Bureau of Labor Statistics (BLS) wage data, given the company's ZIP code and one or more occupations. Returns the recommended annual salary, a defensible range, and the BLS wage area. Look up each occupation `code` with `search_business_info` (type `occupation`) first. GATHERING INPUTS — collect what this tool needs conversationally, one step at a time; don't ask for everything in one message and don't assume values. Follow this order: 1. Location first. Ask for the company's 5-digit ZIP code — it sets the BLS wage area. If the user offers only a city or state, ask them for the ZIP rather than guessing one yourself; a guessed ZIP can land on the wrong wage area. 2. Roles, one at a time. Ask what the owner does, then call `search_business_info` (type `occupation`) for that role, present the candidates, and let the user pick the `code` before asking about anything else — never guess BLS codes. Most owners have a single role; only gather more if the user says they wear more than one hat, resolving each role fully before starting the next. 3. Per-role details. For each chosen occupation confirm `experience_level`, plus — for a multi-role owner — the `time_percentage` split and which role is `primary`. Offer a sensible default and let the user adjust; don't apply these silently. 4. Optional refinements. Only if relevant, ask about a part-time `work_schedule` or an `annual_net_revenue` cap; otherwise leave them out. Confirm every input before calling. A failure returns a `kind` and a `message`; branch on `kind`, not on the message text. RECOVERABLE — fix the inputs per the `message` and re-call: `no_occupations` (the `occupations` array was empty — gather at least one role, per step 2), `time_percentages_not_100`, `duplicate_occupation_code`, `multiple_primary_occupations`, `part_time_hours_required`, `incomplete_occupation` (a role is missing an experience level or time percentage), `invalid_occupation_code` (re-run `search_business_info`), `missing_area` and `zip_lookup_failed` (re-confirm the business's 5-digit ZIP), and `salary_data_unavailable` (BLS publishes no wages for that role, even nationally — ask for a different role). Several of these are about one role rather than the whole request. For `duplicate_occupation_code` and `incomplete_occupation` the `message` names the role — fix only that one, and do not re-gather the others. For `invalid_occupation_code` and `salary_data_unavailable` the message does NOT say which role it was, so with more than one role you cannot tell from the response alone: re-check the codes you sent with `search_business_info` rather than guessing, and ask the user before dropping a role. TERMINAL — do NOT re-call with the same company; say what happened and stop: `company_not_eligible` (reasonable salary applies only to companies taxed as an S-corp, which no input change fixes) and `no_draft_team_member` (the owner's profile is not ready yet — tell the user to try again later rather than retrying in this conversation). Treat an unfamiliar `kind` as recoverable by reading its `message`, rather than failing the conversation. Make ONE call once the inputs are confirmed. When the owner fills more than one role (e.g. a founder who both writes software and runs the business as CEO), list every role in the `occupations` array with `time_percentage` values summing to 1.0 in that single call — do not fire separate `calculate_reasonable_salary` calls per role. The tool blends them into one composite salary; separate calls would each overwrite the last. This tool keeps ONE in-progress estimate per company/owner: every successful call overwrites that single estimate and there is no history, so do not issue parallel or speculative calls — to compare scenarios, run them one at a time and show each result before recalculating. The estimate is referenced implicitly by the authenticated company/owner, so this call intentionally returns no `id`; `accept_reasonable_salary` returns the persisted estimate's `id`. After a successful calculation, present the recommended salary and range and ask whether the owner wants to accept it as their W-2 salary; if they confirm, call `accept_reasonable_salary`. Do not call `accept_reasonable_salary` without explicit user confirmation (see that tool's description).
calculate_reasonable_salary
Reports where the company's Plaid bank connection stands. Use this to confirm the outcome of a connect_bank_via_plaid link, since that flow finishes in an external browser window and reports back to Gusto out of band — nothing in this conversation observes it directly. WHEN TO USE: After the user says they have finished (or abandoned) a Plaid link, to find out what actually landed before telling them anything. Also safe to use to check whether a company already has a bank connection before offering the Plaid flow at all. WHEN NOT TO USE: Do not poll this repeatedly in a loop while waiting — the connection only appears once Plaid reports the finished session, so call it when the user says they are done. Do not use it to ask the user for bank account or routing numbers; it only reads existing state. RETURNS: This reports the company's most recent live bank connection, not a roll-up of every bank account it has — a company can hold an already-verified account while a newly connected one is still verifying, and this reports the new one. Always branch on `status`, not on `success` alone — `success: true` only means the check ran. `connected: true` with `status: "connected"` means the bank is verified and onboarding can move on. `status: "pending_micro_deposits"` means the bank is connected but verifying over 1-2 business days; nothing further is needed from the user, so do not re-offer the link. `status: "not_connected"` means nothing landed, so the user likely did not finish. `status: "connection_unusable"` means the latest attempt failed and needs a fresh link. When present, `account_last_digits` is the last few digits of the connected account, safe to read back to the user for confirmation. On error, `{ success: false, error_type, message }`. PREREQUISITES: A valid access token whose company the acting user is a member of. VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.
check_plaid_connection_status
Opens a Plaid-hosted flow where the user connects their company bank account, verifying instantly in most cases. This is the ONLY way to add a bank account during onboarding: the bank questions cannot be answered in chat, and save_company_onboarding_answer rejects them. Whatever the user enters in the Plaid flow goes straight to Plaid and Gusto — this tool does NOT collect bank account numbers, routing numbers, or banking credentials through the conversation, and you never see what was entered. WHEN TO USE: Whenever next_step returns detail `connect_bank`, or the user asks to add or change the company's bank account. There is no manual alternative to offer alongside it. WHEN NOT TO USE: Never ask the user to type a bank login, routing number, or account number into chat, and never offer to enter those on their behalf — not as an alternative to this tool, not if the user asks to, and not if they volunteer the numbers unprompted. Those are entered only in the Plaid flow. If the user will not use Plaid, send them to Gusto to add the account there. Do not call this again for the same company while a link from earlier in this conversation is still pending — wait for the user to say they've finished, then confirm with check_plaid_connection_status before offering it again. RETURNS: Branch on `success`. On success, `{ success: true, status: "plaid_connection_pending", url, message }` — tell the user to open the link, connect their bank, and come back; do not ask them to report back what they saw or any account details. On error, `{ success: false, error_type, message }`. PREREQUISITES: A valid access token whose company the acting user is a member of. VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.
connect_bank_via_plaid
SIGNUP/ONBOARDING PHASE tool, and the first step — the other onboarding tools are company-scoped and fail until this has created a company. Create the user's Gusto company and payroll-admin account once the user has confirmed the details they want to sign up with. Use this tool for account creation; do not call a separate lead tool first (the lead is created server-side). The account email is already established — it is the address the user verified when they signed in. Do not ask the user for an email. Call create_company with the confirmed flag set to false first; the response returns `account_email`. Confirm that address and the company details with the user, then call again with the confirmed flag set to true. Company creation is not the final account step for chat signups. After onboarding setup is complete, Gusto sends a password setup email, and the user must open that email to finish securing the account and sign in to Gusto directly. Required fields, company_name, first_name, last_name, confirmed. Optional enrichment fields, number_employees, phone, states.
create_company
Retrieves comprehensive business profile information including legal name, business entity type (LLC, Corporation, etc.), EIN, primary contact details, and configured locations. Use this to answer questions about company setup, business structure, or basic organizational info. VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.
get_company
SIGNUP/ONBOARDING PHASE tool. Requires an existing company — if the account does not have one yet, this reports company_exists false and next_step create_company; call create_company, then retry. Returns the company's available plans, add-ons, and benefits during onboarding, plus Gusto's recommended package and the company's current selection. Use this to present the options and the recommendation, compare tiers, or answer pricing questions — all from the returned payload. ONCE THE PROFILE IS READY FOR A RECOMMENDATION: when the only required question left in get_company_onboarding_status is the plan choice (tier_selection) — i.e. every other required question is answered — call this tool to present Gusto's recommendation: explain what's included and why it fits their profile, then ask whether they'd like to proceed with the recommended plan or explore other options before you save their tier_selection (via save_company_onboarding_answer). Do NOT wait for tier_selection itself to be answered before presenting the recommendation — the recommendation is what informs that choice. WHEN TO USE: When the user is choosing or asking about a Gusto plan during onboarding — to present available plans/add-ons, show the recommendation and why, compare tiers, or answer "how much does X cost". WHEN NOT TO USE: To read a single onboarding question — use get_onboarding_answer. DATA RETURNED (keys are camelCase): `plans` and `addOns`, each with `key` (the value to save as `plan`/`add_ons`; `stableId` is also present but may be null, so use `key`), `name`, `description`, and a `pricing` object (`baseFee`, `perEmployeeFee`, `currency`; a fee is null when not charged); `benefits` with `key`, `name`, and `pricingNote` (quoted with partner carriers at setup, not on the Gusto invoice); the `recommended` package (`plan`, `addOns`, `benefits`, and a `rationale`) and the company's current `selected` package; readyForPackageRecommendation (whether every required profile question EXCEPT the plan choice is answered — i.e. the recommendation is ready to present); and profileComplete (whether ALL required questions, including the plan choice, are answered). The recommended block is null until readyForPackageRecommendation is true and a recommendation has been computed. The recommendation is computed once and reflects the profile answers at that time; it is not recomputed here if answers change afterward. SIDE EFFECT: not a pure read — the first call made once the profile is ready computes and stores Gusto's recommendation (a one-time computation; later calls do not recompute it). Calling it before the profile is ready is a safe no-op for the recommendation (the recommended block stays null). PREREQUISITES: The recommendation populates once the company's required profile questions EXCEPT the plan choice are answered (see get_company_onboarding_status). VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.
get_company_onboarding_package
SIGNUP/ONBOARDING PHASE tool. Requires an existing company — if the account does not have one yet, this reports company_exists false and next_step create_company; call create_company, then retry. Returns the onboarding status for a company's current experience. The current experience includes its questions — each with a key, a description, whether it has been answered, whether it is required, and a value_schema describing the fields its answer expects (field name, type, and allowed enum values). Use the value_schema to construct the value for save_company_onboarding_answer without guessing field names. Some answers are resolved with a helper tool rather than the value_schema alone: for `industry_selection` call search_business_info (type "industry"), present its candidates and let the user pick one rather than choosing for them — unless they name a code themselves, which already is their pick — and never guess NAICS/SIC codes. Separately, some large, well-known fields are free-text coded — their value_schema shows a string array with no enum list (e.g. states_employees_work_in, international_employees_countries). For these, collect the user's answer in natural language and map it to canonical codes yourself: US states as 2-letter uppercase codes including DC and PR (other US territories are not accepted), and countries as ISO 3166-1 alpha-2 (e.g. GB, IN, MX) — don't present the full list as options. A save with an invalid code returns the allowed values so you can correct it. Also returns total_questions and answered_questions counts (over every question listed here, required or not; questions withheld from this list are not counted). DRIVING ONBOARDING — work through the questions with the user and save each answer with save_company_onboarding_answer. Each question's required flag indicates whether it must be answered for onboarding to proceed. Required questions (required is true) are mandatory — collect an answer for every one, and do NOT offer the user the option to skip them. Only optional questions (required is false) may be skipped — surface them and offer to capture an answer, but make clear the user is free to skip them. Setup is complete once all required questions are answered — optional questions may stay unanswered, so do NOT treat answered_questions == total_questions as the bar. Bank details are withheld from this list entirely and are collected by connect_bank_via_plaid, so every listed question can be answered while the bank account is still outstanding — the counts cannot tell you that, and next_step is what surfaces it: detail connect_bank where the Plaid tool is available, otherwise a hand-off to Gusto to add the account there. Always follow next_step rather than inferring from this list that setup is done. When summarising what is left for the user, say the bank account still needs connecting unless next_step shows it is done — otherwise the summary omits a required step and the user has no way to know it is coming. IMPORTANT - the question list is dynamic; saved answers can re-route the flow (e.g. a solo owner gets different questions than an employer), so this list is stale after any save_company_onboarding_answer call. Re-plan from that call's returned onboarding_status, or re-call this tool. QUESTION ORDER — next_step.next_question_group is the set of question keys to ASK the user RIGHT NOW. They are all safe to ask this turn and independent of each other, so the order among them does not matter — ask them in whatever order and grouping reads most naturally. Use judgment on how to ask: rather than dumping all of them in one message — or asking strictly one at a time — ask them in a few logically-related, digestible chunks (a couple to a handful at a time, grouping related topics, e.g. the workforce questions — headcount and the states employees work in — together). Often it is just one key. This governs the ASK, not the save: save_company_onboarding_answer takes ONE question_key per call and there is no multi-answer save, so after the user replies, make a SEPARATE save_company_onboarding_answer call for each key using the answers you just collected. Each save returns refreshed status that STILL lists the keys you have not saved yet (next_question_group shrinks as you save) — do NOT ask those again, you already have their answers; just keep saving them, one call per key. Do NOT ask a key that is not in next_question_group, or pull later keys in from remaining_question_keys, because a saved answer can re-route the flow and change what comes next. Once you have saved every answer you collected, re-read the refreshed status and ask the new next_question_group; repeat until none remain. next_question_group and remaining_question_keys can be identical (when every remaining question is safe to ask together); remaining_question_keys is the full ordered outstanding list for context and counts — drive from next_question_group. What comes after the required questions depends on the company's current experience, so follow the next_step cue rather than assuming a plan step always follows: answer_questions (answer the questions in next_question_group); continue_in_mcp with detail select_plan (the profile experience — call get_company_onboarding_package to present Gusto's recommended plan, then save tier_selection); continue_in_mcp with detail ein_registration (the company needs a federal EIN before continuing — run the EIN filing tools: file_ein then pay_ein_filing then check_ein_status, then re-call this tool); continue_in_mcp with detail reasonable_salary_calculator (a Solo S-corp owner can set their reasonable W-2 salary now — run the Reasonable Salary Calculator tools: calculate_reasonable_salary then accept_reasonable_salary, then re-call this tool); continue_in_mcp with detail connect_bank (the company's bank account is not connected — call connect_bank_via_plaid and relay its url; bank account and routing numbers cannot be collected here, so never ask for them instead); continue_in_mcp with detail set_password (this account cannot sign in yet, so no url is returned — follow the step's own message and never give out or invent a gusto.com link); continue_in_gusto (nothing left to drive here — relay the returned url; if it is absent, treat the step as set_password); or complete (onboarding is fully finished). A next_step of complete is authoritative: tell the user they're all set and do NOT present any questions — the questions list is empty and the counts are zero regardless of any past unanswered questions. It covers the company's setup, not website access: if the account signed up in chat, check manage_account get_status and mention any unset password alongside the good news. If you drove the onboarding with the user during this conversation, first present a concise recap of the onboarding answers gathered during this conversation (each question covered and its answer) so the user can confirm what was submitted, then tell them they're all set; build that recap from what you gathered in this conversation, not from this payload (which carries no answers), and do not restate sensitive values in full (e.g. SSN, full bank account numbers). If you did not drive onboarding here (e.g. the user just asked whether they are onboarded), simply confirm they're all set without inventing a recap. VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.
get_company_onboarding_status
Retrieves full details for a single pay rate record by UUID, including rate amount, payment frequency, FLSA status, and effective date. Use list_job_compensations first to find the compensation UUID. Call this for specific details about one pay rate entry.
get_compensation
Retrieves full profile for a single domestic (US-based) contractor by UUID, including name, email, business name (if applicable), payment method, and engagement dates. Use list_contractors first to find the contractor UUID. Call this for detailed info about a specific independent worker. International contractor data is not available through this endpoint.
get_contractor
Retrieves full details for a single contractor payment by UUID, including amount, payment method, bonus breakdown, and reimbursements. Use list_contractor_payments first to find the payment UUID. Call this for line-item details of one specific contractor payment.
get_contractor_payment
Retrieves all individual contractor payments within a batched payment group by UUID. Shows each contractor's payment amount and details from that batch. Use list_contractor_payment_groups first to find the group UUID. Call this to see all payments in a single batch run.
get_contractor_payment_group
Retrieves full details for a single department by UUID, including name, parent department (if nested), and list of assigned employees. Use list_departments first to find the department UUID. Call this for details about one specific department.
get_department
Retrieves full profile for a single domestic (US-based) employee by UUID, including name, email, hire date, department, manager, job title, work location, current pay rate, time-off policy assignments, and time-off balances. Use list_employees first to find the employee UUID. Call this when you need detailed info about one specific person. International employee data is not available through this endpoint.
get_employee
Returns per-employee earning breakdowns (commissions, bonuses, tips, etc.) aggregated across all processed payrolls in a date range. Use this when the user asks about specific earning types attributed to individual employees, such as "How much has each employee been paid in commissions this year?" or "Who received bonuses last quarter?" Default date range is year-to-date. This tool provides per-employee attribution that list_payrolls cannot - list_payrolls only has payroll-wide totals. IMPORTANT - Never guess which employees received specific earning types from aggregate totals. Always use this tool for per-employee earning attribution. Note - only includes earnings for domestic (US) employees. International employee earnings are not included.
get_employee_earnings_summary
Retrieves information about an employee being brought back to the company after a previous departure. Includes the new start date and any updated employment terms. Use this to check if someone is a returning worker and when they rejoined.
get_employee_rehire
Retrieves full details for a single home address record by UUID, including street, city, state, ZIP code, and effective dates. Use list_employee_home_addresses first to find the address UUID. Call this for complete address details for one specific record.
get_employee_home_address
Retrieves full details for a single job position by UUID, including title, department, location, FLSA classification, and current pay rate. Use list_employee_jobs first to find the job UUID. Call this for detailed info about a specific role assignment.
get_job
Retrieves full details for a single company location by UUID, including complete address, phone number, and filing addresses for tax purposes. Use list_locations first to find the location UUID. Call this for complete information about a specific office or work site.
get_location
Requires an existing company — if the account does not have one yet, call create_company first, otherwise this fails. Returns the current answer for a single onboarding question, identified by its question_key. Every one of the question's fields is returned — a null field value means that field has not been set. Use this to read the current state of a specific question before deciding whether to update it, or to verify a previous save took effect. WHEN TO USE: When you need the current value of one specific onboarding question. WHEN NOT TO USE: To discover available question_keys or check overall onboarding progress — use get_company_onboarding_status instead. DATA RETURNED: An answer hash containing every one of the question's fields; a null field value means that field has not been answered yet. An unknown question_key returns an error rather than an empty answer. PREREQUISITES: Call get_company_onboarding_status first to discover valid question_keys before calling this tool. VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.
get_onboarding_answer
Retrieves full details for a single pay schedule by UUID, including frequency, anchor dates, and next scheduled pay dates. Use list_pay_schedules first to find the schedule UUID. Call this to see when the next payday is or understand schedule configuration.
get_pay_schedule
Retrieves complete details for a single payroll by UUID, including worker earnings, taxes, deductions, and net pay. This tool is read-only; use update_payroll to modify payroll inputs (hours, memos, bonuses, PTO) or run_payroll to calculate and submit the payroll.
get_payroll
Retrieves detailed time entries for a single timesheet by UUID, including daily hours worked, overtime, breaks, and notes. Third-party time tracking only - there is no native equivalent, and passing a native shift id fails with a transport-level "resource not found" whose text talks about credentials and configuration rather than the real cause. Check that list_time_records reported a third_party source first, and take the timesheet's top-level id from there. For native companies list_time_records already returns per-shift detail, so no follow-up call is needed. Call this for a line-item breakdown of someone's hours for a specific pay period.
get_time_sheet
Returns employees' current time-off balances - available (balance), accrued, used, and pending hours per policy - with each balance attributed to the worker (name) and policy uuid. Policy name and type are included only when the token also holds the time_off_policies:read scope; without it, policy labels come back blank (the policy uuid is still returned). Use this when an admin asks about PTO, sick, or vacation balances (e.g. "how much vacation does each employee have left?"). Optionally scope with employee_uuids or policy_uuids (comma-separated). Note - covers domestic (US) employees; balances reflect the company's configured time-off policies.
get_time_off_balances
Retrieves full detail for a single time-off request by UUID - the worker (name + uuid), status, policy (type + uuid), the per-day hours requested, and the initiator/approver. Employee and employer notes are omitted, since they are free text that may contain health information. Use list_time_off_requests first to discover the request UUID.
get_time_off_request
Returns information about the current API access token including which permissions (scopes) are granted and which company resources can be accessed. Use this to check what data operations are available or troubleshoot access issues before attempting other API calls.
get_token_info
Retrieves full details for a single work location assignment by UUID, including the location address and effective dates. Use list_employee_work_addresses first to find the work address UUID. Call this for complete details about a specific work location assignment.
get_employee_work_address
Lists batched contractor payment runs for the company. A payment group represents multiple contractor payments processed together on the same date. Shows group UUID, check date, and processing status. Use this to see batched payment history or find payment group UUIDs.
list_contractor_payment_groups
Lists all payments made to independent contractors within a date range. Shows payment amounts, check dates, and contractor info. Requires start_date and end_date parameters. Use this to see contractor payment history, audit 1099 payments, or find how much was paid to contractors. Note - only includes payments to domestic (US) contractors. International contractor payments are not included.
list_contractor_payments
Lists all independent contractors (1099 workers) for the company with pagination and search. Returns contractor UUIDs, names, and basic info. Unlike employees (W-2), contractors are paid separately and file their own taxes. Use this to find contractor UUIDs or get a roster of non-employee workers. Returns all contractors including inactive; check the is_active field for current status. Note - this only includes domestic (US-based) contractors. International contractors are not included in results. If the company has international contractors, mention that totals reflect domestic contractors only.
list_contractors
Retrieves the definitions of all custom fields configured for the company, including field names, data types, and selection options. Custom fields let companies track additional worker attributes beyond standard HR data. Use this to understand what custom data is available before querying individual worker field values.
list_custom_fields_schema
Lists all departments in the company org structure, including department names, UUIDs, and which employees are assigned to each. Use this to see the organizational breakdown, find department headcounts, or understand how workers are grouped. Note - department employee lists and headcounts only include domestic (US) employees. International employees are not reflected in these counts.
list_departments
Lists all earning type categories configured for the company, such as regular pay, overtime, bonuses, commissions, tips, and custom earning types. Shows type name, category, and whether it's taxable. Use this to understand available pay types for payroll input.
list_earning_types
Retrieves all custom field values set for a specific employee. Custom fields are company-defined attributes like T-shirt size, emergency contact, certifications, or any other custom data. Use list_custom_fields_schema first to see available field definitions.
list_employee_custom_fields
Retrieves the complete work history timeline for an employee, including all positions held, role changes, and status transitions. Use this to answer questions about someone's tenure, past roles, or employment dates within the organization.
list_employee_employment_history
Lists all residential addresses on file for an employee, including current and historical addresses with effective dates. Home addresses are used for tax withholding calculations and mailing.
list_employee_home_addresses
Lists all job positions held by an employee, including current and past roles. Each job record contains title, location, hire date, and rate information. Use this to see someone's role history or find job UUIDs needed for compensation lookups.
list_employee_jobs
Retrieves offboarding and separation records for an employee, including departure dates, reasons for leaving, and final pay information. Use this to find when someone left the company, their exit date, or details about their offboarding process.
list_employee_terminations
Lists all work locations assigned to an employee, including current and historical assignments with effective dates. Work addresses determine work-state tax jurisdiction. Use this to see where someone works or has worked, especially for remote or multi-location workers.
list_employee_work_addresses
Lists all employees for the company with pagination and filtering options. Returns basic profile data for each person. Filter by onboarding status, active/inactive status, or search by name. Use this to find employee UUIDs, get headcount, or answer questions about the workforce roster. Without filters, returns all employees including terminated; use terminated=false for active employees only. Note - this only includes domestic (US-based) employees. International employees are not included in results or headcount. If the company has international employees, mention that totals reflect domestic employees only.
list_employees
Lists the pay rate history for a job position, showing all salary or hourly rate changes over time. Each entry includes effective date, rate amount, and payment unit (hourly/salary). Use this to see pay history or track when raises were given. By default only the current compensation is returned. Set include to all_compensations to retrieve the full history.
list_job_compensations
Lists all physical office or work locations registered for the company, including addresses and whether each is active. Locations are used for tax filing, work address assignments, and compliance. Use this to see all company offices or find location UUIDs.
list_locations
Lists all pay periods (date ranges when work is performed) for the company, with links to associated payroll runs. Shows start date, end date, check date, and payroll status. Use this to see upcoming pay periods or find which payroll covers a specific date range.
list_pay_periods
Shows which employees are assigned to which pay schedules. Returns mappings between worker UUIDs and schedule UUIDs. Assignment rules vary by company setup - some assign by department, others individually. Use this to find out when a specific person gets paid or which schedule they follow.
list_pay_schedule_assignments
Lists all configured pay schedules for the company, showing frequency (weekly, biweekly, monthly, etc.), name, and schedule UUID. Does not show which workers are on each schedule. Use this to understand pay frequency options or find schedule UUIDs for assignment lookups.
list_pay_schedules
Identifies issues preventing a specific payroll from being processed, such as missing bank accounts, incomplete tax setup, or unsigned documents. Each blocker includes a description and resolution steps. Use this to diagnose why payroll cannot run or to check readiness before processing.
list_payroll_blockers
Lists all payroll runs for the company with filtering options. When called with no arguments, returns all payrolls (processed and unprocessed, regular, off_cycle, and external) from the past 6 months (start_date defaults to 6 months ago, end_date defaults to today). You can filter results by providing processing_statuses, payroll_types, start_date, end_date, or include parameters. Date filters apply to pay period (work dates), not payment dates. Date range constraints are that the range cannot exceed 1 year, and end_date cannot be more than 3 months in the future. Returns payroll UUIDs, check dates, processing status (processed,unprocessed), and type (regular,off_cycle,external). Use include=totals to get payroll-wide aggregate amounts (gross pay, taxes, net pay, total commissions, total bonuses). These totals are NOT broken down per employee. For per-employee earning breakdowns (who received which commissions, bonuses, etc.), use get_employee_earnings_summary instead. IMPORTANT - Never guess or infer which employees received specific earning types from aggregate totals alone. Common use case is to find the next payroll to process by filtering for processing_statuses=unprocessed and selecting the payroll with check_date closest to today's date. Note - payroll data only covers domestic (US) employees. International employee payroll is managed separately and not included here. Payroll sub-state within `unprocessed`: each list item carries `processed` (boolean) and `calculated_at` (nullable timestamp), but the roster (`employee_compensations`) is NOT included in list responses. From this list alone, use `calculated_at` to distinguish sub-states within `processing_statuses=unprocessed`: - pre-prepare candidate: `calculated_at: null`. - calculated: `calculated_at` is a timestamp. When the user asks for "unprepared", "draft", or "not-yet-prepared" payrolls, filter by `processing_statuses=unprocessed` and pick items with `calculated_at: null`. Then call `get_payroll` on the chosen item to confirm the roster is unmaterialized (`employees: []`, `employee_compensations` empty or absent) before invoking `update_payroll` — that combined signal is what makes the pre-prepare materialize path safe.
list_payrolls
Requires an existing company — if the account does not have one yet, call create_company first, otherwise this fails. Lists time records for the company over a pay period. The response is discriminated by `source`: - `source: 'native'` returns `shifts` (clock-in/out events, breaks, durations) plus `workers`, everyone who tracks time at the company, for companies on Gusto's native time tracking. `workers` covers employees and contractors alike, and lists a worker even when they have no shifts in the requested period, so use it to find the `companyMemberUuid` for someone you want to record a first shift for. - `source: 'third_party'` returns `timesheets` for companies with an active third-party time tracking integration, each carrying `shiftStartedAt`, `shiftEndedAt` and `timezone` so you can tell which day it covers. The tool eagerly paginates the third-party feed internally, so callers receive every timesheet in one response. - `source: 'none'` returns neither array; the company has not completed native onboarding and has no active third-party integration. For companies that have both native onboarding and third-party time tracking active, only the third-party data is returned, mirroring what those customers see in product. Always check `source` before reading shape-specific fields. Every shift and timesheet also carries the worker's identity: `firstName`, `lastName`, `preferredName`, `workerType` (`employee`, `contractor`, or `international_contractor`), and the worker's public id - `employeeUuid` for employees or `contractorUuid` for contractors (the other is null). Use these to label records and to join back to employee/contractor tools. Identity fields are null when a member can't be resolved. On native time tracking, a contractor's `clockInTimestamp` and `clockOutTimestamp` are only readable when the time was entered or edited by an admin; for time the contractor clocked themselves both come back null, because Gusto withholds a contractor's raw clock times from everyone but the contractor. `date` and `durationInMinutes` are always populated, so report contractor hours from those rather than treating a null timestamp as a missing shift. Employee timestamps are unaffected.
list_time_records
Lists a company's time-off requests (PTO, sick, vacation, etc.). When called with no filters, returns all requests. Filter by status (comma-separated - pending, approved, declined, consumed), start_date/end_date (YYYY-MM-DD, matched against the request's dates), and employee_uuids (comma-separated) to scope to specific workers. Each request includes the worker (name + uuid), status, policy (type + uuid), the per-day hours requested, and the initiator/approver. Employee and employer notes are omitted, since they are free text that may contain health information. To get full detail for one request, call get_time_off_request with its uuid. Time off may be managed natively in Gusto or by a third-party integration; this returns the company's requests either way. Note - covers domestic (US) workers.
list_time_off_requests
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Gusto alternatives on ChatGPT?
As of 2026-09-10, Gusto competes with Asanify, Deel, Gusto, Justworks, Kronjop, Whack in ChatGPT Payroll, EOR & HR Operations, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.