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 the employee elective deferral limit for the tax year in force on as_of_date (with the age 50+ catch-up where it applies) 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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "netEarnings": "<netEarnings>",
      "participant_age": "<participant_age>",
      "as_of_date": "<as_of_date>"
    },
    "name": "solo_401k_shield"
  }
}

Input 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

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, destructiveHint=false and openWorldHint=false, so the opening 'deterministic, idempotent calculation with zero external side effects' largely restates structured data. The description does add real behavioral substance beyond that: the actual computation path (elective deferral + age-50 catch-up, 20% of adjusted net earnings for LLC/sole prop vs 25% of W-2 salary for S-Corp, statutory additions cap, marginal-rate multiplication). It does not discuss rounding, currency, or error behavior, keeping it short of a 5.

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?

Clearly front-loaded and sectioned with 'Behavior:' and 'Usage Guidelines:' labels, so an agent can skim. The behavior paragraph is dense with formula detail that partly duplicates the schema, but every sentence is on-topic; only the annotation-restating first clause is arguably redundant.

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?

For a six-parameter, read-only calculator with a full output schema and complete annotation coverage, the definition supplies the calculation logic, the entity-type branching, and the routing rule to the sibling. Return-value shape is handled by the output schema, so no material gap remains.

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%, so the schema already documents as_of_date rule-pack selection, the entityType enum, the deprecated isAge50Plus, and participant_age's role in catch-up eligibility. The description's mention of the age 50+ catch-up and the 20%/25% entity split reinforces but does not add syntax or constraints beyond what the schema states; baseline 3 applies.

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 and resource: compare Solo 401(k) vs SEP-IRA contribution limits for the tax year in force on as_of_date, plus the income-tax reduction at the marginal rate. It also names what it is not (compound_wealth), so an agent can distinguish it from the growth-modeling sibling without opening either schema.

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 positive trigger (owner-only business, independent contractor, or partner optimizing pre-tax retirement deductions) and an explicit exclusion with a named alternative: 'Do not use for multi-year exponential compound investment growth modeling; use compound_wealth instead.' Nothing is left to inference.

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