Local MCP server for preparing US paper tax returns: guided intake, deterministic fill, mandatory verification, cited tax math (22 tools). No cloud, no e-file, no telemetry.
Strong domain-specific tool set with comprehensive schemas and descriptions. All 23 tools have explicit descriptions (avg 180 chars) and input schemas with typed parameters. Naming follows verb_noun convention consistently (list_, get_, fill_, verify_, calc, etc.). However, output schemas are not documented in the visible code, only input schemas are declared. Error handling guidance is minimal; tools lack recovery hints. Parameter descriptions are generally good but some lack format/constraint details (e.g., 'form' accepts arbitrary strings without enum of valid forms). No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Composition is excellent, tools chain well (list_forms → get_form_map → fill_form → verify_form). Descriptions are LLM-optimized and action-oriented.
Execute a deterministic tax calculation operation from the versioned knowledge pack. Every result includes its inputs, a human-readable work derivation, and the citation to the official IRS document.
Compare two tax scenarios (e.g., MFJ vs MFS, itemized vs standard) and return the delta in tax, refund, and key lines.
Early bottom-line estimator: put a preliminary refund/owed RANGE on the table as soon as the first income document is confirmed, with its composition, the assumptions behind it, and what would tighten it.
Extract structured data from a document (PDF, image, or text). Returns the extracted fields, confidence scores, and any warnings.
Download the official blank PDF (checksum-verified) and return its local path.
Generate filing and payment instructions: where to mail, payment methods, routing/account validation, and estimated tax payment schedules.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'returns the written lines + any warnings') but formal output schema definitions are absent from visible code. LLMs cannot plan downstream calls without knowing response structure.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Tools are classified with Risk: READ_ONLY or WRITE in comments, but MCP tool annotations are not present. Agents cannot infer safety/idempotency from the schema.
'form' parameter accepts arbitrary strings without enum constraint. Valid forms (f1040, sched_c, etc.) are discoverable via list_forms, but the parameter schema does not declare an enum. LLMs may pass invalid form keys.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Generate a human-readable summary of the complete filing: all forms, key lines, totals, and filing instructions.
Deterministically fill a form. `values` maps line ids (per get_form_map) to values. Downloads/uses the official blank, writes the filled PDF to out_path, and returns the written lines + any warnings. Rejects unknown lines and comb/length violations.
Return one pack's line->field map, relations, and cross-form refs. `form` is the form KEY (e.g. 'f1040', 'sched_c'). Use list_forms to discover keys.
Return the source documents and citations for a given form/year.
Hand-fill a worksheet (for forms without AcroForm PDFs, like state returns or the FBAR). Returns a structured worksheet with lines and instructions.
Return the intake checklist for a given filing status and year: required documents, questions, and the profile schema.
List the document types that extract_document can handle.
List available form packs (optionally filtered by jurisdiction/year).
Render a filled PDF to PNG pages (one per page) for vision review. Returns MCP image content so the calling agent can see every page before filing.
Classify a filer's residency status (resident, nonresident, dual-status) based on the substantial presence test, visa status, and exempt-individual years.
Determine which states a filer must file in based on residency, income, and state-specific thresholds.
Verify a complete filing (all forms + cross-form relations). Pass the same `independent` dict across all verify_form calls so the recompute runs once per form and cross-form checks see the full picture.
Verify a filled form against its pack: assertions, relation math + independent recompute, clipping scan, required-checkbox audit, and the pitfall registry. Returns ok + failures. `independent` maps line id -> the amount YOU recomputed via the calc tool over the versioned tables (never copied from the form or from your own fill values) — e.g. {"16": 36036, "12": 27700} where 36036 came from calc(op="tax", args={"taxable_income": 205150, "filing_status": "married_filing_jointly", "year": 2023}) and 27700 from calc(op="standard_deduction", ...). This is the no-LLM-arithmetic backstop for the table-lookup lines no relation covers (1040 lines 12/16/19/27, 1040-NR 16). When omitted, the recompute does NOT run and the report's recompute section says so — relation math alone only proves internal consistency.
Load a saved workspace (profile + positions + workspace state) from disk. Returns the workspace object.
Reconcile the workspace after filing: mark positions as filed, archive the workspace, and prepare for the next year.
Record a tax position (line value + authority) in the workspace.
Save the current workspace (profile + positions) to disk.
Error handling lacks recovery guidance. Tool descriptions do not explain what to do if a call fails (e.g., 'If form not found, call list_forms() to discover valid forms'). Agents have no actionable next steps on errors.
'calc' operation parameter is a free-form string with 30+ valid values (tax, standard_deduction, se_tax, eitc, etc.). No enum constraint; description lists examples but not exhaustively. LLMs may hallucinate invalid operation names.