Self employed planner
Skill KameronKales/planfi-skills/skills/self-employed-planner
Plan self-employed / business-owner retirement and the §199A QBI deduction by orchestrating the public planfi MCP. Use whenever a freelancer, 1099 contractor, sole proprietor, single-member LLC, S-corp owner, or partner asks how much they can shelter in tax-advantaged retirement accounts (Solo 401(k) vs SEP-IRA vs SIMPLE IRA), which account wins, what their QBI / §199A deduction is, or — for an S-corp — what reasonable W-2 salary best trades off payroll tax vs the QBI deduction vs retirement contribution room — e.g. "I'm a 1099 consultant netting $200k, how much can I put in a Solo 401k?", "SEP vs Solo 401k for my LLC?", "what's my QBI deduction as a sole prop?", "what salary should I pay myself from my S-corp?".From its SKILL.md
npx -y skills add KameronKales/planfi-skills --skill self-employed-plannerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
19.6 KB, ~5.0k tokens by cl100k_base, as published. Nobody here has run it
Self-Employed Planner
A thin orchestration layer over the planfi MCP (https://ai.planfi.app/mcp/free). All self-employment-tax, contribution-limit, QBI, and S-corp-salary math lives server-side. This skill only gathers inputs and calls the tools — it does not compute anything locally, bakes in no limits/thresholds/defaults of its own, and is read-only. The server is the source of truth.
Related skills: owner-operators of a profitable S/C-corp can layer an employer Nonqualified
Deferred Comp (NQDC / 409A) election on top of the qualified-plan contributions — see
deferred-comp (analyze_deferred_comp) for the defer-now-vs-take-now / lump-vs-installment tradeoff.
Step 0 — Make sure the planfi tools are connected
This skill uses these tools (may be namespaced, e.g. mcp__planfi__analyze_self_employed_retirement):
analyze_self_employed_retirement, analyze_estimated_taxes, analyze_estimated_tax_annualized,
optimize_multi_year_tax, analyze_owner_cash_balance_db, plus optional
generate_financial_plan (to mint a plan_id for chaining + the only share_url). Use whichever
name your environment exposes (bare or mcp__planfi__-prefixed); below they are written bare.
If they're NOT available, tell the user to connect the MCP, then continue:
claude mcp add --transport http planfi https://ai.planfi.app/mcp/free
Try free, then add your key. The command above adds the free connector —
https://ai.planfi.app/mcp/free(no key needed). Once you create an API key, add a new connector with the MCP url —https://ai.planfi.app/mcp— and authorize it with your key.
(On claude.ai: add a custom connector pointing at https://ai.planfi.app/mcp/free.)
Access — free for personal use. The planfi MCP is free to try (a small monthly allowance, no key needed). Heavy automated abuse forced us to add limits — but it stays free for personal use: email [email protected] and we'll send you a free API key, no charge. (Companies and commercial use have paid plans.) To use a key, pass it as an
Authorization: Bearer pft_…header in your MCP client config.
Step 1 — (Optional) build a plan first to chain context + get a share link
Feed it into the forecast (not just plan_id chaining):
generate_financial_plannow acceptsself_employeddirectly as a plan input, so it flows into net worth, FIRE %, and Monte-Carlo backtesting — the recommended tax-advantaged contribution flows in as pre-tax savings. Use the standalone analyze tool below for a focused what-if; passself_employedinto the plan to see its effect on the whole household forecast.
If the user has (or wants) a full household model, call generate_financial_plan once and
capture the returned plan_id. analyze_self_employed_retirement accepts { plan_id }, which
lets the server derive the owner's age, filing status, and other taxable income (e.g. a
spouse's W-2) from the saved plan's earners instead of you re-sending them. generate_financial_plan
also returns a share_url (planfi.app). analyze_self_employed_retirement never emits a
share_url; optimize_multi_year_tax emits one only when you pass a { plan_id } that resolves
to a saved plan. Minting a plan_id here is the reliable way to give the user a sharable plan.
This step is optional: the tool runs cold from raw inputs too. Prefer the plan path when the session already has a model or the user wants a sharable artifact.
Engine facts to bake in: all dollars are today's (real) dollars; all decimals are fractions (24% →
0.24); contribution limits, the SS wage base, and the §199A QBI thresholds are approximate ~2026 values (reported back in each call'sdisclosures). Overridetax_yearif the user needs a different year.
Step 2 — Route by intent
The single specialist tool here is analyze_self_employed_retirement. The only REQUIRED field is
entity_type (sole_prop | single_member_llc | s_corp | partnership). Every other field —
including net_business_income (defaults to 200000) — is optional with a server default, but you
should always pass the entity's income figure so the result reflects the user's actual numbers. Pass
{ plan_id } to resolve age / filing status / other income; otherwise pass them inline. Every
omitted default is reported back (see Step 3).
"How much can I shelter? / which account — Solo 401(k), SEP, or SIMPLE?" → analyze_self_employed_retirement
For sole_prop / single_member_llc / partnership, pass net_business_income (the owner's net
SE earnings). Headline fields: contributions_by_account (per-account max) and recommended_account
recommended_contribution+recommendation_reason. Optional context:age(age-50 catch-up),employee_count,spouse_on_payroll,existing_elective_deferrals(402(g) coordination across jobs).
analyze_self_employed_retirement({ entity_type: "sole_prop", net_business_income: 200000,
age: 45, filing_status: "single", is_sstb: false })
"What's my QBI / §199A deduction?" → analyze_self_employed_retirement
Same tool — read the qbi_deduction block: amount, qbi_base, deduction_before_cap,
w2_wage_limit, threshold_status (below | phase_in | above), sstb_phaseout_applied.
Pass is_sstb: true for a specified service trade or business (law, health, consulting, finance,
etc.), other_taxable_income for the taxable-income threshold, and ubia (unadjusted basis of
qualified property) for the 2.5%-UBIA alternative wage limit. net_federal_tax_delta shows how much
contributing + QBI lowers federal tax.
"What salary should I pay myself from my S-corp?" → analyze_self_employed_retirement
Pass entity_type: "s_corp", net_business_income (business PROFIT before the owner W-2), and
optionally s_corp_w2_wages (if the salary is fixed by the user) + s_corp_distributions
(informational). Omit s_corp_w2_wages to let the server solve a reasonable salary. Read the
s_corp_salary_recommendation block: salary, distribution, payroll_tax, estimated_total_tax,
and its note (reasonable compensation is a facts-and-circumstances IRS rule — relay it as an
estimate). The S-corp employer profit-share is 25% of W-2, so salary also drives retirement room.
analyze_self_employed_retirement({ entity_type: "s_corp", net_business_income: 150000,
s_corp_w2_wages: 90000, s_corp_distributions: 60000, is_sstb: true, filing_status: "single" })
"What are my quarterly estimated payments? / will I owe an underpayment penalty?" → analyze_estimated_taxes
Self-employed and S-corp owners have no automatic payroll withholding on business profit, so they must make quarterly estimated payments or face an IRC §6654 underpayment penalty. This tool projects current-year tax (SE tax, income tax, NIIT, optional flat state tax, QBI) and computes the required annual payment (RAP) — the smaller of the 90%-of-current-year safe harbor and the prior-year safe harbor (100% of last year's tax, or 110% if prior-year AGI > $150k). Pass the entity's projected income plus, when known, prior-year tax/AGI and any expected withholding.
analyze_estimated_taxes({ projected_se_income: 150000, prior_year_tax: 28000,
prior_year_agi: 160000, filing_status: "single" })
Read these blocks:
safe_harbor—currentYearTarget(0.9×),priorYearTarget,priorYearPct(1.0 or 1.1),highIncome,requiredAnnualPayment(RAP),bindingMethod(current_year_90|prior_year), andreason(which safe harbor binds and why). Prior-year safe harbor only applies when a prior return was filed.quarters— the four{ dueDate, amount }installments (Apr 15 / Jun 15 / Sep 15 / Jan 15),totalEstimatedPayments, andremainingPerQuarter(afterpaymentsMade). Expected withholding is treated as paid evenly across quarters and offsets the RAP (underpaymentToCover).underpaymentRisk—covered(withholding + payments ≥ RAP),shortfall, and anote. This tool assumes even quarterly income; if the income is lumpy / back-loaded, route toanalyze_estimated_tax_annualizedinstead (the annualized-income installment method, Form 2210 Schedule AI) for the exact per-period required installment and §6654 penalty dollar amount.
This tool emits a structured assumed_defaults[] (each { field, assumed_value, note }) for anything
omitted — surface it so the user can correct income, filing status, prior-year figures, etc. and
re-call. It accepts { plan_id } (to derive age / filing status / other income from a saved plan) and
chains via next_actions[]. Coordinate with analyze_self_employed_retirement: a larger pre-tax
Solo 401(k)/SEP contribution lowers taxable income and therefore the estimated bill, so size the
contribution first, then feed the resulting income into the estimated-tax projection. Chain to
optimize_multi_year_tax for cross-year coordination.
"My income came late / it's lumpy / I had a Q4 RSU vest or year-end S-corp distribution — do I have to pay even quarterly estimates? / can I defer estimated payments without a penalty? / annualized income installment method / Form 2210 Schedule AI" → analyze_estimated_tax_annualized
Always CALL analyze_estimated_tax_annualized for these — do not answer from general knowledge or quote rules of thumb (e.g. "just pay 25% each quarter" or "you can annualize") from memory. When the user gives the numbers, run it and lead with its real output.
Use this — NOT analyze_estimated_taxes — whenever the income is uneven, back-loaded, or
lumpy: the even-quarter tool above assumes income arrives smoothly and will overstate the early
installments (and the penalty) when most of the income lands late in the year. This tool implements
the annualized-income installment method (Form 2210 Schedule AI): it takes cumulative income
through each of the 4 IRS periods (cutoffs 3/31, 5/31, 8/31, 12/31), annualizes via the period
multipliers (4, 2.4, 1.5, 1), taxes each annualized amount, applies the cumulative percentages
(22.5% / 45% / 67.5% / 90%), and nets out prior installments to give the per-period required
installment — legally deferring payment for income that has not yet arrived (e.g. a Q4 RSU
vest or year-end S-corp distribution) without triggering the §6654 penalty.
It compares the annualized method to the even 25%-per-quarter safe harbor and the prior-year safe harbor (100% / 110% of last year's tax over $150k AGI), computes the §6654 underpayment penalty per period (federal short-term rate + 3%), and reports the total penalty avoided plus which safe harbor (annualized vs prior-year vs current-year-90%) is cheapest.
Disambiguation (do NOT mis-route): if the user's income is even / steady / smooth across the year, use
analyze_estimated_taxes(the even-quarter tool) — only useanalyze_estimated_tax_annualizedwhen the income is explicitly uneven, lumpy, back-loaded, or tied to a discrete late-year event.
analyze_estimated_tax_annualized({ entity: "sole_prop", filing_status: "single",
cumulative_income_by_period: [0, 0, 0, 100000], prior_year_return_filed: false })
Read these blocks:
periods— the 4{ cutoff, multiplier, applicablePct, annualizedIncome, annualizedTax, annualizedInstallment, evenInstallment, penaltyAnnualized, penaltyEven }rows.recommendedSchedule— the{ dueDate, amount }installments to actually pay under the annualized method.penalty.penaltyAvoided— the §6654 dollars the annualized method saves vs paying even quarters (the headline for back-loaded income).cheapestSafeHarbor—{ method: 'annualized' | 'prior_year' | 'current_year_90', amount, reason }.
Emits assumed_defaults[], accepts { plan_id } (derives filing status / age / prior-year tax /
AGI from a saved plan), surfaces share_url, and chains via next_actions[] — coordinate with
analyze_self_employed_retirement (a pre-tax contribution lowers each annualized installment) and
fall back to analyze_estimated_taxes for the even-income case.
"How much can a cash-balance / defined-benefit plan let me deduct? / DB plan on top of my Solo 401(k)? / I'm a profitable 50-something owner maxing tax-deferred space / Solo-401k vs SEP vs cash-balance / will a SEP block my backdoor Roth?" → analyze_owner_cash_balance_db
Always CALL analyze_owner_cash_balance_db for these — do not answer from general knowledge or quote rules of thumb ("a DB plan lets you put away $100k–$300k") from memory. A cash-balance / defined-benefit plan is the single highest-dollar deduction available to a profitable solo owner, and the actuarial sizing (level-funding by age, the §415(b) cap, the Solo-401(k) stack, the backdoor-Roth interaction) is exactly the kind of math the server computes deterministically and memory gets wrong. When the user gives the numbers — net business income, age, years to a normal retirement age, any target benefit/lump-sum — run the tool and lead with its real output.
The only REQUIRED field is net_business_income. Everything else is optional/plan-derivable: owner_age (default 50), normal_retirement_age (default 62), entity, target_annual_benefit or target_lump_sum (omit both to size to the §415(b) cap), valuation_interest_rate (default 5%), high_three_average_compensation, filing_status, other_taxable_income. Pass { plan_id } to derive owner age / filing status / other income from a saved plan.
analyze_owner_cash_balance_db({ entity: "sole_prop", net_business_income: 400000,
owner_age: 50, normal_retirement_age: 62, filing_status: "single" })
Read + surface these:
cash_balance_annual_contribution— the estimated level-funded annual DB/cash-balance contribution, andcash_balance_contribution_by_age(the steep age curve — older = much larger per-year).funded_annual_benefit+capped_by_limit(415b|high_3|target_uncapped) +section_415b_limit— what bounds the funded benefit.solo_401k(deferral + employer profit-share + catch-up, §415(c)-capped) andcombined_deductible_total= DB + Solo-401(k) — total deductible tax-deferred space.total_tax_savedat themarginal_rate.recommended_structure(solo_401k|sep_ira|sep_plus_cash_balance|full_db_plus_solo_401k) +recommendation_reason, and ALWAYS thebackdoor_roth_flag— a SEP-IRA's pre-tax balance triggers §408(d)(2) pro-rata and taxes/blocks a clean backdoor Roth; a Solo-401(k) base avoids it.
These are actuarial estimates (level-funding approximation + a pinned annuity factor) — surface the disclosures/assumed_defaults[] and tell the user a real plan needs an enrolled actuary's valuation. It accepts { plan_id } and chains via next_actions[] (confirm the Solo-401(k) base via analyze_self_employed_retirement; lower estimated payments via analyze_estimated_taxes).
"Coordinate this across years / with ISO exercises + Roth conversions" → optimize_multi_year_tax
After sizing the contribution, chain to optimize_multi_year_tax (AMT-crossover / NIIT-threshold /
IRMAA-tier aware year-by-year plan) — pass { plan_id } when you have one. REQUIRED:
baseline_ordinary_income. This is the typical next_actions[] chain.
Step 3 — Surface the result
- Lead with the headline: the recommended account + annual contribution it shelters (and how
the alternatives compare), then the QBI deduction and the net federal tax delta. For an
S-corp, lead with the recommended salary + distribution split. The
summaryblock has ready-made one-liners. - Read back assumptions: this tool does emit a structured
assumed_defaults[](each{ field, assumed_value, note }) for anything you omitted — surface those so the user can correct any (income, age, filing status, is_sstb, ubia, …) and re-call with overrides. Also readdisclosures.key_assumptions(SE-tax method, ~2026 limits/thresholds, the S-corp facts-and-circumstances note). disclosures.not_advice— relay that this is a planning estimate, not tax advice; for S-corps emphasize that "reasonable compensation" is an IRS facts-and-circumstances rule.next_actions[]— each{ tool, why, prefilled_args }(carrying{ plan_id }when available). Follow these server-suggested chains (oftenoptimize_multi_year_taxorgenerate_financial_plan) rather than guessing the next call.share_url—generate_financial_planalways returns one;optimize_multi_year_taxreturns one only when called with a plan-resolving{ plan_id }.analyze_self_employed_retirementdoes not emit one. If you minted aplan_id, offer that plan'sshare_urlso the user can open the full interactive plan on planfi.app.
Recommended call sequence (typical session)
- (optional)
generate_financial_plan→ captureplan_id+share_url. analyze_self_employed_retirementwithentity_type+ income (+{ plan_id }).- Surface recommended account/contribution + QBI + tax delta; read back
assumed_defaults[]anddisclosures.key_assumptions. - Follow
next_actions[](commonlyoptimize_multi_year_tax); offer the plan'sshare_url.
Fictional examples
1. "I'm a 45-year-old 1099 consultant, sole prop, netting $200k — how much can I shelter and in
what?" → analyze_self_employed_retirement({ entity_type: "sole_prop", net_business_income: 200000, age: 45, filing_status: "single", is_sstb: false }). Lead with recommended_account (likely
solo_401k) + recommended_contribution, compare SEP/SIMPLE, then the qbi_deduction.amount and
net_federal_tax_delta. Read back assumed_defaults[].
2. "My S-corp (consulting) profits $150k; I'm paying myself $90k W-2 with $60k distributions —
is that the right split?" → analyze_self_employed_retirement({ entity_type: "s_corp", net_business_income: 150000, s_corp_w2_wages: 90000, s_corp_distributions: 60000, is_sstb: true, filing_status: "single" }). Lead with s_corp_salary_recommendation (salary/distribution/payroll
tax), flag that consulting is an SSTB (so sstb_phaseout_applied may zero the QBI above the
threshold), and relay the facts-and-circumstances note.
(Both examples use fictional figures — never reuse a real user's numbers in documentation.)
Notes
- All decimals are fractions; all dollars are today's (real) dollars; contribution limits, the SS
wage base, and §199A QBI thresholds are ~2026 (override
tax_yearas needed). - Pass
{ plan_id }to derive age / filing status / other taxable income from a saved model; any field you also pass is an override. - This tool emits a structured
assumed_defaults[]— surface it. The S-corp salary recommendation is a labeled estimate (reasonable compensation is a facts-and-circumstances IRS rule). - Not financial or tax advice. Planning estimates only (approximate ~2026 brackets/limits).
What ships with it: 3 files
6.4 KB alongside SKILL.md
.claude-plugin/
- plugin.json473 B