Skip to main content
Glama

US 1099 contractor vs W-2 parity

contractor_parity
Read-onlyIdempotent

Calculate tax liabilities, statutory benefits, and net take-home cash between W-2 salaried employment and 1099 independent contractor billing, solving the exact breakeven billing rate ($/hr).

Behavior: Deterministic, idempotent calculation with zero external side effects. Computes federal FICA (Social Security up to statutory wage base and Medicare), federal income tax brackets, state income tax, employer health subsidy, 401(k) match, PTO value, SECA tax with 50% above-the-line deduction, and Section 199A QBI deduction. Returns net spendable cash for both employment models, complete tax breakdowns, effective tax rates, and the exact breakeven hourly rate.

Usage Guidelines: Use when an individual or hiring manager is deciding between a W-2 salaried offer and a 1099 contractor contract. Do not use for solo freelancer baseline rate setting without a W-2 benchmark; use billable_floor instead.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ptoDaysNoAnnual W-2 paid time off days (combined vacation and sick leave).
w2SalaryYesW-2 gross annual salary in USD ($/yr). Must be a positive number.
as_of_dateYesCivil date YYYY-MM-DD. Selects the rule pack in force on that date. Required: the engine will not assume a date.
eligibleQBIYesWhether the contractor income qualifies for the Section 199A qualified business income deduction. Required: it changes federal tax and is not assumed.
filingStatusNoIRS income tax filing status: 'single' for unmarried individual or 'mfj' for married filing jointly.single
hoursPerWeekNoExpected billable client hours per week as a 1099 contractor. Must be greater than 0.
weeksPerYearNoActive billable working weeks per year as a 1099 contractor (52 minus unpaid vacation and bench time).
annualExpensesNoAnnual tax-deductible business operating expenses in USD ($/yr) (software, hardware, insurance).
match401kPercentNoW-2 employer 401(k) retirement match as a percentage of gross salary (e.g. 4.0 for 4%).
healthSubsidyAnnualNoAnnual W-2 employer-paid health insurance subsidy in USD ($/yr).
stateTaxRatePercentNoEffective or statutory state income tax rate in percent (e.g. 5.0 for 5%). Set to 0 for states without income tax.
contractorHourlyRateYes1099 contractor hourly billing rate in USD ($/hr). Must be a positive number.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
w2No
verdictNo
currencyNo
metadataNo
contractorNo
disclaimerNo
w2TakeHomeNo
minor_unitsNo
net_cash_deltaNo
contractorTakeHomeNo
breakevenHourlyRateNo
statutory_authorityNo
contractor_advantageNo
breakeven_contractor_hourly_rateNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "breakevenHourlyRate": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "breakeven_contractor_hourly_rate": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "contractor": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "contractorTakeHome": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "contractor_advantage": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "currency": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "disclaimer": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "metadata": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "minor_units": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "net_cash_delta": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "statutory_authority": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "verdict": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "w2": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "w2TakeHome": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed6 schema fields changed
    • addedInput schema / properties / as_of_date
      Added value: +{
      +  "description": "Civil date YYYY-MM-DD. Selects the rule pack in force on that date. Required: the engine will not assume a date.",
      +  "example": "2026-09-26",
      +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +  "type": "string"
      +}
    • removedInput schema / properties / eligibleQBI / default
      Removed value: -true
    • changedInput schema / properties / eligibleQBI / description
      Previous value: -"Whether the 1099 contractor business qualifies for the Section 199A 20% Qualified Business Income deduction."New value: +"Whether the contractor income qualifies for the Section 199A qualified business income deduction. Required: it changes federal tax and is not assumed."
    • removedInput schema / properties / selectedRail
      Removed value: -{
      -  "default": "wise",
      -  "description": "Payment rail provider for international contractor payout: 'wise', 'deel', 'payoneer', 'stripe', 'paypal', or 'wire'.",
      -  "enum": [
      -    "wise",
      -    "deel",
      -    "payoneer",
      -    "stripe",
      -    "paypal",
      -    "wire"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / targetCurrency
      Removed value: -{
      -  "default": "EUR",
      -  "description": "Target fiat currency code for international cross-border conversion drag (e.g. EUR, GBP, CAD).",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "w2Salary",
      -  "contractorHourlyRate"
      -]New value: +[
      +  "w2Salary",
      +  "contractorHourlyRate",
      +  "eligibleQBI",
      +  "as_of_date"
      +]
  3. Changed1 schema field changed
    • removedInput schema / properties / contractorHourlyRate / default
      Removed value: -85
  4. Changed13 schema fields changed
    • changedInput schema / properties / annualExpenses / description
      Previous value: -"1099 deductible business expenses ($/yr)"New value: +"Annual tax-deductible business operating expenses in USD ($/yr) (software, hardware, insurance)."
    • changedInput schema / properties / contractorHourlyRate / description
      Previous value: -"1099 contractor hourly billing rate in USD ($/hr)"New value: +"1099 contractor hourly billing rate in USD ($/hr). Must be a positive number."
    • changedInput schema / properties / eligibleQBI / description
      Previous value: -"Eligible for Section 199A 20% QBI deduction"New value: +"Whether the 1099 contractor business qualifies for the Section 199A 20% Qualified Business Income deduction."
    • changedInput schema / properties / filingStatus / description
      Previous value: -"Tax filing status"New value: +"IRS income tax filing status: 'single' for unmarried individual or 'mfj' for married filing jointly."
    • changedInput schema / properties / healthSubsidyAnnual / description
      Previous value: -"Annual W-2 employer health insurance subsidy ($/yr)"New value: +"Annual W-2 employer-paid health insurance subsidy in USD ($/yr)."
    • changedInput schema / properties / hoursPerWeek / description
      Previous value: -"1099 billable hours per week"New value: +"Expected billable client hours per week as a 1099 contractor. Must be greater than 0."
    • changedInput schema / properties / match401kPercent / description
      Previous value: -"W-2 employer 401(k) match %"New value: +"W-2 employer 401(k) retirement match as a percentage of gross salary (e.g. 4.0 for 4%)."
    • changedInput schema / properties / ptoDays / description
      Previous value: -"W-2 paid time off days"New value: +"Annual W-2 paid time off days (combined vacation and sick leave)."
    • addedInput schema / properties / selectedRail / description
      Added value: +"Payment rail provider for international contractor payout: 'wise', 'deel', 'payoneer', 'stripe', 'paypal', or 'wire'."
    • changedInput schema / properties / stateTaxRatePercent / description
      Previous value: -"State income tax rate %"New value: +"Effective or statutory state income tax rate in percent (e.g. 5.0 for 5%). Set to 0 for states without income tax."
    • changedInput schema / properties / targetCurrency / description
      Previous value: -"Target currency for international cross-border FX drag"New value: +"Target fiat currency code for international cross-border conversion drag (e.g. EUR, GBP, CAD)."
    • changedInput schema / properties / w2Salary / description
      Previous value: -"W-2 gross annual salary in USD ($/yr)"New value: +"W-2 gross annual salary in USD ($/yr). Must be a positive number."
    • changedInput schema / properties / weeksPerYear / description
      Previous value: -"1099 billable weeks per year"New value: +"Active billable working weeks per year as a 1099 contractor (52 minus unpaid vacation and bench time)."
  5. First observed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the leading 'deterministic, idempotent, zero side effects' sentence restates structured data. However, it adds real context by enumerating the computational scope (FICA/SECA, QBI, 199A, 401k match, PTO, health subsidy) so the agent knows the breadth of what is modeled before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by clearly labeled Behavior and Usage Guidelines blocks. Length is proportionate to a 12-parameter, multi-domain tax engine and no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full output schema, complete per-parameter descriptions, and annotations covering the safety profile, the description only needs to add scope and routing — which it does. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with defaults and constraints documented per property, so the baseline is 3. The description adds no per-parameter meaning (e.g. no guidance on how as_of_date's rule pack or eligibleQBI interacts) beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Calculate) and a precisely scoped resource (W-2 vs 1099 tax, benefits and net take-home parity), including the exact deliverable (breakeven $/hr). Clearly differentiated from the sibling billable_floor, which is named directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when ('deciding between a W-2 salaried offer and a 1099 contractor contract') and an explicit when-not with the named alternative ('do not use for solo freelancer baseline rate setting without a W-2 benchmark; use billable_floor instead'). The routing decision is fully determined from the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources