Both additions to tax, with the section 6651(c) offset for months in which both run
One command on the Penalties and safe harbours server, callable over MCP as calculate_filing_penalty, filed in the registry as Late filing and late payment. Every result carries the method it used, the rule pack it was pinned to, what is still missing and whether coverage was complete, for a licensed professional to review.
What it needs, and why
Every input is checked before anything is calculated. Nothing is required to start, and a field left blank means do not apply this rather than zero.
| Input | What it asks for | Why it matters | If you omit it |
|---|---|---|---|
unpaid_tax | Unpaid tax | Both additions to tax are percentages of the tax that was not paid on time. | defaults to 10000 |
days_late | Days late | Both penalties accrue monthly and a part month counts as a whole one, so days rather than months decide the count. | defaults to 95 |
filed | Return was filed on time one of no, yes | The late filing penalty is ten times the late payment one, so whether the return went in on time dominates the result. | defaults to no |
Requests it answers
- “What is the penalty for filing and paying late?”
- “Do the late filing and late payment penalties stack?”
An agent with these skills loaded picks the command from phrasing like that, asks for whatever input is missing, and reports the figures with the method that produced them.
Run it
scripts/mcp_server.sh --server complianceThe same command is exposed by taxagent-compliance, so Claude, Claude Code, Codex, Cursor and any other MCP client can call it directly. Analysis only. No tool in this server places orders, modifies custodian records or files returns. This server holds no client data: every figure arrives in the call and nothing is stored. Results are estimates over those figures, not a return and not tax advice. Interest is never computed: the rate is set quarterly and compounds daily, so no rate is stored here.
Scripted cases that exercise it
4 of the 71 console cases call this command on a real server over JSON-RPC and assert the outcome. Every one runs on every build, and all of them are listed on the case inventory.
| Case | What it asks | What it shows | Outcome |
|---|---|---|---|
comp-file-vs-pay | Three months late, nothing filed | Failure to file runs at ten times the failure-to-pay rate, with the section 6651(c) offset applied so the combined rate is 5%, not 5.5%. | completed |
comp-filed-not-paid | The same debt, but the return was filed | $200 instead of $2,000. This is why 'file even if you cannot pay' is the standard advice, and the numbers make the case. | completed |
comp-minimum-penalty | A small balance more than 60 days late | The percentage addition would be $360, so the statutory floor applies instead. Small balances are not proportionally cheap. | completed |
comp-rejects-negative-days | A negative number of days late | Refused rather than producing a negative penalty. | VALIDATION_FAILED |
Limits it inherits from taxagent-compliance
- Interest. The underpayment rate is set quarterly and compounds daily, so no rate is stored here and these figures are penalties only.
- Reasonable cause, first-time abatement and the fraud rate, any of which changes the result substantially.
- Whether estimated payments were timely by quarter, as opposed to sufficient in total.
The server, its other 3 commands and what it deliberately leaves alone are on the Penalties and safe harbours page.