Skip to main content
Glama

US Solo 401(k) contribution

solo_401k_shield
Read-onlyIdempotent

Compare Solo 401(k) and SEP-IRA contribution limits for the tax year in force on as_of_date, and the income-tax reduction their pre-tax part gives at the marginal rate entered.

Behavior: Deterministic, idempotent calculation with zero external side effects. Computes employee elective deferral (up to $23,000 or $30,500 if age 50+) plus employer profit-sharing (20% of adjusted net earnings for LLC/sole prop, 25% of W-2 salary for S-Corp) subject to annual statutory additions cap. Multiplies total deductible contribution by marginal tax rate to return net cash saved.

Usage Guidelines: Use when an owner-only business, independent contractor, or partner wants to optimize pre-tax retirement deductions. Do not use for multi-year exponential compound investment growth modeling; use compound_wealth instead.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
as_of_dateYesCivil date YYYY-MM-DD. Selects the rule pack in force on that date. Required: the engine will not assume a date.
entityTypeNoTax treatment of the business, which changes the contribution limits. The previously advertised value "llc" is not accepted: an LLC may be taxed either way, so choosing one on the caller's behalf would be a guess. State the tax treatment, not the legal form.
isAge50PlusNoDeprecated and ignored: catch-up eligibility and its limit come from participant_age (required), under the rule pack in force on as_of_date.
netEarningsYesAnnual net business profit (Schedule C) or W-2 officer salary (S-Corp) in USD ($/yr). Must be a positive number.
participant_ageYesParticipant age in years. Required: it decides catch-up eligibility (IRC s.414(v), SECURE 2.0 s.109).
marginalTaxRatePercentNoCombined federal and state marginal income tax bracket percentage (e.g. 28 for 28%).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
sepIraNo
sep_iraNo
currencyNo
solo401kNo
solo_401kNo
as_of_dateNo
comparisonNo
disclaimerNo
entityTypeNo
entity_typeNo
isAge50PlusNo
minor_unitsNo
netEarningsNo
net_earningsNo
rate_pack_idNo
catch_up_typeNo
participant_ageNo
effectiveTaxYearNo
planCompensationNo
plan_compensationNo
statutory_authorityNo
mandatory_roth_catchupNo
marginalTaxRatePercentNo
annual_compensation_capNo
catch_up_eligible_limitNo
marginal_tax_rate_percentNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • removedInput schema / properties / isAge50Plus / default
      Removed value: -false
    • addedInput schema / properties / isAge50Plus / deprecated
      Added value: +true
    • changedInput schema / properties / isAge50Plus / description
      Previous value: -"Whether the account holder is age 50 or older, unlocking the statutory $7,500 catch-up contribution."New value: +"Deprecated and ignored: catch-up eligibility and its limit come from participant_age (required), under the rule pack in force on as_of_date."
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "annual_compensation_cap": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "as_of_date": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "catch_up_eligible_limit": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "catch_up_type": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "comparison": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "currency": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "disclaimer": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "effectiveTaxYear": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "entityType": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "entity_type": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "isAge50Plus": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "mandatory_roth_catchup": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "marginalTaxRatePercent": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "marginal_tax_rate_percent": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "minor_units": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "netEarnings": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "net_earnings": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "participant_age": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "planCompensation": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "plan_compensation": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "rate_pack_id": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "sepIra": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "sep_ira": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "solo401k": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "solo_401k": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "statutory_authority": {
      +      "type": [
      +        "string",
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed2 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"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "netEarnings",
      -  "participant_age"
      -]New value: +[
      +  "netEarnings",
      +  "participant_age",
      +  "as_of_date"
      +]
  4. Changed2 schema fields changed
    • addedInput schema / properties / participant_age
      Added value: +{
      +  "description": "Participant age in years. Required: it decides catch-up eligibility (IRC s.414(v), SECURE 2.0 s.109).",
      +  "example": 45,
      +  "maximum": 100,
      +  "minimum": 18,
      +  "type": "integer"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "netEarnings"
      -]New value: +[
      +  "netEarnings",
      +  "participant_age"
      +]
  5. Changed4 schema fields changed
    • removedInput schema / properties / entityType / default
      Removed value: -"llc"
    • changedInput schema / properties / entityType / description
      Previous value: -"Legal entity tax structure: 'llc' (sole proprietorship / single-member LLC using 20% adjusted SE earnings) or 'scorp' (corporation using 25% W-2 wage)."New value: +"Tax treatment of the business, which changes the contribution limits. The previously advertised value \"llc\" is not accepted: an LLC may be taxed either way, so choosing one on the caller's behalf would be a guess. State the tax treatment, not the legal form."
    • changedInput schema / properties / entityType / enum
      Previous value: -[
      -  "llc",
      -  "scorp"
      -]New value: +[
      +  "sole_prop",
      +  "scorp"
      +]
    • removedInput schema / properties / netEarnings / default
      Removed value: -120000
  6. Changed4 schema fields changed
    • changedInput schema / properties / entityType / description
      Previous value: -"Entity structure: 'llc' or 'scorp'"New value: +"Legal entity tax structure: 'llc' (sole proprietorship / single-member LLC using 20% adjusted SE earnings) or 'scorp' (corporation using 25% W-2 wage)."
    • changedInput schema / properties / isAge50Plus / description
      Previous value: -"Eligible for $7,500 age 50+ catch-up"New value: +"Whether the account holder is age 50 or older, unlocking the statutory $7,500 catch-up contribution."
    • changedInput schema / properties / marginalTaxRatePercent / description
      Previous value: -"Combined federal and state marginal tax bracket %"New value: +"Combined federal and state marginal income tax bracket percentage (e.g. 28 for 28%)."
    • changedInput schema / properties / netEarnings / description
      Previous value: -"Annual net business profit or W-2 salary ($/yr)"New value: +"Annual net business profit (Schedule C) or W-2 officer salary (S-Corp) in USD ($/yr). Must be a positive number."
  7. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and no destructive/open-world behavior, so the sentence restating determinism and zero side effects earns no extra credit. The description does add real behavioral substance beyond the annotations: the deferral caps ($23,000 / $30,500 age 50+), employer profit-sharing math (20% of adjusted net earnings vs 25% of W-2 salary), and the statutory additions cap that governs the result.

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

Conciseness4/5

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

The definition is front-loaded and organized into Purpose, Behavior, and Usage Guidelines blocks with no filler. It is dense for a single tool but each sentence, including the formulas, contributes to correct invocation.

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 six parameters, full schema coverage, rich annotations, and an output schema present, the description supplies everything an agent needs to decide and call correctly; return-value explanation is correctly left to the output schema.

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% and the schema descriptions are unusually rich (entityType caveat, as_of_date rule-pack selection, deprecated isAge50Plus, participant_age catch-up rationale), so the schema carries the parameter burden. The description reinforces the age/entity/rate inputs implicitly through the formula but adds no syntax or format detail beyond the schema.

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?

The description names a specific verb and resources: it compares Solo 401(k) and SEP-IRA contribution limits for a given tax year and computes the income-tax reduction from the pre-tax portion. The scope (owner-only retirement contribution optimization) is clear enough to separate it from siblings like scorp_optimizer or compound_wealth.

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?

It states explicit when-to-use (owner-only business, independent contractor, or partner optimizing pre-tax retirement deductions) and a when-not with a named alternative: multi-year compound growth modeling should use compound_wealth instead. Routing is unambiguous.

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